Can delete expense
This commit is contained in:
@ -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!",
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user