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
|
|
@ -54,7 +54,6 @@ type Sub =
|
|||
|
||||
type Props = {
|
||||
q: string;
|
||||
onClearSearch: () => void;
|
||||
scope: string; // movie | show | both (unified cross-library scope)
|
||||
setScope: (v: string) => void;
|
||||
show: string;
|
||||
|
|
@ -70,7 +69,6 @@ const PAGE = 40;
|
|||
|
||||
export default function PlexBrowse({
|
||||
q,
|
||||
onClearSearch,
|
||||
scope,
|
||||
setScope,
|
||||
show,
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import { CSS } from "@dnd-kit/utilities";
|
|||
import { api, getActiveAccount, type FeedFilters, type SavedView } from "../lib/api";
|
||||
import { filtersToParams, shareUrl } from "../lib/urlState";
|
||||
import { notify } from "../lib/notifications";
|
||||
import { accountKey, LS, readJSON, writeJSON } from "../lib/storage";
|
||||
import { accountKey, LS, writeJSON } from "../lib/storage";
|
||||
import { useConfirm } from "./ConfirmProvider";
|
||||
|
||||
// Compact, order-independent signature of a filter set (reuses the share serializer, which
|
||||
|
|
@ -28,14 +28,6 @@ import { useConfirm } from "./ConfirmProvider";
|
|||
// saved view that matches the feed's current filters.
|
||||
const keyOf = (f: FeedFilters) => filtersToParams(f).toString();
|
||||
|
||||
/** The default view's filters, or null. Read synchronously on load (App.loadAccountFilters) from a
|
||||
* per-account localStorage mirror the widget keeps in sync — avoids a flash before the query loads.
|
||||
* Per-account so one account's default view never seeds another account's feed. */
|
||||
export function loadDefaultViewFilters(): FeedFilters | null {
|
||||
const key = accountKey(LS.defaultViewFilters, getActiveAccount());
|
||||
return key ? readJSON<FeedFilters | null>(key, null) : null;
|
||||
}
|
||||
|
||||
function syncDefaultMirror(views: SavedView[]): void {
|
||||
const key = accountKey(LS.defaultViewFilters, getActiveAccount());
|
||||
if (!key) return;
|
||||
|
|
|
|||
|
|
@ -39,29 +39,11 @@ import {
|
|||
import { shareUrl } from "../lib/urlState";
|
||||
import { notify } from "../lib/notifications";
|
||||
import { useDebounced } from "../lib/useDebounced";
|
||||
import { Switch } from "./ui/form";
|
||||
import TagManager from "./TagManager";
|
||||
import SavedViewsWidget from "./SavedViewsWidget";
|
||||
import CollapsedFilterRail from "./CollapsedFilterRail";
|
||||
|
||||
// Filter ids; display labels resolved at render time via t("sidebar.sort.<id>") etc.
|
||||
const SORT_IDS = [
|
||||
"newest",
|
||||
"oldest",
|
||||
"views",
|
||||
"duration_desc",
|
||||
"duration_asc",
|
||||
"title",
|
||||
"subscribers",
|
||||
"priority",
|
||||
"shuffle",
|
||||
];
|
||||
|
||||
const SHOW_IDS = ["unwatched", "in_progress", "all", "watched", "hidden"];
|
||||
|
||||
// Fresh shuffle token for the "surprise me" sort.
|
||||
const rollSeed = () => Math.floor(Math.random() * 1_000_000_000);
|
||||
|
||||
const DATE_PRESETS: { days: number; key: string }[] = [
|
||||
{ days: 1, key: "24h" },
|
||||
{ days: 7, key: "1week" },
|
||||
|
|
@ -697,19 +679,3 @@ function WidgetCard({
|
|||
);
|
||||
}
|
||||
|
||||
function Toggle({
|
||||
label,
|
||||
checked,
|
||||
onChange,
|
||||
}: {
|
||||
label: string;
|
||||
checked: boolean;
|
||||
onChange: (v: boolean) => void;
|
||||
}) {
|
||||
return (
|
||||
<label className="flex items-center justify-between py-1 cursor-pointer text-sm">
|
||||
<span>{label}</span>
|
||||
<Switch label={label} checked={checked} onChange={onChange} />
|
||||
</label>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -366,7 +366,7 @@ export default function VideoEditor({ job, onClose }: { job: DownloadJob; onClos
|
|||
</div>
|
||||
)}
|
||||
{/* segment tint: dropped = dimmed + hatched */}
|
||||
{segments.map((s, i) => (
|
||||
{segments.map((s) => (
|
||||
<div
|
||||
key={s.id}
|
||||
className={clsx(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue