// The feed's sort vocabulary. `FeedFilters.sort` is a single wire string ("newest", "views_asc", // …); the UI thinks in a key + direction. Kept here rather than inside Feed so the active-filter // chips can label a sort without re-deriving the mapping. export type SortKey = | "date" | "popular" | "duration" | "title" | "subscribers" | "priority" | "shuffle" | "relevance"; export const SORT_KEYS: SortKey[] = [ "date", "popular", "duration", "title", "subscribers", "priority", "shuffle", ]; /** Sorts with no meaningful asc/desc flip. */ export const DIRECTIONLESS: SortKey[] = ["shuffle", "relevance"]; const SORT_MAP: Record, { asc: string; desc: string }> = { date: { desc: "newest", asc: "oldest" }, popular: { desc: "views", asc: "views_asc" }, duration: { desc: "duration_desc", asc: "duration_asc" }, title: { asc: "title", desc: "title_desc" }, subscribers: { desc: "subscribers", asc: "subscribers_asc" }, priority: { desc: "priority", asc: "priority_asc" }, }; export const SORT_DEFAULT_DIR: Record, "asc" | "desc"> = { date: "desc", popular: "desc", duration: "desc", title: "asc", subscribers: "desc", priority: "desc", }; export function parseSort(s: string): { key: SortKey; dir: "asc" | "desc" } { if (s === "shuffle" || s === "relevance") return { key: s, dir: "desc" }; for (const k of Object.keys(SORT_MAP) as (keyof typeof SORT_MAP)[]) { if (SORT_MAP[k].asc === s) return { key: k, dir: "asc" }; if (SORT_MAP[k].desc === s) return { key: k, dir: "desc" }; } return { key: "date", dir: "desc" }; } export function buildSort(key: SortKey, dir: "asc" | "desc"): string { if (key === "shuffle" || key === "relevance") return key; return SORT_MAP[key][dir]; }