rubick/src/renderer/plugins-manager/clipboardWatch.ts
2023-03-16 14:45:53 +08:00

192 lines
5.7 KiB
TypeScript

import getCopyFiles from '@/common/utils/getCopyFiles';
import { clipboard, nativeImage, remote, ipcRenderer } from 'electron';
import path from 'path';
import pluginClickEvent from './pluginClickEvent';
import { ref } from 'vue';
export default ({ currentPlugin, optionsRef, openPlugin, setOptionsRef }) => {
const clipboardFile: any = ref([]);
const searchFocus = () => {
const config = remote.getGlobal('OP_CONFIG').get();
// 未开启自动粘贴
if (!config.perf.common.autoPast) return;
if (currentPlugin.value.name) return;
const fileList = getCopyFiles();
// 拷贝的是文件
if (fileList) {
window.setSubInputValue({ value: '' });
clipboardFile.value = fileList;
const localPlugins = remote.getGlobal('LOCAL_PLUGINS').getLocalPlugins();
const options: any = [
{
name: '复制路径',
value: 'plugin',
icon: require('../assets/link.png'),
desc: '复制路径到剪切板',
click: () => {
clipboard.writeText(fileList.map((file) => file.path).join(','));
ipcRenderer.send('msg-trigger', { type: 'hideMainWindow' });
},
},
];
// 判断复制的文件类型是否一直
const commonLen = fileList.filter(
(file) => path.extname(fileList[0].path) === path.extname(file.path)
).length;
// 复制路径
if (commonLen !== fileList.length) {
setOptionsRef(options);
return;
}
// 再正则插件
localPlugins.forEach((plugin) => {
const feature = plugin.features;
// 系统插件无 features 的情况,不需要再搜索
if (!feature) return;
feature.forEach((fe) => {
const ext = path.extname(fileList[0].path);
fe.cmds.forEach((cmd) => {
const regImg = /\.(png|jpg|gif|jpeg|webp)$/;
if (
cmd.type === 'img' &&
regImg.test(ext) &&
fileList.length === 1
) {
options.push({
name: cmd.label,
value: 'plugin',
icon: plugin.logo,
desc: fe.explain,
type: plugin.pluginType,
click: () => {
pluginClickEvent({
plugin,
fe,
cmd,
ext: {
code: fe.code,
type: cmd.type || 'text',
payload: nativeImage
.createFromPath(fileList[0].path)
.toDataURL(),
},
openPlugin,
});
clearClipboardFile();
},
});
}
// 如果是文件,且符合文件正则类型
if (
fileList.length > 1 ||
(cmd.type === 'file' && new RegExp(cmd.match).test(ext))
) {
options.push({
name: cmd,
value: 'plugin',
icon: plugin.logo,
desc: fe.explain,
type: plugin.pluginType,
click: () => {
pluginClickEvent({
plugin,
fe,
cmd,
ext: {
code: fe.code,
type: cmd.type || 'text',
payload: fileList,
},
openPlugin,
});
clearClipboardFile();
},
});
}
});
});
});
setOptionsRef(options);
clipboard.clear();
return;
}
const clipboardType = clipboard.availableFormats();
if (!clipboardType.length) return;
if ('text/plain' === clipboardType[0]) {
const contentText = clipboard.readText();
if (contentText.trim()) {
clearClipboardFile();
window.setSubInputValue({ value: contentText });
}
clipboard.clear();
}
};
const clearClipboardFile = () => {
clipboardFile.value = [];
optionsRef.value = [];
};
// 触发 ctrl + v 主动粘贴时
const readClipboardContent = () => {
// read image
const img = clipboard.readImage();
const dataUrl = img.toDataURL();
if (!dataUrl.replace('data:image/png;base64,', '')) return;
clipboardFile.value = [
{
isFile: true,
isDirectory: false,
path: null,
dataUrl,
},
];
const localPlugins = remote.getGlobal('LOCAL_PLUGINS').getLocalPlugins();
const options: any = [];
// 再正则插件
localPlugins.forEach((plugin) => {
const feature = plugin.features;
// 系统插件无 features 的情况,不需要再搜索
if (!feature) return;
feature.forEach((fe) => {
fe.cmds.forEach((cmd) => {
if (cmd.type === 'img') {
options.push({
name: cmd.label,
value: 'plugin',
icon: plugin.logo,
desc: fe.explain,
type: plugin.pluginType,
click: () => {
pluginClickEvent({
plugin,
fe,
cmd,
ext: {
code: fe.code,
type: cmd.type || 'text',
payload: dataUrl,
},
openPlugin,
});
clearClipboardFile();
},
});
}
});
});
setOptionsRef(options);
});
};
return {
searchFocus,
clipboardFile,
clearClipboardFile,
readClipboardContent,
};
};