import { forwardRef, useImperativeHandle, useRef, useState } from "react"; import { useLockFn } from "ahooks"; import { useTranslation } from "react-i18next"; import { Button, List, ListItem, ListItemText, styled, TextField, useTheme, } from "@mui/material"; import { useVerge } from "@/hooks/use-verge"; import { defaultTheme, defaultDarkTheme } from "@/pages/_theme"; import { BaseDialog, DialogRef, Notice } from "@/components/base"; import { EditorViewer } from "@/components/profile/editor-viewer"; import { Edit } from "@mui/icons-material"; export const ThemeViewer = forwardRef((props, ref) => { const { t } = useTranslation(); const [open, setOpen] = useState(false); const [editorOpen, setEditorOpen] = useState(false); const { verge, patchVerge } = useVerge(); const { theme_setting } = verge ?? {}; const [theme, setTheme] = useState(theme_setting || {}); useImperativeHandle(ref, () => ({ open: () => { setOpen(true); setTheme({ ...theme_setting } || {}); }, close: () => setOpen(false), })); const textProps = { size: "small", autoComplete: "off", sx: { width: 135 }, } as const; const handleChange = (field: keyof typeof theme) => (e: any) => { setTheme((t) => ({ ...t, [field]: e.target.value })); }; const onSave = useLockFn(async () => { try { await patchVerge({ theme_setting: theme }); setOpen(false); } catch (err: any) { Notice.error(err.message || err.toString()); } }); // default theme const { palette } = useTheme(); const dt = palette.mode === "light" ? defaultTheme : defaultDarkTheme; type ThemeKey = keyof typeof theme & keyof typeof defaultTheme; const renderItem = (label: string, key: ThemeKey) => { return ( e.key === "Enter" && onSave()} /> ); }; return ( setOpen(false)} onCancel={() => setOpen(false)} onOk={onSave} > {renderItem("Primary Color", "primary_color")} {renderItem("Secondary Color", "secondary_color")} {renderItem("Primary Text", "primary_text")} {renderItem("Secondary Text", "secondary_text")} {renderItem("Info Color", "info_color")} {renderItem("Error Color", "error_color")} {renderItem("Warning Color", "warning_color")} {renderItem("Success Color", "success_color")} e.key === "Enter" && onSave()} /> { theme.css_injection = content; handleChange("css_injection"); }} onClose={() => { setEditorOpen(false); }} /> ); }); const Item = styled(ListItem)(() => ({ padding: "5px 2px", })); const Round = styled("div")(() => ({ width: "24px", height: "24px", borderRadius: "18px", display: "inline-block", marginRight: "8px", }));