p-stream/src/components/player/atoms/settings/ThemeView.tsx
2025-10-11 16:14:20 -06:00

141 lines
3.3 KiB
TypeScript

import { useCallback } from "react";
import { useTranslation } from "react-i18next";
import { Menu } from "@/components/player/internals/ContextMenu";
import { useOverlayRouter } from "@/hooks/useOverlayRouter";
import { usePreviewThemeStore, useThemeStore } from "@/stores/theme";
import { SelectableLink } from "../../internals/ContextMenu/Links";
const availableThemes = [
{
id: "default",
selector: "theme-default",
key: "settings.appearance.themes.default",
},
{
id: "classic",
selector: "theme-classic",
key: "settings.appearance.themes.classic",
},
{
id: "blue",
selector: "theme-blue",
key: "settings.appearance.themes.blue",
},
{
id: "teal",
selector: "theme-teal",
key: "settings.appearance.themes.teal",
},
{
id: "red",
selector: "theme-red",
key: "settings.appearance.themes.red",
},
{
id: "gray",
selector: "theme-gray",
key: "settings.appearance.themes.gray",
},
{
id: "green",
selector: "theme-green",
key: "settings.appearance.themes.green",
},
{
id: "forest",
selector: "theme-forest",
key: "settings.appearance.themes.forest",
},
{
id: "mocha",
selector: "theme-mocha",
key: "settings.appearance.themes.mocha",
},
{
id: "pink",
selector: "theme-pink",
key: "settings.appearance.themes.pink",
},
{
id: "noir",
selector: "theme-noir",
key: "settings.appearance.themes.noir",
},
{
id: "ember",
selector: "theme-ember",
key: "settings.appearance.themes.ember",
},
{
id: "acid",
selector: "theme-acid",
key: "settings.appearance.themes.acid",
},
{
id: "spark",
selector: "theme-spark",
key: "settings.appearance.themes.spark",
},
{
id: "grape",
selector: "theme-grape",
key: "settings.appearance.themes.grape",
},
{
id: "spiderman",
selector: "theme-spiderman",
key: "settings.appearance.themes.spiderman",
},
{
id: "wolverine",
selector: "theme-wolverine",
key: "settings.appearance.themes.wolverine",
},
{
id: "hulk",
selector: "theme-hulk",
key: "settings.appearance.themes.hulk",
},
{
id: "popsicle",
selector: "theme-popsicle",
key: "settings.appearance.themes.popsicle",
},
];
export function ThemeView({ id }: { id: string }) {
const { t } = useTranslation();
const router = useOverlayRouter(id);
const activeTheme = useThemeStore((s) => s.theme);
const setTheme = useThemeStore((s) => s.setTheme);
const setPreviewTheme = usePreviewThemeStore((s) => s.setPreviewTheme);
const handleThemeChange = useCallback(
(themeId: string) => {
const newTheme = themeId === "default" ? null : themeId;
setTheme(newTheme);
setPreviewTheme(themeId);
router.close();
},
[setTheme, setPreviewTheme, router],
);
return (
<>
<Menu.BackLink onClick={() => router.navigate("/")}>Theme</Menu.BackLink>
<Menu.Section className="flex flex-col pb-4">
{availableThemes.map((theme) => (
<SelectableLink
key={theme.id}
selected={(activeTheme ?? "default") === theme.id}
onClick={() => handleThemeChange(theme.id)}
>
{t(theme.key)}
</SelectableLink>
))}
</Menu.Section>
</>
);
}