import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get_it/get_it.dart'; import 'package:okane/database/collections/account.dart'; import 'package:okane/database/collections/beneficiary.dart'; import 'package:okane/database/database.dart'; import 'package:okane/ui/pages/account/breakdown_card.dart'; import 'package:okane/ui/pages/account/total_balance_card.dart'; import 'package:okane/ui/pages/account/upcoming_transactions_card.dart'; import 'package:okane/ui/state/core.dart'; import 'package:okane/ui/utils.dart'; import 'package:okane/ui/widgets/piechart.dart'; import 'package:okane/ui/widgets/piechart_card.dart'; class AccountListPage extends StatefulWidget { final bool isPage; const AccountListPage({required this.isPage, super.key}); @override AccountListPageState createState() => AccountListPageState(); } class AccountListPageState extends State { final TextEditingController _accountNameController = TextEditingController(); @override Widget build(BuildContext context) { return Stack( children: [ ListView( children: [ Padding( padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: Text( "Accounts", style: Theme.of(context).textTheme.titleLarge, ), ), Padding( padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: BlocBuilder( builder: (context, state) => SizedBox( child: SizedBox( height: 100, child: ListView.builder( scrollDirection: Axis.horizontal, itemCount: state.accounts.length, itemBuilder: (context, index) => SizedBox( width: 150, height: 100, child: Card( color: colorHash(state.accounts[index].name!), shape: index == state.activeAccountIndex ? RoundedRectangleBorder( side: BorderSide( color: Colors.black, width: 2, ), borderRadius: BorderRadius.circular( 12, ), ) : null, child: InkWell( onTap: () { GetIt.I .get() .setActiveAccountIndex(index); }, child: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ Text(state.accounts[index].name!), FutureBuilder( future: getTotalBalance( state.accounts[index], ), builder: (context, snapshot) { if (!snapshot.hasData) { return Container(); } return Text( formatCurrency(snapshot.data!), ); }, ), ], ), ), ), ), ), ), ), ), ), ), Padding( padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8), child: TotalBalanceCard(), ), Padding( padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8), child: UpcomingTransactionsCard(), ), Wrap( children: [ Padding( padding: EdgeInsets.all(8), //child: BreakdownCard(), child: PieChartCard( titleText: "Spending Breakdown", fallbackText: "No spending available", items: [], ), ), ], ), ], ), Positioned( right: 16, bottom: 16, child: FloatingActionButton( child: Icon(Icons.add), onPressed: () { showDialogOrModal( context: context, builder: (ctx) => Padding( padding: EdgeInsets.symmetric(horizontal: 16), child: Column( mainAxisSize: MainAxisSize.min, children: [ Padding( padding: EdgeInsets.symmetric( vertical: 8, horizontal: 16, ), child: TextField( controller: _accountNameController, decoration: InputDecoration( hintText: "Account name", ), ), ), OutlinedButton( onPressed: () async { if (_accountNameController.text.isEmpty) return; final a = Account()..name = _accountNameController.text; final b = Beneficiary() ..name = _accountNameController.text ..account.value = GetIt.I.get().activeAccount ..type = BeneficiaryType.account; await upsertAccount(a); await upsertBeneficiary(b); _accountNameController.text = ""; Navigator.of(context).pop(); }, child: Text("Add"), ), ], ), ), ); }, ), ), ], ); } }