import { Box, SimpleGrid, Stack, Text, UnstyledButton, useComputedColorScheme, } from "@mantine/core"; import { CaretRightIcon } from "@phosphor-icons/react"; import { Trans, useLingui } from "@lingui/react/macro"; import Sheet from "@/components/sheet/sheet"; import { useSheet } from "@/hooks/use-sheet"; import { updateUserTheme } from "@/features/settings/server"; import { useAuth } from "@/contexts/auth-context"; import { DEFAULT_THEME_ID, THEME_LIST, getTheme } from "@/themes/registry"; import ThemePreview from "./theme-preview"; const ThemePicker = () => { const { metadata, user, set } = useAuth(); const { t } = useLingui(); const sheet = useSheet(); const scheme = useComputedColorScheme("dark"); const currentId = metadata.theme || DEFAULT_THEME_ID; const current = getTheme(currentId); const handleSelect = async (id: string) => { if (!user || id === currentId) return; const previous = metadata; set({ metadata: { ...metadata, theme: id } }); try { await updateUserTheme({ data: id }); } catch { set({ metadata: previous }); } }; return ( Theme {t(current.label)} {[...THEME_LIST] .sort( (a, b) => (a.order ?? 100) - (b.order ?? 100) || t(a.label).localeCompare(t(b.label)) ) .map((manifest) => { const isSelected = manifest.id === currentId; return ( handleSelect(manifest.id)} > {t(manifest.label)} ); })} ); }; export default ThemePicker;