fix(e4): address code-review findings (a11y sweep + dedup guards)
Resolves the 5 /code-review high findings on this branch: - a11y sweep: extend aria-label to the remaining icon-only Plex card buttons the first pass missed — PlexPosterCard Info, SeasonCard watched-toggle + add-season (EpisodeCard already had them). "Fix a principle everywhere, in one sweep." - new shared lib/parseId.ts `parsePositiveIntId`, used by BOTH readSelectedId (now guarding the stored ?pl fallback the same as the URL — was unguarded) and plexSubUrl's ?v=playlist decode; removes the hand-duplicated guard. - PAGE_KEY exported from navigationInit and imported by NavigationProvider (was defined in both). - hoist a `watchedLabel` const per card so title + aria-label can't drift. +8 tests (parseId unit + guarded-stored ?pl); full FE gate green (tsc/eslint/ prettier/knip, 317 vitest).
This commit is contained in:
@@ -1,14 +1,14 @@
|
||||
import { getAccountRaw, LS } from "../lib/storage";
|
||||
import { parsePositiveIntId } from "../lib/parseId";
|
||||
|
||||
// The Playlists module's selected-id seed, split out of PlaylistsProvider so its ?pl guard is
|
||||
// unit-testable and the provider stays react-refresh-clean (component-only exports).
|
||||
export function readSelectedId(): number | null {
|
||||
// A ?pl bookmark wins over the stored selection so a pasted link opens that playlist. Accept only a
|
||||
// positive integer id — a bare "?pl=" gives Number("")===0 (finite!) and "?pl=1.5" a fractional id,
|
||||
// both of which would select a non-existent playlist.
|
||||
const fromUrl = new URLSearchParams(window.location.search).get("pl");
|
||||
const n = fromUrl ? Number(fromUrl) : NaN;
|
||||
if (Number.isInteger(n) && n > 0) return n;
|
||||
const s = getAccountRaw(LS.playlist);
|
||||
return s ? Number(s) : null;
|
||||
// A ?pl bookmark wins over the stored selection so a pasted link opens that playlist. BOTH must be a
|
||||
// positive-integer id (a bare "?pl=" gives Number("")===0, "?pl=1.5" a fractional id) — either would
|
||||
// select a non-existent playlist, so the stored fallback is guarded exactly like the URL.
|
||||
return (
|
||||
parsePositiveIntId(new URLSearchParams(window.location.search).get("pl")) ??
|
||||
parsePositiveIntId(getAccountRaw(LS.playlist))
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user