mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-25 23:30:33 +01:00
The mobile ResetFiltersButton and the TV filter header each had their own active-state and reset logic, and both ignored sort & order — so the reset chip never appeared for a changed sort and reset never restored it. Centralise both in useFilterReset(libraryId): the chip now reflects a non-default sort, and reset restores SortName/Ascending and clears the per-library persisted sort/order/filter preferences so the reset sticks.
85 lines
2.7 KiB
TypeScript
85 lines
2.7 KiB
TypeScript
import { useAtom } from "jotai";
|
|
import { useCallback } from "react";
|
|
import {
|
|
FilterByPreferenceAtom,
|
|
filterByAtom,
|
|
genreFilterAtom,
|
|
SortByOption,
|
|
SortOrderOption,
|
|
sortByAtom,
|
|
sortByPreferenceAtom,
|
|
sortOrderAtom,
|
|
sortOrderPreferenceAtom,
|
|
tagsFilterAtom,
|
|
yearFilterAtom,
|
|
} from "@/utils/atoms/filters";
|
|
|
|
/**
|
|
* Single source of truth for the library filter bar's "reset" action and its
|
|
* visibility. The mobile ResetFiltersButton and the TV filter header both use
|
|
* this so they can't drift — sort/order used to be reset on neither path, so
|
|
* the reset (X) never reflected a changed sort.
|
|
*
|
|
* A reset clears the session filters AND the per-library persisted preferences
|
|
* (sort, order, filterBy); otherwise the saved preference resurfaces when the
|
|
* library's mount effect re-applies it on the next entry.
|
|
*/
|
|
export const useFilterReset = (libraryId: string) => {
|
|
const [selectedGenres, setSelectedGenres] = useAtom(genreFilterAtom);
|
|
const [selectedYears, setSelectedYears] = useAtom(yearFilterAtom);
|
|
const [selectedTags, setSelectedTags] = useAtom(tagsFilterAtom);
|
|
const [filterBy, setFilterBy] = useAtom(filterByAtom);
|
|
const [sortBy, setSortBy] = useAtom(sortByAtom);
|
|
const [sortOrder, setSortOrder] = useAtom(sortOrderAtom);
|
|
const [, setSortByPreference] = useAtom(sortByPreferenceAtom);
|
|
const [, setSortOrderPreference] = useAtom(sortOrderPreferenceAtom);
|
|
const [, setFilterByPreference] = useAtom(FilterByPreferenceAtom);
|
|
|
|
// SortName / Ascending is the baseline a library opens with (mount-effect
|
|
// fallback), so any other value counts as an active, resettable sort.
|
|
const hasActiveFilters =
|
|
selectedGenres.length > 0 ||
|
|
selectedYears.length > 0 ||
|
|
selectedTags.length > 0 ||
|
|
filterBy.length > 0 ||
|
|
sortBy[0] !== SortByOption.SortName ||
|
|
sortOrder[0] !== SortOrderOption.Ascending;
|
|
|
|
const resetAllFilters = useCallback(() => {
|
|
setSelectedGenres([]);
|
|
setSelectedYears([]);
|
|
setSelectedTags([]);
|
|
setFilterBy([]);
|
|
setSortBy([SortByOption.SortName]);
|
|
setSortOrder([SortOrderOption.Ascending]);
|
|
setSortByPreference((prev) => {
|
|
const next = { ...prev };
|
|
delete next[libraryId];
|
|
return next;
|
|
});
|
|
setSortOrderPreference((prev) => {
|
|
const next = { ...prev };
|
|
delete next[libraryId];
|
|
return next;
|
|
});
|
|
setFilterByPreference((prev) => {
|
|
const next = { ...prev };
|
|
delete next[libraryId];
|
|
return next;
|
|
});
|
|
}, [
|
|
libraryId,
|
|
setSelectedGenres,
|
|
setSelectedYears,
|
|
setSelectedTags,
|
|
setFilterBy,
|
|
setSortBy,
|
|
setSortOrder,
|
|
setSortByPreference,
|
|
setSortOrderPreference,
|
|
setFilterByPreference,
|
|
]);
|
|
|
|
return { hasActiveFilters, resetAllFilters };
|
|
};
|