diff --git a/mobile/lib/pages/collections/collections.page.dart b/mobile/lib/pages/collections/collections.page.dart index 028bc94c02291..20d9f8fa47d1b 100644 --- a/mobile/lib/pages/collections/collections.page.dart +++ b/mobile/lib/pages/collections/collections.page.dart @@ -1,9 +1,9 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/extensions/asyncvalue_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/providers/album/album.provider.dart'; import 'package:immich_mobile/providers/album/albumv2.provider.dart'; import 'package:immich_mobile/providers/search/people.provider.dart'; import 'package:immich_mobile/providers/server_info.provider.dart'; @@ -134,17 +134,29 @@ class PeopleCollectionCard extends ConsumerWidget { } } -class AlbumsCollectionCard extends ConsumerWidget { +class AlbumsCollectionCard extends HookConsumerWidget { final bool isLocal; const AlbumsCollectionCard({super.key, this.isLocal = false}); @override Widget build(BuildContext context, WidgetRef ref) { - final albums = isLocal - ? ref.watch(albumProviderV2).where((album) => album.isLocal) - : ref.watch(albumProviderV2).where((album) => album.isRemote); + final albums = useState([]); + final size = MediaQuery.of(context).size.width * 0.5 - 20; + + useEffect( + () { + Future.microtask(() async { + albums.value = isLocal + ? await ref.read(albumProviderV2.notifier).getLocalAlbums() + : await ref.read(albumProviderV2.notifier).getRemoteAlbums(); + }); + return null; + }, + [], + ); + return GestureDetector( onTap: () => context.pushRoute( isLocal @@ -167,7 +179,7 @@ class AlbumsCollectionCard extends ConsumerWidget { crossAxisSpacing: 8, mainAxisSpacing: 8, physics: const NeverScrollableScrollPhysics(), - children: albums.take(4).map((album) { + children: albums.value.take(4).map((album) { return AlbumThumbnailCard( album: album, showTitle: false, diff --git a/mobile/lib/providers/album/albumv2.provider.dart b/mobile/lib/providers/album/albumv2.provider.dart index 4e4c7fa0a9f14..85caeb4e0e6a7 100644 --- a/mobile/lib/providers/album/albumv2.provider.dart +++ b/mobile/lib/providers/album/albumv2.provider.dart @@ -26,7 +26,7 @@ class AlbumNotifierV2 extends StateNotifier> { final Isar db; late final StreamSubscription> _streamSub; - Future getAllAlbums() { + Future refreshAlbums() { return Future.wait([ _albumService.refreshDeviceAlbums(), _albumService.refreshRemoteAlbums(isShared: true), @@ -103,6 +103,14 @@ class AlbumNotifierV2 extends StateNotifier> { } } + Future> getRemoteAlbums() { + return db.albums.filter().remoteIdIsNotNull().findAll(); + } + + Future> getLocalAlbums() { + return db.albums.filter().not().remoteIdIsNotNull().findAll(); + } + @override void dispose() { _streamSub.cancel(); diff --git a/mobile/lib/routing/tab_navigation_observer.dart b/mobile/lib/routing/tab_navigation_observer.dart index e16fecb32392a..bbb870b8b0e5a 100644 --- a/mobile/lib/routing/tab_navigation_observer.dart +++ b/mobile/lib/routing/tab_navigation_observer.dart @@ -2,6 +2,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/foundation.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/providers/album/album.provider.dart'; +import 'package:immich_mobile/providers/album/albumv2.provider.dart'; import 'package:immich_mobile/providers/memory.provider.dart'; import 'package:immich_mobile/providers/search/people.provider.dart'; @@ -50,6 +51,10 @@ class TabNavigationObserver extends AutoRouterObserver { ref.read(albumProvider.notifier).getAllAlbums(); } + if (route.name == 'CollectionsRoute') { + ref.read(albumProviderV2.notifier).refreshAlbums(); + } + if (route.name == 'HomeRoute') { ref.invalidate(memoryFutureProvider); Future(() => ref.read(assetProvider.notifier).getAllAsset());