Skip to content

Commit 12ef49e

Browse files
authored
fix: Window state loading (#1758)
* Remove unused typings * Fix app state hydratation * Use auxiliar function to export localStorage to main process * Apply initial window state earlier * Trick server-url handler to ignore unregistered webviews
1 parent 91f7c5a commit 12ef49e

8 files changed

Lines changed: 53 additions & 44 deletions

File tree

src/app/main/data.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,10 @@ import path from 'path';
44
import { app } from 'electron';
55

66
import { select, dispatch, watch } from '../../store';
7-
import { getRootWindow } from '../../ui/main/rootWindow';
87
import { APP_SETTINGS_LOADED } from '../actions';
98
import { selectPersistableValues } from '../selectors';
109
import { getPersistedValues, persistValues } from './persistence';
1110

12-
export const getLocalStorage = (): Promise<Record<string, string>> =>
13-
getRootWindow().webContents.executeJavaScript('({...localStorage})');
14-
15-
export const purgeLocalStorage = async (): Promise<void> => {
16-
await getRootWindow().webContents.executeJavaScript('localStorage.clear()');
17-
};
18-
1911
export const mergePersistableValues = async (localStorage: Record<string, string>): Promise<void> => {
2012
const initialValues = select(selectPersistableValues);
2113

src/app/main/persistence.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,7 @@ const getElectronStore = (): ElectronStore<PersistableValues> => {
2121
};
2222

2323
export const getPersistedValues = (): PersistableValues =>
24-
selectPersistableValues(
25-
Object.fromEntries(
26-
Array.from(
27-
getElectronStore(),
28-
),
29-
),
30-
);
24+
getElectronStore().store;
3125

3226
export const persistValues = (values: PersistableValues): void => {
3327
getElectronStore().set(values);

src/main.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ import { app } from 'electron';
22

33
import { performElectronStartup, setupApp } from './app/main/app';
44
import {
5-
getLocalStorage,
65
mergePersistableValues,
7-
purgeLocalStorage,
86
watchAndPersistChanges,
97
} from './app/main/data';
108
import { setUserDataDirectory } from './app/main/dev';
@@ -21,8 +19,8 @@ import dock from './ui/main/dock';
2119
import menuBar from './ui/main/menuBar';
2220
import {
2321
createRootWindow,
24-
applyRootWindowState,
2522
showRootWindow,
23+
exportLocalStorage,
2624
} from './ui/main/rootWindow';
2725
import touchBar from './ui/main/touchBar';
2826
import trayIcon from './ui/main/trayIcon';
@@ -39,8 +37,11 @@ const start = async (): Promise<void> => {
3937

4038
await app.whenReady();
4139

42-
i18n.setUp();
40+
const localStorage = await exportLocalStorage();
41+
await mergePersistableValues(localStorage);
42+
await setupServers(localStorage);
4343

44+
i18n.setUp();
4445
await i18n.wait();
4546

4647
const rootWindow = createRootWindow();
@@ -58,10 +59,6 @@ const start = async (): Promise<void> => {
5859
setupNotifications();
5960
setupScreenSharing();
6061

61-
const localStorage = await getLocalStorage();
62-
63-
await mergePersistableValues(localStorage);
64-
await setupServers(localStorage);
6562
await setupSpellChecking();
6663

6764
setupDeepLinks();
@@ -81,9 +78,6 @@ const start = async (): Promise<void> => {
8178
trayIcon.tearDown();
8279
});
8380

84-
applyRootWindowState();
85-
86-
await purgeLocalStorage();
8781
watchAndPersistChanges();
8882

8983
await processDeepLinksInArgs();

src/types/electron-reloader.d.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/ui/common.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ export type WindowState = {
1515
fullscreen: boolean;
1616
normal: boolean;
1717
bounds: {
18-
x: number | undefined,
19-
y: number | undefined,
18+
x?: number,
19+
y?: number,
2020
width: number,
2121
height: number,
2222
}

src/ui/main/rootWindow.ts

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
screen,
88
Rectangle,
99
NativeImage,
10+
WebPreferences,
1011
} from 'electron';
1112
import i18next from 'i18next';
1213
import { createStructuredSelector } from 'reselect';
@@ -25,6 +26,14 @@ import {
2526
} from '../selectors';
2627
import { getTrayIconPath } from './icons';
2728

29+
30+
const webPreferences: WebPreferences = {
31+
nodeIntegration: true,
32+
nodeIntegrationInSubFrames: true,
33+
webviewTag: true,
34+
worldSafeExecuteJavaScript: true,
35+
};
36+
2837
const selectRootWindowState = ({ rootWindowState }: RootState): WindowState => rootWindowState ?? {
2938
bounds: {
3039
x: 0,
@@ -54,12 +63,7 @@ export const createRootWindow = (): BrowserWindow => {
5463
titleBarStyle: 'hidden',
5564
backgroundColor: '#2f343d',
5665
show: false,
57-
webPreferences: {
58-
nodeIntegration: true,
59-
nodeIntegrationInSubFrames: true,
60-
webviewTag: true,
61-
worldSafeExecuteJavaScript: true,
62-
},
66+
webPreferences,
6367
});
6468

6569
rootWindow.addListener('close', (event) => {
@@ -298,8 +302,35 @@ export const showRootWindow = async (rootWindow: BrowserWindow): Promise<void> =
298302

299303
return new Promise((resolve) => {
300304
rootWindow.addListener('ready-to-show', () => {
305+
applyRootWindowState();
301306
setupRootWindow();
302307
resolve();
303308
});
304309
});
305310
};
311+
312+
export const exportLocalStorage = async (): Promise<Record<string, string>> => {
313+
try {
314+
const tempWindow = new BrowserWindow({
315+
show: false,
316+
webPreferences,
317+
});
318+
319+
tempWindow.loadFile(path.join(app.getAppPath(), 'app/index.html'));
320+
321+
await new Promise((resolve) => {
322+
tempWindow.addListener('ready-to-show', () => {
323+
resolve();
324+
});
325+
});
326+
327+
return tempWindow.webContents.executeJavaScript(`(() => {
328+
const data = ({...localStorage})
329+
localStorage.clear();
330+
return data;
331+
})()`);
332+
} catch (error) {
333+
console.error(error);
334+
return {};
335+
}
336+
};

src/ui/main/webviews.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,8 @@ export const attachGuestWebContentsEvents = (rootWindow: BrowserWindow): void =>
468468
ipcMain.handle(
469469
'server-url',
470470
(event) =>
471-
Array.from(webContentsByServerUrl.entries()).find(([, v]) => v === event.sender)[0],
471+
Array.from(webContentsByServerUrl.entries())
472+
.filter(([, v]) => v === event.sender)
473+
.map(([k]) => k)[0],
472474
);
473475
};

src/ui/reducers/rootWindowState.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@ export const rootWindowState: Reducer<WindowState, RootWindowStateAction> = (sta
2929
return action.payload;
3030

3131
case APP_SETTINGS_LOADED: {
32-
const { rootWindowState: mainWindowState = state } = action.payload;
33-
return mainWindowState;
32+
const { rootWindowState = state } = action.payload;
33+
return rootWindowState;
3434
}
35-
}
3635

37-
return state;
36+
default:
37+
return state;
38+
}
3839
};

0 commit comments

Comments
 (0)