import 'package:flutter/material.dart'; class HistoryScreen extends StatefulWidget { const HistoryScreen({super.key}); @override State createState() => _HistoryScreenState(); } class _HistoryScreenState extends State { final List> _transactions = [ { 'title': 'Electricity Bill', 'amount': -120.00, 'date': 'Today', 'icon': Icons.electric_bolt, 'status': 'Completed', }, { 'title': 'Internet Bill', 'amount': -75.00, 'date': 'Yesterday', 'icon': Icons.wifi, 'status': 'Completed', }, { 'title': 'Mobile Bill', 'amount': -50.00, 'date': '2 days ago', 'icon': Icons.phone_android, 'status': 'Completed', }, { 'title': 'Water Bill', 'amount': -45.00, 'date': '3 days ago', 'icon': Icons.water_drop, 'status': 'Completed', }, { 'title': 'Gas Bill', 'amount': -65.00, 'date': '4 days ago', 'icon': Icons.local_fire_department, 'status': 'Completed', }, ]; String _selectedFilter = 'All'; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Transaction History'), actions: [ IconButton( icon: const Icon(Icons.filter_list), onPressed: _showFilterDialog, ), ], ), body: Column( children: [ _buildFilterChips(), Expanded( child: ListView.builder( padding: const EdgeInsets.all(16), itemCount: _transactions.length, itemBuilder: (context, index) { final transaction = _transactions[index]; return _buildTransactionCard(transaction, index); }, ), ), ], ), ); } Widget _buildFilterChips() { return SingleChildScrollView( scrollDirection: Axis.horizontal, padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: Row( children: [ _buildFilterChip('All'), _buildFilterChip('Bills'), _buildFilterChip('Payments'), _buildFilterChip('Transfers'), ], ), ); } Widget _buildFilterChip(String label) { final isSelected = _selectedFilter == label; return Padding( padding: const EdgeInsets.only(right: 8), child: FilterChip( selected: isSelected, label: Text(label), onSelected: (selected) { setState(() { _selectedFilter = label; }); }, backgroundColor: Theme.of(context).colorScheme.surface, selectedColor: Theme.of(context).colorScheme.primary.withOpacity(0.2), checkmarkColor: Theme.of(context).colorScheme.primary, labelStyle: TextStyle( color: isSelected ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onSurface, ), ), ); } Widget _buildTransactionCard(Map transaction, int index) { return Card( margin: const EdgeInsets.only(bottom: 16), child: InkWell( onTap: () => _showTransactionDetails(transaction), borderRadius: BorderRadius.circular(16), child: Padding( padding: const EdgeInsets.all(16), child: Row( children: [ Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Theme.of(context).colorScheme.primary.withOpacity(0.1), borderRadius: BorderRadius.circular(12), ), child: Icon( transaction['icon'] as IconData, color: Theme.of(context).colorScheme.primary, ), ), const SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( transaction['title'] as String, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 16, ), ), const SizedBox(height: 4), Text( transaction['date'] as String, style: TextStyle( color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6), fontSize: 14, ), ), ], ), ), Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( '\$${transaction['amount'].abs().toStringAsFixed(2)}', style: TextStyle( color: transaction['amount'] < 0 ? Theme.of(context).colorScheme.error : Colors.green, fontWeight: FontWeight.bold, fontSize: 16, ), ), const SizedBox(height: 4), Container( padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 4, ), decoration: BoxDecoration( color: Colors.green.withOpacity(0.1), borderRadius: BorderRadius.circular(8), ), child: Text( transaction['status'] as String, style: const TextStyle( color: Colors.green, fontSize: 12, fontWeight: FontWeight.w500, ), ), ), ], ), ], ), ), ), ); } void _showFilterDialog() { showModalBottomSheet( context: context, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(20)), ), builder: (context) { return Padding( padding: const EdgeInsets.all(16), child: Column( mainAxisSize: MainAxisSize.min, children: [ const Text( 'Filter Transactions', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 16), _buildFilterOption('All Transactions'), _buildFilterOption('Bills Only'), _buildFilterOption('Payments Only'), _buildFilterOption('Transfers Only'), const SizedBox(height: 16), ], ), ); }, ); } Widget _buildFilterOption(String option) { return ListTile( title: Text(option), trailing: _selectedFilter == option ? Icon( Icons.check_circle, color: Theme.of(context).colorScheme.primary, ) : null, onTap: () { setState(() { _selectedFilter = option; }); Navigator.pop(context); }, ); } void _showTransactionDetails(Map transaction) { showModalBottomSheet( context: context, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(20)), ), builder: (context) { return Padding( padding: const EdgeInsets.all(24), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Theme.of(context).colorScheme.primary.withOpacity(0.1), borderRadius: BorderRadius.circular(12), ), child: Icon( transaction['icon'] as IconData, color: Theme.of(context).colorScheme.primary, size: 32, ), ), const SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( transaction['title'] as String, style: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 4), Text( transaction['date'] as String, style: TextStyle( color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6), ), ), ], ), ), ], ), const SizedBox(height: 24), _buildDetailRow('Amount', '\$${transaction['amount'].abs().toStringAsFixed(2)}'), _buildDetailRow('Status', transaction['status'] as String), _buildDetailRow('Transaction ID', '#${DateTime.now().millisecondsSinceEpoch}'), const SizedBox(height: 24), SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () { Navigator.pop(context); }, child: const Text('Close'), ), ), ], ), ); }, ); } Widget _buildDetailRow(String label, String value) { return Padding( padding: const EdgeInsets.only(bottom: 16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( label, style: TextStyle( color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6), ), ), Text( value, style: const TextStyle( fontWeight: FontWeight.w500, ), ), ], ), ); } }