From 6fdbf43d09ee827b38819074597bdb3f919216a1 Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Fri, 26 Sep 2025 16:30:48 +0200 Subject: [PATCH] Show splash while authenticating --- sample_app/lib/app/content/auth_controller.dart | 6 ++++++ sample_app/lib/navigation/app_router.dart | 6 ++++++ sample_app/lib/navigation/app_router.gr.dart | 16 ++++++++++++++++ sample_app/lib/navigation/guards/auth_guard.dart | 6 ++++++ sample_app/lib/widgets/app_splash.dart | 2 ++ 5 files changed, 36 insertions(+) diff --git a/sample_app/lib/app/content/auth_controller.dart b/sample_app/lib/app/content/auth_controller.dart index fccd7381..754faab9 100644 --- a/sample_app/lib/app/content/auth_controller.dart +++ b/sample_app/lib/app/content/auth_controller.dart @@ -23,6 +23,8 @@ class AuthController extends ValueNotifier { PushTokenManager? _pushTokenManager; Future connect(UserCredentials credentials) async { + value = const Authenticating(); + final token = UserToken(credentials.token); final client = StreamFeedsClient( @@ -83,3 +85,7 @@ final class Authenticated extends AuthState { final class Unauthenticated extends AuthState { const Unauthenticated(); } + +final class Authenticating extends AuthState { + const Authenticating(); +} diff --git a/sample_app/lib/navigation/app_router.dart b/sample_app/lib/navigation/app_router.dart index 79d20303..3127f431 100644 --- a/sample_app/lib/navigation/app_router.dart +++ b/sample_app/lib/navigation/app_router.dart @@ -7,6 +7,7 @@ import 'package:stream_feeds/stream_feeds.dart'; import '../screens/choose_user/choose_user_screen.dart'; import '../screens/home/home_screen.dart'; import '../screens/user_feed/user_feed_screen.dart'; +import '../widgets/app_splash.dart'; import '../widgets/attachment_gallery/attachment_gallery.dart'; import '../widgets/attachment_gallery/attachment_metadata.dart'; import 'guards/auth_guard.dart'; @@ -45,6 +46,11 @@ class AppRouter extends RootStackRouter { page: ChooseUserRoute.page, keepHistory: false, ), + AutoRoute( + path: '/loading', + page: AppSplashRoute.page, + keepHistory: false, + ), AutoRoute( path: '/attachment_gallery', page: AttachmentGalleryRoute.page, diff --git a/sample_app/lib/navigation/app_router.gr.dart b/sample_app/lib/navigation/app_router.gr.dart index b94fca89..acd6499f 100644 --- a/sample_app/lib/navigation/app_router.gr.dart +++ b/sample_app/lib/navigation/app_router.gr.dart @@ -10,6 +10,22 @@ part of 'app_router.dart'; +/// generated route for +/// [AppSplash] +class AppSplashRoute extends PageRouteInfo { + const AppSplashRoute({List? children}) + : super(AppSplashRoute.name, initialChildren: children); + + static const String name = 'AppSplashRoute'; + + static PageInfo page = PageInfo( + name, + builder: (data) { + return const AppSplash(); + }, + ); +} + /// generated route for /// [AttachmentGalleryPage] class AttachmentGalleryRoute extends PageRouteInfo { diff --git a/sample_app/lib/navigation/guards/auth_guard.dart b/sample_app/lib/navigation/guards/auth_guard.dart index 03e1ffbf..92b838cd 100644 --- a/sample_app/lib/navigation/guards/auth_guard.dart +++ b/sample_app/lib/navigation/guards/auth_guard.dart @@ -15,6 +15,12 @@ class AuthGuard extends AutoRouteGuard { final isAuthenticated = _authController.value is Authenticated; // If the user is authenticated, allow navigation to the requested route. if (isAuthenticated) return resolver.next(); + + // If the user is being authenticated, show the splash screen. + if (_authController.value is Authenticating) { + resolver.redirectUntil(const AppSplashRoute(), replace: true); + } + // Otherwise, redirect to the Choose user page. resolver.redirectUntil(const ChooseUserRoute(), replace: true); } diff --git a/sample_app/lib/widgets/app_splash.dart b/sample_app/lib/widgets/app_splash.dart index afb4b53e..11d7e06e 100644 --- a/sample_app/lib/widgets/app_splash.dart +++ b/sample_app/lib/widgets/app_splash.dart @@ -1,3 +1,4 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -7,6 +8,7 @@ import '../theme/theme.dart'; /// /// Displays only the app logo in a clean, minimal style while the app initializes. /// Follows true minimalistic principles with perfect simplicity. +@RoutePage(name: 'AppSplashRoute') class AppSplash extends StatelessWidget { const AppSplash({super.key});