split up search page

This commit is contained in:
mertalev
2025-03-05 19:06:04 -05:00
parent c110c9b00e
commit 2c7e6071f5
13 changed files with 1005 additions and 640 deletions
@@ -0,0 +1,22 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
/// Whether to display the video part of a motion photo
final isSearchingProvider = StateNotifierProvider<IsSearching, bool>((ref) {
return IsSearching(ref);
});
class IsSearching extends StateNotifier<bool> {
IsSearching(this.ref) : super(false);
final Ref ref;
bool get value => state;
set value(bool value) {
state = value;
}
void toggle() {
state = !state;
}
}
@@ -1,5 +1,6 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/models/search/search_result.model.dart';
import 'package:immich_mobile/providers/search/is_searching.provider.dart';
import 'package:immich_mobile/services/timeline.service.dart';
import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart';
import 'package:immich_mobile/models/search/search_filter.model.dart';
@@ -10,36 +11,41 @@ part 'paginated_search.provider.g.dart';
final paginatedSearchProvider =
StateNotifierProvider<PaginatedSearchNotifier, SearchResult>(
(ref) => PaginatedSearchNotifier(ref.watch(searchServiceProvider)),
(ref) => PaginatedSearchNotifier(ref),
);
class PaginatedSearchNotifier extends StateNotifier<SearchResult> {
final SearchService _searchService;
final Ref ref;
PaginatedSearchNotifier(this._searchService)
: super(SearchResult(assets: [], nextPage: 1));
PaginatedSearchNotifier(this.ref)
: super(const SearchResult(assets: [], nextPage: 1));
Future<bool> search(SearchFilter filter) async {
if (state.nextPage == null) {
return false;
}
final result = await _searchService.search(filter, state.nextPage!);
ref.read(isSearchingProvider.notifier).value = true;
try {
final result =
await ref.read(searchServiceProvider).search(filter, state.nextPage!);
if (result == null) {
return false;
}
if (result == null) {
return false;
state = SearchResult(
assets: [...state.assets, ...result.assets],
nextPage: result.nextPage,
);
} finally {
ref.read(isSearchingProvider.notifier).value = false;
}
state = SearchResult(
assets: [...state.assets, ...result.assets],
nextPage: result.nextPage,
);
return true;
}
clear() {
state = SearchResult(assets: [], nextPage: 1);
state = const SearchResult(assets: [], nextPage: 1);
}
}
@@ -0,0 +1,81 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/interfaces/person_api.interface.dart';
import 'package:immich_mobile/models/search/search_filter.model.dart';
import 'package:immich_mobile/providers/search/is_searching.provider.dart';
import 'package:immich_mobile/providers/search/paginated_search.provider.dart';
final searchFiltersProvider =
StateNotifierProvider<SearchFilterNotifier, SearchFilter>((ref) {
return SearchFilterNotifier(ref);
});
const searchFiltersDefault = SearchFilter(
people: {},
location: SearchLocationFilter(),
camera: SearchCameraFilter(),
date: SearchDateFilter(),
display: SearchDisplayFilters(
isNotInAlbum: false,
isArchive: false,
isFavorite: false,
),
mediaType: AssetType.other,
);
class SearchFilterNotifier extends StateNotifier<SearchFilter> {
final Ref ref;
SearchFilterNotifier(this.ref) : super(searchFiltersDefault);
SearchFilter get value => state;
set value(SearchFilter value) {
state = value;
}
void reset() {
state = searchFiltersDefault;
}
Set<Person> get people => state.people;
SearchLocationFilter get location => state.location;
SearchCameraFilter get camera => state.camera;
SearchDateFilter get date => state.date;
SearchDisplayFilters get display => state.display;
AssetType get mediaType => state.mediaType;
set people(Set<Person> value) {
state = state.copyWith(people: value);
}
set location(SearchLocationFilter value) {
state = state.copyWith(location: value);
}
set camera(SearchCameraFilter value) {
state = state.copyWith(camera: value);
}
set date(SearchDateFilter value) {
state = state.copyWith(date: value);
}
set display(SearchDisplayFilters value) {
state = state.copyWith(display: value);
}
set mediaType(AssetType value) {
state = state.copyWith(mediaType: value);
}
Future<void> search() {
ref.read(paginatedSearchProvider.notifier).clear();
return ref.read(paginatedSearchProvider.notifier).search(state);
}
}