diff --git a/lib/presentation/pages/draw/draw_page.dart b/lib/presentation/pages/draw/draw_page.dart index ad1d364..a2c90ab 100644 --- a/lib/presentation/pages/draw/draw_page.dart +++ b/lib/presentation/pages/draw/draw_page.dart @@ -107,10 +107,6 @@ class _DrawPageState extends State { }).toList(); } - bool _isUserEntered(String drawId) { - return userEntries.any((entry) => entry.drawId == drawId); - } - String _getTimeRemaining(DateTime targetDate) { final now = DateTime.now(); final difference = targetDate.difference(now); @@ -218,389 +214,82 @@ class _DrawPageState extends State { } Widget _buildSimpleDrawCard(DrawEvent draw) { - _isUserEntered(draw.id); final timeRemaining = _getTimeRemaining(draw.drawDate); return GestureDetector( onTap: () => context.router.push(DrawDetailRoute(drawEvent: draw)), child: Container( - margin: EdgeInsets.only(bottom: 16), + margin: EdgeInsets.only(bottom: 8), + padding: EdgeInsets.all(12), decoration: BoxDecoration( - color: AppColor.surface, - borderRadius: BorderRadius.circular(12), + gradient: LinearGradient( + colors: [draw.primaryColor, draw.primaryColor.withOpacity(0.8)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(8), boxShadow: [ BoxShadow( color: AppColor.black.withOpacity(0.08), - blurRadius: 12, - offset: Offset(0, 4), + blurRadius: 8, + offset: Offset(0, 2), ), ], ), - child: Column( + child: Row( children: [ - // Header with gradient background - Container( - height: 160, - width: double.infinity, - decoration: BoxDecoration( - gradient: LinearGradient( - colors: [ - draw.primaryColor, - draw.primaryColor.withOpacity(0.8), - ], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - borderRadius: BorderRadius.vertical(top: Radius.circular(12)), - ), - child: Stack( - children: [ - // Background pattern (coins and gold bar) - Positioned( - right: 20, - top: 20, - child: Opacity( - opacity: 0.3, - child: Column( - children: [ - Row( - children: [ - _buildCoin(), - SizedBox(width: 8), - _buildCoin(), - ], - ), - SizedBox(height: 8), - _buildGoldBar(), - ], - ), - ), - ), - - // Content - Padding( - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (draw.isActive) - Container( - padding: EdgeInsets.symmetric( - horizontal: 8, - vertical: 4, - ), - decoration: BoxDecoration( - color: AppColor.success, - borderRadius: BorderRadius.circular(4), - ), - child: Text( - "AKTIF", - style: AppStyle.xs.copyWith( - color: AppColor.textWhite, - fontWeight: FontWeight.bold, - ), - ), - ), - SizedBox(height: 8), - Text( - "MAKAN\nDAPAT", - style: AppStyle.h5.copyWith( - color: AppColor.textWhite, - fontWeight: FontWeight.bold, - height: 0.9, - ), - ), - SizedBox(height: 4), - Text( - draw.description, - style: AppStyle.sm.copyWith( - color: AppColor.textWhite, - ), - ), - ], - ), - ), - ], - ), - ), - - // Card content - Padding( - padding: EdgeInsets.all(16), + Expanded( child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Prize info - Row( - children: [ - Text(draw.icon, style: AppStyle.h5), - SizedBox(width: 8), - Text( - draw.prize, - style: AppStyle.lg.copyWith( - fontWeight: FontWeight.bold, - color: AppColor.textPrimary, - ), - ), - ], - ), - - SizedBox(height: 16), - - // Stats row - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - children: [ - Text( - "-", - style: AppStyle.h5.copyWith( - fontWeight: FontWeight.bold, - color: AppColor.textPrimary, - ), - ), - Text( - "Peserta", - style: AppStyle.sm.copyWith( - color: AppColor.textSecondary, - ), - ), - ], - ), - Column( - children: [ - Text( - "${draw.hadiah}", - style: AppStyle.h5.copyWith( - fontWeight: FontWeight.bold, - color: AppColor.textPrimary, - ), - ), - Text( - "Hadiah", - style: AppStyle.sm.copyWith( - color: AppColor.textSecondary, - ), - ), - ], - ), - Column( - children: [ - Text( - "0", - style: AppStyle.h5.copyWith( - fontWeight: FontWeight.bold, - color: AppColor.error, - ), - ), - Text( - "Voucher Anda", - style: AppStyle.sm.copyWith( - color: AppColor.textSecondary, - ), - ), - ], - ), - ], - ), - - SizedBox(height: 16), - - // Timer - if (draw.isActive) - Row( - children: [ - Icon( - Icons.access_time, - color: AppColor.error, - size: 16, - ), - SizedBox(width: 4), - Text( - "Berakhir dalam:", - style: AppStyle.md.copyWith( - color: AppColor.textPrimary, - ), - ), - Spacer(), - Text( - timeRemaining, - style: AppStyle.lg.copyWith( - fontWeight: FontWeight.bold, - color: AppColor.error, - ), - ), - ], + // Name + Text( + draw.name, + style: AppStyle.md.copyWith( + fontWeight: FontWeight.w600, + color: AppColor.textWhite, ), - - SizedBox(height: 12), - - // Spending requirement - GestureDetector( - onTap: () => _showSpendingInfo(draw), - child: Container( - padding: EdgeInsets.symmetric( - vertical: 12, - horizontal: 16, - ), - decoration: BoxDecoration( - color: AppColor.backgroundLight, - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: AppColor.borderLight, - width: 1, - ), - ), - child: Row( - children: [ - Expanded( - child: Text( - "Belanja min. Rp ${_formatCurrency(draw.minSpending)} untuk berpartisipasi", - style: AppStyle.sm.copyWith( - color: AppColor.textSecondary, - ), - ), - ), - Icon( - Icons.chevron_right, - color: AppColor.textSecondary, - size: 16, - ), - ], - ), + ), + SizedBox(height: 4), + // Description + Text( + draw.description, + style: AppStyle.sm.copyWith( + color: AppColor.textWhite.withOpacity(0.9), + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + SizedBox(height: 6), + // Date + Text( + draw.isActive ? "Berakhir: $timeRemaining" : "Selesai", + style: AppStyle.xs.copyWith( + color: AppColor.textWhite.withOpacity(0.8), + fontWeight: FontWeight.w500, ), ), ], ), ), - ], - ), - ), - ); - } - - Widget _buildCoin() { - return Container( - width: 20, - height: 20, - decoration: BoxDecoration( - color: AppColor.warning, - shape: BoxShape.circle, - border: Border.all(color: Colors.yellow, width: 1), - ), - child: Center( - child: Text( - "₹", - style: AppStyle.xs.copyWith( - color: Colors.orange[800], - fontWeight: FontWeight.bold, - ), - ), - ), - ); - } - - Widget _buildGoldBar() { - return Container( - width: 30, - height: 15, - decoration: BoxDecoration( - color: AppColor.warning, - borderRadius: BorderRadius.circular(2), - border: Border.all(color: Colors.yellow, width: 1), - ), - child: Center( - child: Text( - "GOLD", - style: TextStyle( - color: Colors.orange[800], - fontSize: 6, - fontWeight: FontWeight.bold, - ), - ), - ), - ); - } - - String _formatCurrency(int amount) { - return amount.toString().replaceAllMapped( - RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), - (Match m) => '${m[1]}.', - ); - } - - void _showSpendingInfo(DrawEvent draw) { - showDialog( - context: context, - builder: (context) => AlertDialog( - backgroundColor: AppColor.surface, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), - title: Text( - "Syarat Partisipasi", - style: AppStyle.lg.copyWith( - fontWeight: FontWeight.w600, - color: AppColor.textPrimary, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Untuk mengikuti undian ${draw.name}, Anda perlu:", - style: AppStyle.md.copyWith(color: AppColor.textPrimary), - ), - SizedBox(height: 12), - Row( + // Price + Column( + crossAxisAlignment: CrossAxisAlignment.end, children: [ - Icon(Icons.shopping_cart, color: draw.primaryColor, size: 20), - SizedBox(width: 8), - Expanded( - child: Text( - "Belanja minimum Rp ${_formatCurrency(draw.minSpending)}", - style: AppStyle.md.copyWith( - fontWeight: FontWeight.w600, - color: AppColor.textPrimary, - ), - ), - ), - ], - ), - SizedBox(height: 8), - Row( - children: [ - Icon(Icons.schedule, color: draw.primaryColor, size: 20), - SizedBox(width: 8), - Expanded( - child: Text( - "Sebelum ${_formatDateTime(draw.drawDate)}", - style: AppStyle.md.copyWith( - fontWeight: FontWeight.w600, - color: AppColor.textPrimary, - ), + Text(draw.icon, style: AppStyle.lg), + SizedBox(height: 2), + Text( + draw.prize, + style: AppStyle.sm.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textWhite, ), ), ], ), ], ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: Text( - "Mengerti", - style: AppStyle.md.copyWith( - color: AppColor.primary, - fontWeight: FontWeight.w600, - ), - ), - ), - ], ), ); } - - String _formatDateTime(DateTime date) { - return "${date.day}/${date.month}/${date.year} ${date.hour.toString().padLeft(2, '0')}:${date.minute.toString().padLeft(2, '0')}"; - } }