From 6b0f00f71a4ea291c201dbac0f331f72efd88853 Mon Sep 17 00:00:00 2001 From: layyback <505187749@qq.com> Date: Fri, 10 Mar 2023 15:13:20 +0800 Subject: [PATCH] :bug: fix apiclass & add some feature --- src/common/constans/main.ts | 3 + src/common/utils/localPlugin.ts | 30 ++--- src/main/browsers/main.ts | 19 ++- src/main/common/api.ts | 178 +++++++++++++------------- src/main/index.ts | 10 +- src/renderer/App.vue | 18 ++- src/renderer/components/search.vue | 64 +++++---- src/renderer/plugins-manager/index.ts | 1 + src/renderer/shims-vue.d.ts | 1 + 9 files changed, 180 insertions(+), 144 deletions(-) diff --git a/src/common/constans/main.ts b/src/common/constans/main.ts index 67cf96a..396f216 100644 --- a/src/common/constans/main.ts +++ b/src/common/constans/main.ts @@ -3,6 +3,9 @@ import path from "path"; const appPath = app.getPath("cache"); +console.log(appPath); + + const PLUGIN_INSTALL_DIR = path.join(appPath, "./rubick-plugins"); const DECODE_KEY = { diff --git a/src/common/utils/localPlugin.ts b/src/common/utils/localPlugin.ts index 146e573..e36e2d3 100644 --- a/src/common/utils/localPlugin.ts +++ b/src/common/utils/localPlugin.ts @@ -3,7 +3,7 @@ import fs from "fs"; import getLocalDataFile from "./getLocalDataFile"; import { PluginHandler } from "@/core"; import { PLUGIN_INSTALL_DIR as baseDir } from "@/common/constans/main"; -import { API } from "@/main/common/api"; +import API from "@/main/common/api"; const configPath = path.join(getLocalDataFile(), "./rubick-local-plugin.json"); @@ -16,12 +16,12 @@ let pluginInstance; console.log(registry); pluginInstance = new PluginHandler({ baseDir, - registry, + registry }); } catch (e) { pluginInstance = new PluginHandler({ baseDir, - registry, + registry }); } })(); @@ -38,7 +38,7 @@ global.LOCAL_PLUGINS = { ); plugin = { ...plugin, - ...pluginInfo, + ...pluginInfo }; } global.LOCAL_PLUGINS.addPlugin(plugin); @@ -52,12 +52,12 @@ global.LOCAL_PLUGINS = { ); plugin = { ...plugin, - ...pluginInfo, + ...pluginInfo }; // 刷新 let currentPlugins = global.LOCAL_PLUGINS.getLocalPlugins(); - currentPlugins = currentPlugins.map((p) => { + currentPlugins = currentPlugins.map(p => { if (p.name === plugin.name) { return plugin; } @@ -85,7 +85,7 @@ global.LOCAL_PLUGINS = { addPlugin(plugin) { let has = false; const currentPlugins = global.LOCAL_PLUGINS.getLocalPlugins(); - currentPlugins.some((p) => { + currentPlugins.some(p => { has = p.name === plugin.name; return has; }); @@ -96,22 +96,20 @@ global.LOCAL_PLUGINS = { } }, updatePlugin(plugin) { - global.LOCAL_PLUGINS.PLUGINS = global.LOCAL_PLUGINS.PLUGINS.map( - (origin) => { - if (origin.name === plugin.name) { - return plugin; - } - return origin; + global.LOCAL_PLUGINS.PLUGINS = global.LOCAL_PLUGINS.PLUGINS.map(origin => { + if (origin.name === plugin.name) { + return plugin; } - ); + return origin; + }); fs.writeFileSync(configPath, JSON.stringify(global.LOCAL_PLUGINS.PLUGINS)); }, async deletePlugin(plugin) { await pluginInstance.uninstall([plugin.name], { isDev: plugin.isDev }); global.LOCAL_PLUGINS.PLUGINS = global.LOCAL_PLUGINS.PLUGINS.filter( - (p) => plugin.name !== p.name + p => plugin.name !== p.name ); fs.writeFileSync(configPath, JSON.stringify(global.LOCAL_PLUGINS.PLUGINS)); return global.LOCAL_PLUGINS.PLUGINS; - }, + } }; diff --git a/src/main/browsers/main.ts b/src/main/browsers/main.ts index cb53322..e2e2d87 100644 --- a/src/main/browsers/main.ts +++ b/src/main/browsers/main.ts @@ -1,4 +1,5 @@ import { app, BrowserWindow, protocol } from "electron"; +import path from "path"; import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; export default () => { let win: any; @@ -24,7 +25,8 @@ export default () => { contextIsolation: false, webviewTag: true, nodeIntegration: true, - }, + preload: path.join(__static, "preload.js") + } }); if (process.env.WEBPACK_DEV_SERVER_URL) { // Load the url of the dev server if in development mode @@ -42,6 +44,19 @@ export default () => { win = undefined; }); + win.on("show", () => { + win.webContents.executeJavaScript( + `window.rubick && window.rubick.hooks && typeof window.rubick.hooks.onShow === "function" && window.rubick.hooks.onShow()` + ); + // win.webContents.openDevTools(); + }); + + win.on("hide", () => { + win.webContents.executeJavaScript( + `window.rubick && window.rubick.hooks && typeof window.rubick.hooks.onHide === "function" && window.rubick.hooks.onHide()` + ); + }); + // 判断失焦是否隐藏 win.on("blur", () => { const config = { ...global.OP_CONFIG.get() }; @@ -55,6 +70,6 @@ export default () => { return { init, - getWindow, + getWindow }; }; diff --git a/src/main/common/api.ts b/src/main/common/api.ts index 3539963..1c9083d 100644 --- a/src/main/common/api.ts +++ b/src/main/common/api.ts @@ -6,7 +6,7 @@ import { Notification, nativeImage, clipboard, - shell, + shell } from "electron"; import { runner, detach } from "../browsers"; import fs from "fs"; @@ -21,145 +21,155 @@ const dbInstance = new LocalDb(app.getPath("userData")); dbInstance.init(); class API { - static currentPlugin: null | any = null; - static DBKEY = "RUBICK_DB_DEFAULT"; + public currentPlugin: null | any = null; + private DBKEY = "RUBICK_DB_DEFAULT"; - static getCurrentWindow = (window, e) => { + init(mainWindow: BrowserWindow) { + // 响应 preload.js 事件 + ipcMain.on("msg-trigger", async (event, arg) => { + const window = arg.winId ? BrowserWindow.fromId(arg.winId) : mainWindow; + const data = await this[arg.type](arg, window, event); + event.returnValue = data; + // event.sender.send(`msg-back-${arg.type}`, data); + }); + } + + public getCurrentWindow = (window, e) => { let originWindow = BrowserWindow.fromWebContents(e.sender); if (originWindow !== window) originWindow = detachInstance.getWindow(); return originWindow; }; - static __EscapeKeyDown = (event, input, window) => { + public __EscapeKeyDown = (event, input, window) => { if (input.type !== "keyDown") return; if (!(input.meta || input.control || input.shift || input.alt)) { if (input.key === "Escape") { - API.removePlugin(null, window); + this.removePlugin(null, window); } return; } }; - static loadPlugin({ data: plugin }, window) { + public loadPlugin({ data: plugin }, window) { window.webContents.executeJavaScript( `window.loadPlugin(${JSON.stringify(plugin)})` ); - API.openPlugin({ data: plugin }, window); + this.openPlugin({ data: plugin }, window); } - static openPlugin({ data: plugin }, window) { - if (API.currentPlugin && API.currentPlugin.name === plugin.name) return; + public openPlugin({ data: plugin }, window) { + if (this.currentPlugin && this.currentPlugin.name === plugin.name) return; window.setSize(window.getSize()[0], 60); runnerInstance.removeView(window); runnerInstance.init(plugin, window); - API.currentPlugin = plugin; + this.currentPlugin = plugin; window.webContents.executeJavaScript( `window.setCurrentPlugin(${JSON.stringify({ - currentPlugin: API.currentPlugin, + currentPlugin: this.currentPlugin })})` ); window.show(); // 按 ESC 退出插件 window.webContents.on("before-input-event", (event, input) => - API.__EscapeKeyDown(event, input, window) + this.__EscapeKeyDown(event, input, window) ); runnerInstance .getView() .webContents.on("before-input-event", (event, input) => - API.__EscapeKeyDown(event, input, window) + this.__EscapeKeyDown(event, input, window) ); } - static removePlugin(e, window) { - API.currentPlugin = null; + public removePlugin(e, window) { + this.currentPlugin = null; runnerInstance.removeView(window); } - static openPluginDevTools() { + public openPluginDevTools() { runnerInstance.getView().webContents.openDevTools({ mode: "detach" }); } - static hideMainWindow(arg, window) { + public hideMainWindow(arg, window) { window.hide(); } - static showMainWindow(arg, window) { + public showMainWindow(arg, window) { window.show(); } - static showOpenDialog({ data }, window) { + public showOpenDialog({ data }, window) { dialog.showOpenDialogSync(window, data); } - static setExpendHeight({ data: height }, window: BrowserWindow, e) { - const originWindow = API.getCurrentWindow(window, e); + public setExpendHeight({ data: height }, window: BrowserWindow, e) { + const originWindow = this.getCurrentWindow(window, e); if (!originWindow) return; const targetHeight = height; originWindow.setSize(originWindow.getSize()[0], targetHeight); } - static setSubInput({ data }, window, e) { - const originWindow = API.getCurrentWindow(window, e); + public setSubInput({ data }, window, e) { + const originWindow = this.getCurrentWindow(window, e); if (!originWindow) return; originWindow.webContents.executeJavaScript( `window.setSubInput(${JSON.stringify({ - placeholder: data.placeholder, + placeholder: data.placeholder })})` ); } - static subInputBlur() { + public subInputBlur() { runnerInstance.getView().webContents.focus(); } - static sendSubInputChangeEvent({ data }) { + public sendSubInputChangeEvent({ data }) { runnerInstance.executeHooks("SubInputChange", data); } - static removeSubInput(data, window, e) { - const originWindow = API.getCurrentWindow(window, e); + public removeSubInput(data, window, e) { + const originWindow = this.getCurrentWindow(window, e); if (!originWindow) return; originWindow.webContents.executeJavaScript(`window.removeSubInput()`); } - static setSubInputValue({ data }, window, e) { - const originWindow = API.getCurrentWindow(window, e); + public setSubInputValue({ data }, window, e) { + const originWindow = this.getCurrentWindow(window, e); if (!originWindow) return; originWindow.webContents.executeJavaScript( `window.setSubInputValue(${JSON.stringify({ - value: data.text, + value: data.text })})` ); } - static getPath({ data }) { + public getPath({ data }) { return app.getPath(data.name); } - static showNotification({ data: { body } }) { + public showNotification({ data: { body } }) { if (!Notification.isSupported()) return; "string" != typeof body && (body = String(body)); - const plugin = API.currentPlugin; + const plugin = this.currentPlugin; if (!plugin) return; const notify = new Notification({ title: plugin.pluginName, body, - icon: plugin.logo, + icon: plugin.logo }); notify.show(); } - static copyImage = ({ data }) => { + public copyImage = ({ data }) => { const image = nativeImage.createFromDataURL(data.img); clipboard.writeImage(image); }; - static copyText({ data }) { + public copyText({ data }) { clipboard.writeText(String(data.text)); return true; } - static copyFile({ data }) { + public copyFile({ data }) { if (data.file && fs.existsSync(data.file)) { clipboard.writeBuffer( "NSFilenamesPboardType", @@ -170,134 +180,126 @@ class API { return false; } - static dbPut({ data }) { - return dbInstance.put(API.DBKEY, data.data); + public dbPut({ data }) { + return dbInstance.put(this.DBKEY, data.data); } - static dbGet({ data }) { - return dbInstance.get(API.DBKEY, data.id); + public dbGet({ data }) { + return dbInstance.get(this.DBKEY, data.id); } - static dbRemove({ data }) { - return dbInstance.remove(API.DBKEY, data.doc); + public dbRemove({ data }) { + return dbInstance.remove(this.DBKEY, data.doc); } - static dbBulkDocs({ data }) { - return dbInstance.bulkDocs(API.DBKEY, data.docs); + public dbBulkDocs({ data }) { + return dbInstance.bulkDocs(this.DBKEY, data.docs); } - static dbAllDocs({ data }) { - return dbInstance.allDocs(API.DBKEY, data.key); + public dbAllDocs({ data }) { + return dbInstance.allDocs(this.DBKEY, data.key); } - static getFeatures() { - return API.currentPlugin.features; + public getFeatures() { + return this.currentPlugin.features; } - static setFeature({ data }, window) { - API.currentPlugin = { - ...API.currentPlugin, + public setFeature({ data }, window) { + this.currentPlugin = { + ...this.currentPlugin, features: (() => { let has = false; - API.currentPlugin.features.some((feature) => { + this.currentPlugin.features.some(feature => { has = feature.code === data.feature.code; return has; }); if (!has) { - return [...API.currentPlugin.features, data.feature]; + return [...this.currentPlugin.features, data.feature]; } - return API.currentPlugin.features; - })(), + return this.currentPlugin.features; + })() }; window.webContents.executeJavaScript( `window.updatePlugin(${JSON.stringify({ - currentPlugin: API.currentPlugin, + currentPlugin: this.currentPlugin })})` ); return true; } - static removeFeature({ data }, window) { - API.currentPlugin = { - ...API.currentPlugin, - features: API.currentPlugin.features.filter((feature) => { + public removeFeature({ data }, window) { + this.currentPlugin = { + ...this.currentPlugin, + features: this.currentPlugin.features.filter(feature => { if (data.code.type) { return feature.code.type !== data.code.type; } return feature.code !== data.code; - }), + }) }; window.webContents.executeJavaScript( `window.updatePlugin(${JSON.stringify({ - currentPlugin: API.currentPlugin, + currentPlugin: this.currentPlugin })})` ); return true; } - static sendPluginSomeKeyDownEvent({ data: { modifiers, keyCode } }) { + public sendPluginSomeKeyDownEvent({ data: { modifiers, keyCode } }) { const code = DECODE_KEY[keyCode]; if (!code || !runnerInstance.getView()) return; if (modifiers.length > 0) { runnerInstance.getView().webContents.sendInputEvent({ type: "keyDown", modifiers, - keyCode: code, + keyCode: code }); } else { runnerInstance.getView().webContents.sendInputEvent({ type: "keyDown", - keyCode: code, + keyCode: code }); } } - static detachPlugin(e, window) { - if (!API.currentPlugin) return; + public detachPlugin(e, window) { + if (!this.currentPlugin) return; const view = window.getBrowserView(); window.setBrowserView(null); window.webContents .executeJavaScript(`window.getMainInputInfo()`) - .then((res) => { + .then(res => { detachInstance.init( { - ...API.currentPlugin, - subInput: res, + ...this.currentPlugin, + subInput: res }, window.getBounds(), view ); window.webContents.executeJavaScript(`window.initRubick()`); window.setSize(window.getSize()[0], 60); - API.currentPlugin = null; + this.currentPlugin = null; }); } - static detachInputChange({ data }) { - API.sendSubInputChangeEvent({ data }); + public detachInputChange({ data }) { + this.sendSubInputChangeEvent({ data }); } - static getLocalId() { + public getLocalId() { return encodeURIComponent(app.getPath("home")); } - static shellShowItemInFolder({ data }) { + public shellShowItemInFolder({ data }) { shell.showItemInFolder(data.path); return true; } - static shellBeep() { + public shellBeep() { shell.beep(); return true; } } -export default (mainWindow: BrowserWindow) => { - // 响应 preload.js 事件 - ipcMain.on("msg-trigger", async (event, arg) => { - const window = arg.winId ? BrowserWindow.fromId(arg.winId) : mainWindow; - const data = await API[arg.type](arg, window, event); - event.returnValue = data; - // event.sender.send(`msg-back-${arg.type}`, data); - }); -}; +export default new API(); diff --git a/src/main/index.ts b/src/main/index.ts index 5db382c..66b2683 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -3,7 +3,7 @@ import electron, { app, globalShortcut, protocol, - BrowserWindow, + BrowserWindow } from "electron"; import { main } from "./browsers"; import commonConst from "../common/utils/commonConst"; @@ -24,7 +24,7 @@ class App { constructor() { protocol.registerSchemesAsPrivileged([ - { scheme: "app", privileges: { secure: true, standard: true } }, + { scheme: "app", privileges: { secure: true, standard: true } } ]); this.windowCreator = main(); const gotTheLock = app.requestSingleInstanceLock(); @@ -59,8 +59,8 @@ class App { onReady() { const readyFunction = () => { this.createWindow(); - API(this.windowCreator.getWindow()); - // this.init() + const mainWindow = this.windowCreator.getWindow(); + API.init(mainWindow); createTray(this.windowCreator.getWindow()); registerHotKey(this.windowCreator.getWindow()); this.systemPlugins.triggerReadyHooks( @@ -108,7 +108,7 @@ class App { if (commonConst.dev()) { if (process.platform === "win32") { - process.on("message", (data) => { + process.on("message", data => { if (data === "graceful-exit") { app.quit(); } diff --git a/src/renderer/App.vue b/src/renderer/App.vue index c2d4414..6df43cb 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -20,6 +20,7 @@ :clipboardFile="clipboardFile || []" @choosePlugin="choosePlugin" @focus="searchFocus" + @clear-search-value="clearSearchValue" @clearClipbord="clearClipboardFile" @readClipboardContent="readClipboardContent" /> @@ -56,8 +57,9 @@ const { pluginLoading, searchFocus, clipboardFile, + setSearchValue, clearClipboardFile, - readClipboardContent, + readClipboardContent } = createPluginManager(); initPlugins(); @@ -68,8 +70,8 @@ const menuPluginInfo = ref({}); getPluginInfo({ pluginName: "feature", // eslint-disable-next-line no-undef - pluginPath: `${__static}/feature/package.json`, -}).then((res) => { + pluginPath: `${__static}/feature/package.json` +}).then(res => { menuPluginInfo.value = res; remote.getGlobal("LOCAL_PLUGINS").addPlugin(res); }); @@ -80,12 +82,12 @@ watch([options], () => { nextTick(() => { ipcRenderer.sendSync("msg-trigger", { type: "setExpendHeight", - data: getWindowHeight(options.value), + data: getWindowHeight(options.value) }); }); }); -const changeIndex = (index) => { +const changeIndex = index => { if (!options.value.length) return; if ( currentSelect.value + index > options.value.length - 1 || @@ -99,7 +101,7 @@ const openMenu = () => { openPlugin({ ...toRaw(menuPluginInfo.value), feature: menuPluginInfo.value.features[0], - cmd: "插件市场", + cmd: "插件市场" }); }; @@ -107,6 +109,10 @@ const choosePlugin = () => { const currentChoose = options.value[currentSelect.value]; currentChoose.click(); }; + +const clearSearchValue = () => { + setSearchValue(""); +};