refactor(channels): share useSortState across the manager + discovery (R13 S1)
ChannelsProvider and ChannelDiscovery each hand-rolled the same sort plumbing (useState<SortState> + parseSortState + a persist key). Both now use the shared useSortState hook. hydrateSort gains an empty-options rule: with no vocabulary passed it parses without healing (these owners heal for display via ColumnSortControl against the live columns), so the un-healed provider store is preserved. plexSortKeys made module-private (knip). Closes R13 S1: feed, Plex, and the two channel tables all sort through one SortControl + one SortState model. Gate green: tsc/eslint(0 err)/prettier/knip clean, vitest 94.
This commit is contained in:
@@ -78,16 +78,20 @@ export function healSort(
|
||||
return sort && options.some((o) => o.key === sort.key) ? sort : fallback;
|
||||
}
|
||||
|
||||
/** Hydrate a persisted raw string into a healed `SortState`. Accepts the JSON `{key,dir}` shape and
|
||||
* tolerates a legacy bare-key string (older builds stored just the key), falling back otherwise. */
|
||||
/** Hydrate a persisted raw string into a `SortState`. Accepts the JSON `{key,dir}` shape and tolerates
|
||||
* a legacy bare-key string (older builds stored just the key). When `options` is empty, the value is
|
||||
* parsed but NOT healed — for a table/provider that owns no vocabulary itself and heals for display
|
||||
* elsewhere (e.g. `ColumnSortControl`); a non-empty `options` heals an absent key to `fallback`. */
|
||||
export function hydrateSort(
|
||||
raw: string | null,
|
||||
options: SortOption[],
|
||||
fallback: SortState = null,
|
||||
): SortState {
|
||||
if (!raw) return fallback;
|
||||
const heal = (s: SortState): SortState =>
|
||||
options.length === 0 ? (s ?? fallback) : healSort(s, options, fallback);
|
||||
try {
|
||||
return healSort(parseSortState(JSON.parse(raw)), options, fallback);
|
||||
return heal(parseSortState(JSON.parse(raw)));
|
||||
} catch {
|
||||
const opt = options.find((o) => o.key === raw);
|
||||
return opt ? { key: raw, dir: opt.defaultDir ?? "asc" } : fallback;
|
||||
|
||||
Reference in New Issue
Block a user