import { forwardRef, useImperativeHandle, useState, useEffect, useCallback, } from "react"; import { useLockFn } from "ahooks"; import { useTranslation } from "react-i18next"; import { useVerge } from "@/hooks/use-verge"; import { defaultTheme, defaultDarkTheme } from "@/pages/_theme"; import { DialogRef } from "@/components/base"; import { EditorViewer } from "@/components/profile/editor-viewer"; import { showNotice } from "@/services/noticeService"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogClose, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Edit } from "lucide-react"; import { useThemeMode } from "@/services/states"; // Наш хук для получения текущего режима import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { HexColorPicker } from "react-colorful"; interface Props {} const ColorSettingRow = ({ label, value, placeholder, onChange, }: { label: string; value: string; placeholder: string; onChange: (e: { target: { value: string } }) => void; // Адаптируем тип для совместимости }) => { const color = value || placeholder; return (
); }; export const ThemeViewer = forwardRef((props, ref) => { const { t } = useTranslation(); const [open, setOpen] = useState(false); const [editorOpen, setEditorOpen] = useState(false); const { verge, patchVerge, mutateVerge } = useVerge(); const { theme_setting } = verge ?? {}; const [theme, setTheme] = useState(theme_setting || {}); const mode = useThemeMode(); const resolvedMode = mode === "system" ? window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" : mode; useImperativeHandle(ref, () => ({ open: () => { setOpen(true); setTheme({ ...theme_setting }); }, close: () => setOpen(false), })); const handleChange = (field: keyof typeof theme) => (e: { target: { value: string } }) => { setTheme((t) => ({ ...t, [field]: e.target.value })); }; const onSave = useLockFn(async () => { try { await patchVerge({ theme_setting: theme }); await mutateVerge(); setOpen(false); showNotice("success", t("Theme updated successfully")); } catch (err: any) { showNotice("error", err.toString()); } }); const dt = resolvedMode === "light" ? defaultTheme : defaultDarkTheme; type ThemeKey = keyof typeof theme & keyof typeof defaultTheme; const renderItem = (label: string, key: ThemeKey) => { return ( ); }; return ( <> {t("Theme Setting")}
{renderItem(t("Primary Color"), "primary_color")} {renderItem(t("Secondary Color"), "secondary_color")} {renderItem(t("Primary Text"), "primary_text")} {renderItem(t("Secondary Text"), "secondary_text")} {renderItem(t("Info Color"), "info_color")} {renderItem(t("Warning Color"), "warning_color")} {renderItem(t("Error Color"), "error_color")} {renderItem(t("Success Color"), "success_color")}
{editorOpen && ( { setTheme((v) => ({ ...v, css_injection: curr })); }} onClose={() => setEditorOpen(false)} /> )} ); });