add account, checkout page
This commit is contained in:
147
lib/features/cart/presentation/widgets/invoice_section.dart
Normal file
147
lib/features/cart/presentation/widgets/invoice_section.dart
Normal file
@@ -0,0 +1,147 @@
|
||||
/// 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;
|
||||
},
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user