Aidra Driver 1.3.5+68
Aidra Driver - Your path to green energy
Loading...
Searching...
No Matches
auth_guard.dart
Go to the documentation of this file.
1import 'dart:async';
2
3import 'package:flutter/material.dart';
4import 'package:go_router/go_router.dart';
5import '../services/auth_service.dart';
6import '../services/check_in_service.dart';
7import '../services/fast_sign_in_service.dart';
8import '../services/service_locator.dart';
9import '../../features/auth/data/datasources/local_datasource/session_local_datasource.dart';
10import '../../features/home/domain/usecases/get_schedule_status_usecase.dart';
11import '../../features/home/domain/entities/res/res_schedule_status_entity.dart';
12import 'routes.dart';
13
14class AuthGuard extends GoRouteData {
15 AuthGuard._();
16
17 static final AuthGuard instance = AuthGuard._();
20 final SessionLocalDataSource _sessionLocalDataSource = SessionLocalDataSource();
21
22 @override
23 FutureOr<String?> redirect(BuildContext context, GoRouterState state) async {
24 final isAuthenticated = await _authService.isTokenValid();
25 final isLoginRoute = state.matchedLocation == Routes.signInScreen.route;
26 final isSplashRoute = state.matchedLocation == Routes.splashScreen.route;
27 final isProcessRoute = isProcessPath(state.matchedLocation);
28 final isFastSignInActive = _fastSignInService.isActive;
29
30 if (isSplashRoute || isProcessRoute) {
31 return null;
32 }
33
34 if (isFastSignInActive) {
35 return null;
36 }
37
38 if (!isAuthenticated && !isLoginRoute) {
39 return Routes.signInScreen.route;
40 }
41
42 if (isAuthenticated && isLoginRoute) {
43 if (context.mounted) {
44 // Check user role first
45 final session = await _sessionLocalDataSource.fetchSession();
46 final userRole = session?.role;
47
48 if (userRole != null && userRole != "Driver") {
49 return Routes.driverRequestsScreen.route;
50 }
51
52 // For drivers, check check-in status
53 final checkIn = await CheckInService().isUserCheckedIn();
54 if (checkIn == false) {
55 return Routes.checkInScreen.route;
56 } else {
57 // User is checked in, check schedule status
58 return await _checkScheduleStatusAndRoute(session!.uid ?? 0);
59 }
60 }
61 }
62
63 return null;
64 }
65
66 Future<String> _checkScheduleStatusAndRoute(int driverId) async {
67 try {
68 final now = DateTime.now();
69 final dateString = '${now.day.toString().padLeft(2, '0')}/${now.month.toString().padLeft(2, '0')}/${now.year}';
70
71 final useCase = sl<GetScheduleStatusUseCase>();
72 final result = await useCase(GetScheduleStatusParams(
74 date: dateString,
75 ));
76
77 return result.fold(
78 (failure) => Routes.homeScreen.route, // On error, go to home
79 (scheduleStatusEntity) {
80 switch (scheduleStatusEntity.status) {
81 case ScheduleStatus.empty:
82 return Routes.startLocationChooserScreen.route;
83 case ScheduleStatus.draft:
84 return Routes.scheduleConfirmationScreen.route;
85 case ScheduleStatus.validated:
86 return Routes.homeScreen.route;
87 }
88 },
89 );
90 } catch (e) {
91 // On any error, default to home screen
92 return Routes.homeScreen.route;
93 }
94 }
95}
96
97bool isProcessPath(String route) {
98 return route == Routes.collectionDetailsScreen.route ||
99 route == Routes.todayScheduleScreen.route ||
100 route == Routes.scheduleConfirmationScreen.route ||
101 route == Routes.startLocationChooserScreen.route ||
102 route == Routes.weeklyCollectionsScreen.route ||
103 route == Routes.endLocationChooserScreen.route ||
104 route == Routes.collectionRequestConfirmationScreen.route ||
105 route == Routes.collectionRequestInformationScreen.route ||
106 route == Routes.collectionRequestSuccessScreen.route ||
107 route == Routes.collectionRequestPaymentScreen.route ||
108 route == Routes.collectionRequestConfirmationScreen.route;
109}
class AuthGuard extends GoRouteData isProcessPath(String route)
Future< String > _checkScheduleStatusAndRoute(int driverId) async
sealed class AuthenticationState extends Equatable failure
Future< bool > isUserCheckedIn() async
override FutureOr< String?> redirect(BuildContext context, GoRouterState state) async
Future< String > _checkScheduleStatusAndRoute(int driverId) async
static final AuthGuard instance
AuthGuard _()
final FastSignInService _fastSignInService
final AuthService _authService
final SessionLocalDataSource _sessionLocalDataSource
class Partner String
final String date
Routes
Definition routes.dart:30
final sl
final int uid