From 23778551f7960e1953b46010c44eb9b40b583753 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Wed, 22 Jul 2026 20:21:33 +0530 Subject: [PATCH] fix: locked view and asset view provider (#30136) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- mobile/lib/providers/routes.provider.dart | 15 ++++++-- .../lib/routing/app_navigation_observer.dart | 35 ------------------- 2 files changed, 13 insertions(+), 37 deletions(-) diff --git a/mobile/lib/providers/routes.provider.dart b/mobile/lib/providers/routes.provider.dart index a752a51a7d..6cc3d08c5d 100644 --- a/mobile/lib/providers/routes.provider.dart +++ b/mobile/lib/providers/routes.provider.dart @@ -1,8 +1,19 @@ import 'package:flutter/widgets.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/routing/router.dart'; + +@visibleForTesting +bool isRouteInStack(Ref ref, String routeName) { + final router = ref.watch(appRouterProvider); + void onChange() => ref.invalidateSelf(); + router.addListener(onChange); + ref.onDispose(() => router.removeListener(onChange)); + return router.stackData.any((route) => route.name == routeName); +} + +final inLockedViewProvider = Provider((ref) => isRouteInStack(ref, DriftLockedFolderRoute.name)); +final isAssetViewerOpenProvider = Provider((ref) => isRouteInStack(ref, AssetViewerRoute.name)); -final inLockedViewProvider = StateProvider((ref) => false); -final isAssetViewerOpenProvider = StateProvider((ref) => false); final currentRouteNameProvider = StateProvider((ref) => null); final previousRouteNameProvider = StateProvider((ref) => null); final previousRouteDataProvider = StateProvider((ref) => null); diff --git a/mobile/lib/routing/app_navigation_observer.dart b/mobile/lib/routing/app_navigation_observer.dart index 09d17da182..57304af44f 100644 --- a/mobile/lib/routing/app_navigation_observer.dart +++ b/mobile/lib/routing/app_navigation_observer.dart @@ -4,7 +4,6 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/providers/routes.provider.dart'; -import 'package:immich_mobile/routing/router.dart'; class AppNavigationObserver extends AutoRouterObserver { /// Riverpod Instance @@ -12,46 +11,12 @@ class AppNavigationObserver extends AutoRouterObserver { AppNavigationObserver({required this.ref}); - @override - Future didChangeTabRoute(TabPageRoute route, TabPageRoute previousRoute) async { - unawaited(Future(() => ref.read(inLockedViewProvider.notifier).state = false)); - } - @override void didPush(Route route, Route? previousRoute) { - _handleDriftLockedFolderState(route, previousRoute); Future(() { ref.read(currentRouteNameProvider.notifier).state = route.settings.name; ref.read(previousRouteNameProvider.notifier).state = previousRoute?.settings.name; ref.read(previousRouteDataProvider.notifier).state = previousRoute?.settings; - if (route.settings.name == AssetViewerRoute.name) { - ref.read(isAssetViewerOpenProvider.notifier).state = true; - } }); } - - @override - void didPop(Route route, Route? previousRoute) { - _handleDriftLockedFolderState(previousRoute ?? route, null); - if (route.settings.name == AssetViewerRoute.name) { - Future(() => ref.read(isAssetViewerOpenProvider.notifier).state = false); - } - } - - _handleDriftLockedFolderState(Route route, Route? previousRoute) { - final isInLockedView = ref.read(inLockedViewProvider); - final isFromLockedViewToDetailView = - route.settings.name == AssetViewerRoute.name && previousRoute?.settings.name == DriftLockedFolderRoute.name; - - final isFromDetailViewToInfoPanelView = - route.settings.name == null && previousRoute?.settings.name == AssetViewerRoute.name && isInLockedView; - - if (route.settings.name == DriftLockedFolderRoute.name || - isFromLockedViewToDetailView || - isFromDetailViewToInfoPanelView) { - Future(() => ref.read(inLockedViewProvider.notifier).state = true); - } else { - Future(() => ref.read(inLockedViewProvider.notifier).state = false); - } - } }