rubick/static/preload.js

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;