From 372e7eca86013b16a0724545806df324cb0e17c3 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 8 May 2026 21:52:12 -0400 Subject: [PATCH] feat(flutter/admin): API providers + adminCountsProvider Single landing-screen provider fans out to requests/quarantine/users list endpoints in parallel and returns counts for the section-card badges. Per-section AsyncNotifier controllers land alongside their screens in subsequent commits. Co-Authored-By: Claude Opus 4.7 (1M context) --- flutter_client/lib/admin/admin_providers.dart | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 flutter_client/lib/admin/admin_providers.dart 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, + ); +});