1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Introduce abstractions for electron application events

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-04-12 08:02:04 +03:00
parent f2d52066f3
commit bace3c84d7
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
23 changed files with 164 additions and 37 deletions

View File

@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import electronAppInjectable from "./electron-app/electron-app.injectable"; import electronAppInjectable from "../../electron-app/electron-app.injectable";
import { getElectronAppPath } from "./get-electron-app-path"; import { getElectronAppPath } from "./get-electron-app-path";
const getElectronAppPathInjectable = getInjectable({ const getElectronAppPathInjectable = getInjectable({

View File

@ -2,7 +2,7 @@
* Copyright (c) OpenLens Authors. All rights reserved. * Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import electronAppInjectable from "./electron-app/electron-app.injectable"; import electronAppInjectable from "../../electron-app/electron-app.injectable";
import getElectronAppPathInjectable from "./get-electron-app-path.injectable"; import getElectronAppPathInjectable from "./get-electron-app-path.injectable";
import { getDiForUnitTesting } from "../../getDiForUnitTesting"; import { getDiForUnitTesting } from "../../getDiForUnitTesting";
import type { App } from "electron"; import type { App } from "electron";

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import type { PathName } from "../../../common/app-paths/app-path-names"; import type { PathName } from "../../../common/app-paths/app-path-names";
import electronAppInjectable from "../get-electron-app-path/electron-app/electron-app.injectable"; import electronAppInjectable from "../../electron-app/electron-app.injectable";
const setElectronAppPathInjectable = getInjectable({ const setElectronAppPathInjectable = getInjectable({
id: "set-electron-app-path", id: "set-electron-app-path",

View File

@ -0,0 +1,28 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import electronAppInjectable from "./electron-app.injectable";
interface CallbackArgs {
windowIsVisible: boolean;
}
const whenApplicationIsActivatedInjectable = getInjectable({
id: "when-application-is-activated",
instantiate: (di) => {
const app = di.inject(electronAppInjectable);
return (callback: (args: CallbackArgs) => void | Promise<void>) => {
app.on("activate", async (_, hasVisibleWindows) => {
await callback({
windowIsVisible: hasVisibleWindows,
});
});
};
},
});
export default whenApplicationIsActivatedInjectable;

View File

@ -0,0 +1,28 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import electronAppInjectable from "./electron-app.injectable";
interface CallbackArgs {
cancel: () => void;
}
const whenApplicationWillQuitInjectable = getInjectable({
id: "when-application-will-quit",
instantiate: (di) => {
const app = di.inject(electronAppInjectable);
return (callback: (args: CallbackArgs) => void) => {
app.on("will-quit", (event) => {
callback({
cancel: () => { event.preventDefault(); },
});
});
};
},
});
export default whenApplicationWillQuitInjectable;

View File

@ -0,0 +1,33 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import electronAppInjectable from "./electron-app.injectable";
interface CallbackArgs {
cancel: () => void;
url: string;
}
const whenOpeningUrlInjectable = getInjectable({
id: "when-opening-url",
instantiate: (di) => {
const app = di.inject(electronAppInjectable);
return (callback: (args: CallbackArgs) => void | Promise<void>) => {
app.on("open-url", async (event, url) => {
await callback({
cancel: () => {
event.preventDefault();
},
url,
});
});
};
},
});
export default whenOpeningUrlInjectable;

View File

@ -0,0 +1,28 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import electronAppInjectable from "./electron-app.injectable";
interface CallbackArgs {
commandLineArguments: string[];
}
const whenSecondInstanceInjectable = getInjectable({
id: "when-second-instance",
instantiate: (di) => {
const app = di.inject(electronAppInjectable);
return (callback: (args: CallbackArgs) => void | Promise<void>) => {
app.on("second-instance", async (_, commandLineArguments) => {
await callback({
commandLineArguments,
});
});
};
},
});
export default whenSecondInstanceInjectable;

View File

@ -35,6 +35,10 @@ import { getAbsolutePathFake } from "../common/test-utils/get-absolute-path-fake
import joinPathsInjectable from "../common/path/join-paths.injectable"; import joinPathsInjectable from "../common/path/join-paths.injectable";
import { joinPathsFake } from "../common/test-utils/join-paths-fake"; import { joinPathsFake } from "../common/test-utils/join-paths-fake";
import hotbarStoreInjectable from "../common/hotbar-store.injectable"; import hotbarStoreInjectable from "../common/hotbar-store.injectable";
import whenApplicationIsActivatedInjectable from "./electron-app/when-application-is-activated.injectable";
import whenApplicationWillQuitInjectable from "./electron-app/when-application-will-quit.injectable";
import whenOpeningUrlInjectable from "./electron-app/when-opening-url.injectable";
import whenSecondInstanceInjectable from "./electron-app/when-second-instance.injectable";
export const getDiForUnitTesting = ( export const getDiForUnitTesting = (
{ doGeneralOverrides } = { doGeneralOverrides: false }, { doGeneralOverrides } = { doGeneralOverrides: false },
@ -63,6 +67,11 @@ export const getDiForUnitTesting = (
di.override(getAbsolutePathInjectable, () => getAbsolutePathFake); di.override(getAbsolutePathInjectable, () => getAbsolutePathFake);
di.override(joinPathsInjectable, () => joinPathsFake); di.override(joinPathsInjectable, () => joinPathsFake);
di.override(whenApplicationIsActivatedInjectable, () => () => {});
di.override(whenApplicationWillQuitInjectable, () => () => {});
di.override(whenOpeningUrlInjectable, () => () => {});
di.override(whenSecondInstanceInjectable, () => () => {});
// eslint-disable-next-line unused-imports/no-unused-vars-ts // eslint-disable-next-line unused-imports/no-unused-vars-ts
di.override(extensionsStoreInjectable, () => ({ isEnabled: ({ id, isBundled }) => false }) as ExtensionsStore); di.override(extensionsStoreInjectable, () => ({ isEnabled: ({ id, isBundled }) => false }) as ExtensionsStore);

View File

@ -6,7 +6,8 @@ import { getInjectable } from "@ogre-tools/injectable";
import lensProtocolRouterMainInjectable from "../../../protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable"; import lensProtocolRouterMainInjectable from "../../../protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable";
import windowManagerInjectable from "../../../window-manager.injectable"; import windowManagerInjectable from "../../../window-manager.injectable";
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token"; import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";
import electronAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/electron-app.injectable"; import whenOpeningUrlInjectable from "../../../electron-app/when-opening-url.injectable";
import whenSecondInstanceInjectable from "../../../electron-app/when-second-instance.injectable";
const setupDeepLinking = getInjectable({ const setupDeepLinking = getInjectable({
id: "setup-deep-linking", id: "setup-deep-linking",
@ -14,17 +15,18 @@ const setupDeepLinking = getInjectable({
instantiate: (di) => { instantiate: (di) => {
const lensProtocolRouterMain = di.inject(lensProtocolRouterMainInjectable); const lensProtocolRouterMain = di.inject(lensProtocolRouterMainInjectable);
const windowManager = di.inject(windowManagerInjectable); const windowManager = di.inject(windowManagerInjectable);
const app = di.inject(electronAppInjectable); const whenOpeningUrl = di.inject(whenOpeningUrlInjectable);
const whenSecondInstance = di.inject(whenSecondInstanceInjectable);
return { return {
run: () => { run: () => {
app.on("open-url", async (event, url) => { whenOpeningUrl(({ cancel, url }) => {
event.preventDefault(); cancel();
await lensProtocolRouterMain.route(url); lensProtocolRouterMain.route(url);
}); });
app.on("second-instance", async (_, commandLineArguments) => { whenSecondInstance(async ({ commandLineArguments }) => {
for (const arg of commandLineArguments) { for (const arg of commandLineArguments) {
if (arg.toLowerCase().startsWith("lens://")) { if (arg.toLowerCase().startsWith("lens://")) {
await lensProtocolRouterMain.route(arg); await lensProtocolRouterMain.route(arg);

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token"; import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";
import electronAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/electron-app.injectable"; import electronAppInjectable from "../../../electron-app/electron-app.injectable";
const setupHardwareAccelerationInjectable = getInjectable({ const setupHardwareAccelerationInjectable = getInjectable({
id: "setup-hardware-acceleration", id: "setup-hardware-acceleration",

View File

@ -8,7 +8,7 @@ import {
getAppVersion, getAppVersion,
getAppVersionFromProxyServer, getAppVersionFromProxyServer,
} from "../../../../common/utils"; } from "../../../../common/utils";
import exitAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/exit-app.injectable"; import exitAppInjectable from "../../../electron-app/exit-app.injectable";
import lensProxyInjectable from "../../../lens-proxy.injectable"; import lensProxyInjectable from "../../../lens-proxy.injectable";
import loggerInjectable from "../../../../common/logger.injectable"; import loggerInjectable from "../../../../common/logger.injectable";
import { dialog } from "electron"; import { dialog } from "electron";

View File

@ -6,9 +6,9 @@ import { getInjectable } from "@ogre-tools/injectable";
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token"; import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";
import { productName } from "../../../../common/vars"; import { productName } from "../../../../common/vars";
import loggerInjectable from "../../../../common/logger.injectable"; import loggerInjectable from "../../../../common/logger.injectable";
import electronAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/electron-app.injectable"; import electronAppInjectable from "../../../electron-app/electron-app.injectable";
import lensProtocolRouterMainInjectable from "../../../protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable"; import lensProtocolRouterMainInjectable from "../../../protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable";
import exitAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/exit-app.injectable"; import exitAppInjectable from "../../../electron-app/exit-app.injectable";
const setupProtocolRouterMainInjectable = getInjectable({ const setupProtocolRouterMainInjectable = getInjectable({
id: "setup-protocol-router-main", id: "setup-protocol-router-main",

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import windowManagerInjectable from "../../../window-manager.injectable"; import windowManagerInjectable from "../../../window-manager.injectable";
import electronAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/electron-app.injectable"; import electronAppInjectable from "../../../electron-app/electron-app.injectable";
import loggerInjectable from "../../../../common/logger.injectable"; import loggerInjectable from "../../../../common/logger.injectable";
import isMacInjectable from "../../../../common/vars/is-mac.injectable"; import isMacInjectable from "../../../../common/vars/is-mac.injectable";
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token"; import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";

View File

@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import electronAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/electron-app.injectable"; import electronAppInjectable from "../../../electron-app/electron-app.injectable";
import appNameInjectable from "../../../app-paths/app-name/app-name.injectable"; import appNameInjectable from "../../../app-paths/app-name/app-name.injectable";
import { beforeApplicationIsReadyInjectionToken } from "../before-application-is-ready-injection-token"; import { beforeApplicationIsReadyInjectionToken } from "../before-application-is-ready-injection-token";

View File

@ -3,16 +3,16 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import electronAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/electron-app.injectable";
import { beforeApplicationIsReadyInjectionToken } from "../before-application-is-ready-injection-token"; import { beforeApplicationIsReadyInjectionToken } from "../before-application-is-ready-injection-token";
import { onApplicationSoftQuitInjectionToken } from "../../on-application-soft-quit/on-application-soft-quit-injection-token"; import { onApplicationSoftQuitInjectionToken } from "../../on-application-soft-quit/on-application-soft-quit-injection-token";
import { runManyFor } from "../../run-many-for"; import { runManyFor } from "../../run-many-for";
import whenApplicationWillQuitInjectable from "../../../electron-app/when-application-will-quit.injectable";
const setupClosingOfApplicationInjectable = getInjectable({ const setupClosingOfApplicationInjectable = getInjectable({
id: "setup-closing-of-application", id: "setup-closing-of-application",
instantiate: (di) => { instantiate: (di) => {
const app = di.inject(electronAppInjectable); const whenApplicationWillQuit = di.inject(whenApplicationWillQuitInjectable);
const runManyForApplicationClose = runManyFor(di)( const runManyForApplicationClose = runManyFor(di)(
onApplicationSoftQuitInjectionToken, onApplicationSoftQuitInjectionToken,
@ -20,8 +20,8 @@ const setupClosingOfApplicationInjectable = getInjectable({
return { return {
run: () => { run: () => {
app.on("will-quit", async (event) => { whenApplicationWillQuit(async args => {
await runManyForApplicationClose({ event }); await runManyForApplicationClose(args);
}); });
}, },
}; };

View File

@ -5,8 +5,8 @@
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import loggerInjectable from "../../../../common/logger.injectable"; import loggerInjectable from "../../../../common/logger.injectable";
import windowManagerInjectable from "../../../window-manager.injectable"; import windowManagerInjectable from "../../../window-manager.injectable";
import electronAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/electron-app.injectable";
import { beforeApplicationIsReadyInjectionToken } from "../before-application-is-ready-injection-token"; import { beforeApplicationIsReadyInjectionToken } from "../before-application-is-ready-injection-token";
import whenApplicationIsActivatedInjectable from "../../../electron-app/when-application-is-activated.injectable";
const setupMainWindowVisibilityInjectable = getInjectable({ const setupMainWindowVisibilityInjectable = getInjectable({
id: "setup-main-window-visibility", id: "setup-main-window-visibility",
@ -14,17 +14,18 @@ const setupMainWindowVisibilityInjectable = getInjectable({
instantiate: (di) => { instantiate: (di) => {
const logger = di.inject(loggerInjectable); const logger = di.inject(loggerInjectable);
const windowManager = di.inject(windowManagerInjectable); const windowManager = di.inject(windowManagerInjectable);
const app = di.inject(electronAppInjectable); const whenApplicationIsActivated = di.inject(whenApplicationIsActivatedInjectable);
return { return {
run: () => { run: () => {
app.on("activate", async (_, hasVisibleWindows) => { whenApplicationIsActivated(async ({ windowIsVisible }) => {
logger.info("APP:ACTIVATE", { hasVisibleWindows }); logger.info("APP:ACTIVATE", { hasVisibleWindows: windowIsVisible });
if (!hasVisibleWindows) { if (!windowIsVisible) {
await windowManager.ensureMainWindow(false); await windowManager.ensureMainWindow(false);
} }
}); });
}, },
}; };
}, },

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { powerMonitor } from "electron"; import { powerMonitor } from "electron";
import exitAppInjectable from "../../../app-paths/get-electron-app-path/electron-app/exit-app.injectable"; import exitAppInjectable from "../../../electron-app/exit-app.injectable";
import { beforeApplicationIsReadyInjectionToken } from "../before-application-is-ready-injection-token"; import { beforeApplicationIsReadyInjectionToken } from "../before-application-is-ready-injection-token";
const setupShutdownOfApplicationWhenSystemShutdownsInjectable = getInjectable({ const setupShutdownOfApplicationWhenSystemShutdownsInjectable = getInjectable({

View File

@ -4,10 +4,9 @@
*/ */
import { getInjectionToken } from "@ogre-tools/injectable"; import { getInjectionToken } from "@ogre-tools/injectable";
import type { Runnable } from "../run-many-for"; import type { Runnable } from "../run-many-for";
import type { Event } from "electron";
export const onApplicationHardQuitInjectionToken = getInjectionToken< export const onApplicationHardQuitInjectionToken = getInjectionToken<
Runnable<{ event: Event }> Runnable<{ cancel: () => void }>
>({ >({
id: "on-application-hard-quit", id: "on-application-hard-quit",
}); });

View File

@ -4,10 +4,9 @@
*/ */
import { getInjectionToken } from "@ogre-tools/injectable"; import { getInjectionToken } from "@ogre-tools/injectable";
import type { Runnable } from "../run-many-for"; import type { Runnable } from "../run-many-for";
import type { Event } from "electron";
export const onApplicationSoftQuitInjectionToken = getInjectionToken< export const onApplicationSoftQuitInjectionToken = getInjectionToken<
Runnable<{ event: Event }> Runnable<{ cancel: () => void }>
>({ >({
id: "on-application-soft-quit", id: "on-application-soft-quit",
}); });

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import electronAppInjectable from "../app-paths/get-electron-app-path/electron-app/electron-app.injectable"; import electronAppInjectable from "../electron-app/electron-app.injectable";
import { beforeApplicationIsReadyInjectionToken } from "./before-application-is-ready/before-application-is-ready-injection-token"; import { beforeApplicationIsReadyInjectionToken } from "./before-application-is-ready/before-application-is-ready-injection-token";
import { afterApplicationIsReadyInjectionToken } from "./after-application-is-ready/after-application-is-ready-injection-token"; import { afterApplicationIsReadyInjectionToken } from "./after-application-is-ready/after-application-is-ready-injection-token";
import { runManyFor } from "./run-many-for"; import { runManyFor } from "./run-many-for";

View File

@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import exitAppInjectable from "./app-paths/get-electron-app-path/electron-app/exit-app.injectable"; import exitAppInjectable from "./electron-app/exit-app.injectable";
import clusterManagerInjectable from "./cluster-manager.injectable"; import clusterManagerInjectable from "./cluster-manager.injectable";
import windowManagerInjectable from "./window-manager.injectable"; import windowManagerInjectable from "./window-manager.injectable";
import appEventBusInjectable from "../common/app-event-bus/app-event-bus.injectable"; import appEventBusInjectable from "../common/app-event-bus/app-event-bus.injectable";