Compare commits

...

1 Commits

Author SHA1 Message Date
Thomas Way
1424857327 fix(mobile): reset asset index on timeline refresh
The current asset changes when the timeline refreshes, which can be
quite jarring. Assets are tracked by their index, and that index becomes
stale when the timeline refreshes. This can be resolved by updating the
index of asset based on a unique identifier (like the hero tag).
2026-01-30 16:14:41 +00:00
2 changed files with 22 additions and 5 deletions

View File

@@ -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<void> dispose() async {
await _bucketSubscription?.cancel();
_bucketSubscription = null;

View File

@@ -451,21 +451,31 @@ class _AssetViewerState extends ConsumerState<AssetViewer> {
}
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);