From 365785a0aeb684d68142f6004e5a0423a4bd7a57 Mon Sep 17 00:00:00 2001 From: Peter Ombodi Date: Wed, 11 Feb 2026 11:22:57 +0200 Subject: [PATCH 1/2] fix(mobile): fix Login routing on Splash screen --- mobile/lib/pages/common/splash_screen.page.dart | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/mobile/lib/pages/common/splash_screen.page.dart b/mobile/lib/pages/common/splash_screen.page.dart index c7d786626c3d2..4650afd3cf88a 100644 --- a/mobile/lib/pages/common/splash_screen.page.dart +++ b/mobile/lib/pages/common/splash_screen.page.dart @@ -10,6 +10,7 @@ import 'package:immich_mobile/providers/background_sync.provider.dart'; import 'package:immich_mobile/providers/backup/backup.provider.dart'; import 'package:immich_mobile/providers/backup/drift_backup.provider.dart'; import 'package:immich_mobile/providers/gallery_permission.provider.dart'; +import 'package:immich_mobile/providers/routes.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/websocket.provider.dart'; import 'package:immich_mobile/routing/router.dart'; @@ -26,6 +27,16 @@ class SplashScreenPage extends StatefulHookConsumerWidget { class SplashScreenPageState extends ConsumerState { final log = Logger("SplashScreenPage"); + Future _goToLoginFromSplash() async { + final previousRouteName = ref.read(previousRouteNameProvider); + // App can return with Splash pushed over existing Login route. + if (previousRouteName == LoginRoute.name && context.router.canPop()) { + await context.router.maybePop(); + return; + } + await context.router.replaceAll([const LoginRoute()]); + } + @override void initState() { super.initState(); @@ -93,14 +104,14 @@ class SplashScreenPageState extends ConsumerState { onError: (exception) => { log.severe('Failed to update auth info with access token: $accessToken'), ref.read(authProvider.notifier).logout(), - context.replaceRoute(const LoginRoute()), + _goToLoginFromSplash(), }, ), ); } else { log.severe('Missing crucial offline login info - Logging out completely'); unawaited(ref.read(authProvider.notifier).logout()); - unawaited(context.replaceRoute(const LoginRoute())); + unawaited(_goToLoginFromSplash()); return; } From 71382a16290598860d5677b959b70627a4ee474c Mon Sep 17 00:00:00 2001 From: Peter Ombodi Date: Wed, 11 Feb 2026 20:39:29 +0200 Subject: [PATCH 2/2] fix(mobile): remove _duplicateGuard from the LoginRoute revert changes in splash_screen --- mobile/lib/pages/common/splash_screen.page.dart | 15 ++------------- mobile/lib/routing/router.dart | 2 +- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/mobile/lib/pages/common/splash_screen.page.dart b/mobile/lib/pages/common/splash_screen.page.dart index 4650afd3cf88a..c7d786626c3d2 100644 --- a/mobile/lib/pages/common/splash_screen.page.dart +++ b/mobile/lib/pages/common/splash_screen.page.dart @@ -10,7 +10,6 @@ import 'package:immich_mobile/providers/background_sync.provider.dart'; import 'package:immich_mobile/providers/backup/backup.provider.dart'; import 'package:immich_mobile/providers/backup/drift_backup.provider.dart'; import 'package:immich_mobile/providers/gallery_permission.provider.dart'; -import 'package:immich_mobile/providers/routes.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/websocket.provider.dart'; import 'package:immich_mobile/routing/router.dart'; @@ -27,16 +26,6 @@ class SplashScreenPage extends StatefulHookConsumerWidget { class SplashScreenPageState extends ConsumerState { final log = Logger("SplashScreenPage"); - Future _goToLoginFromSplash() async { - final previousRouteName = ref.read(previousRouteNameProvider); - // App can return with Splash pushed over existing Login route. - if (previousRouteName == LoginRoute.name && context.router.canPop()) { - await context.router.maybePop(); - return; - } - await context.router.replaceAll([const LoginRoute()]); - } - @override void initState() { super.initState(); @@ -104,14 +93,14 @@ class SplashScreenPageState extends ConsumerState { onError: (exception) => { log.severe('Failed to update auth info with access token: $accessToken'), ref.read(authProvider.notifier).logout(), - _goToLoginFromSplash(), + context.replaceRoute(const LoginRoute()), }, ), ); } else { log.severe('Missing crucial offline login info - Logging out completely'); unawaited(ref.read(authProvider.notifier).logout()); - unawaited(_goToLoginFromSplash()); + unawaited(context.replaceRoute(const LoginRoute())); return; } diff --git a/mobile/lib/routing/router.dart b/mobile/lib/routing/router.dart index 9468b105e5e3e..2bc000db45d16 100644 --- a/mobile/lib/routing/router.dart +++ b/mobile/lib/routing/router.dart @@ -165,7 +165,7 @@ class AppRouter extends RootStackRouter { late final List routes = [ AutoRoute(page: SplashScreenRoute.page, initial: true), AutoRoute(page: PermissionOnboardingRoute.page, guards: [_authGuard, _duplicateGuard]), - AutoRoute(page: LoginRoute.page, guards: [_duplicateGuard]), + AutoRoute(page: LoginRoute.page), AutoRoute(page: ChangePasswordRoute.page), AutoRoute(page: SearchRoute.page, guards: [_authGuard, _duplicateGuard], maintainState: false), AutoRoute(