From 235fda5c72b83a8e54be53e316582a26039f7488 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Tue, 15 Jul 2025 20:11:43 +0200 Subject: [PATCH] Can delete expense --- .../lib/routes/scan_details/scan_details.dart | 19 +++++++++++- .../lib/services/storage/expenses.dart | 30 ++++++++++++++----- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/moneymgr_mobile/lib/routes/scan_details/scan_details.dart b/moneymgr_mobile/lib/routes/scan_details/scan_details.dart index 5e6b53f..156582b 100644 --- a/moneymgr_mobile/lib/routes/scan_details/scan_details.dart +++ b/moneymgr_mobile/lib/routes/scan_details/scan_details.dart @@ -49,6 +49,22 @@ class ScanDetailScreen extends HookConsumerWidget { } } + handleDelete() async { + try { + await expenses.deleteExpense(expense.requireValue!.$1); + if (context.mounted) { + context.pop(); + } + + ref.invalidate(expensesProvider); + } catch (e, s) { + Logger.root.warning("Failed to delete expense! $e$s"); + if (context.mounted) { + context.showTextSnackBar("Failed to delete expense! $e"); + } + } + } + return switch (expense) { AsyncData(:final value) when value == null => FullScreenError( message: "Expense does not exists!", @@ -56,8 +72,9 @@ class ScanDetailScreen extends HookConsumerWidget { ), AsyncData(:final value) => ExpenseEditor( file: value!.$2, - onFinished: handleUpdate, initialData: value.$1.baseExpense, + onFinished: handleUpdate, + onDelete: handleDelete, ), AsyncError(:final error) => FullScreenError( message: "Failed to load expense information!", diff --git a/moneymgr_mobile/lib/services/storage/expenses.dart b/moneymgr_mobile/lib/services/storage/expenses.dart index 986d86a..a3bf192 100644 --- a/moneymgr_mobile/lib/services/storage/expenses.dart +++ b/moneymgr_mobile/lib/services/storage/expenses.dart @@ -10,7 +10,6 @@ import 'package:path_provider/path_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'expenses.freezed.dart'; - part 'expenses.g.dart'; typedef ExpensesList = List; @@ -157,11 +156,28 @@ class ExpensesManager { Future updateExpense(Expense expense, BaseExpenseInfo newInfo) async { final list = await getList(); final entry = list.indexWhere((e) => e.id == expense.id); - list[entry] = Expense(id: expense.id, - label: newInfo.label, - cost: newInfo.cost, - time: newInfo.timeAsSeconds, - mimeType: expense.mimeType); + list[entry] = Expense( + id: expense.id, + label: newInfo.label, + cost: newInfo.cost, + time: newInfo.timeAsSeconds, + mimeType: expense.mimeType, + ); saveList(list); } -} \ No newline at end of file + + /// Delete an expense + Future deleteExpense(Expense expense) async { + // Remove expense from the list + final list = await getList(); + await saveList(list.where((e) => e.id != expense.id).toList()); + + // Delete associated file, if any + final filePath = File( + p.join(filesStoragePath.absolute.path, expense.localFileName), + ); + if (await filePath.exists()) { + await filePath.delete(); + } + } +}