Skip to content

Commit ceb36a3

Browse files
authored
fix: view in timeline does not jump to the timeline correctly (#23428)
1 parent f5d7e5a commit ceb36a3

File tree

5 files changed

+35
-7
lines changed

5 files changed

+35
-7
lines changed

mobile/lib/constants/constants.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,8 @@ const int kMinMonthsToEnableScrubberSnap = 12;
5353
const String kImmichAppStoreLink = "https://apps.apple.com/app/immich/id6449244941";
5454
const String kImmichPlayStoreLink = "https://play.google.com/store/apps/details?id=app.alextran.immich";
5555
const String kImmichLatestRelease = "https://github.com/immich-app/immich/releases/latest";
56+
57+
const int kPhotoTabIndex = 0;
58+
const int kSearchTabIndex = 1;
59+
const int kAlbumTabIndex = 2;
60+
const int kLibraryTabIndex = 3;

mobile/lib/pages/common/tab_shell.page.dart

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:auto_route/auto_route.dart';
44
import 'package:easy_localization/easy_localization.dart';
55
import 'package:flutter/material.dart';
66
import 'package:hooks_riverpod/hooks_riverpod.dart';
7+
import 'package:immich_mobile/constants/constants.dart';
78
import 'package:immich_mobile/domain/models/timeline.model.dart';
89
import 'package:immich_mobile/domain/utils/event_stream.dart';
910
import 'package:immich_mobile/extensions/build_context_extensions.dart';
@@ -13,6 +14,7 @@ import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
1314
import 'package:immich_mobile/providers/infrastructure/memory.provider.dart';
1415
import 'package:immich_mobile/providers/infrastructure/people.provider.dart';
1516
import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart';
17+
import 'package:immich_mobile/providers/routes.provider.dart';
1618
import 'package:immich_mobile/providers/search/search_input_focus.provider.dart';
1719
import 'package:immich_mobile/providers/tab.provider.dart';
1820
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
@@ -106,31 +108,33 @@ class _TabShellPageState extends ConsumerState<TabShellPage> {
106108
}
107109

108110
void _onNavigationSelected(TabsRouter router, int index, WidgetRef ref) {
111+
ref.read(currentTabIndexProvider.notifier).state = index;
112+
109113
// On Photos page menu tapped
110-
if (router.activeIndex == 0 && index == 0) {
114+
if (router.activeIndex == kPhotoTabIndex && index == kPhotoTabIndex) {
111115
EventStream.shared.emit(const ScrollToTopEvent());
112116
}
113117

114-
if (index == 0) {
118+
if (index == kPhotoTabIndex) {
115119
ref.invalidate(driftMemoryFutureProvider);
116120
}
117121

118-
if (router.activeIndex != 1 && index == 1) {
122+
if (router.activeIndex != kSearchTabIndex && index == kSearchTabIndex) {
119123
ref.read(searchPreFilterProvider.notifier).clear();
120124
}
121125

122126
// On Search page tapped
123-
if (router.activeIndex == 1 && index == 1) {
127+
if (router.activeIndex == kSearchTabIndex && index == kSearchTabIndex) {
124128
ref.read(searchInputFocusProvider).requestFocus();
125129
}
126130

127131
// Album page
128-
if (index == 2) {
132+
if (index == kAlbumTabIndex) {
129133
ref.read(remoteAlbumProvider.notifier).refresh();
130134
}
131135

132136
// Library page
133-
if (index == 3) {
137+
if (index == kLibraryTabIndex) {
134138
ref.invalidate(localAlbumProvider);
135139
ref.invalidate(driftGetAllPeopleProvider);
136140
}

mobile/lib/presentation/widgets/action_buttons/similar_photos_action_button.widget.dart

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import 'dart:async';
33
import 'package:auto_route/auto_route.dart';
44
import 'package:flutter/material.dart';
55
import 'package:hooks_riverpod/hooks_riverpod.dart';
6+
import 'package:immich_mobile/constants/constants.dart';
67
import 'package:immich_mobile/entities/asset.entity.dart';
78
import 'package:immich_mobile/extensions/translate_extensions.dart';
89
import 'package:immich_mobile/models/search/search_filter.model.dart';
910
import 'package:immich_mobile/presentation/pages/search/paginated_search.provider.dart';
1011
import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart';
1112
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart';
13+
import 'package:immich_mobile/providers/routes.provider.dart';
1214
import 'package:immich_mobile/routing/router.dart';
1315

1416
class SimilarPhotosActionButton extends ConsumerWidget {
@@ -35,7 +37,21 @@ class SimilarPhotosActionButton extends ConsumerWidget {
3537
mediaType: AssetType.image,
3638
),
3739
);
38-
unawaited(context.router.popAndPush(const DriftSearchRoute()));
40+
41+
/// Using and currentTabIndex to make sure we are using the correct
42+
/// navigation behavior. We want to be able to navigate back to the
43+
/// main timline using View In Timeline button without the need of
44+
/// waiting for the timeline to be rebuild. At the same time, we want
45+
/// to refresh the search page when tapping the Similar Photos button
46+
/// while already in the Search tab.
47+
final currentTabIndex = (ref.read(currentTabIndexProvider.notifier).state);
48+
49+
if (currentTabIndex != kSearchTabIndex) {
50+
unawaited(context.router.navigate(const DriftSearchRoute()));
51+
ref.read(currentTabIndexProvider.notifier).state = kSearchTabIndex;
52+
} else {
53+
unawaited(context.router.popAndPush(const DriftSearchRoute()));
54+
}
3955
}
4056

4157
@override

mobile/lib/presentation/widgets/timeline/timeline.widget.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ class _SliverTimelineState extends ConsumerState<_SliverTimeline> {
228228
curve: Curves.easeInOut,
229229
)
230230
.whenComplete(() => ref.read(timelineStateProvider.notifier).setScrubbing(false));
231+
} else {
232+
ref.read(timelineStateProvider.notifier).setScrubbing(false);
231233
}
232234
});
233235
}

mobile/lib/providers/routes.provider.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ final inLockedViewProvider = StateProvider<bool>((ref) => false);
55
final currentRouteNameProvider = StateProvider<String?>((ref) => null);
66
final previousRouteNameProvider = StateProvider<String?>((ref) => null);
77
final previousRouteDataProvider = StateProvider<RouteSettings?>((ref) => null);
8+
final currentTabIndexProvider = StateProvider<int>((ref) => 0);

0 commit comments

Comments
 (0)