split up search page
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user