fix(sort): address R13 S1 review findings
- PlexSidebar activeCount now compares the HEALED sort, so an out-of-scope key (movie "duration" after switching to shows) no longer inflates the active-filter badge while the control + grid show the default. - PlexProvider strips the legacy `sortDir` from the filters blob, so it stops leaking into the facets query key and being re-persisted on every change. - PlexProvider sort migration guards the fall-through: valid JSON that isn't a SortState now falls back instead of using the raw JSON string as the key. - New shared healPlexSort(sort, scope) is the single heal both PlexBrowse and PlexSidebar use (removes the noop-label plexSortOptions call + the duplication). - Tests: useSortState.dom.test.ts (hydrate/persist/heal round-trip via renderHook) and SortControl.dom.test.tsx (options, pick, direction toggle, directionless, trailing). vitest 94 -> 105. Gate green: tsc/eslint(0 err)/prettier/knip clean, vitest 105.
This commit is contained in:
@@ -72,12 +72,17 @@ export function PlexProvider({ children }: { children: ReactNode }) {
|
||||
const [sort, setSortState] = useState<SortState>(() => {
|
||||
const raw = getAccountRaw(LS.plexSort);
|
||||
if (!raw) return PLEX_SORT_FALLBACK;
|
||||
let wasJson = false;
|
||||
try {
|
||||
const parsed = parseSortState(JSON.parse(raw));
|
||||
wasJson = true;
|
||||
if (parsed) return parsed;
|
||||
} catch {
|
||||
/* legacy bare-key string handled below */
|
||||
/* not JSON → a legacy bare-key string, handled below */
|
||||
}
|
||||
// Valid JSON that wasn't a SortState is corrupt — fall back rather than treat the JSON text as a
|
||||
// key. Only a non-JSON raw is a genuine legacy bare key.
|
||||
if (wasJson) return PLEX_SORT_FALLBACK;
|
||||
let dir: "asc" | "desc" = "asc";
|
||||
try {
|
||||
if (
|
||||
@@ -94,7 +99,10 @@ export function PlexProvider({ children }: { children: ReactNode }) {
|
||||
const [filtersRaw, setFiltersRaw] = useState<string>(() => getAccountRaw(LS.plexFilters) ?? "{}");
|
||||
const filters = useMemo<PlexFilters>(() => {
|
||||
try {
|
||||
return { ...EMPTY_PLEX_FILTERS, ...JSON.parse(filtersRaw) };
|
||||
// Drop the legacy `sortDir` — direction now lives in the sort SortState. Left here it would leak
|
||||
// into the facets query key and be re-persisted on every filter change.
|
||||
const { sortDir: _drop, ...rest } = JSON.parse(filtersRaw);
|
||||
return { ...EMPTY_PLEX_FILTERS, ...rest };
|
||||
} catch {
|
||||
return EMPTY_PLEX_FILTERS;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user