diff --git a/mobile/lib/domain/services/timeline.service.dart b/mobile/lib/domain/services/timeline.service.dart index 61e114762c..bd36d0b569 100644 --- a/mobile/lib/domain/services/timeline.service.dart +++ b/mobile/lib/domain/services/timeline.service.dart @@ -227,6 +227,13 @@ class TimelineService { return _buffer.elementAt(index - _bufferOffset); } + /// Finds the index of an asset by its heroTag within the current buffer. + /// Returns null if the asset is not found in the buffer. + int? getIndex(String heroTag) { + final index = _buffer.indexWhere((a) => a.heroTag == heroTag); + return index >= 0 ? _bufferOffset + index : null; + } + Future dispose() async { await _bucketSubscription?.cancel(); _bucketSubscription = null; diff --git a/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart b/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart index 2be2bdf765..9129d998e6 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/asset_viewer.page.dart @@ -451,21 +451,31 @@ class _AssetViewerState extends ConsumerState { } void _onTimelineReloadEvent() { - totalAssets = ref.read(timelineServiceProvider).totalAssets; + final timelineService = ref.read(timelineServiceProvider); + totalAssets = timelineService.totalAssets; + if (totalAssets == 0) { context.maybePop(); return; } + var index = pageController.page?.round() ?? 0; + final currentAsset = ref.read(currentAssetNotifier); + if (currentAsset != null) { + final newIndex = timelineService.getIndex(currentAsset.heroTag); + if (newIndex != null && newIndex != index) { + index = newIndex; + pageController.jumpToPage(index); + } + } + if (assetReloadRequested) { assetReloadRequested = false; - _onAssetReloadEvent(); - return; + _onAssetReloadEvent(index); } } - void _onAssetReloadEvent() async { - final index = pageController.page?.round() ?? 0; + void _onAssetReloadEvent(int index) async { final timelineService = ref.read(timelineServiceProvider); final newAsset = await timelineService.getAssetAsync(index);