From 10efa444bfb3a19aff46442e6bd448c83308d2ed Mon Sep 17 00:00:00 2001 From: fullex <106392080+0xfullex@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:54:15 +0800 Subject: [PATCH] fix: missing ExportMenuOptions in persist leads to useSelector re-render a lot (#4593) * fix: missing ExportMenuOptions in persist leads to useSelector re-render * chore: cleanup --- .../src/pages/home/Messages/MessageMenubar.tsx | 15 +-------------- src/renderer/src/pages/home/Tabs/TopicsTab.tsx | 15 +-------------- .../settings/DataSettings/ExportMenuSettings.tsx | 15 +-------------- src/renderer/src/store/index.ts | 2 +- src/renderer/src/store/migrate.ts | 13 ++++++++++++- src/renderer/src/store/settings.ts | 2 +- 6 files changed, 17 insertions(+), 45 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index 31e86977..382436e7 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -70,20 +70,7 @@ const MessageMenubar: FC = (props) => { const isUserMessage = message.role === 'user' - const exportMenuOptions = useSelector( - (state: RootState) => - state.settings.exportMenuOptions || { - image: true, - markdown: true, - markdown_reason: true, - notion: true, - yuque: true, - joplin: true, - obsidian: true, - siyuan: true, - docx: true - } - ) + const exportMenuOptions = useSelector((state: RootState) => state.settings.exportMenuOptions) const onCopy = useCallback( (e: React.MouseEvent) => { diff --git a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx index 000294a3..967e7f41 100644 --- a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx @@ -156,20 +156,7 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic [setActiveTopic] ) - const exportMenuOptions = useSelector( - (state: RootState) => - state.settings.exportMenuOptions || { - image: true, - markdown: true, - markdown_reason: true, - notion: true, - yuque: true, - joplin: true, - obsidian: true, - siyuan: true, - docx: true - } - ) + const exportMenuOptions = useSelector((state: RootState) => state.settings.exportMenuOptions) const getTopicMenuItems = useCallback( (topic: Topic) => { diff --git a/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx b/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx index 847f05c1..019fc8e9 100644 --- a/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/ExportMenuSettings.tsx @@ -13,20 +13,7 @@ const ExportMenuOptions: FC = () => { const { theme } = useTheme() const dispatch = useAppDispatch() - const exportMenuOptions = useSelector( - (state: RootState) => - state.settings.exportMenuOptions || { - image: true, - markdown: true, - markdown_reason: true, - notion: true, - yuque: true, - joplin: true, - obsidian: true, - siyuan: true, - docx: true - } - ) + const exportMenuOptions = useSelector((state: RootState) => state.settings.exportMenuOptions) const handleToggleOption = (option: string, checked: boolean) => { dispatch( diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index f6fe36cd..1723f30a 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -42,7 +42,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 92, + version: 93, blacklist: ['runtime', 'messages'], migrate }, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index aea7201a..c058372d 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -13,7 +13,7 @@ import { createMigrate } from 'redux-persist' import { RootState } from '.' import { INITIAL_PROVIDERS, moveProvider } from './llm' import { mcpSlice } from './mcp' -import { DEFAULT_SIDEBAR_ICONS } from './settings' +import { DEFAULT_SIDEBAR_ICONS, initialState as settingsInitialState } from './settings' // remove logo base64 data to reduce the size of the state function removeMiniAppIconsFromState(state: RootState) { @@ -1173,6 +1173,17 @@ const migrateConfig = { } catch (error) { return state } + }, + '93': (state: RootState) => { + try { + if (!state?.settings?.exportMenuOptions) { + state.settings.exportMenuOptions = settingsInitialState.exportMenuOptions + return state + } + return state + } catch (error) { + return state + } } } diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index 18c503ad..037f3db3 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -125,7 +125,7 @@ export interface SettingsState { export type MultiModelMessageStyle = 'horizontal' | 'vertical' | 'fold' | 'grid' -const initialState: SettingsState = { +export const initialState: SettingsState = { showAssistants: true, showTopics: true, sendMessageShortcut: 'Enter',