From 0c270824d9f20cb8a96ece7e4aecadd3dc3eb4dd Mon Sep 17 00:00:00 2001 From: Florian Schindler <florianschndlr@gmail.com> Date: Tue, 27 Jun 2023 12:48:22 +0200 Subject: [PATCH] add transaction ability to add and edit transaction - transactions are now read from hive and saved to hive --- trackeroo/lib/app_scaffold.dart | 6 ++- trackeroo/lib/frontend/views/home_view.dart | 32 +++++++++-- trackeroo/lib/logic/services/locator.dart | 3 +- .../services/transactions_controller.dart | 54 ++++++++++++++----- 4 files changed, 74 insertions(+), 21 deletions(-) diff --git a/trackeroo/lib/app_scaffold.dart b/trackeroo/lib/app_scaffold.dart index 455d9f0..c5f3f88 100644 --- a/trackeroo/lib/app_scaffold.dart +++ b/trackeroo/lib/app_scaffold.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:trackeroo/frontend/views/edit_transaction_view.dart'; import 'package:trackeroo/frontend/views/home_view.dart'; import 'package:trackeroo/frontend/views/details_view.dart'; import 'package:trackeroo/frontend/views/category_view.dart'; @@ -78,7 +79,10 @@ class _AppScaffoldState extends State<AppScaffold> { floatingActionButton: FloatingActionButton( onPressed: () { if(index == 0 || index == 1) { - // add tranaction + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const EditTransactionView()) + ); } if(index == 2) { // add category diff --git a/trackeroo/lib/frontend/views/home_view.dart b/trackeroo/lib/frontend/views/home_view.dart index 9b1b702..9b9ccb4 100644 --- a/trackeroo/lib/frontend/views/home_view.dart +++ b/trackeroo/lib/frontend/views/home_view.dart @@ -1,8 +1,11 @@ import 'package:flutter/material.dart'; import 'package:fl_chart/fl_chart.dart'; +import 'package:hive_flutter/hive_flutter.dart'; import 'package:trackeroo/frontend/utils/transaction_listtile.dart'; import 'package:trackeroo/frontend/views/onboarding_view.dart'; import 'package:trackeroo/logic/models/transaction.dart'; +import 'package:trackeroo/logic/services/locator.dart'; +import 'package:trackeroo/logic/services/transactions_controller.dart'; enum Timespan { daily, weekly, monthly, yearly, all } @@ -18,6 +21,7 @@ class _HomeViewState extends State<HomeView> { Transaction trp = Transaction(title: "Gehalt", amount: 1300, categoryId: 'leisure_and_entertainment', dueDate: DateTime.now()); Timespan timespanView = Timespan.monthly; + TransactionsController transContr = locator.get<TransactionsController>(); @override Widget build(BuildContext context) { @@ -154,11 +158,29 @@ class _HomeViewState extends State<HomeView> { ), ), const SizedBox(height: 5.0), - TransactionListtile(transaction: trn), - TransactionListtile(transaction: trn), - TransactionListtile(transaction: trn), - TransactionListtile(transaction: trp), - TransactionListtile(transaction: trn), + ValueListenableBuilder( + valueListenable: transContr.transactionsBox.listenable(), + builder: (context, Box<Transaction> box, widget) { + transContr.transactionsList = box.values.toList(); + transContr.transactionsList.sort((b, a) => a.createdAt.compareTo(b.createdAt)); + if(box.isEmpty) { + return const SizedBox( + height: 200.0, + child: Center( + child: Text('no existing transactions yet'), + ), + ); + } + return ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: transContr.transactionsList.length <= 25 ? transContr.transactionsList.length : 25, + itemBuilder: (context, index) { + return TransactionListtile(transaction: transContr.transactionsList[index]); + }, + ); + }, + ), FilledButton( onPressed: () { Navigator.push( diff --git a/trackeroo/lib/logic/services/locator.dart b/trackeroo/lib/logic/services/locator.dart index 70b733c..5936372 100644 --- a/trackeroo/lib/logic/services/locator.dart +++ b/trackeroo/lib/logic/services/locator.dart @@ -49,10 +49,9 @@ Future<void> setupLocatorService() async { locator.registerLazySingleton<CategoriesController>(() => categoriesController); Box<Transaction> transactionsBox = await Hive.openBox<Transaction>('transactions_box'); - List<Transaction> transactionsList = HiveList(transactionsBox); TransactionsController transactionsController = TransactionsController( transactionsBox: transactionsBox, - transactions: transactionsList + transactionsList: transactionsBox.values.toList() ); locator.registerLazySingleton<TransactionsController>(() => transactionsController); } diff --git a/trackeroo/lib/logic/services/transactions_controller.dart b/trackeroo/lib/logic/services/transactions_controller.dart index 934fbba..88a7cfc 100644 --- a/trackeroo/lib/logic/services/transactions_controller.dart +++ b/trackeroo/lib/logic/services/transactions_controller.dart @@ -5,25 +5,53 @@ import 'package:trackeroo/logic/services/categories_controller.dart'; import 'package:trackeroo/logic/services/locator.dart'; class TransactionsController { - TransactionsController({required this.transactionsBox, required this.transactions}); + TransactionsController({required this.transactionsBox, required this.transactionsList}); Box<Transaction> transactionsBox; - List<Transaction> transactions; + List<Transaction> transactionsList; + late Transaction lastDeletedTransaction; - void saveTransaction(Transaction transaction) { - locator.get<CategoriesController>().categories[transaction.categoryId]?.spendings += transaction.amount; - int id = UniqueKey().hashCode; - transaction.id = id; - transactionsBox.put(transaction.id, transaction); - transactions.add(transaction); + Future<bool> saveTransaction(Transaction transaction) async { + try { + locator.get<CategoriesController>().categories[transaction.categoryId]?.spendings += transaction.amount; + int id = UniqueKey().hashCode; + transaction.id = id; + await transactionsBox.put(transaction.id, transaction); + transactionsList = transactionsBox.values.toList(); + } catch (e) { + return false; + } + return true; } - void updateTransaction() { - // TODO: implement update transaction + Future<bool> updateTransaction(Transaction transaction) async { + try { + await transactionsBox.put(transaction.id, transaction); + transactionsList = transactionsBox.values.toList(); + } catch (e) { + return false; + } + return true; } - void deleteTransaction(Transaction transaction) { - transactionsBox.delete(transaction.id); - transactions.remove(transaction); + Future<bool> deleteTransaction(Transaction transaction) async { + try { + lastDeletedTransaction = transaction; + await transactionsBox.delete(transaction.id); + transactionsList = transactionsBox.values.toList(); + } catch (e) { + return false; + } + return true; + } + + Future<bool> undoLastDeletion() async { + try { + await transactionsBox.put(lastDeletedTransaction.id, lastDeletedTransaction); + transactionsList = transactionsBox.values.toList(); + } catch (e) { + return false; + } + return true; } } -- GitLab