Skip to content

Commit c330b14

Browse files
committed
refactor: login page "pops"
1 parent 980759e commit c330b14

File tree

2 files changed

+35
-13
lines changed

2 files changed

+35
-13
lines changed

Diff for: lib/app/app_router.dart

+21-10
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ part "app_router.gr.dart";
1616

1717
/// The router for the application.
1818
@AutoRouterConfig(replaceInRouteName: "Page,Route")
19-
class AppRouter extends _$AppRouter {
19+
class AppRouter extends _$AppRouter implements AutoRouteGuard {
2020
/// Create a new instance of [AppRouter].
2121
AppRouter({required this.ref});
2222

@@ -28,20 +28,31 @@ class AppRouter extends _$AppRouter {
2828
transitionsBuilder: TransitionsBuilders.slideLeftWithFade,
2929
);
3030

31+
@override
32+
Future<void> onNavigation(
33+
NavigationResolver resolver,
34+
StackRouter router,
35+
) async {
36+
final authState = ref.read(userProvider).valueOrNull;
37+
38+
if (authState != null || resolver.route.name == AuthRoute.name) {
39+
resolver.next(); // continue navigation
40+
} else {
41+
// else we navigate to the Login page so we get authenticated
42+
43+
// tip: use resolver.redirect to have the redirected route
44+
// automatically removed from the stack when the resolver is completed
45+
await resolver.redirect(const AuthRoute()).then(
46+
(didLogin) => resolver.next((didLogin ?? false) as bool),
47+
);
48+
}
49+
}
50+
3151
@override
3252
List<AutoRoute> get routes => [
3353
AutoRoute(
3454
page: WrapperRoute.page,
3555
path: "/",
36-
guards: [
37-
AutoRouteGuard.redirect(
38-
(resolver) {
39-
final authState = ref.read(userProvider).valueOrNull;
40-
41-
return (authState != null) ? null : const AuthRoute();
42-
},
43-
),
44-
],
4556
children: [
4657
AutoRoute(
4758
page: PirateCoinsRoute.page,

Diff for: lib/features/auth/presentation/auth_page/auth_page.dart

+14-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import "../../../../l10n/l10n.dart";
1111
import "../../application/auth_service.dart";
1212

1313
/// The page located at `/login/`.
14-
@RoutePage()
14+
@RoutePage<bool>()
1515
class AuthPage extends ConsumerWidget {
1616
/// Create a new instance of [AuthPage].
1717
const AuthPage({super.key});
@@ -38,7 +38,7 @@ class AuthPage extends ConsumerWidget {
3838
.authenticate();
3939

4040
if (context.mounted) {
41-
await context.router.push(const DashboardRoute());
41+
await context.go();
4242
}
4343
},
4444
icon: const Icon(Icons.g_mobiledata),
@@ -52,7 +52,7 @@ class AuthPage extends ConsumerWidget {
5252
.anonymous();
5353

5454
if (context.mounted) {
55-
await context.router.push(const DashboardRoute());
55+
await context.go();
5656
}
5757
},
5858
icon: const Icon(Icons.person),
@@ -67,3 +67,14 @@ class AuthPage extends ConsumerWidget {
6767
);
6868
}
6969
}
70+
71+
extension _Go on BuildContext {
72+
Future<void> go() async {
73+
// if we were redirected here, go back to the right page.
74+
await router.pop<bool>(true);
75+
if (mounted) {
76+
// otherwise, go to the dashboard.
77+
await router.push(const DashboardRoute());
78+
}
79+
}
80+
}

0 commit comments

Comments
 (0)