// Pure selection helpers for saved ("personal") views, split out of SavedViewsProvider so the // tie-break logic is unit-testable without mounting the provider (its React Query / context deps). /** Among the views whose filters match the live filters, pick the one to treat as active: prefer the * explicitly-applied ("sticky") view when several capture identical filters, so apply(B) isn't * silently re-attributed to an earlier duplicate A; otherwise the first match. Null if none match. */ export function preferSticky( matches: T[], stickyId: number | null, ): T | null { return matches.find((v) => v.id === stickyId) ?? matches[0] ?? null; } /** The starred default view to seed a module's filters with on first load, or null to leave them. * Seeds ONLY when the module is a genuinely fresh start (`canSeed`: no stored filters for this * account and — feed only — no URL filter override); otherwise the last-session/URL/manual filters * win, exactly as they do after any edit. First `is_default` wins if somehow several are flagged, so * the choice is deterministic. This is the single default-application path for BOTH the feed and Plex * (SavedViewsProvider drives it on the views query's first resolve) — it replaced the feed-only * localStorage mirror that raced the login effect and left Plex with no default at all. */ export function pickDefaultToSeed( views: T[], canSeed: boolean, ): T | null { if (!canSeed) return null; return views.find((v) => v.is_default) ?? null; }