chore(hygiene): Phase 4 guardrails — noUnusedLocals/Parameters + dead-code sweep
Enable tsconfig noUnusedLocals + noUnusedParameters (permanent guardrail: every tsc/ build now flags re-accumulated dead code). Fixed the 8 violations that surfaced, all genuine dead code: - Sidebar: deleted unused SORT_IDS/SHOW_IDS/rollSeed consts + the dead Toggle component (+ its now-unused Switch import). - PlexBrowse: dropped the unused onClearSearch prop (Props + destructure + App call site). - VideoEditor: dropped the unused map index; notifications: deleted the dead back-compat toast(); storage: deleted the unused non-account usePersistedState (+ readJSON import). - SavedViewsWidget: deleted the dead loadDefaultViewFilters export (App loads the default view inline; resolves the last knip unused-export → knip now clean). Backend: added backend/ruff.toml (ignore E402 — intentional pre-import setup in main.py) and fixed the 6 E702/E741 style items (_vtt_s_to_ts semicolons, ambiguous `l` loop vars) so ruff is green. localdev boots; Feed/Plex/sidebar render; 0 console errors.
This commit is contained in:
parent
b481de0e48
commit
4dd1327b93
12 changed files with 27 additions and 85 deletions
|
|
@ -223,11 +223,6 @@ export function notify(input: NotifyInput): number {
|
|||
return id;
|
||||
}
|
||||
|
||||
/** Back-compat: a simple info toast with an optional inline action (e.g. Undo). */
|
||||
function toast(message: string, action?: NotifAction): number {
|
||||
return notify({ message, action });
|
||||
}
|
||||
|
||||
/** Close the transient toast surface; the entry stays in the center's history. */
|
||||
export function dismiss(id: number): void {
|
||||
items = items.map((n) => (n.id === id ? { ...n, dismissed: true } : n));
|
||||
|
|
|
|||
|
|
@ -129,29 +129,11 @@ export function writeJSON(key: string, value: unknown): void {
|
|||
|
||||
// --- reactive persisted string state ----------------------------------------------------
|
||||
|
||||
/** A `useState` whose string value is mirrored to localStorage, so it survives a reload (F5).
|
||||
* Validation is deferred to the caller (clamp at render) so it can be used before an
|
||||
* async-loaded option list is known, keeping hook order stable. Generalizes the per-component
|
||||
* "persisted active tab" pattern (Settings, Stats, admin pages, the channel filter…). */
|
||||
function usePersistedState(
|
||||
key: string,
|
||||
fallback = "",
|
||||
): [string, (value: string) => void] {
|
||||
const [value, setValue] = useState<string>(() => localStorage.getItem(key) ?? fallback);
|
||||
const set = (next: string) => {
|
||||
setValue(next);
|
||||
try {
|
||||
localStorage.setItem(key, next);
|
||||
} catch {
|
||||
/* ignore */
|
||||
}
|
||||
};
|
||||
return [value, set];
|
||||
}
|
||||
|
||||
/** Like usePersistedState but scoped to the current account (see accountKey), so one account's
|
||||
* persisted tab/view position doesn't carry over to another in the same browser. These hooks run
|
||||
* in components that only mount once signed in, so the account is known. */
|
||||
/** A `useState` whose string value is mirrored to localStorage, scoped to the current account (see
|
||||
* accountKey), so one account's persisted tab/view position doesn't carry over to another in the
|
||||
* same browser. Survives reload (F5); validation is deferred to the caller (clamp at render) so it
|
||||
* can be used before an async-loaded option list is known, keeping hook order stable. These hooks
|
||||
* run in components that only mount once signed in, so the account is known. */
|
||||
export function useAccountPersistedState(
|
||||
base: string,
|
||||
fallback = "",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue