From 8ea186ef4a5c415ba878cbc6b0102e9381c19046 Mon Sep 17 00:00:00 2001 From: Mathias Beaulieu-Duncan Date: Tue, 20 Jan 2026 13:07:35 -0500 Subject: [PATCH] auto-claude: subtask-4-1 - Add gRPC client provider to providers.dart Add grpcClientProvider to providers.dart for gRPC-based API access: - Import GrpcCqrsApiClient and GrpcConfig from api layer - Create grpcClientProvider using Provider.autoDispose for proper channel cleanup when no longer watched - Inject authService for token management - Register onDispose callback to shutdown gRPC channel resources This follows the same pattern as the existing apiClientProvider while adding proper resource management for gRPC connections. Co-Authored-By: Claude --- lib/providers/providers.dart | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/providers/providers.dart b/lib/providers/providers.dart index b4b0947..d766883 100644 --- a/lib/providers/providers.dart +++ b/lib/providers/providers.dart @@ -3,6 +3,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../api/types.dart'; import '../api/client.dart'; +import '../api/grpc_client.dart'; +import '../api/grpc_config.dart'; import '../api/openapi_config.dart'; import '../services/auth_service.dart'; import '../models/user_profile.dart'; @@ -21,6 +23,31 @@ final apiClientProvider = Provider((ref) { ); }); +/// Provider for the gRPC-based CQRS API client. +/// +/// Uses auto-dispose to properly shut down the gRPC channel when the provider +/// is no longer being watched. This ensures network resources are cleaned up. +/// +/// Example usage: +/// ```dart +/// final grpcClient = ref.watch(grpcClientProvider); +/// final result = await grpcClient.getDeliveryRoutes(); +/// ``` +final grpcClientProvider = Provider.autoDispose((ref) { + final authService = ref.watch(authServiceProvider); + final client = GrpcCqrsApiClient( + config: GrpcConfig.development, + authService: authService, + ); + + // Register disposal callback to clean up gRPC channel resources + ref.onDispose(() { + client.shutdown(); + }); + + return client; +}); + final isAuthenticatedProvider = FutureProvider((ref) async { final authService = ref.watch(authServiceProvider); return await authService.isAuthenticated();