Use SignalContext instead of SignalWindow

This commit is contained in:
Josh Perez 2021-10-07 19:28:47 -04:00 committed by GitHub
parent a70a8a88d6
commit 75dab30367
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
35 changed files with 180 additions and 231 deletions

View file

@ -5,18 +5,15 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { contextBridge, ipcRenderer } from 'electron';
// It is important to call this as early as possible
import '../context';
import { SignalWindow } from '../configure';
import { SignalContext } from '../context';
import { About } from '../../components/About';
contextBridge.exposeInMainWorld('SignalWindow', {
...SignalWindow,
contextBridge.exposeInMainWorld('SignalContext', {
...SignalContext,
renderWindow: () => {
const environmentText: Array<string> = [SignalWindow.getEnvironment()];
const environmentText: Array<string> = [SignalContext.getEnvironment()];
const appInstance = SignalWindow.getAppInstance();
const appInstance = SignalContext.getAppInstance();
if (appInstance) {
environmentText.push(appInstance);
}
@ -25,8 +22,8 @@ contextBridge.exposeInMainWorld('SignalWindow', {
React.createElement(About, {
closeAbout: () => ipcRenderer.send('close-about'),
environment: environmentText.join(' - '),
i18n: SignalWindow.i18n,
version: SignalWindow.getVersion(),
i18n: SignalContext.i18n,
version: SignalContext.getVersion(),
}),
document.getElementById('app')
);

View file

@ -2,13 +2,13 @@
// SPDX-License-Identifier: AGPL-3.0-only
async function applyTheme() {
const theme = await window.SignalWindow.Settings.themeSetting.getValue();
const theme = await window.SignalContext.Settings.themeSetting.getValue();
document.body.classList.remove('light-theme');
document.body.classList.remove('dark-theme');
document.body.classList.add(
`${
theme === 'system'
? window.SignalWindow.context.nativeThemeListener.getSystemTheme()
? window.SignalContext.nativeThemeListener.getSystemTheme()
: theme
}-theme`
);
@ -18,7 +18,7 @@ async function applyThemeLoop() {
// eslint-disable-next-line no-constant-condition
while (true) {
// eslint-disable-next-line no-await-in-loop
await window.SignalWindow.Settings.waitForChange();
await window.SignalContext.Settings.waitForChange();
// eslint-disable-next-line no-await-in-loop
await applyTheme();
@ -28,6 +28,6 @@ async function applyThemeLoop() {
applyTheme();
applyThemeLoop();
window.SignalWindow.context.nativeThemeListener.subscribe(() => {
window.SignalContext.nativeThemeListener.subscribe(() => {
applyTheme();
});

View file

@ -1,44 +0,0 @@
// Copyright 2018-2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import url from 'url';
import { ipcRenderer } from 'electron';
import { setupI18n } from '../util/setupI18n';
import {
getEnvironment,
parseEnvironment,
setEnvironment,
} from '../environment';
import { strictAssert } from '../util/assert';
import { createSetting } from '../util/preload';
import { initialize as initializeLogging } from '../logging/set_up_renderer_logging';
import { waitForSettingsChange } from './waitForSettingsChange';
const config = url.parse(window.location.toString(), true).query;
const { locale } = config;
strictAssert(locale, 'locale could not be parsed from config');
strictAssert(typeof locale === 'string', 'locale is not a string');
const localeMessages = ipcRenderer.sendSync('locale-data');
setEnvironment(parseEnvironment(config.environment));
strictAssert(Boolean(window.SignalContext), 'context must be defined');
initializeLogging();
export const SignalWindow = {
Settings: {
themeSetting: createSetting('themeSetting', { setter: false }),
waitForChange: waitForSettingsChange,
},
config,
context: window.SignalContext,
getAppInstance: (): string | undefined =>
config.appInstance ? String(config.appInstance) : undefined,
getEnvironment,
getNodeVersion: (): string => String(config.node_version),
getVersion: (): string => String(config.version),
i18n: setupI18n(locale, localeMessages),
log: window.SignalWindow.log,
};

View file

@ -1,8 +1,83 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { ipcRenderer as ipc } from 'electron';
import { ipcRenderer } from 'electron';
import url from 'url';
import type { ParsedUrlQuery } from 'querystring';
import type { IPCEventsValuesType } from '../util/createIPCEvents';
import type { LocalizerType } from '../types/Util';
import type { LoggerType } from '../types/Logging';
import type { NativeThemeType } from '../context/createNativeThemeListener';
import type { SettingType } from '../util/preload';
import { Bytes } from '../context/Bytes';
import { Crypto } from '../context/Crypto';
import { Timers } from '../context/Timers';
import { Context } from '../context';
import { setupI18n } from '../util/setupI18n';
import {
getEnvironment,
parseEnvironment,
setEnvironment,
} from '../environment';
import { strictAssert } from '../util/assert';
import { createSetting } from '../util/preload';
import { initialize as initializeLogging } from '../logging/set_up_renderer_logging';
import { waitForSettingsChange } from './waitForSettingsChange';
import { createNativeThemeListener } from '../context/createNativeThemeListener';
window.SignalContext = new Context(ipc);
const config = url.parse(window.location.toString(), true).query;
const { locale } = config;
strictAssert(locale, 'locale could not be parsed from config');
strictAssert(typeof locale === 'string', 'locale is not a string');
const localeMessages = ipcRenderer.sendSync('locale-data');
setEnvironment(parseEnvironment(config.environment));
strictAssert(Boolean(window.SignalContext), 'context must be defined');
initializeLogging();
export type SignalContextType = {
bytes: Bytes;
crypto: Crypto;
timers: Timers;
nativeThemeListener: NativeThemeType;
setIsCallActive: (isCallActive: boolean) => unknown;
Settings: {
themeSetting: SettingType<IPCEventsValuesType['themeSetting']>;
waitForChange: () => Promise<void>;
};
config: ParsedUrlQuery;
getAppInstance: () => string | undefined;
getEnvironment: () => string;
getNodeVersion: () => string;
getVersion: () => string;
i18n: LocalizerType;
log: LoggerType;
renderWindow?: () => void;
};
export const SignalContext: SignalContextType = {
Settings: {
themeSetting: createSetting('themeSetting', { setter: false }),
waitForChange: waitForSettingsChange,
},
bytes: new Bytes(),
config,
crypto: new Crypto(),
getAppInstance: (): string | undefined =>
config.appInstance ? String(config.appInstance) : undefined,
getEnvironment,
getNodeVersion: (): string => String(config.node_version),
getVersion: (): string => String(config.version),
i18n: setupI18n(locale, localeMessages),
log: window.SignalContext.log,
nativeThemeListener: createNativeThemeListener(ipcRenderer, window),
setIsCallActive(isCallActive: boolean): void {
ipcRenderer.send('set-is-call-active', isCallActive);
},
timers: new Timers(),
};
window.SignalContext = SignalContext;

View file

@ -5,19 +5,16 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { contextBridge, ipcRenderer } from 'electron';
// It is important to call this as early as possible
import '../context';
import { SignalWindow } from '../configure';
import { SignalContext } from '../context';
import { DebugLogWindow } from '../../components/DebugLogWindow';
import * as debugLog from '../../logging/debuglogs';
contextBridge.exposeInMainWorld('SignalWindow', {
...SignalWindow,
contextBridge.exposeInMainWorld('SignalContext', {
...SignalContext,
renderWindow: () => {
const environmentText: Array<string> = [SignalWindow.getEnvironment()];
const environmentText: Array<string> = [SignalContext.getEnvironment()];
const appInstance = SignalWindow.getAppInstance();
const appInstance = SignalContext.getAppInstance();
if (appInstance) {
environmentText.push(appInstance);
}
@ -27,15 +24,15 @@ contextBridge.exposeInMainWorld('SignalWindow', {
closeWindow: () => ipcRenderer.send('close-debug-log'),
downloadLog: (logText: string) =>
ipcRenderer.send('show-debug-log-save-dialog', logText),
i18n: SignalWindow.i18n,
i18n: SignalContext.i18n,
fetchLogs() {
return debugLog.fetch(
SignalWindow.getNodeVersion(),
SignalWindow.getVersion()
SignalContext.getNodeVersion(),
SignalContext.getVersion()
);
},
uploadLogs(logs: string) {
return debugLog.upload(logs, SignalWindow.getVersion());
return debugLog.upload(logs, SignalContext.getVersion());
},
}),
document.getElementById('app')

View file

@ -1,4 +1,8 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
window.SignalWindow.renderWindow();
if (window.SignalContext.renderWindow) {
window.SignalContext.renderWindow();
} else {
window.SignalContext.log.error('renderWindow is undefined!');
}

View file

@ -3,9 +3,6 @@
import { contextBridge } from 'electron';
// It is important to call this as early as possible
import '../context';
import { SignalContext } from '../context';
import { SignalWindow } from '../configure';
contextBridge.exposeInMainWorld('SignalWindow', SignalWindow);
contextBridge.exposeInMainWorld('SignalContext', SignalContext);

View file

@ -3,5 +3,5 @@
const message = document.getElementById('message');
if (message) {
message.innerHTML = window.SignalWindow.i18n('optimizingApplication');
message.innerHTML = window.SignalContext.i18n('optimizingApplication');
}

View file

@ -5,11 +5,9 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { contextBridge, ipcRenderer } from 'electron';
// It is important to call this as early as possible
import '../context';
import { SignalContext } from '../context';
import { createSetting } from '../../util/preload';
import { SignalWindow } from '../configure';
import { PermissionsPopup } from '../../components/PermissionsPopup';
const mediaCameraPermissions = createSetting('mediaCameraPermissions', {
@ -24,21 +22,21 @@ contextBridge.exposeInMainWorld(
window.SignalContext.nativeThemeListener
);
contextBridge.exposeInMainWorld('SignalWindow', {
...SignalWindow,
contextBridge.exposeInMainWorld('SignalContext', {
...SignalContext,
renderWindow: () => {
const forCalling = SignalWindow.config.forCalling === 'true';
const forCamera = SignalWindow.config.forCamera === 'true';
const forCalling = SignalContext.config.forCalling === 'true';
const forCamera = SignalContext.config.forCamera === 'true';
let message;
if (forCalling) {
if (forCamera) {
message = SignalWindow.i18n('videoCallingPermissionNeeded');
message = SignalContext.i18n('videoCallingPermissionNeeded');
} else {
message = SignalWindow.i18n('audioCallingPermissionNeeded');
message = SignalContext.i18n('audioCallingPermissionNeeded');
}
} else {
message = SignalWindow.i18n('audioPermissionNeeded');
message = SignalContext.i18n('audioPermissionNeeded');
}
function onClose() {
@ -47,7 +45,7 @@ contextBridge.exposeInMainWorld('SignalWindow', {
ReactDOM.render(
React.createElement(PermissionsPopup, {
i18n: SignalWindow.i18n,
i18n: SignalContext.i18n,
message,
onAccept: () => {
if (!forCamera) {

View file

@ -5,18 +5,15 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { contextBridge, ipcRenderer } from 'electron';
// It is important to call this as early as possible
import '../context';
import { SignalWindow } from '../configure';
import { SignalContext } from '../context';
import { CallingScreenSharingController } from '../../components/CallingScreenSharingController';
contextBridge.exposeInMainWorld('SignalWindow', SignalWindow);
contextBridge.exposeInMainWorld('SignalContext', SignalContext);
function renderScreenSharingController(presentedSourceName: string): void {
ReactDOM.render(
React.createElement(CallingScreenSharingController, {
i18n: SignalWindow.i18n,
i18n: SignalContext.i18n,
onCloseController: () =>
ipcRenderer.send('close-screen-share-controller'),
onStopSharing: () => ipcRenderer.send('stop-screen-share'),

View file

@ -5,10 +5,7 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { contextBridge, ipcRenderer } from 'electron';
// It is important to call this as early as possible
import '../context';
import { SignalWindow } from '../configure';
import { SignalContext } from '../context';
import * as Settings from '../../types/Settings';
import { Preferences } from '../../components/Preferences';
import {
@ -260,7 +257,7 @@ const renderPreferences = async () => {
editCustomColor: ipcEditCustomColor,
getConversationsWithCustomColor: ipcGetConversationsWithCustomColor,
initialSpellCheckSetting:
SignalWindow.config.appStartInitialSpellcheckSetting === 'true',
SignalContext.config.appStartInitialSpellcheckSetting === 'true',
makeSyncRequest: ipcMakeSyncRequest,
removeCustomColor: ipcRemoveCustomColor,
removeCustomColorOnConversations: ipcRemoveCustomColorOnConversations,
@ -277,7 +274,7 @@ const renderPreferences = async () => {
isPhoneNumberSharingSupported,
isSyncSupported: !isSyncNotSupported,
isSystemTraySupported: Settings.isSystemTraySupported(
SignalWindow.getVersion()
SignalContext.getVersion()
),
// Change handlers
@ -343,7 +340,7 @@ const renderPreferences = async () => {
// rerender.
onZoomFactorChange: settingZoomFactor.setValue,
i18n: SignalWindow.i18n,
i18n: SignalContext.i18n,
};
function reRender<Value>(f: (value: Value) => Promise<Value>) {
@ -361,7 +358,7 @@ const renderPreferences = async () => {
ipcRenderer.on('preferences-changed', () => renderPreferences());
contextBridge.exposeInMainWorld('SignalWindow', {
...SignalWindow,
contextBridge.exposeInMainWorld('SignalContext', {
...SignalContext,
renderWindow: renderPreferences,
});