mirror of
https://github.com/rubickCenter/rubick
synced 2025-06-16 00:16:58 +08:00
303 lines
6.9 KiB
JavaScript
303 lines
6.9 KiB
JavaScript
const { getData, getLocalDataFile, saveData } = require("./utils");
|
|
const axios = require("axios");
|
|
const marked = require("marked");
|
|
const rendererMD = new marked.Renderer();
|
|
const path = require("path");
|
|
const os = require("os");
|
|
|
|
const appPath = path.join(getLocalDataFile());
|
|
const dbPath = path.join(appPath, "./db.json");
|
|
|
|
let filePath = "";
|
|
function getQueryVariable(variable) {
|
|
var query = window.location.search.substring(1);
|
|
var vars = query.split("&");
|
|
for (var i = 0; i < vars.length; i++) {
|
|
var pair = vars[i].split("=");
|
|
if (pair[0] == variable) {
|
|
return pair[1];
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
if (location.href.indexOf("targetFile") > -1) {
|
|
filePath = decodeURIComponent(getQueryVariable("targetFile"));
|
|
} else {
|
|
filePath =
|
|
process.platform === "win32"
|
|
? location.pathname.replace("/", "")
|
|
: location.pathname.replace("file://", "");
|
|
}
|
|
const {
|
|
ipcRenderer,
|
|
nativeImage,
|
|
clipboard,
|
|
remote,
|
|
shell,
|
|
} = require("electron");
|
|
|
|
const currentWindow = remote.getCurrentWindow();
|
|
const winId = currentWindow.id;
|
|
const BrowserWindow = remote.BrowserWindow;
|
|
|
|
function convertImgToBase64(url, callback, outputFormat) {
|
|
var canvas = document.createElement("CANVAS"),
|
|
ctx = canvas.getContext("2d"),
|
|
img = new Image();
|
|
img.crossOrigin = "Anonymous";
|
|
img.onload = function() {
|
|
canvas.height = img.height;
|
|
canvas.width = img.width;
|
|
ctx.drawImage(img, 0, 0);
|
|
var dataURL = canvas.toDataURL(outputFormat || "image/png");
|
|
callback.call(this, dataURL);
|
|
canvas = null;
|
|
};
|
|
img.src = url;
|
|
}
|
|
|
|
window.rubick = {
|
|
// 事件
|
|
onPluginEnter(cb) {
|
|
ipcRenderer.on("onPluginEnter", (e, message) => {
|
|
const feature = message.detail;
|
|
cb({
|
|
...feature,
|
|
type: message.cmd.type ? message.cmd.type : "text",
|
|
payload: message.payload,
|
|
});
|
|
});
|
|
},
|
|
onPluginReady(cb) {
|
|
ipcRenderer.once("onPluginReady", (e, message) => {
|
|
const feature = message.detail;
|
|
cb({
|
|
...feature,
|
|
type: message.cmd.type ? message.cmd.type : "text",
|
|
payload: message.payload,
|
|
});
|
|
});
|
|
},
|
|
onPluginOut(cb) {
|
|
ipcRenderer.once("onPluginOut", (e, message) => {
|
|
const feature = JSON.parse(message.detail);
|
|
cb({ ...feature, type: "text" });
|
|
});
|
|
},
|
|
|
|
// 窗口交互
|
|
hideMainWindow() {
|
|
ipcRenderer.send("msg-trigger", {
|
|
type: "hideMainWindow",
|
|
});
|
|
},
|
|
showMainWindow() {
|
|
ipcRenderer.send("msg-trigger", {
|
|
type: "showMainWindow",
|
|
});
|
|
},
|
|
setExpendHeight(height) {
|
|
ipcRenderer.send("msg-trigger", {
|
|
type: "setExpendHeight",
|
|
height,
|
|
winId,
|
|
});
|
|
},
|
|
setSubInput(onChange, placeHolder, isFocus) {
|
|
ipcRenderer.sendToHost("setSubInput", {
|
|
placeHolder,
|
|
isFocus,
|
|
});
|
|
ipcRenderer.on(`msg-back-setSubInput`, (e, result) => {
|
|
onChange({ text: result });
|
|
});
|
|
},
|
|
|
|
removeSubInput() {
|
|
ipcRenderer.sendToHost("removeSubInput");
|
|
},
|
|
|
|
setSubInputValue(text) {
|
|
ipcRenderer.sendToHost("setSubInputValue", {
|
|
text,
|
|
});
|
|
},
|
|
|
|
getPath(name) {
|
|
return remote.app.getPath(name);
|
|
},
|
|
|
|
showNotification(body, clickFeatureCode) {
|
|
const myNotification = new Notification("Rubick 通知", {
|
|
body,
|
|
});
|
|
return myNotification;
|
|
// todo 实现 clickFeatureCode
|
|
},
|
|
showOpenDialog(options) {
|
|
ipcRenderer.send("msg-trigger", {
|
|
type: "showOpenDialog",
|
|
options: { ...options },
|
|
});
|
|
return new Promise((resolve, reject) => {
|
|
ipcRenderer.once(`msg-back-showOpenDialog`, (e, result) => {
|
|
result ? resolve(result) : reject();
|
|
});
|
|
});
|
|
},
|
|
|
|
copyImage(img) {
|
|
convertImgToBase64(img, function(base64Image) {
|
|
const image = nativeImage.createFromDataURL(base64Image);
|
|
clipboard.writeImage(image);
|
|
});
|
|
},
|
|
copyText(text) {
|
|
clipboard.writeText(text);
|
|
},
|
|
db: {
|
|
put(data) {
|
|
data._rev = "";
|
|
let dbData = getData(dbPath) || [];
|
|
let target = [];
|
|
dbData.some((d, i) => {
|
|
if (d._id === data._id) {
|
|
target = [d, i];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
// 更新
|
|
if (target[0]) {
|
|
dbData[target[1]] = data;
|
|
} else {
|
|
dbData.push(data);
|
|
}
|
|
saveData(dbPath, dbData);
|
|
return {
|
|
id: data._id,
|
|
ok: true,
|
|
rev: "",
|
|
};
|
|
},
|
|
get(key) {
|
|
const dbData = getData(dbPath) || [];
|
|
return dbData.find((d) => d._id === key) || "";
|
|
},
|
|
remove(key) {
|
|
key = typeof key === "object" ? key._id : key;
|
|
let dbData = getData(dbPath);
|
|
let find = false;
|
|
dbData.some((d, i) => {
|
|
if (d._id === key) {
|
|
dbData.splice(i, 1);
|
|
find = true;
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
if (find) {
|
|
saveData(dbPath, dbData);
|
|
return {
|
|
id: key,
|
|
ok: true,
|
|
rev: "",
|
|
};
|
|
} else {
|
|
return {
|
|
id: key,
|
|
ok: false,
|
|
rev: "",
|
|
};
|
|
}
|
|
},
|
|
bulkDocs(docs) {
|
|
const dbData = getData(dbPath);
|
|
dbData.forEach((d, i) => {
|
|
const result = docs.find((data) => data._id === d._id);
|
|
if (result) {
|
|
dbData[i] = result;
|
|
}
|
|
});
|
|
saveData(dbPath, dbData);
|
|
return docs.map((d) => ({
|
|
id: d._id,
|
|
success: true,
|
|
rev: "",
|
|
}));
|
|
},
|
|
allDocs(key) {
|
|
const dbData = getData(dbPath);
|
|
if (!key) {
|
|
return dbData;
|
|
}
|
|
if (typeof key === "string") {
|
|
return dbData.filter((d) => d._id.indexOf(key) >= 0);
|
|
}
|
|
if (Array.isArray(key)) {
|
|
return dbData.filter((d) => key.indexOf(d._id) >= 0);
|
|
}
|
|
return [];
|
|
},
|
|
},
|
|
isDarkColors() {
|
|
return false;
|
|
},
|
|
features: [],
|
|
getFeatures() {
|
|
ipcRenderer.sendToHost("getFeatures");
|
|
return new Promise((resolve) => {
|
|
ipcRenderer.on(`msg-back-getFeatures`, (e, result) => {
|
|
rubick.features = result;
|
|
resolve(result);
|
|
});
|
|
});
|
|
},
|
|
setFeature(feature) {
|
|
ipcRenderer.sendToHost("setFeature", { feature });
|
|
},
|
|
|
|
removeFeature(code) {
|
|
ipcRenderer.sendToHost("removeFeature", { code });
|
|
return !!rubick.features.filter((fe) => fe.code === code).length;
|
|
},
|
|
// 系统
|
|
shellOpenExternal(url) {
|
|
shell.openExternal(url);
|
|
},
|
|
|
|
isMacOs() {
|
|
return os.type() === "Darwin";
|
|
},
|
|
|
|
isWindows() {
|
|
return os.type() === "Windows_NT";
|
|
},
|
|
|
|
isLinux() {
|
|
return os.type() === "Linux";
|
|
},
|
|
|
|
shellOpenPath(path) {
|
|
shell.openPath(path);
|
|
},
|
|
|
|
request(config = {}) {
|
|
return axios.create({
|
|
timeout: 10000,
|
|
withCredentials: true,
|
|
...config,
|
|
});
|
|
},
|
|
};
|
|
const preloadPath = getQueryVariable("preloadPath") || "./preload.js";
|
|
|
|
require(path.join(filePath, "../", preloadPath));
|
|
window.exports &&
|
|
ipcRenderer.sendToHost("templateConfig", {
|
|
config: JSON.parse(JSON.stringify(window.exports)),
|
|
});
|
|
window.ipcRenderer = ipcRenderer;
|