From a72feebeadb07eeb5f5b8114edf03c2548872c01 Mon Sep 17 00:00:00 2001 From: Phantom <59059173+EurFelux@users.noreply.github.com> Date: Thu, 18 Sep 2025 19:16:53 +0800 Subject: [PATCH] refactor: migrate Switch from antd to heroui (#10237) * refactor(eslint): reorganize eslint config for better maintainability Move ignores section and oxlint configs to be grouped with other configurations * fix(eslint): update antd import restriction to include Switch Add Switch to restricted imports from antd to enforce using custom components * feat(ui): add Switch component wrapper and update imports Add a wrapper for the Switch component from @heroui/react and export it through @cherrystudio/ui. Update eslint rules to prevent direct imports from @heroui/react and update imports in TranslateSettings to use the new wrapper * refactor(ui): replace antd Switch with custom Switch component Migrate all instances of antd Switch component to the custom Switch component from @cherrystudio/ui. This includes updating props from `checked` to `isSelected` and `onChange` to `onValueChange` to match the new component's API. Also updates size prop from `small` to `sm` where applicable. The change ensures consistency across the UI and reduces dependency on antd components. All affected files have been updated to use the new Switch component with proper prop mappings. * feat(ui): enhance Switch component with loading state Add loading state support to Switch component by showing a spinner when isLoading is true and disabling interaction during loading. Update all Switch component usages to use the new isLoading prop instead of loading. * fix(Switch): prevent thumbIcon override when isLoading is true Implement type constraints to disallow thumbIcon when isLoading is true Add ref forwarding support and export enhanced props type * fix(settings): update Switch component props to use consistent naming Change deprecated 'defaultChecked' and 'disabled' props to 'defaultSelected' and 'isDisabled' respectively to match component library updates * refactor(Switch): simplify type definition by removing redundant ref prop * refactor(Switch): simplify props type definition for loading state Remove complex union type in favor of simpler interface extending SwitchProps * docs(ui): add jsdoc for CustomizedSwitch component Add documentation for the CustomizedSwitch component to clarify its purpose and the isLoading prop usage * fix(eslint): comment out heroui import restriction rule Temporarily disable the heroui import restriction to allow direct imports while wrapped components are being updated * style: fix formatting and spacing in settings components --- eslint.config.mjs | 55 ++++--- .../ui/src/components/base/Switch/index.tsx | 27 ++++ packages/ui/src/components/index.ts | 1 + packages/ui/src/utils/index.ts | 10 +- .../components/Buttons/ActionIconButton.tsx | 2 +- .../src/components/ObsidianExportDialog.tsx | 5 +- src/renderer/src/context/HeroUIProvider.tsx | 1 + src/renderer/src/hero.ts | 5 +- .../src/pages/home/Tabs/SettingsTab.tsx | 143 +++++++----------- .../MiniappSettings/MiniAppSettings.tsx | 10 +- .../src/pages/paintings/AihubmixPage.tsx | 7 +- .../src/pages/paintings/DmxapiPage.tsx | 5 +- .../src/pages/paintings/SiliconPage.tsx | 7 +- .../components/DynamicFormRender.tsx | 7 +- .../src/pages/settings/AboutSettings.tsx | 7 +- .../AssistantMCPSettings.tsx | 9 +- .../AssistantMemorySettings.tsx | 7 +- .../AssistantModelSettings.tsx | 19 +-- .../settings/DataSettings/DataSettings.tsx | 11 +- .../DataSettings/ExportMenuSettings.tsx | 47 ++++-- .../settings/DataSettings/JoplinSettings.tsx | 5 +- .../DataSettings/LocalBackupSettings.tsx | 5 +- .../DataSettings/MarkdownExportSettings.tsx | 15 +- .../settings/DataSettings/NotionSettings.tsx | 5 +- .../DataSettings/NutstoreSettings.tsx | 5 +- .../settings/DataSettings/S3Settings.tsx | 5 +- .../settings/DataSettings/WebDavSettings.tsx | 7 +- .../DisplaySettings/DisplaySettings.tsx | 13 +- .../src/pages/settings/GeneralSettings.tsx | 36 +++-- .../settings/MCPSettings/McpServerCard.tsx | 11 +- .../settings/MCPSettings/McpSettings.tsx | 12 +- .../pages/settings/MCPSettings/McpTool.tsx | 13 +- .../MemorySettings/MemorySettings.tsx | 5 +- .../DefaultAssistantSettings.tsx | 15 +- .../ModelSettings/QuickModelPopup.tsx | 5 +- .../src/pages/settings/NotesSettings.tsx | 12 +- .../ApiOptionsSettings/ApiOptionsSettings.tsx | 4 +- .../EditModelPopup/ModelEditContent.tsx | 11 +- .../ProviderSettings/ProviderSetting.tsx | 7 +- .../pages/settings/QuickAssistantSettings.tsx | 9 +- .../SelectionAssistantSettings.tsx | 19 +-- .../src/pages/settings/ShortcutSettings.tsx | 5 +- .../WebSearchSettings/BasicSettings.tsx | 5 +- src/renderer/src/pages/settings/index.tsx | 2 +- .../src/pages/translate/TranslateSettings.tsx | 3 +- .../components/PreferenceBasicTests.tsx | 10 +- 46 files changed, 341 insertions(+), 288 deletions(-) create mode 100644 packages/ui/src/components/base/Switch/index.tsx diff --git a/eslint.config.mjs b/eslint.config.mjs index 19b4efcd3..546c6d377 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -48,6 +48,27 @@ export default defineConfig([ '@eslint-react/no-children-to-array': 'off' } }, + { + ignores: [ + 'node_modules/**', + 'build/**', + 'dist/**', + 'out/**', + 'local/**', + '.yarn/**', + '.gitignore', + 'scripts/cloudflare-worker.js', + 'src/main/integration/nutstore/sso/lib/**', + 'src/main/integration/cherryin/index.js', + 'src/main/integration/nutstore/sso/lib/**', + 'src/renderer/src/ui/**', + 'packages/**/dist' + ] + }, + // turn off oxlint supported rules. + ...oxlint.configs['flat/eslint'], + ...oxlint.configs['flat/typescript'], + ...oxlint.configs['flat/unicorn'], { // LoggerService Custom Rules - only apply to src directory files: ['src/**/*.{ts,tsx,js,jsx}'], @@ -121,34 +142,18 @@ export default defineConfig([ { name: 'antd', // TODO: migrate message again - importNames: ['Flex'], + importNames: ['Flex', 'Switch'], message: - '❌ Do not import Flex from antd. Use our custom Layout components instead: import { Flex } from "@cherrystudio/ui"' - } + '❌ Do not import this component from antd. Use our custom components instead: import { ... } from "@cherrystudio/ui"' + }, + // { + // name: '@heroui/react', + // message: + // '❌ Do not import components from heroui directly. Use our wrapped components instead: import { ... } from "@cherrystudio/ui"' + // } ] } ] } - }, - { - ignores: [ - 'node_modules/**', - 'build/**', - 'dist/**', - 'out/**', - 'local/**', - '.yarn/**', - '.gitignore', - 'scripts/cloudflare-worker.js', - 'src/main/integration/nutstore/sso/lib/**', - 'src/main/integration/cherryin/index.js', - 'src/main/integration/nutstore/sso/lib/**', - 'src/renderer/src/ui/**', - 'packages/**/dist' - ] - }, - // turn off oxlint supported rules. - ...oxlint.configs['flat/eslint'], - ...oxlint.configs['flat/typescript'], - ...oxlint.configs['flat/unicorn'] + } ]) diff --git a/packages/ui/src/components/base/Switch/index.tsx b/packages/ui/src/components/base/Switch/index.tsx new file mode 100644 index 000000000..b3fdf7b98 --- /dev/null +++ b/packages/ui/src/components/base/Switch/index.tsx @@ -0,0 +1,27 @@ +import type { SwitchProps } from '@heroui/react' +import { Spinner, Switch } from '@heroui/react' + +// Enhanced Switch component with loading state support +interface CustomSwitchProps extends SwitchProps { + isLoading?: boolean +} + +/** + * A customized Switch component based on HeroUI Switch + * @see https://www.heroui.com/docs/components/switch#api + * @param isLoading When true, displays a loading spinner in the switch thumb + */ +const CustomizedSwitch = ({ isLoading, children, ref, thumbIcon, ...props }: CustomSwitchProps) => { + const finalThumbIcon = isLoading ? : thumbIcon + + return ( + + {children} + + ) +} + +CustomizedSwitch.displayName = 'Switch' + +export { CustomizedSwitch as Switch } +export type { CustomSwitchProps as SwitchProps } diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index c5f3727e3..8e83e2ea8 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -10,6 +10,7 @@ export { default as IndicatorLight } from './base/IndicatorLight' export { default as Spinner } from './base/Spinner' export type { StatusTagProps, StatusType } from './base/StatusTag' export { ErrorTag, InfoTag, StatusTag, SuccessTag, WarnTag } from './base/StatusTag' +export { Switch } from './base/Switch' export { default as TextBadge } from './base/TextBadge' // Display Components diff --git a/packages/ui/src/utils/index.ts b/packages/ui/src/utils/index.ts index 9eb12d4de..6f3e963d0 100644 --- a/packages/ui/src/utils/index.ts +++ b/packages/ui/src/utils/index.ts @@ -1,9 +1 @@ -import { type ClassValue, clsx } from 'clsx' - -/** - * 合并CSS类名的工具函数 - * 基于clsx,支持条件类名和Tailwind CSS - */ -export function cn(...inputs: ClassValue[]) { - return clsx(inputs) -} +export { cn } from '@heroui/react' diff --git a/src/renderer/src/components/Buttons/ActionIconButton.tsx b/src/renderer/src/components/Buttons/ActionIconButton.tsx index 9f5c98abf..d571f7ff1 100644 --- a/src/renderer/src/components/Buttons/ActionIconButton.tsx +++ b/src/renderer/src/components/Buttons/ActionIconButton.tsx @@ -1,4 +1,4 @@ -import { cn } from '@heroui/react' +import { cn } from '@cherrystudio/ui' import type { ButtonProps } from 'antd' import { Button } from 'antd' import React, { memo } from 'react' diff --git a/src/renderer/src/components/ObsidianExportDialog.tsx b/src/renderer/src/components/ObsidianExportDialog.tsx index 9cad3986e..5ccac03d3 100644 --- a/src/renderer/src/components/ObsidianExportDialog.tsx +++ b/src/renderer/src/components/ObsidianExportDialog.tsx @@ -1,3 +1,4 @@ +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import { loggerService } from '@logger' import i18n from '@renderer/i18n' @@ -10,7 +11,7 @@ import { messageToMarkdownWithReasoning, topicToMarkdown } from '@renderer/utils/export' -import { Alert, Empty, Form, Input, Modal, Select, Spin, Switch, TreeSelect } from 'antd' +import { Alert, Empty, Form, Input, Modal, Select, Spin, TreeSelect } from 'antd' import React, { useEffect, useState } from 'react' const logger = loggerService.withContext('ObsidianExportDialog') @@ -410,7 +411,7 @@ const PopupContainer: React.FC = ({ - + diff --git a/src/renderer/src/context/HeroUIProvider.tsx b/src/renderer/src/context/HeroUIProvider.tsx index 1a0f31a89..d6f978066 100644 --- a/src/renderer/src/context/HeroUIProvider.tsx +++ b/src/renderer/src/context/HeroUIProvider.tsx @@ -1,6 +1,7 @@ import { HeroUIProvider } from '@heroui/react' import { useSettings } from '@renderer/hooks/useSettings' +// TODO: migrate to ui package const AppHeroUIProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const { language } = useSettings() return ( diff --git a/src/renderer/src/hero.ts b/src/renderer/src/hero.ts index 93a081c30..a93a523a0 100644 --- a/src/renderer/src/hero.ts +++ b/src/renderer/src/hero.ts @@ -1,2 +1,5 @@ import { heroui } from '@heroui/react' -export default heroui() + +const hero: ReturnType = heroui() + +export default hero diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 4c61f497f..e405e79f9 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -1,4 +1,5 @@ import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { useMultiplePreferences, usePreference } from '@data/hooks/usePreference' import EditableNumber from '@renderer/components/EditableNumber' import Scrollbar from '@renderer/components/Scrollbar' @@ -21,7 +22,7 @@ import { modalConfirm } from '@renderer/utils' import { getSendMessageShortcutLabel } from '@renderer/utils/input' import type { SendMessageShortcut } from '@shared/data/preference/preferenceTypes' import { ThemeMode } from '@shared/data/preference/preferenceTypes' -import { Button, Col, InputNumber, Row, Slider, Switch } from 'antd' +import { Button, Col, InputNumber, Row, Slider } from 'antd' import { Settings2 } from 'lucide-react' import type { FC } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -188,10 +189,10 @@ const SettingsTab: FC = (props) => { { + size="sm" + className="ml-auto" + isSelected={enableTemperature} + onValueChange={(enabled) => { setEnableTemperature(enabled) onUpdateAssistantSettings({ enableTemperature: enabled }) }} @@ -235,9 +236,9 @@ const SettingsTab: FC = (props) => { {t('models.stream_output')} { + size="sm" + isSelected={streamOutput} + onValueChange={(checked) => { setStreamOutput(checked) onUpdateAssistantSettings({ streamOutput: checked }) }} @@ -252,9 +253,9 @@ const SettingsTab: FC = (props) => { { + size="sm" + isSelected={enableMaxTokens} + onValueChange={async (enabled) => { if (enabled) { const confirmed = await modalConfirm({ title: t('chat.settings.max_tokens.confirm'), @@ -302,15 +303,15 @@ const SettingsTab: FC = (props) => { {t('settings.messages.prompt')} - setShowPrompt(checked)} /> + {t('settings.messages.use_serif_font')} setMessageFont(checked ? 'serif' : 'system')} + size="sm" + isSelected={messageFont === 'serif'} + onValueChange={(checked) => setMessageFont(checked ? 'serif' : 'system')} /> @@ -319,16 +320,12 @@ const SettingsTab: FC = (props) => { {t('chat.settings.thought_auto_collapse.label')} - setThoughtAutoCollapse(checked)} - /> + {t('settings.messages.show_message_outline')} - setShowMessageOutline(checked)} /> + @@ -413,11 +410,7 @@ const SettingsTab: FC = (props) => { {t('settings.math.single_dollar.label')} - setMathEnableSingleDollar(checked)} - /> + @@ -441,7 +434,7 @@ const SettingsTab: FC = (props) => { {t('chat.settings.code_fancy_block.label')} - setCodeFancyBlock(checked)} /> + @@ -450,9 +443,9 @@ const SettingsTab: FC = (props) => { setCodeExecution({ enabled: checked })} + size="sm" + isSelected={codeExecution.enabled} + onValueChange={(checked) => setCodeExecution({ enabled: checked })} /> {codeExecution.enabled && ( @@ -479,9 +472,9 @@ const SettingsTab: FC = (props) => { {t('chat.settings.code_editor.title')} setCodeEditor({ enabled: checked })} + size="sm" + isSelected={codeEditor.enabled} + onValueChange={(checked) => setCodeEditor({ enabled: checked })} /> {codeEditor.enabled && ( @@ -490,36 +483,36 @@ const SettingsTab: FC = (props) => { {t('chat.settings.code_editor.highlight_active_line')} setCodeEditor({ highlightActiveLine: checked })} + size="sm" + isSelected={codeEditor.highlightActiveLine} + onValueChange={(checked) => setCodeEditor({ highlightActiveLine: checked })} /> {t('chat.settings.code_editor.fold_gutter')} setCodeEditor({ foldGutter: checked })} + size="sm" + isSelected={codeEditor.foldGutter} + onValueChange={(checked) => setCodeEditor({ foldGutter: checked })} /> {t('chat.settings.code_editor.autocompletion')} setCodeEditor({ autocompletion: checked })} + size="sm" + isSelected={codeEditor.autocompletion} + onValueChange={(checked) => setCodeEditor({ autocompletion: checked })} /> {t('chat.settings.code_editor.keymap')} setCodeEditor({ keymap: checked })} + size="sm" + isSelected={codeEditor.keymap} + onValueChange={(checked) => setCodeEditor({ keymap: checked })} /> @@ -527,21 +520,17 @@ const SettingsTab: FC = (props) => { {t('chat.settings.show_line_numbers')} - setCodeShowLineNumbers(checked)} - /> + {t('chat.settings.code_collapsible')} - setCodeCollapsible(checked)} /> + {t('chat.settings.code_wrappable')} - setCodeWrappable(checked)} /> + @@ -549,7 +538,7 @@ const SettingsTab: FC = (props) => { {t('chat.settings.code_image_tools.label')} - setCodeImageTools(checked)} /> + @@ -558,20 +547,12 @@ const SettingsTab: FC = (props) => { {t('settings.messages.input.show_estimated_tokens')} - setShowInputEstimatedTokens(checked)} - /> + {t('settings.messages.input.paste_long_text_as_file')} - setPasteLongTextAsFile(checked)} - /> + {pasteLongTextAsFile && ( <> @@ -594,9 +575,9 @@ const SettingsTab: FC = (props) => { {t('settings.messages.markdown_rendering_input_message')} setRenderInputMessageAsMarkdown(checked)} + size="sm" + isSelected={renderInputMessageAsMarkdown} + onValueChange={setRenderInputMessageAsMarkdown} /> @@ -604,49 +585,29 @@ const SettingsTab: FC = (props) => { <> {t('settings.input.auto_translate_with_space')} - setAutoTranslateWithSpace(checked)} - /> + )} {t('settings.input.show_translate_confirm')} - setShowTranslateConfirm(checked)} - /> + {t('settings.messages.input.enable_quick_triggers')} - setEnableQuickPanelTriggers(checked)} - /> + {t('settings.messages.input.confirm_delete_message')} - setConfirmDeleteMessage(checked)} - /> + {t('settings.messages.input.confirm_regenerate_message')} - setConfirmRegenerateMessage(checked)} - /> + diff --git a/src/renderer/src/pages/minapps/MiniappSettings/MiniAppSettings.tsx b/src/renderer/src/pages/minapps/MiniappSettings/MiniAppSettings.tsx index da1e6e61f..7b3925d5b 100644 --- a/src/renderer/src/pages/minapps/MiniappSettings/MiniAppSettings.tsx +++ b/src/renderer/src/pages/minapps/MiniappSettings/MiniAppSettings.tsx @@ -1,9 +1,10 @@ import { UndoOutlined } from '@ant-design/icons' // 导入重置图标 +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import { DEFAULT_MIN_APPS } from '@renderer/config/minapps' import { useMinapps } from '@renderer/hooks/useMinapps' import { SettingDescription, SettingDivider, SettingRowTitle, SettingTitle } from '@renderer/pages/settings' -import { Button, message, Slider, Switch, Tooltip } from 'antd' +import { Button, message, Slider, Tooltip } from 'antd' import type { FC } from 'react' import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -97,7 +98,7 @@ const MiniAppSettings: FC = () => { {t('settings.miniapps.open_link_external.title')} - setMinappsOpenLinkExternal(checked)} /> + setMinappsOpenLinkExternal(checked)} /> {/* 缓存小程序数量设置 */} @@ -134,7 +135,10 @@ const MiniAppSettings: FC = () => { {t('settings.miniapps.sidebar_title')} {t('settings.miniapps.sidebar_description')} - setShowOpenedMinappsInSidebar(checked)} /> + setShowOpenedMinappsInSidebar(checked)} + /> ) diff --git a/src/renderer/src/pages/paintings/AihubmixPage.tsx b/src/renderer/src/pages/paintings/AihubmixPage.tsx index e5f06b8e5..38d9045ee 100644 --- a/src/renderer/src/pages/paintings/AihubmixPage.tsx +++ b/src/renderer/src/pages/paintings/AihubmixPage.tsx @@ -1,5 +1,6 @@ import { PlusOutlined, RedoOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { useCache } from '@data/hooks/useCache' import { usePreference } from '@data/hooks/usePreference' import { loggerService } from '@logger' @@ -20,7 +21,7 @@ import { translateText } from '@renderer/services/TranslateService' import type { FileMetadata } from '@renderer/types' import type { PaintingAction, PaintingsState } from '@renderer/types' import { getErrorMessage, uuid } from '@renderer/utils' -import { Avatar, Button, Input, InputNumber, Radio, Segmented, Select, Slider, Switch, Tooltip, Upload } from 'antd' +import { Avatar, Button, Input, InputNumber, Radio, Segmented, Select, Slider, Tooltip, Upload } from 'antd' import TextArea from 'antd/es/input/TextArea' import { Info } from 'lucide-react' import type { FC } from 'react' @@ -747,8 +748,8 @@ const AihubmixPage: FC<{ Options: string[] }> = ({ Options }) => { return ( updatePaintingState({ [item.key!]: checked })} + isSelected={(painting[item.key!] || item.initialValue) as boolean} + onValueChange={(checked) => updatePaintingState({ [item.key!]: checked })} /> ) diff --git a/src/renderer/src/pages/paintings/DmxapiPage.tsx b/src/renderer/src/pages/paintings/DmxapiPage.tsx index df2c833d5..0d47a9263 100644 --- a/src/renderer/src/pages/paintings/DmxapiPage.tsx +++ b/src/renderer/src/pages/paintings/DmxapiPage.tsx @@ -1,5 +1,6 @@ import { PlusOutlined, RedoOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { useCache } from '@data/hooks/useCache' import DMXAPIToImg from '@renderer/assets/images/providers/DMXAPI-to-img.webp' import { Navbar, NavbarCenter, NavbarRight } from '@renderer/components/app/Navbar' @@ -13,7 +14,7 @@ import FileManager from '@renderer/services/FileManager' import type { FileMetadata } from '@renderer/types' import { convertToBase64, uuid } from '@renderer/utils' import type { DmxapiPainting } from '@types' -import { Avatar, Button, Input, InputNumber, Segmented, Select, Switch, Tooltip } from 'antd' +import { Avatar, Button, Input, InputNumber, Segmented, Select, Tooltip } from 'antd' import TextArea from 'antd/es/input/TextArea' import { Info } from 'lucide-react' import type { FC } from 'react' @@ -960,7 +961,7 @@ const DmxapiPage: FC<{ Options: string[] }> = ({ Options }) => { - onChangeAutoCreate(checked)} /> + onChangeAutoCreate(checked)} /> diff --git a/src/renderer/src/pages/paintings/SiliconPage.tsx b/src/renderer/src/pages/paintings/SiliconPage.tsx index 173c8ab5b..0b54f4e2d 100644 --- a/src/renderer/src/pages/paintings/SiliconPage.tsx +++ b/src/renderer/src/pages/paintings/SiliconPage.tsx @@ -1,5 +1,6 @@ import { PlusOutlined, RedoOutlined } from '@ant-design/icons' import { ColFlex, RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { useCache } from '@data/hooks/useCache' import { usePreference } from '@data/hooks/usePreference' import { loggerService } from '@logger' @@ -24,7 +25,7 @@ import FileManager from '@renderer/services/FileManager' import { translateText } from '@renderer/services/TranslateService' import type { FileMetadata, Painting } from '@renderer/types' import { getErrorMessage, uuid } from '@renderer/utils' -import { Button, Input, InputNumber, Radio, Select, Slider, Switch, Tooltip } from 'antd' +import { Button, Input, InputNumber, Radio, Select, Slider, Tooltip } from 'antd' import TextArea from 'antd/es/input/TextArea' import { Info } from 'lucide-react' import type { FC } from 'react' @@ -485,8 +486,8 @@ const SiliconPage: FC<{ Options: string[] }> = ({ Options }) => { updatePaintingState({ promptEnhancement: checked })} + isSelected={painting.promptEnhancement} + onValueChange={(checked) => updatePaintingState({ promptEnhancement: checked })} /> diff --git a/src/renderer/src/pages/paintings/components/DynamicFormRender.tsx b/src/renderer/src/pages/paintings/components/DynamicFormRender.tsx index 7495ad1a5..dab3e27b6 100644 --- a/src/renderer/src/pages/paintings/components/DynamicFormRender.tsx +++ b/src/renderer/src/pages/paintings/components/DynamicFormRender.tsx @@ -1,7 +1,8 @@ import { CloseOutlined, LinkOutlined, RedoOutlined, UploadOutlined } from '@ant-design/icons' +import { Switch } from '@cherrystudio/ui' import { loggerService } from '@logger' import { convertToBase64 } from '@renderer/utils' -import { Button, Input, InputNumber, Select, Switch, Upload } from 'antd' +import { Button, Input, InputNumber, Select, Upload } from 'antd' import TextArea from 'antd/es/input/TextArea' import { useCallback } from 'react' @@ -205,8 +206,8 @@ export const DynamicFormRender: React.FC = ({ if (type === 'boolean') { return ( onChange(propertyName, checked)} + isSelected={value !== undefined ? value : defaultValue} + onValueChange={(checked) => onChange(propertyName, checked)} style={{ width: '2px' }} /> ) diff --git a/src/renderer/src/pages/settings/AboutSettings.tsx b/src/renderer/src/pages/settings/AboutSettings.tsx index 1751c5d94..2dfb7ddeb 100644 --- a/src/renderer/src/pages/settings/AboutSettings.tsx +++ b/src/renderer/src/pages/settings/AboutSettings.tsx @@ -1,5 +1,6 @@ import { GithubOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import IndicatorLight from '@renderer/components/IndicatorLight' import { APP_NAME, AppLogo } from '@renderer/config/env' @@ -13,7 +14,7 @@ import { handleSaveData } from '@renderer/store' import { runAsyncFunction } from '@renderer/utils' import { UpgradeChannel } from '@shared/data/preference/preferenceTypes' import { ThemeMode } from '@shared/data/preference/preferenceTypes' -import { Avatar, Button, Progress, Radio, Row, Switch, Tag, Tooltip } from 'antd' +import { Avatar, Button, Progress, Radio, Row, Tag, Tooltip } from 'antd' import { debounce } from 'lodash' import { Bug, FileCheck, Github, Globe, Mail, Rss } from 'lucide-react' import { BadgeQuestionMark } from 'lucide-react' @@ -237,13 +238,13 @@ const AboutSettings: FC = () => { {t('settings.general.auto_check_update.title')} - setAutoCheckUpdate(v)} /> + setAutoCheckUpdate(v)} /> {t('settings.general.test_plan.title')} - handleSetTestPlan(v)} /> + handleSetTestPlan(v)} /> {testPlan && ( diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantMCPSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantMCPSettings.tsx index 13c4974e4..addff65dd 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantMCPSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantMCPSettings.tsx @@ -1,8 +1,9 @@ import { InfoCircleOutlined } from '@ant-design/icons' import { Box } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { useMCPServers } from '@renderer/hooks/useMCPServers' import type { Assistant, AssistantSettings } from '@renderer/types' -import { Empty, Switch, Tooltip } from 'antd' +import { Empty, Tooltip } from 'antd' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -84,10 +85,10 @@ const AssistantMCPSettings: React.FC = ({ assistant, updateAssistant }) = : undefined }> handleServerToggle(server.id)} - size="small" + onValueChange={() => handleServerToggle(server.id)} + size="sm" /> diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx index d414108d3..8c5ec1538 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx @@ -1,11 +1,12 @@ import { InfoCircleOutlined } from '@ant-design/icons' import { Box } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { loggerService } from '@logger' import MemoriesSettingsModal from '@renderer/pages/memory/settings-modal' import MemoryService from '@renderer/services/MemoryService' import { selectGlobalMemoryEnabled, selectMemoryConfig } from '@renderer/store/memory' import type { Assistant, AssistantSettings } from '@renderer/types' -import { Alert, Button, Card, Space, Switch, Tooltip, Typography } from 'antd' +import { Alert, Button, Card, Space, Tooltip, Typography } from 'antd' import { useForm } from 'antd/es/form/Form' import { Settings2 } from 'lucide-react' import { useCallback, useEffect, useState } from 'react' @@ -91,8 +92,8 @@ const AssistantMemorySettings: React.FC = ({ assistant, updateAssistant, : '' }> diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx index c797e4d60..af6e89c31 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx @@ -1,5 +1,6 @@ import { QuestionCircleOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import ModelAvatar from '@renderer/components/Avatar/ModelAvatar' import EditableNumber from '@renderer/components/EditableNumber' import { DeleteIcon, ResetIcon } from '@renderer/components/Icons' @@ -11,7 +12,7 @@ import { useTimer } from '@renderer/hooks/useTimer' import { SettingRow } from '@renderer/pages/settings' import type { Assistant, AssistantSettingCustomParameters, AssistantSettings, Model } from '@renderer/types' import { modalConfirm } from '@renderer/utils' -import { Button, Col, Divider, Input, InputNumber, Row, Select, Slider, Switch, Tooltip } from 'antd' +import { Button, Col, Divider, Input, InputNumber, Row, Select, Slider, Tooltip } from 'antd' import { isNull } from 'lodash' import { PlusIcon } from 'lucide-react' import type { FC } from 'react' @@ -250,8 +251,8 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA { + isSelected={enableTemperature} + onValueChange={(enabled) => { setEnableTemperature(enabled) updateAssistantSettings({ enableTemperature: enabled }) }} @@ -298,8 +299,8 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA { + isSelected={enableTopP} + onValueChange={(enabled) => { setEnableTopP(enabled) updateAssistantSettings({ enableTopP: enabled }) }} @@ -387,8 +388,8 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA { + isSelected={enableMaxTokens} + onValueChange={async (enabled) => { if (enabled) { const confirmed = await modalConfirm({ title: t('chat.settings.max_tokens.confirm'), @@ -430,8 +431,8 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA { + isSelected={streamOutput} + onValueChange={(checked) => { setStreamOutput(checked) updateAssistantSettings({ streamOutput: checked }) }} diff --git a/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx b/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx index 253675a1e..508c67952 100644 --- a/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx @@ -6,6 +6,7 @@ import { YuqueOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import DividerWithText from '@renderer/components/DividerWithText' import { NutstoreIcon } from '@renderer/components/Icons/NutstoreIcons' @@ -19,7 +20,7 @@ import { reset } from '@renderer/services/BackupService' import type { AppInfo } from '@renderer/types' import { formatFileSize } from '@renderer/utils' import { occupiedDirs } from '@shared/config/constant' -import { Button, Progress, Switch, Typography } from 'antd' +import { Button, Progress, Typography } from 'antd' import { FileText, FolderCog, FolderInput, FolderOpen, SaveIcon, Sparkle } from 'lucide-react' import type { FC } from 'react' import { useEffect, useState } from 'react' @@ -287,11 +288,11 @@ const DataSettings: FC = () => {
{ + defaultSelected={shouldCopyData} + onValueChange={(checked) => { shouldCopyData = checked }} - style={{ marginRight: '8px' }} + className="mr-2" /> {t('settings.data.app_data.copy_data_option')} @@ -612,7 +613,7 @@ const DataSettings: FC = () => { {t('settings.data.backup.skip_file_data_title')} - + {t('settings.data.backup.skip_file_data_help')} diff --git a/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx b/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx index 4276b55ee..974f76023 100644 --- a/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx @@ -1,6 +1,6 @@ +import { Switch } from '@cherrystudio/ui' import { useMultiplePreferences } from '@data/hooks/usePreference' import { useTheme } from '@renderer/context/ThemeProvider' -import { Switch } from 'antd' import type { FC } from 'react' import { useTranslation } from 'react-i18next' @@ -35,66 +35,87 @@ const ExportMenuOptions: FC = () => { {t('settings.data.export_menu.image')} - handleToggleOption('image', checked)} /> + handleToggleOption('image', checked)} + /> {t('settings.data.export_menu.markdown')} - handleToggleOption('markdown', checked)} /> + handleToggleOption('markdown', checked)} + /> {t('settings.data.export_menu.markdown_reason')} handleToggleOption('markdown_reason', checked)} + isSelected={exportMenuOptions.markdown_reason} + onValueChange={(checked) => handleToggleOption('markdown_reason', checked)} /> {t('settings.data.export_menu.notion')} - handleToggleOption('notion', checked)} /> + handleToggleOption('notion', checked)} + /> {t('settings.data.export_menu.yuque')} - handleToggleOption('yuque', checked)} /> + handleToggleOption('yuque', checked)} + /> {t('settings.data.export_menu.joplin')} - handleToggleOption('joplin', checked)} /> + handleToggleOption('joplin', checked)} + /> {t('settings.data.export_menu.obsidian')} - handleToggleOption('obsidian', checked)} /> + handleToggleOption('obsidian', checked)} + /> {t('settings.data.export_menu.siyuan')} - handleToggleOption('siyuan', checked)} /> + handleToggleOption('siyuan', checked)} + /> {t('settings.data.export_menu.docx')} - handleToggleOption('docx', checked)} /> + handleToggleOption('docx', checked)} /> {t('settings.data.export_menu.plain_text')} handleToggleOption('plain_text', checked)} + isSelected={exportMenuOptions.plain_text} + onValueChange={(checked) => handleToggleOption('plain_text', checked)} /> diff --git a/src/renderer/src/pages/settings/DataSettings/JoplinSettings.tsx b/src/renderer/src/pages/settings/DataSettings/JoplinSettings.tsx index 2aaf86e24..c3379514c 100644 --- a/src/renderer/src/pages/settings/DataSettings/JoplinSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/JoplinSettings.tsx @@ -1,9 +1,10 @@ import { InfoCircleOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import { useTheme } from '@renderer/context/ThemeProvider' import { useMinappPopup } from '@renderer/hooks/useMinappPopup' -import { Button, Space, Switch, Tooltip } from 'antd' +import { Button, Space, Tooltip } from 'antd' import { Input } from 'antd' import type { FC } from 'react' import { useTranslation } from 'react-i18next' @@ -118,7 +119,7 @@ const JoplinSettings: FC = () => { {t('settings.data.joplin.export_reasoning.title')} - + {t('settings.data.joplin.export_reasoning.help')} diff --git a/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx b/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx index 1b369e2dc..c67a453b5 100644 --- a/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx @@ -1,5 +1,6 @@ import { DeleteOutlined, FolderOpenOutlined, SaveOutlined, SyncOutlined, WarningOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import { loggerService } from '@logger' import { LocalBackupManager } from '@renderer/components/LocalBackupManager' @@ -9,7 +10,7 @@ import { useTheme } from '@renderer/context/ThemeProvider' import { startAutoSync, stopAutoSync } from '@renderer/services/BackupService' import { useAppSelector } from '@renderer/store' import type { AppInfo } from '@renderer/types' -import { Button, Input, Switch, Tooltip } from 'antd' +import { Button, Input, Tooltip } from 'antd' import dayjs from 'dayjs' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -256,7 +257,7 @@ const LocalBackupSettings: React.FC = () => { {t('settings.data.backup.skip_file_data_title')} - + {t('settings.data.backup.skip_file_data_help')} diff --git a/src/renderer/src/pages/settings/DataSettings/MarkdownExportSettings.tsx b/src/renderer/src/pages/settings/DataSettings/MarkdownExportSettings.tsx index ed1dff4f1..f7a23b886 100644 --- a/src/renderer/src/pages/settings/DataSettings/MarkdownExportSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/MarkdownExportSettings.tsx @@ -1,8 +1,9 @@ import { DeleteOutlined, FolderOpenOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import { useTheme } from '@renderer/context/ThemeProvider' -import { Button, Switch } from 'antd' +import { Button } from 'antd' import Input from 'antd/es/input/Input' import type { FC } from 'react' import { useTranslation } from 'react-i18next' @@ -96,7 +97,7 @@ const MarkdownExportSettings: FC = () => { {t('settings.data.markdown_export.force_dollar_math.title')} - + {t('settings.data.markdown_export.force_dollar_math.help')} @@ -104,7 +105,7 @@ const MarkdownExportSettings: FC = () => { {t('settings.data.message_title.use_topic_naming.title')} - + {t('settings.data.message_title.use_topic_naming.help')} @@ -112,7 +113,7 @@ const MarkdownExportSettings: FC = () => { {t('settings.data.markdown_export.show_model_name.title')} - + {t('settings.data.markdown_export.show_model_name.help')} @@ -120,7 +121,7 @@ const MarkdownExportSettings: FC = () => { {t('settings.data.markdown_export.show_model_provider.title')} - + {t('settings.data.markdown_export.show_model_provider.help')} @@ -128,7 +129,7 @@ const MarkdownExportSettings: FC = () => { {t('settings.data.markdown_export.exclude_citations.title')} - + {t('settings.data.markdown_export.exclude_citations.help')} @@ -136,7 +137,7 @@ const MarkdownExportSettings: FC = () => { {t('settings.data.markdown_export.standardize_citations.title')} - + {t('settings.data.markdown_export.standardize_citations.help')} diff --git a/src/renderer/src/pages/settings/DataSettings/NotionSettings.tsx b/src/renderer/src/pages/settings/DataSettings/NotionSettings.tsx index 6139372eb..d8b3c78be 100644 --- a/src/renderer/src/pages/settings/DataSettings/NotionSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/NotionSettings.tsx @@ -1,10 +1,11 @@ import { InfoCircleOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import { Client } from '@notionhq/client' import { useTheme } from '@renderer/context/ThemeProvider' import { useMinappPopup } from '@renderer/hooks/useMinappPopup' -import { Button, Space, Switch, Tooltip } from 'antd' +import { Button, Space, Tooltip } from 'antd' import { Input } from 'antd' import type { FC } from 'react' import { useTranslation } from 'react-i18next' @@ -126,7 +127,7 @@ const NotionSettings: FC = () => { {t('settings.data.notion.export_reasoning.title')} - + {t('settings.data.notion.export_reasoning.help')} diff --git a/src/renderer/src/pages/settings/DataSettings/NutstoreSettings.tsx b/src/renderer/src/pages/settings/DataSettings/NutstoreSettings.tsx index 99891f728..3b169a759 100644 --- a/src/renderer/src/pages/settings/DataSettings/NutstoreSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/NutstoreSettings.tsx @@ -1,5 +1,6 @@ import { CheckOutlined, FolderOutlined, LoadingOutlined, SyncOutlined, WarningOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import NutstorePathPopup from '@renderer/components/Popups/NutsorePathPopup' import Selector from '@renderer/components/Selector' @@ -19,7 +20,7 @@ import { import { useAppSelector } from '@renderer/store' import { modalConfirm } from '@renderer/utils' import { NUTSTORE_HOST } from '@shared/config/nutstore' -import { Button, Input, Switch, Tooltip, Typography } from 'antd' +import { Button, Input, Tooltip, Typography } from 'antd' import dayjs from 'dayjs' import type { FC } from 'react' import { useCallback, useEffect, useState } from 'react' @@ -319,7 +320,7 @@ const NutstoreSettings: FC = () => { {t('settings.data.backup.skip_file_data_title')} - + {t('settings.data.backup.skip_file_data_help')} diff --git a/src/renderer/src/pages/settings/DataSettings/S3Settings.tsx b/src/renderer/src/pages/settings/DataSettings/S3Settings.tsx index ba314751c..f5f74b442 100644 --- a/src/renderer/src/pages/settings/DataSettings/S3Settings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/S3Settings.tsx @@ -1,5 +1,6 @@ import { FolderOpenOutlined, InfoCircleOutlined, SaveOutlined, SyncOutlined, WarningOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import { S3BackupManager } from '@renderer/components/S3BackupManager' import { S3BackupModal, useS3BackupModal } from '@renderer/components/S3Modals' @@ -8,7 +9,7 @@ import { useTheme } from '@renderer/context/ThemeProvider' import { useMinappPopup } from '@renderer/hooks/useMinappPopup' import { startAutoSync, stopAutoSync } from '@renderer/services/BackupService' import { useAppSelector } from '@renderer/store' -import { Button, Input, Switch, Tooltip } from 'antd' +import { Button, Input, Tooltip } from 'antd' import dayjs from 'dayjs' import type { FC } from 'react' import { useState } from 'react' @@ -237,7 +238,7 @@ const S3Settings: FC = () => { {t('settings.data.s3.skipBackupFile.label')} - + {t('settings.data.s3.skipBackupFile.help')} diff --git a/src/renderer/src/pages/settings/DataSettings/WebDavSettings.tsx b/src/renderer/src/pages/settings/DataSettings/WebDavSettings.tsx index c9db62dac..d3cf5963f 100644 --- a/src/renderer/src/pages/settings/DataSettings/WebDavSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/WebDavSettings.tsx @@ -1,5 +1,6 @@ import { FolderOpenOutlined, SaveOutlined, SyncOutlined, WarningOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import Selector from '@renderer/components/Selector' import { WebdavBackupManager } from '@renderer/components/WebdavBackupManager' @@ -7,7 +8,7 @@ import { useWebdavBackupModal, WebdavBackupModal } from '@renderer/components/We import { useTheme } from '@renderer/context/ThemeProvider' import { startAutoSync, stopAutoSync } from '@renderer/services/BackupService' import { useAppSelector } from '@renderer/store' -import { Button, Input, Switch, Tooltip } from 'antd' +import { Button, Input, Tooltip } from 'antd' import dayjs from 'dayjs' import type { FC } from 'react' import { useState } from 'react' @@ -198,7 +199,7 @@ const WebDavSettings: FC = () => { {t('settings.data.backup.skip_file_data_title')} - + {t('settings.data.backup.skip_file_data_help')} @@ -206,7 +207,7 @@ const WebDavSettings: FC = () => { {t('settings.data.webdav.disableStream.title')} - + {t('settings.data.webdav.disableStream.help')} diff --git a/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx b/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx index 24abdcc8a..98e0f6e92 100644 --- a/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx +++ b/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx @@ -1,5 +1,6 @@ import { RowFlex } from '@cherrystudio/ui' import { CodeEditor } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import { ResetIcon } from '@renderer/components/Icons' import TextBadge from '@renderer/components/TextBadge' @@ -11,7 +12,7 @@ import useUserTheme from '@renderer/hooks/useUserTheme' import { DefaultPreferences } from '@shared/data/preference/preferenceSchemas' import type { AssistantIconType } from '@shared/data/preference/preferenceTypes' import { ThemeMode } from '@shared/data/preference/preferenceTypes' -import { Button, ColorPicker, Segmented, Select, Switch } from 'antd' +import { Button, ColorPicker, Segmented, Select } from 'antd' import { Minus, Monitor, Moon, Plus, Sun } from 'lucide-react' import type { FC } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -229,7 +230,7 @@ const DisplaySettings: FC = () => { {t('settings.theme.window.style.transparent')} - + )} @@ -361,8 +362,8 @@ const DisplaySettings: FC = () => { {t('settings.advanced.auto_switch_to_topics')} setClickAssistantToShowTopic(checked)} + isSelected={clickAssistantToShowTopic} + onValueChange={(checked) => setClickAssistantToShowTopic(checked)} /> @@ -370,12 +371,12 @@ const DisplaySettings: FC = () => { )} {t('settings.topic.show.time')} - setShowTopicTime(checked)} /> + setShowTopicTime(checked)} /> {t('settings.topic.pin_to_top')} - setPinTopicsToTop(checked)} /> + setPinTopicsToTop(checked)} /> diff --git a/src/renderer/src/pages/settings/GeneralSettings.tsx b/src/renderer/src/pages/settings/GeneralSettings.tsx index 20abd11b4..fab07d15c 100644 --- a/src/renderer/src/pages/settings/GeneralSettings.tsx +++ b/src/renderer/src/pages/settings/GeneralSettings.tsx @@ -1,6 +1,7 @@ import { InfoCircleOutlined } from '@ant-design/icons' import { RowFlex } from '@cherrystudio/ui' import { Flex } from '@cherrystudio/ui' +import { Switch } from '@cherrystudio/ui' import { useMultiplePreferences, usePreference } from '@data/hooks/usePreference' import Selector from '@renderer/components/Selector' import { InfoTooltip } from '@renderer/components/TooltipIcons' @@ -12,7 +13,7 @@ import { isValidProxyUrl } from '@renderer/utils' import { formatErrorMessage } from '@renderer/utils/error' import { defaultByPassRules, defaultLanguage } from '@shared/config/constant' import type { LanguageVarious } from '@shared/data/preference/preferenceTypes' -import { Input, Switch, Tooltip } from 'antd' +import { Input, Tooltip } from 'antd' import type { FC } from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' @@ -260,12 +261,12 @@ const GeneralSettings: FC = () => { /> )} - + {t('settings.hardware_acceleration.title')} - + @@ -278,17 +279,26 @@ const GeneralSettings: FC = () => { - handleNotificationChange('assistant', v)} /> + handleNotificationChange('assistant', v)} + /> {t('settings.notification.backup')} - handleNotificationChange('backup', v)} /> + handleNotificationChange('backup', v)} + /> {t('settings.notification.knowledge_embed')} - handleNotificationChange('knowledge', v)} /> + handleNotificationChange('knowledge', v)} + /> @@ -296,12 +306,12 @@ const GeneralSettings: FC = () => { {t('settings.launch.onboot')} - updateLaunchOnBoot(checked)} /> + updateLaunchOnBoot(checked)} /> {t('settings.launch.totray')} - updateLaunchToTray(checked)} /> + updateLaunchToTray(checked)} /> @@ -309,12 +319,12 @@ const GeneralSettings: FC = () => { {t('settings.tray.show')} - updateTray(checked)} /> + updateTray(checked)} /> {t('settings.tray.onclose')} - updateTrayOnClose(checked)} /> + updateTrayOnClose(checked)} /> @@ -323,8 +333,8 @@ const GeneralSettings: FC = () => { {t('settings.privacy.enable_privacy_mode')} { + isSelected={enableDataCollection} + onValueChange={(v) => { setEnableDataCollection(v) window.api.config.set('enableDataCollection', v) }} @@ -339,7 +349,7 @@ const GeneralSettings: FC = () => { {t('settings.developer.enable_developer_mode')} - + diff --git a/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx b/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx index f7bc4fae2..046a830d3 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpServerCard.tsx @@ -1,3 +1,4 @@ +import { Switch } from '@cherrystudio/ui' import { ErrorBoundary } from '@renderer/components/ErrorBoundary' import { DeleteIcon } from '@renderer/components/Icons' import GeneralPopup from '@renderer/components/Popups/GeneralPopup' @@ -5,7 +6,7 @@ import Scrollbar from '@renderer/components/Scrollbar' import { getMcpTypeLabel } from '@renderer/i18n/label' import type { MCPServer } from '@renderer/types' import { formatErrorMessage } from '@renderer/utils/error' -import { Alert, Button, Space, Switch, Tag, Tooltip, Typography } from 'antd' +import { Alert, Button, Space, Tag, Tooltip, Typography } from 'antd' import { CircleXIcon, Settings2, SquareArrowOutUpRight } from 'lucide-react' import type { FC } from 'react' import { useCallback } from 'react' @@ -132,11 +133,11 @@ const McpServerCard: FC = ({ e.stopPropagation()}>