diff --git a/lib/domains/transaction/transaction_bloc.dart b/lib/domains/transaction/transaction_bloc.dart index 39e40f5..6605e0a 100644 --- a/lib/domains/transaction/transaction_bloc.dart +++ b/lib/domains/transaction/transaction_bloc.dart @@ -37,6 +37,7 @@ class TransactionBloc extends Bloc { on(_onTransactionDeleteCurrent); on(_onTransactionFilterCategory); on(_onTransactionFilterAccount); + on(_onTransactionResetSnackBar); _transactionsRepository .getTransactionsStream() @@ -181,6 +182,9 @@ class TransactionBloc extends Bloc { transactionsLinesFiltered: _applyFilters(computeResult.list), globalTotal: computeResult.globalTotal, accountsTotals: computeResult.accountsTotals, + showSnackBar: true, + snackBarIsError: false, + snackBarMessage: 'Transaction ${currentTransaction == null ? 'added' : 'updated'} !', )); } } @@ -231,6 +235,9 @@ class TransactionBloc extends Bloc { transactionsLinesFiltered: _applyFilters(computeResult.list), globalTotal: computeResult.globalTotal, accountsTotals: computeResult.accountsTotals, + showSnackBar: true, + snackBarIsError: false, + snackBarMessage: 'Transaction removed !', )); } } @@ -296,4 +303,12 @@ class TransactionBloc extends Bloc { return transactionsLinesFiltered; } + + FutureOr _onTransactionResetSnackBar(TransactionResetSnackBar event, Emitter emit) { + emit(state.copyWith( + showSnackBar: false, + snackBarIsError: false, + snackBarMessage: '', + )); + } } \ No newline at end of file diff --git a/lib/domains/transaction/transaction_event.dart b/lib/domains/transaction/transaction_event.dart index 2b7ce6f..ffa0d73 100644 --- a/lib/domains/transaction/transaction_event.dart +++ b/lib/domains/transaction/transaction_event.dart @@ -83,4 +83,8 @@ final class TransactionFilterAccount extends TransactionEvent { final Account? account; const TransactionFilterAccount(this.account); +} + +final class TransactionResetSnackBar extends TransactionEvent { + const TransactionResetSnackBar(); } \ No newline at end of file diff --git a/lib/domains/transaction/transaction_state.dart b/lib/domains/transaction/transaction_state.dart index ce334ca..7e6868e 100644 --- a/lib/domains/transaction/transaction_state.dart +++ b/lib/domains/transaction/transaction_state.dart @@ -20,6 +20,10 @@ final class TransactionState extends Equatable { final Transaction? currentTransaction; + final bool showSnackBar; + final String snackBarMessage; + final bool snackBarIsError; + const TransactionState({ this.globalTotal = 0, this.accountsTotals = const {}, @@ -36,6 +40,9 @@ final class TransactionState extends Equatable { this.currentTransaction, this.categoryFilter, this.accountFilter, + this.showSnackBar = false, + this.snackBarMessage = '', + this.snackBarIsError = false, }); TransactionState copyWith({ @@ -54,6 +61,9 @@ final class TransactionState extends Equatable { Transaction? currentTransaction, Category? categoryFilter, Account? accountFilter, + bool? showSnackBar, + String? snackBarMessage, + bool? snackBarIsError, }) { return TransactionState( globalTotal: globalTotal ?? this.globalTotal, @@ -71,6 +81,9 @@ final class TransactionState extends Equatable { currentTransaction: currentTransaction ?? this.currentTransaction, categoryFilter: categoryFilter ?? this.categoryFilter, accountFilter: accountFilter ?? this.accountFilter, + showSnackBar: showSnackBar ?? this.showSnackBar, + snackBarMessage: snackBarMessage ?? this.snackBarMessage, + snackBarIsError: snackBarIsError ?? this.snackBarIsError, ); } @@ -89,6 +102,9 @@ final class TransactionState extends Equatable { currentTransaction, categoryFilter, accountFilter, + showSnackBar, + snackBarMessage, + snackBarIsError, ]; } \ No newline at end of file diff --git a/lib/pages/transactions/transactions_page.dart b/lib/pages/transactions/transactions_page.dart index 5e6d46c..7141cf4 100644 --- a/lib/pages/transactions/transactions_page.dart +++ b/lib/pages/transactions/transactions_page.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:krezus/domains/transaction/transaction_bloc.dart'; import 'package:krezus/pages/transactions/widgets/transactions_actions.dart'; import 'package:krezus/pages/transactions/widgets/transactions_header.dart'; import 'package:krezus/pages/transactions/widgets/transactions_list.dart'; @@ -9,20 +11,34 @@ class TransactionsPage extends StatelessWidget { @override Widget build(BuildContext context) { MediaQueryData mediaQuery = MediaQuery.of(context); - return Center( - child: Container( - constraints: const BoxConstraints( - maxWidth: 1000 + return BlocListener( + listenWhen: (previous, current) => previous.showSnackBar != current.showSnackBar, + listener: (context, state) { + if (state.showSnackBar) { + ScaffoldMessenger + .of(context) + .showSnackBar( + SnackBar( + backgroundColor: state.snackBarIsError ? Colors.red : Colors.green, + content: Text(state.snackBarMessage), + ), + ); + context.read().add(const TransactionResetSnackBar()); + } + }, + child: Center( + child: Container( + constraints: const BoxConstraints(maxWidth: 1000), + padding: mediaQuery.padding, + child: const Column( + children: [ + TransactionsActions(), + TransactionsHeader(), + TransactionsList(), + ], + ), ), - padding: mediaQuery.padding, - child: const Column( - children: [ - TransactionsActions(), - TransactionsHeader(), - TransactionsList(), - ], - ), - ) + ), ); } -} \ No newline at end of file +} diff --git a/lib/pages/transactions/widgets/transaction_add_dialog.dart b/lib/pages/transactions/widgets/transaction_add_dialog.dart index ec0c386..96dc0b7 100644 --- a/lib/pages/transactions/widgets/transaction_add_dialog.dart +++ b/lib/pages/transactions/widgets/transaction_add_dialog.dart @@ -21,8 +21,8 @@ class TransactionAddDialog extends StatelessWidget { BlocProvider.value(value: BlocProvider.of(context)), BlocProvider.value(value: BlocProvider.of(context)), ], - child: const TransactionAddDialog() - ) + child: const TransactionAddDialog(), + ), ); } @@ -32,18 +32,18 @@ class TransactionAddDialog extends StatelessWidget { final actions = [ IconButton( onPressed: () => TransactionAddDialog.hide(context), - icon: const Icon(Icons.close) + icon: const Icon(Icons.close), ), IconButton( onPressed: () => context.read().add(const TransactionAdd()), - icon: const Icon(Icons.save) + icon: const Icon(Icons.save), ), ]; if (currentTransaction != null) { actions.add(IconButton( onPressed: () => context.read().add(const TransactionDeleteCurrent()), - icon: const Icon(Icons.delete) + icon: const Icon(Icons.delete), )); } @@ -57,8 +57,8 @@ class TransactionAddDialog extends StatelessWidget { builder: (context, state) => AlertDialog( title: Text(state.currentTransaction == null ? 'Add Transaction' : 'Edit Transaction'), actions: _computeActions(context, state.currentTransaction), - content: const TransactionForm() - ) + content: const TransactionForm(), + ), ); } } \ No newline at end of file