import { Form, Swatches } from '@lobehub/ui'; import { Input, Segmented, Select, Switch } from 'antd'; import isEqual from 'fast-deep-equal'; import { Palette } from 'lucide-react'; import { memo, useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { CustomLogo } from '@/components'; import { type WebuiSetting, selectors, useAppStore } from '@/store'; import Footer from './Footer'; import { type NeutralColor, type PrimaryColor, findCustomThemeName, neutralColors, neutralColorsSwatches, primaryColors, primaryColorsSwatches, } from './data'; import { SettingItemGroup } from './types'; const SettingForm = memo(() => { const setting = useAppStore(selectors.currentSetting, isEqual); const { onSetSetting, localeOptions } = useAppStore((st) => ({ localeOptions: st.localeOptions, onSetSetting: st.onSetSetting, })); const [rawSetting, setRawSetting] = useState(setting); const [primaryColor, setPrimaryColor] = useState( setting.primaryColor || undefined, ); const [neutralColor, setNeutralColor] = useState( setting.neutralColor || undefined, ); const { t } = useTranslation(); const onFinish = useCallback( (value: WebuiSetting) => { onSetSetting({ ...value, neutralColor, primaryColor }); location.reload(); }, [primaryColor, neutralColor], ); const theme: SettingItemGroup = useMemo( () => ({ children: [ { children: , desc: t('setting.customLogo.desc'), divider: false, hidden: rawSetting.logoType !== 'custom', label: t('setting.customLogo.title'), name: 'logoCustomUrl', }, { children: , desc: t('setting.customTitle.desc'), divider: false, hidden: rawSetting.logoType !== 'custom', label: t('setting.customTitle.title'), name: 'logoCustomTitle', }, { children: ( ), divider: false, hidden: rawSetting.logoType !== 'custom', label: t('setting.logoType.preview'), }, { children: , desc: t('setting.svgIcons.desc'), label: t('setting.svgIcons.title'), name: 'svgIcon', valuePropName: 'checked', }, { children: , desc: t('setting.customFont.desc'), label: t('setting.customFont.title'), name: 'enableWebFont', valuePropName: 'checked', }, { children: , desc: t('setting.confirmPageUnload.desc'), label: t('setting.confirmPageUnload.title'), name: 'confirmPageUnload', valuePropName: 'checked', }, ], icon: Palette, title: t('setting.group.theme'), }), [ primaryColor, neutralColor, rawSetting.logoType, rawSetting.logoCustomTitle, rawSetting.logoCustomUrl, ], ); return (
} initialValues={setting} items={[theme]} onFinish={onFinish} onValuesChange={(_, v) => setRawSetting(v)} style={{ flex: 1 }} /> ); }); export default SettingForm;