mirror of
https://github.com/p-stream/p-stream.git
synced 2026-05-17 23:01:46 +00:00
141 lines
3.3 KiB
TypeScript
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>
|
|
</>
|
|
);
|
|
}
|