From 9f3eeed0911cccc9879d2c3dbd39a3825ea5f3e1 Mon Sep 17 00:00:00 2001 From: Yaros Date: Fri, 21 Nov 2025 16:11:30 +0100 Subject: [PATCH] fix(mobile): first video memory on page doesn't play (#23906) * fix(mobile): first video memory doesn't play * refactor: moved logic to static method * refactor: fix haptic feedback & empty check * refactor: use DriftMemory on setMemory * refactor: move video reset into if block --- .../lib/presentation/pages/drift_memory.page.dart | 14 ++++++++++++++ .../widgets/memory/memory_lane.widget.dart | 12 ++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/mobile/lib/presentation/pages/drift_memory.page.dart b/mobile/lib/presentation/pages/drift_memory.page.dart index 55e5d24ecb..9042f2f1f5 100644 --- a/mobile/lib/presentation/pages/drift_memory.page.dart +++ b/mobile/lib/presentation/pages/drift_memory.page.dart @@ -24,6 +24,16 @@ class DriftMemoryPage extends HookConsumerWidget { const DriftMemoryPage({required this.memories, required this.memoryIndex, super.key}); + static void setMemory(WidgetRef ref, DriftMemory memory) { + if (memory.assets.isNotEmpty) { + ref.read(currentAssetNotifier.notifier).setAsset(memory.assets.first); + + if (memory.assets.first.isVideo) { + ref.read(videoPlaybackValueProvider.notifier).reset(); + } + } + } + @override Widget build(BuildContext context, WidgetRef ref) { final currentMemory = useState(memories[memoryIndex]); @@ -202,6 +212,10 @@ class DriftMemoryPage extends HookConsumerWidget { if (pageNumber < memories.length) { currentMemoryIndex.value = pageNumber; currentMemory.value = memories[pageNumber]; + + WidgetsBinding.instance.addPostFrameCallback((_) { + DriftMemoryPage.setMemory(ref, memories[pageNumber]); + }); } currentAssetPage.value = 0; diff --git a/mobile/lib/presentation/widgets/memory/memory_lane.widget.dart b/mobile/lib/presentation/widgets/memory/memory_lane.widget.dart index b2c61c7488..e85a6c05f8 100644 --- a/mobile/lib/presentation/widgets/memory/memory_lane.widget.dart +++ b/mobile/lib/presentation/widgets/memory/memory_lane.widget.dart @@ -3,10 +3,9 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/models/memory.model.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; +import 'package:immich_mobile/presentation/pages/drift_memory.page.dart'; import 'package:immich_mobile/presentation/widgets/images/thumbnail.widget.dart'; -import 'package:immich_mobile/providers/asset_viewer/video_player_value_provider.dart'; import 'package:immich_mobile/providers/haptic_feedback.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart'; import 'package:immich_mobile/providers/infrastructure/memory.provider.dart'; import 'package:immich_mobile/routing/router.dart'; @@ -31,16 +30,9 @@ class DriftMemoryLane extends ConsumerWidget { overlayColor: WidgetStateProperty.all(Colors.white.withValues(alpha: 0.1)), onTap: (index) { ref.read(hapticFeedbackProvider.notifier).heavyImpact(); - if (memories[index].assets.isNotEmpty) { - final asset = memories[index].assets[0]; - ref.read(currentAssetNotifier.notifier).setAsset(asset); - - if (asset.isVideo) { - ref.read(videoPlaybackValueProvider.notifier).reset(); - } + DriftMemoryPage.setMemory(ref, memories[index]); } - context.pushRoute(DriftMemoryRoute(memories: memories, memoryIndex: index)); }, children: memories