Can delete expense

This commit is contained in:
2025-07-15 20:11:43 +02:00
parent 2568ea14b4
commit 235fda5c72
2 changed files with 41 additions and 8 deletions

View File

@ -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) { return switch (expense) {
AsyncData(:final value) when value == null => FullScreenError( AsyncData(:final value) when value == null => FullScreenError(
message: "Expense does not exists!", message: "Expense does not exists!",
@ -56,8 +72,9 @@ class ScanDetailScreen extends HookConsumerWidget {
), ),
AsyncData(:final value) => ExpenseEditor( AsyncData(:final value) => ExpenseEditor(
file: value!.$2, file: value!.$2,
onFinished: handleUpdate,
initialData: value.$1.baseExpense, initialData: value.$1.baseExpense,
onFinished: handleUpdate,
onDelete: handleDelete,
), ),
AsyncError(:final error) => FullScreenError( AsyncError(:final error) => FullScreenError(
message: "Failed to load expense information!", message: "Failed to load expense information!",

View File

@ -10,7 +10,6 @@ import 'package:path_provider/path_provider.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'expenses.freezed.dart'; part 'expenses.freezed.dart';
part 'expenses.g.dart'; part 'expenses.g.dart';
typedef ExpensesList = List<Expense>; typedef ExpensesList = List<Expense>;
@ -157,11 +156,28 @@ class ExpensesManager {
Future<void> updateExpense(Expense expense, BaseExpenseInfo newInfo) async { Future<void> updateExpense(Expense expense, BaseExpenseInfo newInfo) async {
final list = await getList(); final list = await getList();
final entry = list.indexWhere((e) => e.id == expense.id); final entry = list.indexWhere((e) => e.id == expense.id);
list[entry] = Expense(id: expense.id, list[entry] = Expense(
label: newInfo.label, id: expense.id,
cost: newInfo.cost, label: newInfo.label,
time: newInfo.timeAsSeconds, cost: newInfo.cost,
mimeType: expense.mimeType); time: newInfo.timeAsSeconds,
mimeType: expense.mimeType,
);
saveList(list); saveList(list);
} }
}
/// Delete an expense
Future<void> 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();
}
}
}