diff --git a/packages/insomnia/src/account/__tests__/session.test.ts b/packages/insomnia/src/account/__tests__/session.test.ts index 7e5ca8c4a0..f4ee90e6cd 100644 --- a/packages/insomnia/src/account/__tests__/session.test.ts +++ b/packages/insomnia/src/account/__tests__/session.test.ts @@ -93,10 +93,11 @@ describe('absorbKey', () => { expect(session.encPrivateKey).toEqual(MOCK_ENC_PRIVATE_KEY); }); - it('triggers loginStateChange after storing session', async () => { + it('triggers loginStateChange with true after storing session', async () => { await absorbKey(SESSION_ID, RAW_KEY); expect(getWindowMain().loginStateChange).toHaveBeenCalledOnce(); + expect(getWindowMain().loginStateChange).toHaveBeenCalledWith(true); }); it('falls back to current session id when none is provided', async () => { @@ -189,7 +190,7 @@ describe('logout', () => { expect(insomniaApi.logout).toHaveBeenCalledWith({ sessionId: SESSION_ID }); }); - it('triggers loginStateChange', async () => { + it('triggers loginStateChange with false', async () => { await setSessionData( SESSION_ID, 'acct', @@ -204,6 +205,7 @@ describe('logout', () => { await logout(); expect(getWindowMain().loginStateChange).toHaveBeenCalledOnce(); + expect(getWindowMain().loginStateChange).toHaveBeenCalledWith(false); }); it('does not throw if the API call fails', async () => { diff --git a/packages/insomnia/src/account/session.ts b/packages/insomnia/src/account/session.ts index 67d7d09d14..5fd9ee5c7f 100644 --- a/packages/insomnia/src/account/session.ts +++ b/packages/insomnia/src/account/session.ts @@ -42,7 +42,7 @@ export async function absorbKey(sessionId: string, key: string) { JSON.parse(encPrivateKey), ); - window.main.loginStateChange(); + window.main.loginStateChange(true); } export async function getPrivateKey() { @@ -93,7 +93,7 @@ export async function logout(clearCredentials = false) { if (clearCredentials) { await _removeAllCredentials(); } - window.main.loginStateChange(); + window.main.loginStateChange(false); } /** Set data for the new session and store it encrypted with the sessionId */ diff --git a/packages/insomnia/src/entry.preload.ts b/packages/insomnia/src/entry.preload.ts index bab4161c07..d2221a072f 100644 --- a/packages/insomnia/src/entry.preload.ts +++ b/packages/insomnia/src/entry.preload.ts @@ -258,7 +258,7 @@ const main: Window['main'] = { completeExecutionStep: options => ipcRenderer.send('completeExecutionStep', options), updateLatestStepName: options => ipcRenderer.send('updateLatestStepName', options), getExecution: options => invokeWithNormalizedError('getExecution', options), - loginStateChange: () => ipcRenderer.send('loginStateChange'), + loginStateChange: options => ipcRenderer.send('loginStateChange', options), restart: () => ipcRenderer.send('restart'), openInBrowser: options => ipcRenderer.send('openInBrowser', options), openDeepLink: options => ipcRenderer.send('openDeepLink', options), diff --git a/packages/insomnia/src/main/ipc/main.ts b/packages/insomnia/src/main/ipc/main.ts index 2e752fba89..a7756f2535 100644 --- a/packages/insomnia/src/main/ipc/main.ts +++ b/packages/insomnia/src/main/ipc/main.ts @@ -136,8 +136,7 @@ const writeResponseBodyToFile = async ( } }; -const getResponsesDir = () => - path.join(process.env.INSOMNIA_DATA_PATH || app.getPath('userData'), 'responses'); +const getResponsesDir = () => path.join(process.env.INSOMNIA_DATA_PATH || app.getPath('userData'), 'responses'); const responsesDirCreated = new Set(); @@ -151,10 +150,7 @@ const getTimelinePath = (_: unknown, responseId: string) => { return target; }; -const appendToTimeline = async ( - _: unknown, - options: { timelinePath: string; data: string }, -) => { +const appendToTimeline = async (_: unknown, options: { timelinePath: string; data: string }) => { const allowedResponsesDir = getResponsesDir(); const resolvedPath = path.resolve(options.timelinePath); if (!resolvedPath.startsWith(path.resolve(allowedResponsesDir) + path.sep) || !resolvedPath.endsWith('.timeline')) { @@ -171,7 +167,7 @@ const appendToTimeline = async ( }; export interface RendererToMainBridgeAPI { - loginStateChange: () => void; + loginStateChange: (isLoggedIn: boolean) => void; openInBrowser: (url: string) => void; restart: () => void; halfSecondAfterAppStart: () => void; @@ -325,9 +321,11 @@ export function registerMainHandlers() { ipcMainHandle('multipartBufferToArray', async (_, options) => { return multipartBufferToArray(options); }); - ipcMainOn('loginStateChange', async () => { + ipcMainOn('loginStateChange', async (event, isLoggedIn: boolean) => { BrowserWindow.getAllWindows().forEach(w => { - w.webContents.send('loggedIn'); + if (w.webContents !== event.sender) { + w.webContents.send('loggedIn', isLoggedIn); + } }); }); ipcMainHandle('backup', async () => { diff --git a/packages/insomnia/src/root.tsx b/packages/insomnia/src/root.tsx index ce57fd73f6..b0ef8d7d1e 100644 --- a/packages/insomnia/src/root.tsx +++ b/packages/insomnia/src/root.tsx @@ -335,12 +335,26 @@ const Root = () => { const latestInSubmission = useLatest(ifInSubmission); useEffect(() => { - return window.main.on('git.db-synced', () => { + const unsubLoggedIn = window.main.on('loggedIn', (_, isLoggedIn: boolean) => { + if (!latestInSubmission.current) { + if (!isLoggedIn) { + // If the user just logged out, navigate to the login page + navigate(href('/auth/login')); + } else { + navigate(href('/organization')); + } + } + }); + const unsubGitDbSynced = window.main.on('git.db-synced', () => { if (!latestInSubmission.current) { revalidate(); } }); - }, [latestInSubmission, revalidate]); + return () => { + unsubLoggedIn(); + unsubGitDbSynced(); + }; + }, [latestInSubmission, revalidate, navigate]); useEffect(() => { return window.main.on('shell:open', async (_: IpcRendererEvent, url: string) => {