300 lines
9.7 KiB
Dart
Raw Normal View History

2025-08-29 16:28:27 +07:00
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import '../../../../../common/theme/theme.dart';
@RoutePage()
class VoucherDetailPage extends StatelessWidget {
const VoucherDetailPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.background,
appBar: AppBar(
title: Text(
'Detail Voucher',
style: AppStyle.xl.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.textPrimary,
),
),
backgroundColor: AppColor.backgroundLight,
elevation: 0,
iconTheme: IconThemeData(color: AppColor.textPrimary),
bottom: PreferredSize(
preferredSize: Size.fromHeight(1),
child: Container(height: 1, color: AppColor.borderLight),
),
),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Voucher Card Section
Container(
margin: EdgeInsets.all(16),
padding: EdgeInsets.all(20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: AppColor.primaryGradient,
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: AppColor.primary.withOpacity(0.3),
offset: Offset(0, 4),
blurRadius: 12,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Voucher Icon
Container(
width: 48,
height: 48,
decoration: BoxDecoration(
color: AppColor.white.withOpacity(0.2),
borderRadius: BorderRadius.circular(12),
),
child: Icon(
Icons.local_offer,
color: AppColor.white,
size: 24,
),
),
SizedBox(height: 16),
// Title
Text(
'New User Voucher - Diskon 50% hingga Rp35K',
style: AppStyle.xl.copyWith(
color: AppColor.white,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 8),
// Subtitle
Text(
'Tanpa Min. Belanja',
style: AppStyle.md.copyWith(
color: AppColor.white.withOpacity(0.9),
),
),
SizedBox(height: 20),
// Voucher Details Row
Row(
children: [
Expanded(
child: _buildDetailItem(
icon: Icons.schedule,
label: 'Berlaku hingga',
value: '25 Sep 2025',
),
),
Container(
width: 1,
height: 40,
color: AppColor.white.withOpacity(0.3),
margin: EdgeInsets.symmetric(horizontal: 16),
),
Expanded(
child: _buildDetailItem(
icon: Icons.shopping_cart,
label: 'Min. Transaksi',
value: '-',
),
),
],
),
],
),
),
// Action Buttons
Padding(
padding: EdgeInsets.symmetric(horizontal: 16),
child: Row(
children: [
Expanded(
child: ElevatedButton.icon(
onPressed: () {
// Copy voucher code functionality
_copyVoucherCode(context);
},
style: ElevatedButton.styleFrom(
backgroundColor: AppColor.backgroundLight,
foregroundColor: AppColor.primary,
elevation: 0,
padding: EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
side: BorderSide(color: AppColor.border),
),
),
icon: Icon(Icons.copy, size: 20),
label: Text(
'Salin Kode',
style: AppStyle.md.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.primary,
),
),
),
),
SizedBox(width: 12),
Expanded(
child: ElevatedButton(
onPressed: () {
// Use voucher functionality
_useVoucher(context);
},
style: ElevatedButton.styleFrom(
backgroundColor: AppColor.primary,
foregroundColor: AppColor.white,
elevation: 0,
padding: EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Text(
'Gunakan',
style: AppStyle.md.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.white,
),
),
),
),
],
),
),
SizedBox(height: 24),
// Description Section
_buildSection(
title: 'Deskripsi',
content:
'Dapatkan diskon hingga 50% untuk pembelian pertama Anda! Voucher ini khusus untuk pengguna baru dan berlaku untuk semua kategori produk tanpa minimum pembelian.',
),
SizedBox(height: 16),
// Terms and Conditions Section
_buildSection(
title: 'Syarat dan Ketentuan',
content: _getDefaultTermsAndConditions(),
),
SizedBox(height: 24),
],
),
),
);
}
Widget _buildDetailItem({
required IconData icon,
required String label,
required String value,
}) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(icon, size: 16, color: AppColor.white.withOpacity(0.8)),
SizedBox(width: 4),
Text(
label,
style: AppStyle.xs.copyWith(
color: AppColor.white.withOpacity(0.8),
),
),
],
),
SizedBox(height: 4),
Text(
value,
style: AppStyle.sm.copyWith(
color: AppColor.white,
fontWeight: FontWeight.w600,
),
),
],
);
}
Widget _buildSection({required String title, required String content}) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 16),
padding: EdgeInsets.all(20),
decoration: BoxDecoration(
color: AppColor.backgroundLight,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: AppColor.borderLight),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: AppStyle.lg.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.textPrimary,
),
),
SizedBox(height: 12),
Text(
content,
style: AppStyle.md.copyWith(
color: AppColor.textSecondary,
height: 1.5,
),
),
],
),
);
}
void _copyVoucherCode(BuildContext context) {
// Implementation for copying voucher code
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Kode voucher berhasil disalin!',
style: AppStyle.md.copyWith(color: AppColor.white),
),
backgroundColor: AppColor.success,
behavior: SnackBarBehavior.floating,
margin: EdgeInsets.all(16),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
);
}
void _useVoucher(BuildContext context) {
// Implementation for using voucher
// Navigate back to checkout or shopping cart
context.router.back(); // Return true to indicate voucher was selected
}
String _getDefaultTermsAndConditions() {
return '''• Voucher hanya berlaku untuk pengguna baru
Tidak dapat digabungkan dengan promo lain
Berlaku untuk semua kategori produk
Voucher tidak dapat diuangkan
Voucher akan hangus jika tidak digunakan sebelum tanggal expired
Satu voucher hanya berlaku untuk satu kali transaksi
Voucher tidak berlaku untuk produk yang sudah didiskon
Kebijakan voucher dapat berubah sewaktu-waktu''';
}
}