diff --git a/packages/desktop-client/src/browser-preload.browser.js b/packages/desktop-client/src/browser-preload.browser.js index c7e0f0b35be7a23af910c851311dd5724ccf0489..75065ca521db9b8cbf1e6a359252a64626f95e38 100644 --- a/packages/desktop-client/src/browser-preload.browser.js +++ b/packages/desktop-client/src/browser-preload.browser.js @@ -51,6 +51,8 @@ global.Actual = { window.location.reload(); }, + restartElectronServer: () => {}, + openFileDialog: async ({ filters = [] }) => { return new Promise(resolve => { let createdElement = false; diff --git a/packages/desktop-client/src/components/manager/ConfigServer.tsx b/packages/desktop-client/src/components/manager/ConfigServer.tsx index 66e4543304237d860042df52f5152966ca79c8f7..fcc619321667c3ee0fac284c7f180e2536ef801c 100644 --- a/packages/desktop-client/src/components/manager/ConfigServer.tsx +++ b/packages/desktop-client/src/components/manager/ConfigServer.tsx @@ -1,5 +1,5 @@ // @ts-strict-ignore -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { Trans, useTranslation } from 'react-i18next'; import { @@ -34,8 +34,15 @@ export function ConfigServer() { }, [currentUrl]); const [loading, setLoading] = useState(false); const [error, setError] = useState<string | null>(null); + + const restartElectronServer = useCallback(() => { + globalThis.window.Actual.restartElectronServer(); + setError(null); + }, []); + const [_serverSelfSignedCert, setServerSelfSignedCert] = useGlobalPref( 'serverSelfSignedCert', + restartElectronServer, ); function getErrorMessage(error: string) { @@ -101,7 +108,6 @@ export function ConfigServer() { if (selfSignedCertificateLocation) { setServerSelfSignedCert(selfSignedCertificateLocation[0]); - globalThis.window.Actual.relaunch(); // relaunch to use the certificate } } diff --git a/packages/desktop-client/src/hooks/useGlobalPref.ts b/packages/desktop-client/src/hooks/useGlobalPref.ts index 02d5773ac62d0a4c91e9cbf208cc4053a1cb9341..4f686a2aefff9cad8d1d9ea7ea09f311a3bfc662 100644 --- a/packages/desktop-client/src/hooks/useGlobalPref.ts +++ b/packages/desktop-client/src/hooks/useGlobalPref.ts @@ -11,13 +11,21 @@ type SetGlobalPrefAction<K extends keyof GlobalPrefs> = ( export function useGlobalPref<K extends keyof GlobalPrefs>( prefName: K, + onSaveGlobalPrefs?: () => void, ): [GlobalPrefs[K], SetGlobalPrefAction<K>] { const dispatch = useDispatch(); const setGlobalPref = useCallback<SetGlobalPrefAction<K>>( value => { - dispatch(saveGlobalPrefs({ [prefName]: value } as GlobalPrefs)); + dispatch( + saveGlobalPrefs( + { + [prefName]: value, + } as GlobalPrefs, + onSaveGlobalPrefs, + ), + ); }, - [prefName, dispatch], + [prefName, dispatch, onSaveGlobalPrefs], ); const globalPref = useSelector( (state: State) => state.prefs.global?.[prefName] as GlobalPrefs[K], diff --git a/packages/desktop-electron/index.ts b/packages/desktop-electron/index.ts index d5767d200fc341d8f0d93a9f78ee9b08bab0dfb9..dda8cf7741e9a260c6629752a06bad254d7304ff 100644 --- a/packages/desktop-electron/index.ts +++ b/packages/desktop-electron/index.ts @@ -297,6 +297,12 @@ ipcMain.on('get-bootstrap-data', event => { event.returnValue = payload; }); +ipcMain.handle('restart-server', () => { + serverProcess.kill(); + serverProcess = null; + createBackgroundProcess(); +}); + ipcMain.handle('relaunch', () => { app.relaunch(); app.exit(); diff --git a/packages/desktop-electron/preload.ts b/packages/desktop-electron/preload.ts index 832bd6a505bfc75dd34c4793be949ad8cdde15e5..7ede4442910bf7ad59ad2b2c35a0d7a332099cb2 100644 --- a/packages/desktop-electron/preload.ts +++ b/packages/desktop-electron/preload.ts @@ -34,6 +34,10 @@ contextBridge.exposeInMainWorld('Actual', { ipcRenderer.invoke('relaunch'); }, + restartElectronServer: () => { + ipcRenderer.invoke('restart-server'); + }, + openFileDialog: (opts: OpenFileDialogPayload) => { return ipcRenderer.invoke('open-file-dialog', opts); }, diff --git a/packages/loot-core/src/client/actions/prefs.ts b/packages/loot-core/src/client/actions/prefs.ts index 5dbca103f50908b1787b2da89deb92ac5330e2c2..76b9272d62f0d8a4a60fb08da2f010603f5b6c7f 100644 --- a/packages/loot-core/src/client/actions/prefs.ts +++ b/packages/loot-core/src/client/actions/prefs.ts @@ -48,12 +48,16 @@ export function loadGlobalPrefs() { }; } -export function saveGlobalPrefs(prefs: prefs.GlobalPrefs) { +export function saveGlobalPrefs( + prefs: prefs.GlobalPrefs, + onSaveGlobalPrefs?: () => void, +) { return async (dispatch: Dispatch) => { await send('save-global-prefs', prefs); dispatch({ type: constants.MERGE_GLOBAL_PREFS, globalPrefs: prefs, }); + onSaveGlobalPrefs?.(); }; } diff --git a/packages/loot-core/src/platform/server/fetch/index.electron.ts b/packages/loot-core/src/platform/server/fetch/index.electron.ts index 63ba01462afd7428d4d1a814e72496a264d1e82d..05a320bc0fe38371cd528a2eea6ca79bdaa586f0 100644 --- a/packages/loot-core/src/platform/server/fetch/index.electron.ts +++ b/packages/loot-core/src/platform/server/fetch/index.electron.ts @@ -1,12 +1,20 @@ // @ts-strict-ignore import nodeFetch from 'node-fetch'; -export const fetch = (input: RequestInfo | URL, options?: RequestInit) => { - return nodeFetch(input, { - ...options, - headers: { - ...options?.headers, - origin: 'app://actual', - }, - }); +export const fetch = async ( + input: RequestInfo | URL, + options?: RequestInit, +) => { + try { + return await nodeFetch(input, { + ...options, + headers: { + ...options?.headers, + origin: 'app://actual', + }, + }); + } catch (error) { + console.error(error); // log error + throw error; + } }; diff --git a/packages/loot-core/typings/window.d.ts b/packages/loot-core/typings/window.d.ts index 7f9173c6ae7e76a99a8478d1839f286a8bd257c5..870114cb64bf6e620900bf009bfa81740eb645ab 100644 --- a/packages/loot-core/typings/window.d.ts +++ b/packages/loot-core/typings/window.d.ts @@ -15,6 +15,7 @@ declare global { opts: Parameters<import('electron').Dialog['showOpenDialogSync']>[0], ) => Promise<string[]>; relaunch: () => void; + restartElectronServer: () => void; }; __navigate?: import('react-router').NavigateFunction; diff --git a/upcoming-release-notes/3431.md b/upcoming-release-notes/3431.md new file mode 100644 index 0000000000000000000000000000000000000000..a323e31a3c3ba623619af64c6b43025d0e0a3164 --- /dev/null +++ b/upcoming-release-notes/3431.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [MikesGlitch] +--- + +Restart server silently when adding self signed cert and add some logs