diff --git a/mobile/lib/modules/search/providers/search_page_state.provider.dart b/mobile/lib/modules/search/providers/search_page_state.provider.dart index f1637c8b58..ee0d4c780b 100644 --- a/mobile/lib/modules/search/providers/search_page_state.provider.dart +++ b/mobile/lib/modules/search/providers/search_page_state.provider.dart @@ -3,7 +3,7 @@ import 'package:immich_mobile/models/search/search_curated_content.model.dart'; import 'package:immich_mobile/modules/search/services/search.service.dart'; -final getPlacesProvider = +final getPreviewPlacesProvider = FutureProvider.autoDispose>((ref) async { final SearchService searchService = ref.watch(searchServiceProvider); @@ -27,3 +27,25 @@ final getPlacesProvider = return curatedContent; }); + +final getAllPlacesProvider = + FutureProvider.autoDispose>((ref) async { + final SearchService searchService = ref.watch(searchServiceProvider); + + final assetPlaces = await searchService.getAllPlaces(); + + if (assetPlaces == null) { + return []; + } + + final curatedContent = assetPlaces + .map( + (data) => SearchCuratedContent( + label: data.exifInfo!.city!, + id: data.id, + ), + ) + .toList(); + + return curatedContent; +}); diff --git a/mobile/lib/modules/search/services/search.service.dart b/mobile/lib/modules/search/services/search.service.dart index fc06a21bf7..ada06e2d1e 100644 --- a/mobile/lib/modules/search/services/search.service.dart +++ b/mobile/lib/modules/search/services/search.service.dart @@ -119,4 +119,13 @@ class SearchService { } return null; } + + Future?> getAllPlaces() async { + try { + return await _apiService.searchApi.getAssetsByCity(); + } catch (error, stackTrace) { + _log.severe("Failed to getAllPlaces", error, stackTrace); + } + return null; + } } diff --git a/mobile/lib/modules/search/views/curated_location_page.dart b/mobile/lib/modules/search/views/all_places_page.dart similarity index 88% rename from mobile/lib/modules/search/views/curated_location_page.dart rename to mobile/lib/modules/search/views/all_places_page.dart index dce5de183d..c03a6ff6a8 100644 --- a/mobile/lib/modules/search/views/curated_location_page.dart +++ b/mobile/lib/modules/search/views/all_places_page.dart @@ -8,13 +8,13 @@ import 'package:immich_mobile/modules/search/providers/search_page_state.provide import 'package:immich_mobile/modules/search/ui/explore_grid.dart'; @RoutePage() -class CuratedLocationPage extends HookConsumerWidget { - const CuratedLocationPage({super.key}); +class AllPlacesPage extends HookConsumerWidget { + const AllPlacesPage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { AsyncValue> places = - ref.watch(getPlacesProvider); + ref.watch(getAllPlacesProvider); return Scaffold( appBar: AppBar( diff --git a/mobile/lib/modules/search/views/search_page.dart b/mobile/lib/modules/search/views/search_page.dart index 1650d1839c..421184fbc5 100644 --- a/mobile/lib/modules/search/views/search_page.dart +++ b/mobile/lib/modules/search/views/search_page.dart @@ -27,7 +27,7 @@ class SearchPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final places = ref.watch(getPlacesProvider); + final places = ref.watch(getPreviewPlacesProvider); final curatedPeople = ref.watch(getAllPeopleProvider); final isMapEnabled = ref.watch(serverInfoProvider.select((v) => v.serverFeatures.map)); @@ -174,7 +174,7 @@ class SearchPage extends HookConsumerWidget { SearchRowTitle( title: "search_page_places".tr(), onViewAllPressed: () => - context.pushRoute(const CuratedLocationRoute()), + context.pushRoute(const AllPlacesRoute()), top: 0, ), const SizedBox(height: 10.0), diff --git a/mobile/lib/routing/router.dart b/mobile/lib/routing/router.dart index 19fae27c5f..4122d94fde 100644 --- a/mobile/lib/routing/router.dart +++ b/mobile/lib/routing/router.dart @@ -41,7 +41,7 @@ import 'package:immich_mobile/modules/trash/views/trash_page.dart'; import 'package:immich_mobile/modules/search/views/all_motion_videos_page.dart'; import 'package:immich_mobile/modules/search/views/all_people_page.dart'; import 'package:immich_mobile/modules/search/views/all_videos_page.dart'; -import 'package:immich_mobile/modules/search/views/curated_location_page.dart'; +import 'package:immich_mobile/modules/search/views/all_places_page.dart'; import 'package:immich_mobile/modules/search/views/person_result_page.dart'; import 'package:immich_mobile/modules/search/views/recently_added_page.dart'; import 'package:immich_mobile/modules/search/views/search_page.dart'; @@ -127,7 +127,7 @@ class AppRouter extends _$AppRouter { guards: [_authGuard, _duplicateGuard, _backupPermissionGuard], ), AutoRoute( - page: CuratedLocationRoute.page, + page: AllPlacesRoute.page, guards: [_authGuard, _duplicateGuard], ), AutoRoute( diff --git a/mobile/lib/routing/router.gr.dart b/mobile/lib/routing/router.gr.dart index fa9fa32f66..2b0baff086 100644 --- a/mobile/lib/routing/router.gr.dart +++ b/mobile/lib/routing/router.gr.dart @@ -138,10 +138,10 @@ abstract class _$AppRouter extends RootStackRouter { ), ); }, - CuratedLocationRoute.name: (routeData) { + AllPlacesRoute.name: (routeData) { return AutoRoutePage( routeData: routeData, - child: const CuratedLocationPage(), + child: const AllPlacesPage(), ); }, FailedBackupStatusRoute.name: (routeData) { @@ -753,11 +753,11 @@ class CreateAlbumRouteArgs { } /// generated route for -/// [CuratedLocationPage] -class CuratedLocationRoute extends PageRouteInfo { - const CuratedLocationRoute({List? children}) +/// [AllPlacesPage] +class AllPlacesRoute extends PageRouteInfo { + const AllPlacesRoute({List? children}) : super( - CuratedLocationRoute.name, + AllPlacesRoute.name, initialChildren: children, ); diff --git a/mobile/lib/routing/tab_navigation_observer.dart b/mobile/lib/routing/tab_navigation_observer.dart index a5ea99da80..6dc4067a2c 100644 --- a/mobile/lib/routing/tab_navigation_observer.dart +++ b/mobile/lib/routing/tab_navigation_observer.dart @@ -37,7 +37,7 @@ class TabNavigationObserver extends AutoRouterObserver { // Perform tasks on re-visit to SearchRoute if (route.name == 'SearchRoute') { // Refresh Location State - ref.invalidate(getPlacesProvider); + ref.invalidate(getPreviewPlacesProvider); ref.invalidate(getAllPeopleProvider); }