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