mirror of
https://github.com/rubickCenter/rubick
synced 2025-06-07 19:14:11 +08:00
164 lines
4.2 KiB
TypeScript
164 lines
4.2 KiB
TypeScript
import {
|
|
BrowserWindow,
|
|
ipcMain,
|
|
dialog,
|
|
app,
|
|
Notification,
|
|
nativeImage,
|
|
clipboard,
|
|
} from "electron";
|
|
import { runner } from "../browsers";
|
|
import path from "path";
|
|
import fs from "fs";
|
|
import { LocalDb } from "@/core";
|
|
import plist from "plist";
|
|
|
|
const runnerInstance = runner();
|
|
const dbInstance = new LocalDb(app.getPath("userData"));
|
|
|
|
dbInstance.init();
|
|
|
|
const API: any = {
|
|
currentPlugin: null,
|
|
DBKEY: "RUBICK_DB_DEFAULT",
|
|
openPlugin({ plugin }, window) {
|
|
runnerInstance.removeView(window);
|
|
runnerInstance.init(plugin, window);
|
|
API.currentPlugin = plugin;
|
|
},
|
|
removePlugin(e, window) {
|
|
runnerInstance.removeView(window);
|
|
},
|
|
hideMainWindow(arg, window) {
|
|
window.hide();
|
|
},
|
|
showMainWindow(arg, window) {
|
|
window.show();
|
|
},
|
|
showOpenDialog({ data }, window) {
|
|
dialog.showOpenDialogSync(window, data);
|
|
},
|
|
setExpendHeight({ data: height }, window: BrowserWindow) {
|
|
const targetHeight = height;
|
|
window.setSize(window.getSize()[0], targetHeight);
|
|
},
|
|
setSubInput({ data }, window) {
|
|
window.webContents.executeJavaScript(
|
|
`window.setSubInput(${JSON.stringify({
|
|
placeholder: data.placeholder,
|
|
})})`
|
|
);
|
|
},
|
|
sendSubInputChangeEvent({ data }) {
|
|
runnerInstance.executeHooks("SubInputChange", data);
|
|
},
|
|
removeSubInput(e, window) {
|
|
window.webContents.executeJavaScript(`window.removeSubInput()`);
|
|
},
|
|
setSubInputValue({ data }, window) {
|
|
window.webContents.executeJavaScript(
|
|
`window.setSubInputValue(${JSON.stringify({
|
|
value: data.text,
|
|
})})`
|
|
);
|
|
},
|
|
getPath({ data }) {
|
|
return app.getPath(data.name);
|
|
},
|
|
showNotification({ data: { body } }) {
|
|
if (!Notification.isSupported()) return;
|
|
"string" != typeof body && (body = String(body));
|
|
const plugin = API.currentPlugin;
|
|
if (!plugin) return;
|
|
const notify = new Notification({
|
|
title: plugin.pluginName,
|
|
body,
|
|
icon: plugin.logo,
|
|
});
|
|
notify.show();
|
|
},
|
|
copyImage: ({ data }) => {
|
|
const image = nativeImage.createFromDataURL(data.img);
|
|
clipboard.writeImage(image);
|
|
},
|
|
copyText({ data }) {
|
|
clipboard.writeText(String(data.text));
|
|
return true;
|
|
},
|
|
copyFile: ({ data }) => {
|
|
if (data.file && fs.existsSync(data.file)) {
|
|
clipboard.writeBuffer(
|
|
"NSFilenamesPboardType",
|
|
Buffer.from(plist.build([data.file]))
|
|
);
|
|
return true;
|
|
}
|
|
return false;
|
|
},
|
|
dbPut({ data }) {
|
|
return dbInstance.put(API.DBKEY, data.data);
|
|
},
|
|
dbGet({ data }) {
|
|
return dbInstance.get(API.DBKEY, data.id);
|
|
},
|
|
dbRemove({ data }) {
|
|
return dbInstance.remove(API.DBKEY, data.doc);
|
|
},
|
|
dbBulkDocs({ data }) {
|
|
return dbInstance.bulkDocs(API.DBKEY, data.docs);
|
|
},
|
|
dbAllDocs({ data }) {
|
|
return dbInstance.bulkDocs(API.DBKEY, data.key);
|
|
},
|
|
getFeatures() {
|
|
return API.currentPlugin.features;
|
|
},
|
|
setFeature({ data }, window) {
|
|
API.currentPlugin = {
|
|
...API.currentPlugin,
|
|
features: (() => {
|
|
let has = false;
|
|
API.currentPlugin.features.some((feature) => {
|
|
has = feature.code === data.feature.code;
|
|
return has;
|
|
});
|
|
if (!has) {
|
|
return [...API.currentPlugin.features, data.feature];
|
|
}
|
|
return API.currentPlugin.features;
|
|
})(),
|
|
};
|
|
window.webContents.executeJavaScript(
|
|
`window.updatePlugin(${JSON.stringify({
|
|
currentPlugin: API.currentPlugin,
|
|
})})`
|
|
);
|
|
return true;
|
|
},
|
|
removeFeature({ data }, window) {
|
|
API.currentPlugin = {
|
|
...API.currentPlugin,
|
|
features: API.currentPlugin.features.filter(
|
|
(feature) => feature.code !== data.code
|
|
),
|
|
};
|
|
window.webContents.executeJavaScript(
|
|
`window.updatePlugin(${JSON.stringify({
|
|
currentPlugin: API.currentPlugin,
|
|
})})`
|
|
);
|
|
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);
|
|
});
|
|
};
|