import { Form, type ItemGroup, Swatches } from '@lobehub/ui'; import { Button, Input, InputNumber, Segmented, Select, Switch } from 'antd'; import isEqual from 'fast-deep-equal'; import { Layout, Palette, PanelLeftClose, PanelRightClose, TextCursorInput } from 'lucide-react'; import { memo, useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { shallow } from 'zustand/shallow'; import { CustomLogo } from '@/components'; import { DEFAULT_SETTING, type WebuiSetting, type WebuiSettingKeys, selectors, useAppStore, } from '@/store'; import { type NeutralColor, type PrimaryColor, findCustomThemeName, neutralColors, neutralColorsSwatches, primaryColors, primaryColorsSwatches, } from './data'; import { useStyles } from './style'; type SettingItemGroup = ItemGroup & { children: { name?: WebuiSettingKeys | string; }[]; }; const SettingForm = memo(() => { const setting = useAppStore(selectors.currentSetting, isEqual); const { onSetSetting, localeOptions } = useAppStore( (st) => ({ localeOptions: st.localeOptions, onSetSetting: st.onSetSetting }), shallow, ); const [rawSetting, setRawSetting] = useState(setting); const [primaryColor, setPrimaryColor] = useState( setting.primaryColor || undefined, ); const [neutralColor, setNeutralColor] = useState( setting.neutralColor || undefined, ); const { styles } = useStyles(); const { t } = useTranslation(); const onReset = useCallback(() => { onSetSetting(DEFAULT_SETTING); location.reload(); }, []); const onFinish = useCallback( (value: WebuiSetting) => { onSetSetting({ ...value, neutralColor, primaryColor }); location.reload(); }, [primaryColor, neutralColor], ); const theme: SettingItemGroup = useMemo( () => ({ children: [ { children: , desc: t('settingCustomLogoDesc'), divider: false, hidden: rawSetting.logoType !== 'custom', label: t('settingCustomLogo'), name: 'logoCustomUrl', }, { children: , desc: t('settingCustomTitleDesc'), divider: false, hidden: rawSetting.logoType !== 'custom', label: t('settingCustomTitle'), name: 'logoCustomTitle', }, { children: ( ), divider: false, hidden: rawSetting.logoType !== 'custom', label: t('settingLogoPreview'), }, { children: , desc: t('settingSvgIconsDesc'), label: t('settingSvgIcons'), name: 'svgIcon', valuePropName: 'checked', }, { children: , desc: t('settingCustomFontDesc'), label: t('settingCustomFont'), name: 'enableWebFont', valuePropName: 'checked', }, ], icon: Palette, title: t('settingGroupTheme'), }), [ primaryColor, neutralColor, rawSetting.logoType, rawSetting.logoCustomTitle, rawSetting.logoCustomUrl, ], ); const promptTextarea: SettingItemGroup = useMemo( () => ({ children: [ { children: ( ), desc: t('settingPromptDisplayModeDesc'), label: t('settingPromptDisplayMode'), name: 'promptTextareaType', }, { children: , desc: t('settingPromptHighlightDesc'), label: t('settingPromptHighlight'), name: 'enableHighlight', valuePropName: 'checked', }, { children: , desc: t('settingPromptEditorDesc'), label: t('settingPromptEditor'), name: 'promptEditor', valuePropName: 'checked', }, ], icon: TextCursorInput, title: t('settingGroupPromptTextarea'), }), [], ); const layout: SettingItemGroup = useMemo( () => ({ children: [ { children: , desc: t('settingSplitPreviewerDesc'), label: t('settingSplitPreviewer'), name: 'layoutSplitPreview', valuePropName: 'checked', }, { children: , desc: t('settingHideFooterDesc'), label: t('settingHideFooter'), name: 'layoutHideFooter', valuePropName: 'checked', }, ], icon: Layout, title: t('settingGroupLayout'), }), [], ); const quickSettingSidebar: SettingItemGroup = useMemo( () => ({ children: [ { children: , desc: t('settingQuickSettingSidebarEnableDesc'), label: t('settingQuickSettingSidebarEnable'), name: 'enableSidebar', valuePropName: 'checked', }, { children: , desc: t('settingQuickSettingSidebarDefaultExpandDesc'), hidden: !rawSetting.enableSidebar, label: t('settingQuickSettingSidebarDefaultExpand'), name: 'sidebarExpand', valuePropName: 'checked', }, { children: ( ), desc: t('settingQuickSettingSidebarDisplayModeDesc'), hidden: !rawSetting.enableSidebar, label: t('settingQuickSettingSidebarDisplayMode'), name: 'sidebarFixedMode', }, { children: , desc: t('settingQuickSettingSidebarDefaultWidthDesc'), hidden: !rawSetting.enableSidebar, label: t('settingQuickSettingSidebarDefaultWidth'), name: 'sidebarWidth', }, ], icon: PanelLeftClose, title: t('settingGroupQuickSettingSidebar'), }), [rawSetting.enableSidebar], ); const extraNetworkSidebar: SettingItemGroup = useMemo( () => ({ children: [ { children: , desc: t('settingExtraNetworkSidebarEnableDesc'), label: t('settingExtraNetworkSidebarEnable'), name: 'enableExtraNetworkSidebar', valuePropName: 'checked', }, { children: ( ), desc: t('settingExtraNetworkSidebarDisplayModeDesc'), hidden: !rawSetting.enableExtraNetworkSidebar, label: t('settingExtraNetworkSidebarDisplayMode'), name: 'extraNetworkFixedMode', }, { children: , desc: t('settingExtraNetworkSidebarDefaultExpandDesc'), hidden: !rawSetting.enableExtraNetworkSidebar, label: t('settingExtraNetworkSidebarDefaultExpand'), name: 'extraNetworkSidebarExpand', valuePropName: 'checked', }, { children: , desc: t('settingExtraNetworkSidebarDefaultWidthDesc'), hidden: !rawSetting.enableExtraNetworkSidebar, label: t('settingExtraNetworkSidebarDefaultWidth'), name: 'extraNetworkSidebarWidth', }, { children: , desc: t('settingExtraNetworkSidebarDefaultCardSizeDesc'), hidden: !rawSetting.enableExtraNetworkSidebar, label: t('settingExtraNetworkSidebarDefaultCardSize'), name: 'extraNetworkCardSize', }, ], icon: PanelRightClose, title: t('settingGroupExtraNetworkSidebar'), }), [rawSetting.enableExtraNetworkSidebar], ); return (
} initialValues={setting} items={[theme, promptTextarea, layout, quickSettingSidebar, extraNetworkSidebar]} onFinish={onFinish} onValuesChange={(_, v) => setRawSetting(v)} /> ); }); export default SettingForm;