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