From ca5c86dbf192466c71a8a39c86584cde65b01327 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Mon, 12 Dec 2022 23:35:57 +0100 Subject: [PATCH] create sevice to manage deep links --- src/main/main.ts | 11 +++ src/main/services/deep-link.service.ts | 80 +++++++++++++++++++ .../maps/local-maps-manager.service.ts | 4 + src/renderer/services/maps-manager.service.ts | 2 +- 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/main/services/deep-link.service.ts diff --git a/src/main/main.ts b/src/main/main.ts index 88d6b2f6..816c732b 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -14,6 +14,7 @@ import log from 'electron-log'; import './ipcs'; import { UtilsService } from './services/utils.service'; import { WindowManagerService } from './services/window-manager.service'; +import { DeepLinkService } from './services/deep-link.service'; export const PRELOAD_PATH = app.isPackaged ? path.join(__dirname, 'preload.js') : path.join(__dirname, '../../.erb/dll/preload.js') @@ -60,6 +61,16 @@ app.on('window-all-closed', () => { } }); +app.on('open-url', (event, url) => { + DeepLinkService.getInstance().dispatchLinkOpened(url); +}); + +const gotTheLock = app.requestSingleInstanceLock(); + +if(!gotTheLock){ + app.quit(); +} + app.whenReady().then(() => { createWindow(); }).catch(log.error); diff --git a/src/main/services/deep-link.service.ts b/src/main/services/deep-link.service.ts new file mode 100644 index 00000000..8284a944 --- /dev/null +++ b/src/main/services/deep-link.service.ts @@ -0,0 +1,80 @@ +import { app } from "electron"; +import path from "path"; +import { URL } from "url"; + +export class DeepLinkService { + + // See docs : https://www.electronjs.org/docs/latest/tutorial/launch-app-from-url-in-another-app#main-process-mainjs + + private static instance: DeepLinkService; + + public static getInstance(): DeepLinkService{ + if(!DeepLinkService.instance){ DeepLinkService.instance = new DeepLinkService(); } + return DeepLinkService.instance; + } + + private readonly listeners = new Map() + + public registerDeepLink(protocol: string): boolean{ + + if(process.defaultApp && process.argv.length >= 2){ + return app.setAsDefaultProtocolClient(protocol, process.execPath, [path.resolve(process.argv[1])]); + } + + return app.setAsDefaultProtocolClient(protocol); + } + + public unRegisterDeepLink(protocol: string): boolean{ + + if(process.defaultApp && process.argv.length >= 2) { + return app.removeAsDefaultProtocolClient(protocol, process.execPath, [path.resolve(process.argv[1])]); + } + + app.removeAsDefaultProtocolClient(protocol); + } + + public isDeepLinkRegistred(protocol: string): boolean{ + + if(process.defaultApp && process.argv.length >= 2) { + return app.isDefaultProtocolClient(protocol, process.execPath, [path.resolve(process.argv[1])]); + } + + return app.isDefaultProtocolClient(protocol); + } + + public addLinkOpenedListener(protocol: string, fn: Listerner){ + + if(!this.listeners.has(protocol)){ + this.listeners.set(protocol, [] as Listerner[]); + } + + this.listeners.get(protocol).push(fn); + } + + public removeLinkOpenedListener(protocol: string, fn: Listerner){ + + if(!this.listeners.get(protocol)?.length){ return; } + + const listeners = this.listeners.get(protocol); + const fnIndex = listeners.findIndex(listener => listener === fn); + + if(fnIndex < 0){ return; } + + listeners.splice(fnIndex, 1); + + } + + public dispatchLinkOpened(link: string){ + const url = new URL(link); + + const protocolListeners = this.listeners.get(url.protocol.replace(":", "")) ?? []; + + protocolListeners.forEach(listerner => { + listerner(link); + }); + + } + +} + +type Listerner = (link: string) => void; \ No newline at end of file diff --git a/src/main/services/maps/local-maps-manager.service.ts b/src/main/services/maps/local-maps-manager.service.ts index f10f9f5f..b4a31093 100644 --- a/src/main/services/maps/local-maps-manager.service.ts +++ b/src/main/services/maps/local-maps-manager.service.ts @@ -233,6 +233,10 @@ export class LocalMapsManagerService { } + public async enableDeepLink(){ + // TODO + } + } \ No newline at end of file diff --git a/src/renderer/services/maps-manager.service.ts b/src/renderer/services/maps-manager.service.ts index 3ccf1f27..9f5817a0 100644 --- a/src/renderer/services/maps-manager.service.ts +++ b/src/renderer/services/maps-manager.service.ts @@ -160,7 +160,7 @@ export class MapsManagerService { } public async enableDeepLink(): Promise{ - return true; + return true; // TODO } public get versionLinked$(): Observable{