import 'package:flutter/material.dart'; import 'package:line_icons/line_icons.dart'; import '../../../../common/theme/theme.dart'; class PurchaseTile extends StatelessWidget { final Map purchase; final int index; const PurchaseTile({super.key, required this.purchase, required this.index}); @override Widget build(BuildContext context) { Color statusColor; switch (purchase['status']) { case 'Completed': statusColor = AppColor.success; break; case 'Pending': statusColor = AppColor.warning; break; case 'Cancelled': statusColor = AppColor.error; break; default: statusColor = AppColor.textSecondary; } return AnimatedContainer( duration: Duration(milliseconds: 300 + (index * 50)), curve: Curves.easeOutCubic, margin: const EdgeInsets.only(bottom: 16), child: Material( elevation: 0, borderRadius: BorderRadius.circular(20), child: Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( gradient: LinearGradient( colors: [AppColor.surface, AppColor.surface.withOpacity(0.95)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(20), border: Border.all( color: AppColor.border.withOpacity(0.2), width: 1, ), boxShadow: [ BoxShadow( color: AppColor.primary.withOpacity(0.08), blurRadius: 25, offset: const Offset(0, 10), spreadRadius: 0, ), BoxShadow( color: AppColor.black.withOpacity(0.04), blurRadius: 10, offset: const Offset(0, 4), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 6, ), decoration: BoxDecoration( gradient: LinearGradient( colors: AppColor.primaryGradient, begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: AppColor.primary.withOpacity(0.3), blurRadius: 8, offset: const Offset(0, 2), ), ], ), child: Text( purchase['id'], style: AppStyle.sm.copyWith( fontWeight: FontWeight.w700, color: AppColor.textWhite, ), ), ), Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 8, ), decoration: BoxDecoration( gradient: LinearGradient( colors: [ statusColor.withOpacity(0.15), statusColor.withOpacity(0.05), ], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(16), border: Border.all( color: statusColor.withOpacity(0.2), width: 1, ), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Container( width: 8, height: 8, decoration: BoxDecoration( shape: BoxShape.circle, color: statusColor, ), ), const SizedBox(width: 6), Text( purchase['status'], style: AppStyle.xs.copyWith( color: statusColor, fontWeight: FontWeight.w700, ), ), ], ), ), ], ), const SizedBox(height: 16), Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: AppColor.background.withOpacity(0.5), borderRadius: BorderRadius.circular(12), border: Border.all( color: AppColor.border.withOpacity(0.3), width: 1, ), ), child: Column( children: [ Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: AppColor.primary.withOpacity(0.1), borderRadius: BorderRadius.circular(8), ), child: Icon( LineIcons.building, color: AppColor.primary, size: 16, ), ), const SizedBox(width: 12), Expanded( child: Text( purchase['supplier'], style: AppStyle.md.copyWith( color: AppColor.textPrimary, fontWeight: FontWeight.w600, ), ), ), ], ), const SizedBox(height: 12), Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: AppColor.info.withOpacity(0.1), borderRadius: BorderRadius.circular(8), ), child: Icon( LineIcons.calendar, color: AppColor.info, size: 16, ), ), const SizedBox(width: 12), Text( purchase['date'], style: AppStyle.sm.copyWith( color: AppColor.textSecondary, fontWeight: FontWeight.w500, ), ), const Spacer(), Container( padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 4, ), decoration: BoxDecoration( color: AppColor.secondary.withOpacity(0.1), borderRadius: BorderRadius.circular(8), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon( LineIcons.shoppingBag, color: AppColor.secondary, size: 14, ), const SizedBox(width: 4), Text( '${purchase['items']} items', style: AppStyle.xs.copyWith( color: AppColor.secondary, fontWeight: FontWeight.w600, ), ), ], ), ), ], ), ], ), ), const SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Total Pembelian', style: AppStyle.xs.copyWith( color: AppColor.textSecondary, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 4), Text( 'Rp ${purchase['total'].toString().replaceAllMapped(RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) => '${m[1]}.')}', style: AppStyle.lg.copyWith( fontWeight: FontWeight.w800, color: AppColor.primary, ), ), ], ), Row( children: [ _buildActionButton(LineIcons.eye, AppColor.info, () {}), const SizedBox(width: 8), _buildActionButton( LineIcons.edit, AppColor.warning, () {}, ), const SizedBox(width: 8), _buildActionButton( LineIcons.trash, AppColor.error, () {}, ), ], ), ], ), ], ), ), ), ); } Widget _buildActionButton( IconData icon, Color color, VoidCallback onPressed, ) { return Container( width: 40, height: 40, decoration: BoxDecoration( gradient: LinearGradient( colors: [color.withOpacity(0.15), color.withOpacity(0.05)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(12), border: Border.all(color: color.withOpacity(0.2), width: 1), ), child: Material( color: Colors.transparent, child: InkWell( borderRadius: BorderRadius.circular(12), onTap: onPressed, child: Center(child: Icon(icon, color: color, size: 18)), ), ), ); } }