import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get_it/get_it.dart'; import 'package:okane/database/collections/recurrent.dart'; import 'package:okane/database/database.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) => t.isDue(today)).toList(); final List upcoming = upcomingRaw.isEmpty ? List.empty() : upcomingRaw.sublist(0, min(upcomingRaw.length, 3)); final transactions = upcoming.isEmpty ? [ Text( "No upcoming transactions", style: Theme.of(context).textTheme.bodyLarge, ), ] : upcoming .map( (t) => ListTile( title: Text( "${t.template.value!.name} (${t.template.value!.amount}€)", ), subtitle: Text( "Due in ${today.difference(t.lastExecution ?? today).inDays} days", ), leading: Icon( t.template.value!.amount < 0 ? Icons.remove : Icons.add, color: t.template.value!.amount < 0 ? Colors.red : Colors.green, ), trailing: IconButton( icon: Icon(Icons.play_arrow), onPressed: () { showDialogOrModal( context: context, builder: (context) => AddTransactionWidget( activeAccountItem: bloc.activeAccount!, template: t.template.value!, onAdd: (transaction) async { // Update the recurring template print(transaction.date); t.lastExecution = transaction.date; await upsertRecurringTransaction(t); Navigator.of(context).pop(); }, ), ); }, ), ), ) .toList(); return ResponsiveCard( titleText: "Upcoming Transactions", child: Padding( padding: const EdgeInsets.all(16), child: Column(children: transactions), ), ); }, ); } }