diff --git a/mobile/lib/ui/viewer/gallery/state/search_filter_data_provider.dart b/mobile/lib/ui/viewer/gallery/state/search_filter_data_provider.dart new file mode 100644 index 0000000000..badbc6e63b --- /dev/null +++ b/mobile/lib/ui/viewer/gallery/state/search_filter_data_provider.dart @@ -0,0 +1,78 @@ +import "package:flutter/material.dart"; +import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart"; + +class SearchFilterDataProvider { + final _appliedFiltersNotifier = _AppliedFiltersNotifier(); + final _recommendedFiltersNotifier = _RecommendedFiltersNotifier(); + + get recommendations => _recommendedFiltersNotifier.recommendedFilters; + get appliedFilters => _appliedFiltersNotifier.appliedFilters; + + void addRecommendations(List filters) { + _recommendedFiltersNotifier.addFilters(filters); + } + + void applyFilters(List filters) { + _appliedFiltersNotifier.addFilters(filters); + _recommendedFiltersNotifier.removeFilters(filters); + } + + void removeAppliedFilters(List filters) { + _appliedFiltersNotifier.removeFilters(filters); + _recommendedFiltersNotifier.addFilters(filters); + } + + void clearRecommendations() { + _recommendedFiltersNotifier.clearFilters(); + } + + void addListener({ + bool toApplied = false, + bool toRecommended = false, + required VoidCallback listener, + }) { + if (toApplied) { + _appliedFiltersNotifier.addListener(listener); + } + if (toRecommended) { + _recommendedFiltersNotifier.addListener(listener); + } + } +} + +class _AppliedFiltersNotifier extends ChangeNotifier { + final List _appliedFilters = []; + + List get appliedFilters => _appliedFilters; + + void addFilters(List filters) { + _appliedFilters.addAll(filters); + notifyListeners(); + } + + void removeFilters(List filters) { + _appliedFilters.removeWhere((filter) => filters.contains(filter)); + notifyListeners(); + } +} + +class _RecommendedFiltersNotifier extends ChangeNotifier { + final List _recommendedFilters = []; + + List get recommendedFilters => _recommendedFilters; + + void addFilters(List filters) { + _recommendedFilters.addAll(filters); + notifyListeners(); + } + + void removeFilters(List filters) { + _recommendedFilters.removeWhere((filter) => filters.contains(filter)); + notifyListeners(); + } + + void clearFilters() { + _recommendedFilters.clear(); + notifyListeners(); + } +}