import 'package:flutter/material.dart'; import 'package:material_symbols_icons/material_symbols_icons.dart'; class AccountStatementScreen extends StatefulWidget { const AccountStatementScreen({super.key}); @override State createState() => _AccountStatementScreen(); } class _AccountStatementScreen extends State { DateTime? fromDate; DateTime? toDate; final _amountRangeController = TextEditingController(text: ""); final transactions = [ { "desc": "Transfer From ICICI Bank subsidy", "amount": "+₹133.98", "type": "Cr", "time": "21-02-2024 13:09:30" }, { "desc": "Mobile recharge", "amount": "-₹299.00", "type": "Dr", "time": "21-02-2024 13:09:30" }, { "desc": "NEFT received from Jaya Saha", "amount": "+₹987.80", "type": "Cr", "time": "21-02-2024 13:09:30" }, { "desc": "Transfer From ICICI Bank subsidy", "amount": "+₹100.00", "type": "Cr", "time": "21-02-2024 13:09:30" }, { "desc": "Transfer From ICICI Bank subsidy", "amount": "-₹100.00", "type": "Dr", "time": "21-02-2024 13:09:30" }, { "desc": "Transfer From ICICI Bank subsidy", "amount": "+₹100.00", "type": "Cr", "time": "21-02-2024 13:09:30" }, { "desc": "Transfer From ICICI Bank subsidy", "amount": "+₹100.00", "type": "Cr", "time": "21-02-2024 13:09:30" }, ]; Future _selectFromDate(BuildContext context) async { final DateTime now = DateTime.now(); final DateTime? picked = await showDatePicker( context: context, initialDate: fromDate ?? now, firstDate: DateTime(2020), // or your app's start limit lastDate: now, // No future date ); if (picked != null) { setState(() { fromDate = picked; toDate = null; // reset toDate when fromDate changes }); } } Future _selectToDate(BuildContext context) async { if (fromDate == null) { ScaffoldMessenger.of(context).showSnackBar(const SnackBar( content: Text('Please select From Date first'), )); return; } final DateTime now = DateTime.now(); final DateTime lastAllowedDate = fromDate!.add(const Duration(days: 31)); final DateTime maxToDate = lastAllowedDate.isBefore(now) ? lastAllowedDate : now; final DateTime? picked = await showDatePicker( context: context, initialDate: toDate ?? fromDate!, firstDate: fromDate!, // 🔒 can't be before fromDate lastDate: maxToDate, // 🔒 not more than 1 month or future ); if (picked != null) { setState(() { toDate = picked; }); } } String _formatDate(DateTime date) { return "${date.day.toString().padLeft(2, '0')}-" "${date.month.toString().padLeft(2, '0')}-" "${date.year}"; } @override void dispose() { _amountRangeController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: IconButton( icon: const Icon(Symbols.arrow_back_ios_new), onPressed: () { Navigator.pop(context); }, ), title: const Text( 'Account Statement', style: TextStyle(color: Colors.black, fontWeight: FontWeight.w500), ), centerTitle: false, actions: const [ Padding( padding: EdgeInsets.only(right: 10.0), child: CircleAvatar( backgroundImage: AssetImage('assets/images/avatar.jpg'), // Replace with your image radius: 20, ), ), ], ), body: Padding( padding: const EdgeInsets.all(12.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Filters', style: TextStyle(fontSize: 17), ), const SizedBox( height: 15, ), Row( children: [ Expanded(child: GestureDetector( onTap: () => _selectFromDate(context), child: buildDateBox("From Date", fromDate), ),), const SizedBox(width: 10), Expanded(child: GestureDetector( onTap: () => _selectToDate(context), child: buildDateBox("To Date", toDate), ),), ], ), const SizedBox(height: 20), Row( children: [ Expanded( child: _buildFilterBox(""), ), const SizedBox( width: 8, ), SizedBox( width: 75, child: ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).primaryColor, ), child: const Text( 'Go', style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600), )), ) ], ), const SizedBox(height: 35), Expanded( child: ListView.builder( itemCount: transactions.length, itemBuilder: (context, index) { final txn = transactions[index]; return _buildTransactionTile(txn); }, ), ), ], ), ), ); } Widget buildDateBox(String label, DateTime? date) { return Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16), decoration: BoxDecoration( border: Border.all(color: Colors.grey), borderRadius: BorderRadius.circular(6), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( date != null ? _formatDate(date) : label, style: TextStyle(fontSize: 16, color: date != null ? Colors.black: Colors.grey), ), const Icon(Icons.arrow_drop_down), ], ), ); } Widget _buildFilterBox(String text) { return TextFormField( controller: _amountRangeController, decoration: const InputDecoration( labelText: 'Amount Range', // prefixIcon: Icon(Icons.person), border: OutlineInputBorder(), isDense: true, filled: true, fillColor: Colors.white, enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: Colors.black), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 2), ), ), keyboardType: TextInputType.number, textInputAction: TextInputAction.next, validator: (value) { if (value == null || value.isEmpty) { return 'Please enter amount range'; } return null; }, ); } Widget _buildTransactionTile(Map txn) { final isCredit = txn['type'] == "Cr"; final amountColor = isCredit ? Colors.green : Colors.red; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(txn['time']!, style: const TextStyle(color: Colors.grey)), const SizedBox(height: 4), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text(txn['desc']!, style: const TextStyle(fontSize: 16))), Text( "${txn['amount']} ${txn['type']}", style: TextStyle(color: amountColor, fontWeight: FontWeight.bold), ), ], ), const SizedBox(height: 25), ], ); } }