diff --git a/.auto-claude-status b/.auto-claude-status index c221313..82dbbee 100644 --- a/.auto-claude-status +++ b/.auto-claude-status @@ -3,7 +3,7 @@ "spec": "002-migrate-api-routes-from-http-to-grpc", "state": "building", "subtasks": { - "completed": 9, + "completed": 10, "total": 13, "in_progress": 1, "failed": 0 @@ -18,8 +18,8 @@ "max": 1 }, "session": { - "number": 10, + "number": 11, "started_at": "2026-01-20T12:45:59.858836" }, - "last_update": "2026-01-20T13:08:01.853317" + "last_update": "2026-01-20T13:09:16.962328" } \ No newline at end of file diff --git a/lib/providers/providers.dart b/lib/providers/providers.dart index 1120529..5d80eda 100644 --- a/lib/providers/providers.dart +++ b/lib/providers/providers.dart @@ -132,6 +132,47 @@ final grpcDeliveryRoutesProvider = FutureProvider>((ref) asy ); }); +/// Provider for deliveries using gRPC. +/// +/// This is the gRPC-based alternative to [deliveriesProvider]. +/// Uses [GrpcCqrsApiClient] for improved performance and type safety. +/// Takes a [routeFragmentId] parameter to fetch deliveries for a specific route. +/// +/// Example usage: +/// ```dart +/// final deliveries = ref.watch(grpcDeliveriesProvider(routeFragmentId)); +/// deliveries.when( +/// data: (data) => displayDeliveries(data), +/// loading: () => showLoading(), +/// error: (error, stack) => showError(error), +/// ); +/// ``` +final grpcDeliveriesProvider = FutureProvider.family, int>((ref, routeFragmentId) async { + final authService = ref.watch(authServiceProvider); + final isAuthenticated = await authService.isAuthenticated(); + + if (!isAuthenticated) { + throw Exception('User not authenticated'); + } + + final grpcClient = ref.watch(grpcClientProvider); + final result = await grpcClient.getDeliveries(routeFragmentId: routeFragmentId); + + final deliveries = result.when( + success: (deliveries) => deliveries, + onError: (error) { + debugPrint('ERROR fetching deliveries for route $routeFragmentId via gRPC: ${error.message}'); + if (error.originalException != null) { + debugPrint('Original exception: ${error.originalException}'); + } + throw Exception(error.message); + }, + ); + + // Always append the warehouse delivery at the end + return [...deliveries, Delivery.createWarehouseDelivery()]; +}); + final deliveriesProvider = FutureProvider.family, int>((ref, routeFragmentId) async { final authService = ref.watch(authServiceProvider); final isAuthenticated = await authService.isAuthenticated();