@vueuse/electron
Version:
Electron renderer process modules for VueUse
141 lines (135 loc) • 5.23 kB
JavaScript
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 };