import { type RefObject } from "react"; import { useTranslation } from "react-i18next"; import { Slider, Toggle } from "./plexPlayerControls"; import { clockParts, type PlexPlayerPrefs } from "../lib/plexPlayerPrefs"; type SettingsTab = "sync" | "playback" | "subtitle" | "clock"; // The gear/tuning panel of the Plex player — a tabbed (sync / playback / subtitle / clock) sheet of // Slider/Toggle rows over the per-account prefs. Extracted verbatim from PlexPlayer to keep that // component focused on the media engine; every row is still `prefs.` + `patchPrefs`, so the // panel owns no state of its own. `now` is the live wall clock (passed in, not a second ticker) used // only for the clock-date-style preview buttons. export function PlexPlayerSettings(props: { menuRef: RefObject; settingsTabs: { key: SettingsTab; label: string }[]; activeTab: SettingsTab; setSettingsTab: (tab: SettingsTab) => void; prefs: PlexPlayerPrefs; patchPrefs: (patch: Partial) => void; changeAudioOffset: (v: number) => void; now: Date; }) { const { menuRef, settingsTabs, activeTab, setSettingsTab, prefs, patchPrefs, changeAudioOffset, now, } = props; const { t } = useTranslation(); return (
e.stopPropagation()} onClick={(e) => e.stopPropagation()} className="border border-white/15 bg-neutral-900/95 absolute bottom-full right-0 mb-2 w-80 rounded-xl p-2 text-sm text-white shadow-2xl" >
{settingsTabs.map((tab) => ( ))}
{activeTab === "sync" && ( <> patchPrefs({ subOffset: v })} onReset={() => patchPrefs({ subOffset: 0 })} /> changeAudioOffset(0)} /> )} {activeTab === "playback" && ( <> patchPrefs({ seekStep: v })} /> patchPrefs({ fineSeekStep: v })} /> patchPrefs({ barAutoHide: v })} /> patchPrefs({ autoSkipIntro: v })} /> patchPrefs({ autoSkipCredits: v })} /> patchPrefs({ upNext: v })} /> {(prefs.autoSkipIntro || prefs.autoSkipCredits) && ( patchPrefs({ autoSkipDelay: v })} /> )} )} {activeTab === "subtitle" && ( <> patchPrefs({ subSize: v })} /> patchPrefs({ subPos: v })} />
{t("plex.player.subColor")} patchPrefs({ subColor: e.target.value })} className="h-6 w-10 cursor-pointer rounded-sm bg-transparent" />
{t("plex.player.subBg")}
{prefs.subBg !== "transparent" && ( patchPrefs({ subBg: e.target.value })} className="h-6 w-10 cursor-pointer rounded-sm bg-transparent" /> )}
patchPrefs({ subShadow: v })} /> {prefs.subShadow > 0 && (
{t("plex.player.subShadowColor")} patchPrefs({ subShadowColor: e.target.value })} className="h-6 w-10 cursor-pointer rounded-sm bg-transparent" />
)} )} {activeTab === "clock" && ( <> patchPrefs({ clockShow: v })} /> patchPrefs({ clock24h: v })} /> patchPrefs({ clockSize: v })} />
{t("plex.player.clockColor")} patchPrefs({ clockColor: e.target.value })} className="h-6 w-10 cursor-pointer rounded-sm bg-transparent" />
patchPrefs({ clockDate: v })} /> {prefs.clockDate && (
{(["hu", "en"] as const).map((st) => ( ))}
)} )}
); }