diff --git a/mobile/lib/constants/constants.dart b/mobile/lib/constants/constants.dart index 8d4636bbe1..cc408548d2 100644 --- a/mobile/lib/constants/constants.dart +++ b/mobile/lib/constants/constants.dart @@ -50,7 +50,7 @@ const double kUploadStatusCanceled = -2.0; const int kMinMonthsToEnableScrubberSnap = 12; -const String kImmichAppStoreLink = "https://apps.apple.com/app/immich/id6449244941"; +const String kImmichAppStoreLink = "https://apps.apple.com/app/immich/id1613945652"; const String kImmichPlayStoreLink = "https://play.google.com/store/apps/details?id=app.alextran.immich"; const String kImmichLatestRelease = "https://github.com/immich-app/immich/releases/latest"; diff --git a/mobile/lib/infrastructure/repositories/timeline.repository.dart b/mobile/lib/infrastructure/repositories/timeline.repository.dart index 1fc0ee43e5..d21e1e905b 100644 --- a/mobile/lib/infrastructure/repositories/timeline.repository.dart +++ b/mobile/lib/infrastructure/repositories/timeline.repository.dart @@ -265,7 +265,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository { row.deletedAt.isNull() & row.isFavorite.equals(true) & row.ownerId.equals(userId) & - row.visibility.equalsValue(AssetVisibility.timeline), + (row.visibility.equalsValue(AssetVisibility.timeline) | row.visibility.equalsValue(AssetVisibility.archive)), groupBy: groupBy, origin: TimelineOrigin.favorite, ); 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 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79fcb38f3c..3cf42646ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -726,19 +726,22 @@ importers: specifier: ^7.4.47 version: 7.4.47 '@photo-sphere-viewer/core': - specifier: ^5.11.5 + specifier: ^5.14.0 version: 5.14.0 '@photo-sphere-viewer/equirectangular-video-adapter': - specifier: ^5.11.5 + specifier: ^5.14.0 version: 5.14.0(@photo-sphere-viewer/core@5.14.0)(@photo-sphere-viewer/video-plugin@5.14.0(@photo-sphere-viewer/core@5.14.0)) + '@photo-sphere-viewer/markers-plugin': + specifier: ^5.14.0 + version: 5.14.0(@photo-sphere-viewer/core@5.14.0) '@photo-sphere-viewer/resolution-plugin': - specifier: ^5.11.5 + specifier: ^5.14.0 version: 5.14.0(@photo-sphere-viewer/core@5.14.0)(@photo-sphere-viewer/settings-plugin@5.14.0(@photo-sphere-viewer/core@5.14.0)) '@photo-sphere-viewer/settings-plugin': - specifier: ^5.11.5 + specifier: ^5.14.0 version: 5.14.0(@photo-sphere-viewer/core@5.14.0) '@photo-sphere-viewer/video-plugin': - specifier: ^5.11.5 + specifier: ^5.14.0 version: 5.14.0(@photo-sphere-viewer/core@5.14.0) '@types/geojson': specifier: ^7946.0.16 @@ -3725,6 +3728,11 @@ packages: '@photo-sphere-viewer/core': 5.14.0 '@photo-sphere-viewer/video-plugin': 5.14.0 + '@photo-sphere-viewer/markers-plugin@5.14.0': + resolution: {integrity: sha512-w7txVHtLxXMS61m0EbNjgvdNXQYRh6Aa0oatft5oruKgoXLg/UlCu1mG6Btg+zrNsG05W2zl4gRM3fcWoVdneA==} + peerDependencies: + '@photo-sphere-viewer/core': 5.14.0 + '@photo-sphere-viewer/resolution-plugin@5.14.0': resolution: {integrity: sha512-PvDMX1h+8FzWdySxiorQ2bSmyBGTPsZjNNFRBqIfmb5C+01aWCIE7kuXodXGHwpXQNcOojsVX9IiX0Vz4CiW4A==} peerDependencies: @@ -15769,6 +15777,10 @@ snapshots: '@photo-sphere-viewer/video-plugin': 5.14.0(@photo-sphere-viewer/core@5.14.0) three: 0.180.0 + '@photo-sphere-viewer/markers-plugin@5.14.0(@photo-sphere-viewer/core@5.14.0)': + dependencies: + '@photo-sphere-viewer/core': 5.14.0 + '@photo-sphere-viewer/resolution-plugin@5.14.0(@photo-sphere-viewer/core@5.14.0)(@photo-sphere-viewer/settings-plugin@5.14.0(@photo-sphere-viewer/core@5.14.0))': dependencies: '@photo-sphere-viewer/core': 5.14.0 diff --git a/web/package.json b/web/package.json index 9a7de09424..1fb0f50653 100644 --- a/web/package.json +++ b/web/package.json @@ -31,11 +31,12 @@ "@immich/ui": "^0.45.1", "@mapbox/mapbox-gl-rtl-text": "0.2.3", "@mdi/js": "^7.4.47", - "@photo-sphere-viewer/core": "^5.11.5", - "@photo-sphere-viewer/equirectangular-video-adapter": "^5.11.5", - "@photo-sphere-viewer/resolution-plugin": "^5.11.5", - "@photo-sphere-viewer/settings-plugin": "^5.11.5", - "@photo-sphere-viewer/video-plugin": "^5.11.5", + "@photo-sphere-viewer/core": "^5.14.0", + "@photo-sphere-viewer/equirectangular-video-adapter": "^5.14.0", + "@photo-sphere-viewer/markers-plugin": "^5.14.0", + "@photo-sphere-viewer/resolution-plugin": "^5.14.0", + "@photo-sphere-viewer/settings-plugin": "^5.14.0", + "@photo-sphere-viewer/video-plugin": "^5.14.0", "@types/geojson": "^7946.0.16", "@zoom-image/core": "^0.41.0", "@zoom-image/svelte": "^0.3.0", diff --git a/web/src/lib/actions/shortcut.ts b/web/src/lib/actions/shortcut.ts index f7b3009403..8f01ce8924 100644 --- a/web/src/lib/actions/shortcut.ts +++ b/web/src/lib/actions/shortcut.ts @@ -39,13 +39,17 @@ export const shortcutLabel = (shortcut: Shortcut) => { /** Determines whether an event should be ignored. The event will be ignored if: * - The element dispatching the event is not the same as the element which the event listener is attached to * - The element dispatching the event is an input field + * - The element dispatching the event is a map canvas */ export const shouldIgnoreEvent = (event: KeyboardEvent | ClipboardEvent): boolean => { if (event.target === event.currentTarget) { return false; } const type = (event.target as HTMLInputElement).type; - return ['textarea', 'text', 'date', 'datetime-local', 'email', 'password'].includes(type); + return ( + ['textarea', 'text', 'date', 'datetime-local', 'email', 'password'].includes(type) || + (event.target instanceof HTMLCanvasElement && event.target.classList.contains('maplibregl-canvas')) + ); }; export const matchesShortcut = (event: KeyboardEvent, shortcut: Shortcut) => { diff --git a/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte b/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte index cd9a010f78..00f3a6795f 100644 --- a/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte +++ b/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte @@ -1,4 +1,5 @@