diff --git a/flutter_client/lib/admin/admin_providers.dart b/flutter_client/lib/admin/admin_providers.dart new file mode 100644 index 00000000..a812380e --- /dev/null +++ b/flutter_client/lib/admin/admin_providers.dart @@ -0,0 +1,53 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import '../api/endpoints/admin_invites.dart'; +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; + +final adminRequestsApiProvider = FutureProvider((ref) async { + return AdminRequestsApi(await ref.watch(dioProvider.future)); +}); + +final adminQuarantineApiProvider = + FutureProvider((ref) async { + return AdminQuarantineApi(await ref.watch(dioProvider.future)); +}); + +final adminUsersApiProvider = FutureProvider((ref) async { + return AdminUsersApi(await ref.watch(dioProvider.future)); +}); + +final adminInvitesApiProvider = FutureProvider((ref) async { + return AdminInvitesApi(await ref.watch(dioProvider.future)); +}); + +class AdminCounts { + const AdminCounts({ + required this.requests, + required this.quarantine, + required this.users, + }); + final int requests; + final int quarantine; + final int users; +} + +/// Fans out to the three list endpoints in parallel and rolls them up +/// into `{requests, quarantine, users}` for the landing screen badges. +final adminCountsProvider = FutureProvider((ref) async { + final requestsApi = await ref.watch(adminRequestsApiProvider.future); + final quarantineApi = await ref.watch(adminQuarantineApiProvider.future); + final usersApi = await ref.watch(adminUsersApiProvider.future); + final results = await Future.wait([ + requestsApi.list(), + quarantineApi.list(), + usersApi.list(), + ]); + return AdminCounts( + requests: (results[0] as List).length, + quarantine: (results[1] as List).length, + users: (results[2] as List).length, + ); +});