diff --git a/src/main/features/core/settings/index.ts b/src/main/features/core/settings/index.ts index dff1b3031..b35ca5c6f 100644 --- a/src/main/features/core/settings/index.ts +++ b/src/main/features/core/settings/index.ts @@ -1,7 +1,8 @@ import type { TitleTheme } from '/@/shared/types/types'; -import { dialog, ipcMain, nativeTheme, OpenDialogOptions, safeStorage } from 'electron'; +import { app, dialog, ipcMain, nativeTheme, OpenDialogOptions, safeStorage } from 'electron'; import Store from 'electron-store'; +import path from 'path'; const getFrame = () => { const isWindows = process.platform === 'win32'; @@ -18,10 +19,18 @@ const getFrame = () => { return 'linux'; }; +const isDevelopment = process.env.NODE_ENV === 'development'; + +const defaultUserDataPath = app.getPath('userData'); +const storePath = isDevelopment + ? path.normalize(`${defaultUserDataPath}-dev`) + : path.normalize(defaultUserDataPath); + export const store = new Store({ beforeEachMigration: (_store, context) => { console.log(`settings migrate from ${context.fromVersion} → ${context.toVersion}`); }, + cwd: storePath, defaults: { disable_auto_updates: false, enableNeteaseTranslation: false, @@ -52,7 +61,11 @@ ipcMain.handle('settings-get', (_event, data: { property: string }) => { }); ipcMain.on('settings-set', (__event, data: { property: string; value: any }) => { - store.set(`${data.property}`, data.value); + if (data.value === undefined) { + store.delete(data.property); + } else { + store.set(data.property, data.value); + } }); ipcMain.handle('password-get', (_event, server: string): null | string => { diff --git a/src/preload/local-settings.ts b/src/preload/local-settings.ts index 4833ae81f..572a19ea7 100644 --- a/src/preload/local-settings.ts +++ b/src/preload/local-settings.ts @@ -1,24 +1,16 @@ import { ipcRenderer, IpcRendererEvent, OpenDialogOptions, webFrame } from 'electron'; -import Store from 'electron-store'; import { TitleTheme } from '/@/shared/types/types'; -const store = new Store(); - const set = ( property: string, value: boolean | Record | string | string[] | undefined, ) => { - if (value === undefined) { - store.delete(property); - return; - } - - store.set(`${property}`, value); + ipcRenderer.send('settings-set', { property, value }); }; -const get = (property: string) => { - return store.get(`${property}`); +const get = async (property: string) => { + return ipcRenderer.invoke('settings-get', { property }); }; const restart = () => { @@ -87,9 +79,13 @@ const env = { SERVER_NAME: process.env.SERVER_NAME ?? '', SERVER_TYPE, SERVER_URL: process.env.SERVER_URL ?? 'http://', - START_MAXIMIZED: store.get('maximized'), + START_MAXIMIZED: undefined as boolean | undefined, }; +get('maximized').then((value) => { + env.START_MAXIMIZED = value as boolean | undefined; +}); + export const localSettings = { disableMediaKeys, enableMediaKeys, diff --git a/src/renderer/hooks/use-sync-settings-to-main.ts b/src/renderer/hooks/use-sync-settings-to-main.ts index ce1cb4258..bb61aa846 100644 --- a/src/renderer/hooks/use-sync-settings-to-main.ts +++ b/src/renderer/hooks/use-sync-settings-to-main.ts @@ -42,7 +42,6 @@ export const useSyncSettingsToMain = () => { hasRunRef.current = true; const localSettings = window.api.localSettings; - let hasDifferences = false; const settingsMappings: Array<{ mainStoreKey: string; @@ -105,34 +104,40 @@ export const useSyncSettingsToMain = () => { ]; // Compare and sync each setting - for (const mapping of settingsMappings) { - const mainValue = localSettings.get(mapping.mainStoreKey); - const rendererValue = mapping.rendererValue; + (async () => { + let hasDifferences = false; - const mainValueNormalized = mainValue === undefined ? null : mainValue; - const rendererValueNormalized = rendererValue === undefined ? null : rendererValue; + for (const mapping of settingsMappings) { + const mainValue = await localSettings.get(mapping.mainStoreKey); + const rendererValue = mapping.rendererValue; - if ( - JSON.stringify(mainValueNormalized) !== JSON.stringify(rendererValueNormalized) - ) { - hasDifferences = true; - logFn.warn(logMsg.system.settingsSynchronized, { - meta: { - mainStoreKey: mapping.mainStoreKey, - mainValue: mainValueNormalized, - rendererValue: rendererValueNormalized, - }, - }); - localSettings.set(mapping.mainStoreKey, rendererValue); + const mainValueNormalized = mainValue === undefined ? null : mainValue; + const rendererValueNormalized = + rendererValue === undefined ? null : rendererValue; + + if ( + JSON.stringify(mainValueNormalized) !== + JSON.stringify(rendererValueNormalized) + ) { + hasDifferences = true; + logFn.warn(logMsg.system.settingsSynchronized, { + meta: { + mainStoreKey: mapping.mainStoreKey, + mainValue: mainValueNormalized, + rendererValue: rendererValueNormalized, + }, + }); + localSettings.set(mapping.mainStoreKey, rendererValue); + } } - } - // Show restart toast if there were differences - if (hasDifferences) { - openRestartRequiredToast( - i18n.t('error.settingsSyncError', { postProcess: 'sentenceCase' }), - ); - } + // Show restart toast if there were differences + if (hasDifferences) { + openRestartRequiredToast( + i18n.t('error.settingsSyncError', { postProcess: 'sentenceCase' }), + ); + } + })(); }, 5000); return () => {