mirror of
https://github.com/immich-app/immich
synced 2025-11-07 17:27:20 +00:00
fix: persist search scroll between rebuilds Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex <alex.tran1502@gmail.com>
43 lines
1.3 KiB
Dart
43 lines
1.3 KiB
Dart
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:immich_mobile/domain/models/search_result.model.dart';
|
|
import 'package:immich_mobile/domain/services/search.service.dart';
|
|
import 'package:immich_mobile/models/search/search_filter.model.dart';
|
|
import 'package:immich_mobile/providers/infrastructure/search.provider.dart';
|
|
|
|
final paginatedSearchProvider = StateNotifierProvider<PaginatedSearchNotifier, SearchResult>(
|
|
(ref) => PaginatedSearchNotifier(ref.watch(searchServiceProvider)),
|
|
);
|
|
|
|
class PaginatedSearchNotifier extends StateNotifier<SearchResult> {
|
|
final SearchService _searchService;
|
|
|
|
PaginatedSearchNotifier(this._searchService) : 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!);
|
|
|
|
if (result == null) {
|
|
return false;
|
|
}
|
|
|
|
state = SearchResult(
|
|
assets: [...state.assets, ...result.assets],
|
|
nextPage: result.nextPage,
|
|
scrollOffset: state.scrollOffset,
|
|
);
|
|
|
|
return true;
|
|
}
|
|
|
|
void setScrollOffset(double offset) {
|
|
state = state.copyWith(scrollOffset: offset);
|
|
}
|
|
|
|
clear() {
|
|
state = const SearchResult(assets: [], nextPage: 1, scrollOffset: 0.0);
|
|
}
|
|
}
|