UNPKG

@vueuse/electron

Version:

Electron renderer process modules for VueUse

141 lines (135 loc) 5.23 kB
import { isRef, ref, shallowRef, watch } from "vue"; import { tryOnScopeDispose } from "@vueuse/shared"; //#region useIpcRendererInvoke/index.ts /** * Returns Promise<any> - Resolves with the response from the main process. * * Send a message to the main process via channel and expect a result ~~asynchronously~~. As composition-api, it makes asynchronous operations look like synchronous. * * @see https://www.electronjs.org/docs/api/ipc-renderer#ipcrendererinvokechannel-args * @see https://vueuse.org/useIpcRendererInvoke * * @__NO_SIDE_EFFECTS__ */ function useIpcRendererInvoke(...args) { let ipcRenderer; let channel; let invokeArgs; if (typeof args[0] === "string") { [channel, ...invokeArgs] = args; ipcRenderer = window.require ? window.require("electron").ipcRenderer : void 0; } else [ipcRenderer, channel, ...invokeArgs] = args; if (!ipcRenderer) throw new Error("please provide IpcRenderer module or enable nodeIntegration"); const result = shallowRef(null); ipcRenderer.invoke(channel, ...invokeArgs).then((response) => { result.value = response; }); return result; } //#endregion //#region useIpcRendererOn/index.ts function useIpcRendererOn(...args) { let ipcRenderer; let channel; let listener; if (typeof args[0] === "string") { [channel, listener] = args; ipcRenderer = window.require ? window.require("electron").ipcRenderer : void 0; } else [ipcRenderer, channel, listener] = args; if (!ipcRenderer) throw new Error("please provide IpcRenderer module or enable nodeIntegration"); tryOnScopeDispose(() => { ipcRenderer.removeListener(channel, listener); }); return ipcRenderer.on(channel, listener); } //#endregion //#region useIpcRenderer/index.ts /** * Create a `sendSync` function */ function setSendSync(ipcRenderer) { return (channel, ...args) => { const result = shallowRef(null); result.value = ipcRenderer.sendSync(channel, ...args); return result; }; } /** * Get the `ipcRenderer` module with all APIs. * * @see https://www.electronjs.org/docs/api/ipc-renderer#ipcrenderersendtohostchannel-args * @see https://vueuse.org/useIpcRenderer */ function useIpcRenderer(ipcRenderer) { var _window; if (!ipcRenderer) ipcRenderer = (_window = window) === null || _window === void 0 ? void 0 : _window.require("electron").ipcRenderer; if (!ipcRenderer) throw new Error("provide IpcRenderer module or enable nodeIntegration"); return { on: (channel, listener) => useIpcRendererOn(channel, listener), once: ipcRenderer.once.bind(ipcRenderer), removeListener: ipcRenderer.removeListener.bind(ipcRenderer), removeAllListeners: ipcRenderer.removeAllListeners.bind(ipcRenderer), send: ipcRenderer.send, invoke: (channel, ...args) => useIpcRendererInvoke(ipcRenderer, channel, ...args), sendSync: setSendSync(ipcRenderer), postMessage: ipcRenderer.postMessage, sendTo: ipcRenderer.sendTo, sendToHost: ipcRenderer.sendToHost }; } //#endregion //#region useZoomFactor/index.ts /** * Reactive WebFrame zoom factor * * @see https://www.electronjs.org/docs/api/web-frame#webframesetzoomfactorfactor * @see https://vueuse.org/useZoomFactor */ function useZoomFactor(...args) { var _newFactor; let webFrame; let newFactor = null; if (args.length === 0 || isRef(args[0]) && typeof args[0].value === "number" || typeof args[0] === "number") { webFrame = window.require ? window.require("electron").webFrame : void 0; newFactor = args.length > 0 ? ref(args[0]) : null; } else { webFrame = args[0]; newFactor = args.length > 1 ? ref(args[1]) : null; } if (!webFrame) throw new Error("provide WebFrame module or enable nodeIntegration"); if (newFactor && newFactor.value === 0) throw new Error("the factor must be greater than 0.0."); const factor = ref((_newFactor = newFactor) !== null && _newFactor !== void 0 ? _newFactor : webFrame.getZoomFactor()); watch(factor, (f, o) => { if (typeof f === "number" && f === 0) throw new Error("the factor must be greater than 0.0."); if (typeof f === "number" && f !== o) webFrame === null || webFrame === void 0 || webFrame.setZoomFactor(f); }, { immediate: true }); return factor; } //#endregion //#region useZoomLevel/index.ts /** * Reactive WebFrame zoom level * * @see https://www.electronjs.org/docs/api/web-frame#webframesetzoomlevellevel * @see https://vueuse.org/useZoomLevel */ function useZoomLevel(...args) { var _newLevel; let webFrame; let newLevel = null; if (args.length === 0 || isRef(args[0]) && typeof args[0].value === "number" || typeof args[0] === "number") { webFrame = window.require ? window.require("electron").webFrame : void 0; newLevel = args.length > 0 ? ref(args[0]) : null; } else { webFrame = args[0]; newLevel = args.length > 1 ? ref(args[1]) : null; } if (!webFrame) throw new Error("provide WebFrame module or enable nodeIntegration"); const level = ref((_newLevel = newLevel) !== null && _newLevel !== void 0 ? _newLevel : webFrame.getZoomLevel()); watch(level, (f, o) => { if (typeof f === "number" && f !== o) webFrame === null || webFrame === void 0 || webFrame.setZoomLevel(f); }, { immediate: true }); return level; } //#endregion export { useIpcRenderer, useIpcRendererInvoke, useIpcRendererOn, useZoomFactor, useZoomLevel };