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 <noreply@anthropic.com>
This commit is contained in:
Mathias Beaulieu-Duncan 2026-01-20 13:07:35 -05:00
parent 823f9107fd
commit 8ea186ef4a

View File

@ -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<CqrsApiClient>((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<GrpcCqrsApiClient>((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<bool>((ref) async {
final authService = ref.watch(authServiceProvider);
return await authService.isAuthenticated();