import 'dart:math'; import 'package:drift/drift.dart' show Value; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get_it/get_it.dart'; import 'package:okane/database/sqlite.dart'; import 'package:okane/i18n/strings.g.dart'; import 'package:okane/ui/state/core.dart'; import 'package:okane/ui/utils.dart'; import 'package:okane/ui/widgets/add_transaction.dart'; import 'package:okane/ui/widgets/piechart_card.dart'; class UpcomingTransactionsCard extends StatelessWidget { const UpcomingTransactionsCard({super.key}); @override Widget build(BuildContext context) { final bloc = GetIt.I.get(); return BlocBuilder( builder: (context, state) { final today = DateTime.now(); final upcomingRaw = state.recurringTransactions .where((t) => isTransactionDue(t.recurring, today)) .toList(); final List upcoming = upcomingRaw.isEmpty ? List.empty() : upcomingRaw.sublist(0, min(upcomingRaw.length, 3)); final transactions = upcoming.isEmpty ? [ Text( t .pages .accounts .upcomingTransactions .noUpcomingTransactions, style: Theme.of(context).textTheme.bodyLarge, ), ] : upcoming .map( (transaction) => ListTile( title: Text( t.pages.accounts.upcomingTransactions.items.title( name: transaction.template.name, amount: "${formatCurrency(transaction.template.amount)}€", ), ), subtitle: Text( t.pages.accounts.upcomingTransactions.items.dueIn( number: today .difference( transaction.recurring.lastExecution ?? today, ) .inDays, ), ), leading: Icon( transaction.template.amount < 0 ? Icons.remove : Icons.add, color: transaction.template.amount < 0 ? Colors.red : Colors.green, ), trailing: IconButton( icon: Icon(Icons.play_arrow), onPressed: () { showDialogOrModal( context: context, builder: (context) => AddTransactionWidget( activeAccountItem: bloc.activeAccount!, template: ( template: transaction.template, beneficiary: transaction.beneficiary, expenseCategory: null, ), onAdd: (newTransaction) async { // Update the recurring template await GetIt.I .get() .recurringTransactionsDao .upsertRecurringTransaction( transaction.recurring .copyWith( lastExecution: Value( newTransaction .transaction .date, ), ) .toCompanion(true), ); Navigator.of(context).pop(); }, ), ); }, ), ), ) .toList(); return ResponsiveCard( titleText: t.pages.accounts.upcomingTransactions.title, child: Padding( padding: const EdgeInsets.all(16), child: Column(children: transactions), ), ); }, ); } }