import { EditRounded } from "@mui/icons-material"; import { Button, List, ListItem, ListItemText, styled, TextField, useTheme, } from "@mui/material"; import { useLockFn } from "ahooks"; import { useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; import { BaseDialog } from "@/components/base"; import { EditorViewer } from "@/components/profile/editor-viewer"; import { useVerge } from "@/hooks/use-verge"; import { defaultTheme, defaultDarkTheme } from "@/pages/_theme"; import { showNotice } from "@/services/noticeService"; export const ThemeViewer = ({ ref, ...props }) => { 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) { showNotice("error", 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(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")} e.key === "Enter" && onSave()} /> {editorOpen && ( { theme.css_injection = curr; 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", }));