148 lines
4.6 KiB
Dart
148 lines
4.6 KiB
Dart
/// Invoice Section Widget
|
|
///
|
|
/// Optional invoice information form section.
|
|
library;
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
import 'package:worker/core/constants/ui_constants.dart';
|
|
import 'package:worker/core/theme/colors.dart';
|
|
import 'package:worker/features/cart/presentation/widgets/checkout_text_field.dart';
|
|
|
|
/// Invoice Section
|
|
///
|
|
/// Collects invoice/VAT information when checkbox is enabled.
|
|
class InvoiceSection extends HookWidget {
|
|
final ValueNotifier<bool> needsInvoice;
|
|
final TextEditingController companyNameController;
|
|
final TextEditingController taxIdController;
|
|
final TextEditingController companyAddressController;
|
|
final TextEditingController companyEmailController;
|
|
|
|
const InvoiceSection({
|
|
super.key,
|
|
required this.needsInvoice,
|
|
required this.companyNameController,
|
|
required this.taxIdController,
|
|
required this.companyAddressController,
|
|
required this.companyEmailController,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
margin: const EdgeInsets.symmetric(horizontal: AppSpacing.md),
|
|
padding: const EdgeInsets.all(AppSpacing.md),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.circular(AppRadius.card),
|
|
boxShadow: [
|
|
BoxShadow(
|
|
color: Colors.black.withValues(alpha: 0.05),
|
|
blurRadius: 8,
|
|
offset: const Offset(0, 2),
|
|
),
|
|
],
|
|
),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
// Invoice Checkbox
|
|
Row(
|
|
children: [
|
|
Checkbox(
|
|
value: needsInvoice.value,
|
|
onChanged: (value) {
|
|
needsInvoice.value = value ?? false;
|
|
},
|
|
activeColor: AppColors.primaryBlue,
|
|
),
|
|
const Expanded(
|
|
child: Text(
|
|
'Xuất hóa đơn VAT',
|
|
style: TextStyle(
|
|
fontSize: 16,
|
|
fontWeight: FontWeight.w600,
|
|
color: Color(0xFF212121),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
|
|
// Invoice Fields (visible when checkbox is checked)
|
|
if (needsInvoice.value) ...[
|
|
const SizedBox(height: AppSpacing.md),
|
|
|
|
// Company Name
|
|
CheckoutTextField(
|
|
label: 'Tên công ty',
|
|
controller: companyNameController,
|
|
required: true,
|
|
validator: (value) {
|
|
if (needsInvoice.value && (value == null || value.isEmpty)) {
|
|
return 'Vui lòng nhập tên công ty';
|
|
}
|
|
return null;
|
|
},
|
|
),
|
|
|
|
const SizedBox(height: AppSpacing.md),
|
|
|
|
// Tax ID
|
|
CheckoutTextField(
|
|
label: 'Mã số thuế',
|
|
controller: taxIdController,
|
|
required: true,
|
|
keyboardType: TextInputType.number,
|
|
validator: (value) {
|
|
if (needsInvoice.value && (value == null || value.isEmpty)) {
|
|
return 'Vui lòng nhập mã số thuế';
|
|
}
|
|
return null;
|
|
},
|
|
),
|
|
|
|
const SizedBox(height: AppSpacing.md),
|
|
|
|
// Company Address
|
|
CheckoutTextField(
|
|
label: 'Địa chỉ công ty',
|
|
controller: companyAddressController,
|
|
required: true,
|
|
maxLines: 2,
|
|
validator: (value) {
|
|
if (needsInvoice.value && (value == null || value.isEmpty)) {
|
|
return 'Vui lòng nhập địa chỉ công ty';
|
|
}
|
|
return null;
|
|
},
|
|
),
|
|
|
|
const SizedBox(height: AppSpacing.md),
|
|
|
|
// Company Email
|
|
CheckoutTextField(
|
|
label: 'Email nhận hóa đơn',
|
|
controller: companyEmailController,
|
|
required: true,
|
|
keyboardType: TextInputType.emailAddress,
|
|
validator: (value) {
|
|
if (needsInvoice.value && (value == null || value.isEmpty)) {
|
|
return 'Vui lòng nhập email';
|
|
}
|
|
if (needsInvoice.value &&
|
|
!RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$')
|
|
.hasMatch(value!)) {
|
|
return 'Email không hợp lệ';
|
|
}
|
|
return null;
|
|
},
|
|
),
|
|
],
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|