storage.ts's registry gives each key a kind (pref, device, view, cache, public); a key without one does not compile. A contract test refuses a key spelled out elsewhere, an account preference read or written straight from storage instead of through usePref, and an e2e seed of a key nobody reads. The keys the next account's wipe keeps are the public ones. The seven preferences kept only in the browser move onto usePref: start on Home, the onboarding dismissal, the release banner's last version, the channel manager's layout, the Plex playlist layout, the playlist rail's sort and channel discovery's sort. usePref reads an older bare-string copy, and a value only this browser held is saved to the server once, so the account's other devices get it. Performance mode is the device's: it is neither read from the account nor saved to it.
17 lines
860 B
TypeScript
17 lines
860 B
TypeScript
// Build info baked into the SPA at build time (Vite inlines VITE_*-prefixed env).
|
|
// Injected via Docker build-args (see Dockerfile); falls back to "dev" for un-stamped builds.
|
|
import { LS } from "./storage";
|
|
import type { UsePrefOptions } from "./usePref";
|
|
|
|
export const FRONTEND_VERSION = import.meta.env.VITE_APP_VERSION || "dev";
|
|
export const FRONTEND_SHA = import.meta.env.VITE_GIT_SHA || "unknown";
|
|
export const FRONTEND_BUILD_DATE = import.meta.env.VITE_BUILD_DATE || "";
|
|
|
|
// The last version the account has seen the release notes banner for — an account preference
|
|
// (usePref), so a banner dismissed on one device stays dismissed on the others.
|
|
export const SEEN_VERSION_PREF = "seenVersion";
|
|
export const SEEN_VERSION_OPTIONS: UsePrefOptions<string | null> = {
|
|
localKey: LS.seenVersion,
|
|
parse: (raw) => (raw == null ? null : String(raw)),
|
|
};
|