diff --git a/flutter_client/lib/admin/admin_providers.dart b/flutter_client/lib/admin/admin_providers.dart index a812380e..75b24ba5 100644 --- a/flutter_client/lib/admin/admin_providers.dart +++ b/flutter_client/lib/admin/admin_providers.dart @@ -5,6 +5,7 @@ import '../api/endpoints/admin_quarantine.dart'; import '../api/endpoints/admin_requests.dart'; import '../api/endpoints/admin_users.dart'; import '../library/library_providers.dart' show dioProvider; +import '../models/admin_request.dart'; final adminRequestsApiProvider = FutureProvider((ref) async { return AdminRequestsApi(await ref.watch(dioProvider.future)); @@ -51,3 +52,40 @@ final adminCountsProvider = FutureProvider((ref) async { users: (results[2] as List).length, ); }); + +class AdminRequestsController extends AsyncNotifier> { + @override + Future> build() async { + final api = await ref.watch(adminRequestsApiProvider.future); + return api.list(); + } + + Future approve(String id) async { + await _decide(id, (api) => api.approve(id)); + } + + Future reject(String id) async { + await _decide(id, (api) => api.reject(id)); + } + + Future _decide( + String id, + Future Function(AdminRequestsApi api) action, + ) async { + final api = await ref.read(adminRequestsApiProvider.future); + final current = state.value ?? const []; + state = AsyncData(current.where((r) => r.id != id).toList()); + try { + await action(api); + // Refresh landing badge. + ref.invalidate(adminCountsProvider); + } catch (e, st) { + state = AsyncData(current); + Error.throwWithStackTrace(e, st); + } + } +} + +final adminRequestsProvider = + AsyncNotifierProvider>( + AdminRequestsController.new);