Files
worker/lib/features/account/presentation/widgets/address_card.dart
Phuoc Nguyen 49082026f5 update icon
2025-11-17 09:34:17 +07:00

196 lines
6.1 KiB
Dart

/// Address Card Widget
///
/// Displays a saved address with edit/delete actions.
library;
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:worker/core/constants/ui_constants.dart';
import 'package:worker/core/theme/colors.dart';
/// Address Card Widget
///
/// Shows address details with name, phone, address text, default badge,
/// and action buttons (edit/delete).
class AddressCard extends StatelessWidget {
final String name;
final String phone;
final String address;
final bool isDefault;
final VoidCallback? onEdit;
final VoidCallback? onDelete;
final VoidCallback? onSetDefault;
const AddressCard({
super.key,
required this.name,
required this.phone,
required this.address,
this.isDefault = false,
this.onEdit,
this.onDelete,
this.onSetDefault,
});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(AppRadius.card),
border: isDefault
? Border.all(color: AppColors.primaryBlue, width: 2)
: null,
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.05),
blurRadius: 8,
offset: const Offset(0, 2),
),
],
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Address Content
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Header (Name + Badge or Set Default Button)
Row(
children: [
Flexible(
child: Text(
name,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w500,
color: Color(0xFF212121),
),
overflow: TextOverflow.ellipsis,
),
),
const SizedBox(width: 8),
if (isDefault)
Container(
padding: const EdgeInsets.symmetric(
horizontal: 8,
vertical: 2,
),
decoration: BoxDecoration(
color: AppColors.primaryBlue,
borderRadius: BorderRadius.circular(4),
),
child: const Text(
'Mặc định',
style: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w500,
color: Colors.white,
),
),
)
else if (onSetDefault != null)
TextButton(
onPressed: onSetDefault,
style: TextButton.styleFrom(
padding: const EdgeInsets.symmetric(
horizontal: 8,
vertical: 2,
),
minimumSize: Size.zero,
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
child: const Text(
'Đặt mặc định',
style: TextStyle(
fontSize: 12,
color: AppColors.primaryBlue,
),
),
),
],
),
const SizedBox(height: 4),
// Phone
Text(
phone,
style: const TextStyle(
fontSize: 14,
color: AppColors.grey500,
),
),
const SizedBox(height: 8),
// Address Text
Text(
address,
style: const TextStyle(
fontSize: 14,
color: Color(0xFF212121),
height: 1.4,
),
),
],
),
),
const SizedBox(width: 12),
// Actions
Column(
children: [
// Edit Button
if (onEdit != null)
InkWell(
onTap: onEdit,
borderRadius: BorderRadius.circular(8),
child: Container(
width: 36,
height: 36,
decoration: BoxDecoration(
border: Border.all(color: const Color(0xFFE2E8F0)),
borderRadius: BorderRadius.circular(8),
),
child: const FaIcon(
FontAwesomeIcons.penToSquare,
size: 16,
color: AppColors.primaryBlue,
),
),
),
const SizedBox(height: 8),
// Delete Button
if (onDelete != null)
InkWell(
onTap: onDelete,
borderRadius: BorderRadius.circular(8),
child: Container(
width: 36,
height: 36,
decoration: BoxDecoration(
border: Border.all(color: const Color(0xFFE2E8F0)),
borderRadius: BorderRadius.circular(8),
),
child: const FaIcon(
FontAwesomeIcons.trashCan,
size: 16,
color: AppColors.danger,
),
),
),
],
),
],
),
);
}
}