feat: 新增electron打包
2
.gitignore
vendored
@ -35,6 +35,6 @@ lib/
|
||||
out/
|
||||
build
|
||||
out-election/
|
||||
output/
|
||||
dist-ele/
|
||||
icon.icns
|
||||
icons.iconset
|
@ -1,9 +1,9 @@
|
||||
module.exports = {
|
||||
productName: "唐僧叨叨", //项目名
|
||||
productName: "tangsengdaodao", //项目名
|
||||
appId: "com.tsdaodao.im",
|
||||
copyright: "Copyright © tsdaodao", //版权
|
||||
directories: {
|
||||
output: "output/app", // 输出文件夹
|
||||
output: "dist-ele", // 输出文件夹
|
||||
},
|
||||
npmRebuild: false,
|
||||
asar: false,
|
||||
@ -11,17 +11,19 @@ module.exports = {
|
||||
electronDownload: {
|
||||
mirror: "https://registry.npmmirror.com/-/binary/electron/",
|
||||
},
|
||||
files: ["out-election/**/*", "build/**/*"], // 需要打包的文件
|
||||
files: ["resources/**/*","out-election/**/*", "build/**/*"], // 需要打包的文件
|
||||
extraMetadata: {
|
||||
main: "out-election/main/index.js",
|
||||
},
|
||||
mac: {
|
||||
category: "public.app-category.utilities",
|
||||
icon: "public/icon.icns",
|
||||
category: "public.app-category.instant-messaging",
|
||||
artifactName: "${productName}-${version}-${arch}.${ext}",
|
||||
icon: "resources/icons/icon.icns",
|
||||
target: ["dmg", "zip"]
|
||||
},
|
||||
dmg: {
|
||||
// background: 'build/appdmg.png', // dmg安装窗口背景图
|
||||
icon: "public/icon.icns", // 客户端图标
|
||||
icon: "resources/icons/icon.icns", // 客户端图标
|
||||
iconSize: 100, // 安装图标大小
|
||||
// 安装窗口中包含的项目和配置
|
||||
contents: [
|
||||
@ -31,8 +33,10 @@ module.exports = {
|
||||
window: { width: 500, height: 500 }, // 安装窗口大小
|
||||
},
|
||||
win: {
|
||||
icon: "public/icon.icns",
|
||||
icon: "resources/icons/icon.ico",
|
||||
verifyUpdateCodeSignature: false,
|
||||
target: ["nsis", "zip"],
|
||||
artifactName: "${productName}-Setup-${version}.${ext}"
|
||||
},
|
||||
nsis: {
|
||||
oneClick: false, // 是否一键安装
|
||||
@ -43,10 +47,9 @@ module.exports = {
|
||||
// installerHeaderIcon: "./build/icon.ico", // 安装时头部图标
|
||||
createDesktopShortcut: true, // 创建桌面图标
|
||||
createStartMenuShortcut: true, // 创建开始菜单图标
|
||||
shortcutName: "唐僧叨叨", // 图标名称
|
||||
},
|
||||
linux: {
|
||||
target: ["AppImage", "deb"],
|
||||
icon: "public/icon.icns",
|
||||
icon: "resources/icons/icon.icns",
|
||||
},
|
||||
};
|
||||
};
|
@ -3,6 +3,22 @@
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"main": "out-election/main/index.js",
|
||||
"scripts": {
|
||||
"start": "cross-env BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start",
|
||||
"dev": "cross-env MODE=dev BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start",
|
||||
"dev-ele": "kill-port 3000 && concurrently -k -n=web,ele -c=green,blue \"yarn dev\" \"wait-on tcp:3000 && npm-run-all watch\"",
|
||||
"watch": "tsc-watch -p tsconfig.e.json --onSuccess \"npm-run-all start:electron\"",
|
||||
"start:electron": "cross-env NODE_ENV=development electron .",
|
||||
"build": "cross-env REACT_APP_VERSION=$npm_package_version react-app-rewired build",
|
||||
"build:analyzer": "cross-env ANALYZER=true REACT_APP_VERSION=$npm_package_version react-app-rewired build",
|
||||
"build-ele:mac": "tsc -p tsconfig.e.json && electron-builder --mac -c",
|
||||
"build-ele:win": "tsc -p tsconfig.e.json && electron-builder --win -c",
|
||||
"build-ele": "tsc -p tsconfig.e.json && electron-builder -mw -c",
|
||||
"test": "react-app-rewired test",
|
||||
"eject": "react-app-rewired eject",
|
||||
"clean": "rimraf node_modules out-election build dist-ele .turbo",
|
||||
"tauri": "tauri"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^1.1.0",
|
||||
"@tsdaodao/base": "*",
|
||||
@ -13,6 +29,8 @@
|
||||
"@types/react-mentions": "^4.1.5",
|
||||
"@types/react-virtualized": "^9.21.22",
|
||||
"classnames": "^2.3.1",
|
||||
"electron-log": "^5.1.1",
|
||||
"electron-screenshots": "^0.5.26",
|
||||
"howler": "^2.2.4",
|
||||
"react": "^17.0.2",
|
||||
"react-app-rewired": "^2.1.8",
|
||||
@ -49,21 +67,6 @@
|
||||
"wait-on": "^7.2.0",
|
||||
"webpack-bundle-analyzer": "^4.5.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "cross-env BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start",
|
||||
"dev": "cross-env MODE=dev BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start",
|
||||
"dev-ele": "kill-port 3000 && concurrently -k -n=web,ele -c=green,blue \"yarn dev\" \"wait-on tcp:3000 && npm-run-all watch\"",
|
||||
"watch": "tsc-watch -p tsconfig.e.json --onSuccess \"npm-run-all start:electron\"",
|
||||
"start:electron": "cross-env NODE_ENV=development electron .",
|
||||
"build": "cross-env REACT_APP_VERSION=$npm_package_version react-app-rewired build",
|
||||
"build:analyzer": "cross-env ANALYZER=true REACT_APP_VERSION=$npm_package_version react-app-rewired build",
|
||||
"build-ele:mac": "tsc -p tsconfig.e.json && electron-builder --mac -c",
|
||||
"build-ele:win": "tsc -p tsconfig.e.json && electron-builder --win -c",
|
||||
"build-ele": "tsc -p tsconfig.e.json && electron-builder -mw -c",
|
||||
"test": "react-app-rewired test",
|
||||
"eject": "react-app-rewired eject",
|
||||
"tauri": "tauri"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": "react-app"
|
||||
},
|
||||
|
BIN
apps/web/resources/icons/128x128.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
apps/web/resources/icons/128x128@2x.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
apps/web/resources/icons/32x32.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
apps/web/resources/icons/icon.ico
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
apps/web/resources/logo.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
apps/web/resources/tray/128x128.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
apps/web/resources/tray/30x30.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
apps/web/resources/tray/32x32.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
1
apps/web/src-election/electron-env.d.ts
vendored
@ -0,0 +1 @@
|
||||
declare module 'tmp';
|
6
apps/web/src-election/main/confing.ts
Normal file
@ -0,0 +1,6 @@
|
||||
const TSDD_FONFIG = {
|
||||
appId: "com.tsdaodao.im",
|
||||
name: "唐僧叨叨",
|
||||
};
|
||||
|
||||
export default TSDD_FONFIG;
|
@ -1,19 +1,441 @@
|
||||
import { app, BrowserWindow, Menu } from "electron";
|
||||
import {
|
||||
app,
|
||||
BrowserWindow,
|
||||
screen,
|
||||
globalShortcut,
|
||||
ipcMain,
|
||||
nativeImage as NativeImage,
|
||||
Menu,
|
||||
Tray,
|
||||
} from "electron";
|
||||
import fs from "fs";
|
||||
import tmp from 'tmp';
|
||||
import Screenshots from "electron-screenshots";
|
||||
import { join } from "path";
|
||||
|
||||
import { createWindow } from "./utils/createWindow";
|
||||
import logo, { getNoMessageTrayIcon } from "./logo";
|
||||
import TSDD_FONFIG from "./confing";
|
||||
|
||||
let forceQuit = false;
|
||||
let mainWindow: any;
|
||||
let isMainWindowFocusedWhenStartScreenshot = false;
|
||||
let screenshots: any;
|
||||
let tray: any;
|
||||
let trayIcon: any;
|
||||
let settings: any = {};
|
||||
let screenShotWindowId = 0;
|
||||
let isFullScreen = false;
|
||||
|
||||
let isOsx = process.platform === "darwin";
|
||||
let isWin = !isOsx;
|
||||
|
||||
const isDevelopment = process.env.NODE_ENV === "development";
|
||||
|
||||
let mainMenu: (Electron.MenuItemConstructorOptions | Electron.MenuItem)[] = [
|
||||
{
|
||||
label: "唐僧叨叨",
|
||||
submenu: [
|
||||
{
|
||||
label: `关于唐僧叨叨`,
|
||||
},
|
||||
{ label: "服务", role: "services" },
|
||||
{ type: "separator" },
|
||||
{
|
||||
label: "退出",
|
||||
accelerator: "Command+Q",
|
||||
click() {
|
||||
forceQuit = true;
|
||||
mainWindow = null;
|
||||
setTimeout(() => {
|
||||
app.exit(0);
|
||||
}, 1000);
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: "编辑",
|
||||
submenu: [
|
||||
{
|
||||
role: "undo",
|
||||
label: "撤销",
|
||||
},
|
||||
{
|
||||
role: "redo",
|
||||
label: "重做",
|
||||
},
|
||||
{
|
||||
type: "separator",
|
||||
},
|
||||
{
|
||||
role: "cut",
|
||||
label: "剪切",
|
||||
},
|
||||
{
|
||||
role: "copy",
|
||||
label: "复制",
|
||||
},
|
||||
{
|
||||
role: "paste",
|
||||
label: "粘贴",
|
||||
},
|
||||
{
|
||||
role: "pasteAndMatchStyle",
|
||||
label: "粘贴并匹配样式",
|
||||
},
|
||||
{
|
||||
role: "delete",
|
||||
label: "删除",
|
||||
},
|
||||
{
|
||||
role: "selectAll",
|
||||
label: "全选",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: "显示",
|
||||
submenu: [
|
||||
{
|
||||
label: isFullScreen ? "全屏" : "退出全屏",
|
||||
accelerator: "Shift+Cmd+F",
|
||||
click() {
|
||||
isFullScreen = !isFullScreen;
|
||||
|
||||
mainWindow.show();
|
||||
mainWindow.setFullScreen(isFullScreen);
|
||||
},
|
||||
},
|
||||
{
|
||||
label: "切换会话",
|
||||
accelerator: "Shift+Cmd+M",
|
||||
click() {
|
||||
mainWindow.show();
|
||||
mainWindow.webContents.send("show-conversations");
|
||||
},
|
||||
},
|
||||
{
|
||||
type: "separator",
|
||||
},
|
||||
{
|
||||
type: "separator",
|
||||
},
|
||||
{
|
||||
role: "toggleDevTools",
|
||||
label: "切换开发者工具",
|
||||
},
|
||||
{
|
||||
role: "togglefullscreen",
|
||||
label: "切换全屏",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: "窗口",
|
||||
role: "window",
|
||||
submenu: [
|
||||
{
|
||||
label: "最小化",
|
||||
role: "minimize",
|
||||
},
|
||||
{
|
||||
label: "关闭窗口",
|
||||
role: "close",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: "帮助",
|
||||
role: "help",
|
||||
submenu: [
|
||||
{
|
||||
type: "separator",
|
||||
},
|
||||
{
|
||||
role: "reload",
|
||||
label: "刷新",
|
||||
},
|
||||
{
|
||||
role: "forceReload",
|
||||
label: "强制刷新",
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
let trayMenu: Electron.MenuItemConstructorOptions[] = [
|
||||
{
|
||||
label: "显示窗口",
|
||||
click() {
|
||||
let isVisible = mainWindow.isVisible();
|
||||
isVisible ? mainWindow.hide() : mainWindow.show();
|
||||
},
|
||||
},
|
||||
{
|
||||
type: "separator",
|
||||
},
|
||||
{
|
||||
label: "退出",
|
||||
accelerator: "Command+Q",
|
||||
click() {
|
||||
forceQuit = true;
|
||||
mainWindow = null;
|
||||
setTimeout(() => {
|
||||
app.exit(0);
|
||||
}, 1000);
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
function updateTray(unread = 0): any {
|
||||
settings.showOnTray = true;
|
||||
|
||||
// linux 系统不支持 tray
|
||||
if (process.platform === "linux") {
|
||||
return;
|
||||
}
|
||||
|
||||
if (settings.showOnTray) {
|
||||
let contextmenu = Menu.buildFromTemplate(trayMenu);
|
||||
|
||||
if (!trayIcon) {
|
||||
trayIcon = getNoMessageTrayIcon();
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
if (!tray) {
|
||||
// Init tray icon
|
||||
tray = new Tray(trayIcon);
|
||||
if (process.platform === "linux") {
|
||||
tray.setContextMenu(contextmenu);
|
||||
}
|
||||
|
||||
tray.on("right-click", () => {
|
||||
tray.popUpContextMenu(contextmenu);
|
||||
});
|
||||
|
||||
tray.on("click", () => {
|
||||
mainWindow.show();
|
||||
});
|
||||
}
|
||||
|
||||
if (isOsx) {
|
||||
tray.setTitle(unread > 0 ? " " + unread : "");
|
||||
}
|
||||
|
||||
tray.setImage(trayIcon);
|
||||
});
|
||||
} else {
|
||||
if (!tray) return;
|
||||
tray.destroy();
|
||||
tray = null;
|
||||
}
|
||||
}
|
||||
|
||||
function createMenu() {
|
||||
var menu = Menu.buildFromTemplate(mainMenu);
|
||||
|
||||
if (isOsx) {
|
||||
Menu.setApplicationMenu(menu);
|
||||
} else {
|
||||
mainWindow.setMenu(null);
|
||||
}
|
||||
}
|
||||
|
||||
function regShortcut() {
|
||||
globalShortcut.register("CommandOrControl+shift+a", () => {
|
||||
isMainWindowFocusedWhenStartScreenshot = mainWindow.isFocused();
|
||||
console.log(
|
||||
"isMainWindowFocusedWhenStartScreenshot",
|
||||
mainWindow.isFocused()
|
||||
);
|
||||
screenshots.startCapture();
|
||||
});
|
||||
|
||||
globalShortcut.register("esc", () => {
|
||||
if (screenshots.$win?.isFocused()) {
|
||||
screenshots.endCapture();
|
||||
}
|
||||
});
|
||||
|
||||
// 打开所有窗口控制台
|
||||
globalShortcut.register("ctrl+shift+i", () => {
|
||||
let windows = BrowserWindow.getAllWindows();
|
||||
windows.forEach((win: any) => win.openDevTools());
|
||||
});
|
||||
}
|
||||
|
||||
const createMainWindow = async () => {
|
||||
const NODE_ENV = process.env.NODE_ENV;
|
||||
const { width, height } = screen.getPrimaryDisplay().workAreaSize;
|
||||
mainWindow = new BrowserWindow({
|
||||
width: 960,
|
||||
height: 600,
|
||||
minWidth: 960,
|
||||
minHeight: 600,
|
||||
// frame: true, // * app边框(包括关闭,全屏,最小化按钮的导航栏) @false: 隐藏
|
||||
// titleBarStyle: "hidden",
|
||||
// transparent: true, // * app 背景透明
|
||||
hasShadow: false, // * app 边框阴影
|
||||
show: false, // 启动窗口时隐藏,直到渲染进程加载完成「ready-to-show 监听事件」 再显示窗口,防止加载时闪烁
|
||||
resizable: true, // 禁止手动修改窗口尺寸
|
||||
webPreferences: {
|
||||
// 加载脚本
|
||||
preload: join(__dirname, "..", "preload/index"),
|
||||
nodeIntegration: true,
|
||||
},
|
||||
// frame: !isWin,
|
||||
});
|
||||
mainWindow.center();
|
||||
mainWindow.once("ready-to-show", () => {
|
||||
mainWindow.show(); // 显示窗口
|
||||
mainWindow.focus();
|
||||
});
|
||||
|
||||
mainWindow.on("close", (e: any) => {
|
||||
if (forceQuit || !tray) {
|
||||
mainWindow = null;
|
||||
} else {
|
||||
e.preventDefault();
|
||||
if (mainWindow.isFullScreen()) {
|
||||
mainWindow.setFullScreen(false);
|
||||
mainWindow.once("leave-full-screen", () => mainWindow.hide());
|
||||
} else {
|
||||
mainWindow.hide();
|
||||
}
|
||||
}
|
||||
});
|
||||
if (NODE_ENV === "development") mainWindow.loadURL("http://localhost:3000");
|
||||
if (NODE_ENV !== "development") {
|
||||
process.env.DIST_ELECTRON = join(__dirname, "../");
|
||||
const WEB_URL = join(process.env.DIST_ELECTRON, "../build/index.html");
|
||||
mainWindow.loadFile(WEB_URL);
|
||||
}
|
||||
|
||||
ipcMain.on("screenshots-start", (event, args) => {
|
||||
console.log("main voip-message event", args);
|
||||
screenShotWindowId = event.sender.id;
|
||||
screenshots.startCapture();
|
||||
});
|
||||
|
||||
createMenu();
|
||||
};
|
||||
|
||||
function onDeepLink(url: string) {
|
||||
console.log("onOpenDeepLink", url);
|
||||
mainWindow.webContents.send("deep-link", url);
|
||||
}
|
||||
|
||||
app.setName(TSDD_FONFIG.name);
|
||||
isDevelopment && app.dock && app.dock.setIcon(logo);
|
||||
app.on("open-url", (event, url) => {
|
||||
onDeepLink(url);
|
||||
});
|
||||
|
||||
// 单例模式启动
|
||||
const gotTheLock = app.requestSingleInstanceLock();
|
||||
if (!gotTheLock) {
|
||||
app.quit();
|
||||
} else {
|
||||
app.on("second-instance", (event, argv) => {
|
||||
if (mainWindow) {
|
||||
mainWindow.show();
|
||||
if (mainWindow.isMinimized()) {
|
||||
mainWindow.restore();
|
||||
}
|
||||
mainWindow.focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
app.on("ready", () => {
|
||||
// 设置app菜单
|
||||
// Menu.setApplicationMenu(createAppMenu());
|
||||
createWindow(); // 创建窗口
|
||||
// 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他打开的窗口,那么程序会重新创建一个窗口。
|
||||
app.on(
|
||||
"activate",
|
||||
() => BrowserWindow.getAllWindows().length === 0 && createWindow()
|
||||
);
|
||||
regShortcut();
|
||||
createMainWindow(); // 创建窗口
|
||||
|
||||
screenshots = new Screenshots({
|
||||
singleWindow: true,
|
||||
});
|
||||
|
||||
const onScreenShotEnd = (result?: any) => {
|
||||
console.log(
|
||||
"onScreenShotEnd",
|
||||
isMainWindowFocusedWhenStartScreenshot,
|
||||
screenShotWindowId
|
||||
);
|
||||
if (isMainWindowFocusedWhenStartScreenshot) {
|
||||
if (result) {
|
||||
mainWindow.webContents.send("screenshots-ok", result);
|
||||
}
|
||||
mainWindow.show();
|
||||
isMainWindowFocusedWhenStartScreenshot = false;
|
||||
} else if (screenShotWindowId) {
|
||||
let windows = BrowserWindow.getAllWindows();
|
||||
let tms = windows.filter(
|
||||
(win) => win.webContents.id === screenShotWindowId
|
||||
);
|
||||
if (tms.length > 0) {
|
||||
if (result) {
|
||||
tms[0].webContents.send("screenshots-ok", result);
|
||||
}
|
||||
tms[0].show();
|
||||
}
|
||||
screenShotWindowId = 0;
|
||||
}
|
||||
};
|
||||
|
||||
// 点击确定按钮回调事件
|
||||
screenshots.on("ok", (e, buffer, bounds) => {
|
||||
let filename = tmp.tmpNameSync() + '.png';
|
||||
let image = NativeImage.createFromBuffer(buffer);
|
||||
fs.writeFileSync(filename, image.toPNG());
|
||||
|
||||
console.log("screenshots ok", e);
|
||||
onScreenShotEnd({ filePath: filename });
|
||||
});
|
||||
|
||||
// 点击取消按钮回调事件
|
||||
screenshots.on("cancel", (e: any) => {
|
||||
// 执行了preventDefault
|
||||
// 点击取消不会关闭截图窗口
|
||||
// e.preventDefault()
|
||||
// console.log('capture', 'cancel2')
|
||||
console.log("screenshots cancel", e);
|
||||
onScreenShotEnd();
|
||||
});
|
||||
// 点击保存按钮回调事件
|
||||
screenshots.on("save", (e, { viewer }) => {
|
||||
console.log("screenshots save", e);
|
||||
onScreenShotEnd();
|
||||
});
|
||||
|
||||
try {
|
||||
updateTray();
|
||||
} catch (e) {
|
||||
// do nothing
|
||||
console.log("==updateTray==", e);
|
||||
}
|
||||
});
|
||||
|
||||
app.on("activate", () => {
|
||||
if (!mainWindow) {
|
||||
return createMainWindow();
|
||||
}
|
||||
|
||||
if (!mainWindow.isVisible()) {
|
||||
mainWindow.show();
|
||||
}
|
||||
});
|
||||
|
||||
app.on("before-quit", () => {
|
||||
forceQuit = true;
|
||||
|
||||
if (!tray) return;
|
||||
|
||||
tray.destroy();
|
||||
tray = null;
|
||||
});
|
||||
|
||||
// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 macOS窗口全部关闭时,dock中程序不会退出
|
||||
app.on("window-all-closed", () => {
|
||||
process.platform !== "darwin" && app.quit();
|
||||
});
|
||||
});
|
16
apps/web/src-election/main/logo.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import path from "path";
|
||||
import { app, screen } from "electron";
|
||||
|
||||
export default path.join(app.getAppPath(), "./resources/logo.png");
|
||||
|
||||
export function getNoMessageTrayIcon () {
|
||||
if (process.platform === 'darwin') {
|
||||
return path.join(app.getAppPath(), './resources/tray/30x30.png')
|
||||
} else if (process.platform === 'win32') {
|
||||
return path.join(app.getAppPath(), './resources/tray/128x128.png')
|
||||
} else if (screen.getPrimaryDisplay().scaleFactor > 1) {
|
||||
return path.join(app.getAppPath(), './resources/tray/128x128.png')
|
||||
} else {
|
||||
return path.join(app.getAppPath(), './resources/tray/128x128.png')
|
||||
}
|
||||
}
|
@ -1,3 +1,21 @@
|
||||
import { contextBridge, ipcRenderer } from "electron";
|
||||
|
||||
contextBridge.exposeInMainWorld("__POWERED_ELECTRON__", true);
|
||||
contextBridge.exposeInMainWorld("__POWERED_ELECTRON__", true);
|
||||
|
||||
contextBridge.exposeInMainWorld("ipc", {
|
||||
send: (channel: string, ...args: any[]) => ipcRenderer.send(channel, ...args),
|
||||
invoke: (channel: string, ...args: any[]): Promise<any> =>
|
||||
ipcRenderer.invoke(channel, ...args),
|
||||
on: (
|
||||
channel: string,
|
||||
listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void
|
||||
) => {
|
||||
ipcRenderer.on(channel, listener);
|
||||
},
|
||||
once: (
|
||||
channel: string,
|
||||
listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void
|
||||
) => {
|
||||
ipcRenderer.once(channel, listener);
|
||||
},
|
||||
});
|
@ -6,13 +6,15 @@
|
||||
],
|
||||
"resolutions": {
|
||||
"//": "See https://github.com/facebook/create-react-app/issues/11773",
|
||||
"react-error-overlay": "6.0.9"
|
||||
"react-error-overlay": "6.0.11"
|
||||
},
|
||||
"scripts": {
|
||||
"bootstrap": "yarn install",
|
||||
"dev": "turbo run dev --parallel",
|
||||
"dev-ele": "turbo run dev-ele --parallel",
|
||||
"build": "turbo run build",
|
||||
"build-ele": "turbo run build-ele",
|
||||
"clean": "turbo run clean && rimraf node_modules",
|
||||
"lint": "turbo run lint",
|
||||
"format": "prettier --write \"**/*.{ts,tsx,md}\""
|
||||
},
|
||||
@ -20,8 +22,8 @@
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-custom": "*",
|
||||
"prettier": "^2.5.1",
|
||||
"rimraf": "^5.0.5",
|
||||
"turbo": "latest"
|
||||
},
|
||||
"dependencies": {},
|
||||
"version": "0.0.0"
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ module.exports = {
|
||||
rules: {
|
||||
"@next/next/no-html-link-for-pages": "off",
|
||||
"react/jsx-key": "off",
|
||||
"@next/next/no-img-element": "off"
|
||||
"@next/next/no-img-element": "off",
|
||||
"no-template-curly-in-string": "off"
|
||||
},
|
||||
};
|
||||
|
@ -3,6 +3,9 @@
|
||||
"version": "0.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"clean": "rimraf node_modules out-election"
|
||||
},
|
||||
"dependencies": {
|
||||
"@typescript-eslint/parser": "^6.16.0",
|
||||
"eslint-config-next": "^12.0.8",
|
||||
|
@ -13,8 +13,9 @@
|
||||
"axios": "^0.25.0",
|
||||
"benz-amr-recorder": "^1.1.3",
|
||||
"classnames": "^2.3.1",
|
||||
"electron-log": "^5.1.1",
|
||||
"electron-screenshots": "^0.5.26",
|
||||
"hotkeys-js": "^3.8.7",
|
||||
"wukongimjssdk": "^1.1.2",
|
||||
"moment": "^2.29.3",
|
||||
"qrcode.react": "^1.0.1",
|
||||
"react": "^17.0.2",
|
||||
@ -22,7 +23,8 @@
|
||||
"react-mentions": "^4.3.1",
|
||||
"react-scroll": "^1.8.4",
|
||||
"react-spinners": "^0.11.0",
|
||||
"react-viewer": "^3.2.2"
|
||||
"react-viewer": "^3.2.2",
|
||||
"wukongimjssdk": "^1.2.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react-avatar-editor": "^13.0.0",
|
||||
|
@ -17,6 +17,9 @@
|
||||
},
|
||||
"lint": {
|
||||
"outputs": []
|
||||
},
|
||||
"clean": {
|
||||
"dependsOn": ["^clean"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
111
yarn.lock
@ -6104,10 +6104,10 @@ electron-builder@^24.9.1:
|
||||
simple-update-notifier "2.0.0"
|
||||
yargs "^17.6.2"
|
||||
|
||||
electron-log@^5.0.1:
|
||||
version "5.0.2"
|
||||
resolved "https://registry.npmmirror.com/electron-log/-/electron-log-5.0.2.tgz#6dae26cb7fce9feaa4605d575e02fee75da7b085"
|
||||
integrity sha512-uzUXpUGZ5lJeCEIn4Hrxt6zQWiURu+EbFyTul0Y81huc6UrvWXIOMx4WxNdaGJYWPk9YLWrz2dQf3894MoZKXw==
|
||||
electron-log@^5.1.1:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.npmmirror.com/electron-log/-/electron-log-5.1.1.tgz#3341c0265339c6c8285a91840cb7c872008103d6"
|
||||
integrity sha512-If7HU4Slbh2xfjOXOLxifkbgu6HmWDNJyXPLW+XNTOHMfFKisg0trA3d/7syyu25S+lHosfsd0VMfDSjGn1+Pw==
|
||||
|
||||
electron-publish@24.8.1:
|
||||
version "24.8.1"
|
||||
@ -6122,6 +6122,16 @@ electron-publish@24.8.1:
|
||||
lazy-val "^1.0.5"
|
||||
mime "^2.5.2"
|
||||
|
||||
electron-screenshots@^0.5.26:
|
||||
version "0.5.26"
|
||||
resolved "https://registry.npmmirror.com/electron-screenshots/-/electron-screenshots-0.5.26.tgz#d5e14cf11271adbd0e7f961cbe926c139d87a5d2"
|
||||
integrity sha512-btr1S8arUt+rqVjgiY4+hdi9DQJGCYHG9x0A3n3rrJvCaet7XnRRnEULXDLtY86CZHeg7JsQzeMdQ4Lj2Bu8lQ==
|
||||
dependencies:
|
||||
debug "^4.3.4"
|
||||
fs-extra "^11.1.1"
|
||||
node-screenshots "^0.1.9"
|
||||
react-screenshots "^0.5.22"
|
||||
|
||||
electron-to-chromium@^1.4.251:
|
||||
version "1.4.255"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.255.tgz#dc52d1095b876ed8acf25865db10265b02b1d6e1"
|
||||
@ -7208,6 +7218,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0:
|
||||
jsonfile "^6.0.1"
|
||||
universalify "^2.0.0"
|
||||
|
||||
fs-extra@^11.1.1:
|
||||
version "11.2.0"
|
||||
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
|
||||
integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^6.0.1"
|
||||
universalify "^2.0.0"
|
||||
|
||||
fs-extra@^8.1.0:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
|
||||
@ -7386,7 +7405,7 @@ glob@7.1.7:
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@^10.3.10:
|
||||
glob@^10.3.10, glob@^10.3.7:
|
||||
version "10.3.10"
|
||||
resolved "https://registry.npmmirror.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b"
|
||||
integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==
|
||||
@ -9561,6 +9580,60 @@ node-releases@^2.0.6:
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
|
||||
integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
|
||||
|
||||
node-screenshots-darwin-arm64@0.1.9:
|
||||
version "0.1.9"
|
||||
resolved "https://registry.npmmirror.com/node-screenshots-darwin-arm64/-/node-screenshots-darwin-arm64-0.1.9.tgz#4413a62570eb662cb259fffcca504ab3cef2a0e5"
|
||||
integrity sha512-zDhuui2hsgUA5FyL1wQQ9c2lPbvqmJzi45g7J+sxEmDDvRjmVv+92wTuiWuERiVAIkpjN2h+f2IR3HtOgHJHXw==
|
||||
|
||||
node-screenshots-darwin-universal@0.1.9:
|
||||
version "0.1.9"
|
||||
resolved "https://registry.npmmirror.com/node-screenshots-darwin-universal/-/node-screenshots-darwin-universal-0.1.9.tgz#2d0a5e9cf40dfca5ac9f734c816715db350e7ab5"
|
||||
integrity sha512-4SbvokC/GvOTzYDQzcFa39c02mxWzvhIRT72J9ys82HcKgmeWWbVih2atLUvFONQrSnMt+pxrCUBqFiJVawcyQ==
|
||||
|
||||
node-screenshots-darwin-x64@0.1.9:
|
||||
version "0.1.9"
|
||||
resolved "https://registry.npmmirror.com/node-screenshots-darwin-x64/-/node-screenshots-darwin-x64-0.1.9.tgz#9883cfd35f5753913f05183dd653708977964717"
|
||||
integrity sha512-/+VYlLVbsoYYmV/by+oPZY7aUfwF02dyl0rWUxM+xaGn80o55zht05B4UaIN8vcuBByunsGv2gybECT6Gk74PA==
|
||||
|
||||
node-screenshots-linux-x64-gnu@0.1.9:
|
||||
version "0.1.9"
|
||||
resolved "https://registry.npmmirror.com/node-screenshots-linux-x64-gnu/-/node-screenshots-linux-x64-gnu-0.1.9.tgz#21368912ce5234b428bcfb539f3140664130e0f1"
|
||||
integrity sha512-n7uTdNJCMqJ3tEMRq0wAOsq8qiK8cbOV+fqDgaQnlFLY+5PTxH67r09r41CJdWwX5sGeDsKHguosh7ZcGte+TA==
|
||||
|
||||
node-screenshots-linux-x64-musl@0.1.9:
|
||||
version "0.1.9"
|
||||
resolved "https://registry.npmmirror.com/node-screenshots-linux-x64-musl/-/node-screenshots-linux-x64-musl-0.1.9.tgz#9eddb506a82f62ccbdf450d1b5ece2d414c1c718"
|
||||
integrity sha512-zOIv5rIpL+ndWH0XWLrJOIELxh4P96WcE1omaql2oeWleS4EGwb0VqVJLhjadiMm1YROq8nvp8Vxz850nw5XPQ==
|
||||
|
||||
node-screenshots-win32-arm64-msvc@0.1.9:
|
||||
version "0.1.9"
|
||||
resolved "https://registry.npmmirror.com/node-screenshots-win32-arm64-msvc/-/node-screenshots-win32-arm64-msvc-0.1.9.tgz#c165c10230362cb5cdf3a106bc730965ef1b0382"
|
||||
integrity sha512-wBw6SsRSKcLMyM3zTx38rzPJ1l5MjDvveWbacpkSkOXmlMMknhDr7wOsDM/VvbBV9RnEid6+AJ25gXc35HJrcA==
|
||||
|
||||
node-screenshots-win32-ia32-msvc@0.1.9:
|
||||
version "0.1.9"
|
||||
resolved "https://registry.npmmirror.com/node-screenshots-win32-ia32-msvc/-/node-screenshots-win32-ia32-msvc-0.1.9.tgz#5cfc18e4a667d350c52d019be0493908b5e844de"
|
||||
integrity sha512-uZW5gbKV6Hrmk2tafoAyHnn48cJ0LWRsSh8HQjiOjyeYd2E29ubPczhlt7NhAxr7ZUCzDeOigEZYm+VV2HCTrg==
|
||||
|
||||
node-screenshots-win32-x64-msvc@0.1.9:
|
||||
version "0.1.9"
|
||||
resolved "https://registry.npmmirror.com/node-screenshots-win32-x64-msvc/-/node-screenshots-win32-x64-msvc-0.1.9.tgz#faacca9a952eef00ec51b061c62896d507958811"
|
||||
integrity sha512-9HR/YaYwAImHeuptFtnQuP4/JI9OxfcqQlLiK1XgYwH18eTnv49ukG09MbDAiHvXXWYxQK3Q5w2H7da7FCoCWA==
|
||||
|
||||
node-screenshots@^0.1.9:
|
||||
version "0.1.9"
|
||||
resolved "https://registry.npmmirror.com/node-screenshots/-/node-screenshots-0.1.9.tgz#c6a17657def4dd12ffaa9fe9832ae0154d571196"
|
||||
integrity sha512-9f6yV/e7LU0KWkOJAQNR6GTEtnbnSaZKf9ukkF1VDJk0qj3aIcedQqYtd92IdEK8chVg+YbMfSuchlhq8iHI0Q==
|
||||
optionalDependencies:
|
||||
node-screenshots-darwin-arm64 "0.1.9"
|
||||
node-screenshots-darwin-universal "0.1.9"
|
||||
node-screenshots-darwin-x64 "0.1.9"
|
||||
node-screenshots-linux-x64-gnu "0.1.9"
|
||||
node-screenshots-linux-x64-musl "0.1.9"
|
||||
node-screenshots-win32-arm64-msvc "0.1.9"
|
||||
node-screenshots-win32-ia32-msvc "0.1.9"
|
||||
node-screenshots-win32-x64-msvc "0.1.9"
|
||||
|
||||
normalize-package-data@^2.3.2:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
|
||||
@ -10929,10 +11002,10 @@ react-draggable@^4.0.3:
|
||||
clsx "^1.1.1"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
react-error-overlay@6.0.9, react-error-overlay@^6.0.11:
|
||||
version "6.0.9"
|
||||
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a"
|
||||
integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==
|
||||
react-error-overlay@^6.0.11:
|
||||
version "6.0.11"
|
||||
resolved "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb"
|
||||
integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==
|
||||
|
||||
react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.4:
|
||||
version "16.13.1"
|
||||
@ -10982,6 +11055,11 @@ react-resizable@^3.0.5:
|
||||
prop-types "15.x"
|
||||
react-draggable "^4.0.3"
|
||||
|
||||
react-screenshots@^0.5.22:
|
||||
version "0.5.22"
|
||||
resolved "https://registry.npmmirror.com/react-screenshots/-/react-screenshots-0.5.22.tgz#2d974189d2d2df74388a4a19482fd1c956641837"
|
||||
integrity sha512-aooIlb1k6161BTqhhyADlMrlF0n1UdudjuhyvXaCQfwURXZNuUerMxFuOfwNCgSbPAHlxdHCWtYQ6iQT+RaF+w==
|
||||
|
||||
react-scripts@5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.0.tgz#6547a6d7f8b64364ef95273767466cc577cb4b60"
|
||||
@ -11425,6 +11503,13 @@ rimraf@^3.0.0, rimraf@^3.0.2:
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
rimraf@^5.0.5:
|
||||
version "5.0.5"
|
||||
resolved "https://registry.npmmirror.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf"
|
||||
integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==
|
||||
dependencies:
|
||||
glob "^10.3.7"
|
||||
|
||||
roarr@^2.15.3:
|
||||
version "2.15.4"
|
||||
resolved "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
|
||||
@ -13565,10 +13650,10 @@ ws@^8.13.0:
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0"
|
||||
integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==
|
||||
|
||||
wukongimjssdk@^1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/wukongimjssdk/-/wukongimjssdk-1.1.2.tgz#d1f781a1c5d4fb32217bba939b7000e09d04bf22"
|
||||
integrity sha512-x1xAnn17jHZshZnt53eiccMOffYIaIy+6CHH9NWS6p2aefJibX3LfHODrQWQJkoJ4ppGtfGfuqukkYgwTIqxiw==
|
||||
wukongimjssdk@^1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.npmmirror.com/wukongimjssdk/-/wukongimjssdk-1.2.7.tgz#db9af096efff467d6d1766c5ea50f16fe386662c"
|
||||
integrity sha512-Okx+hTDLhMSDCicA2od9VBvSlfzNLtxMw4drbqaUx31hp09G5LSgthhWz9rfJl8AbmljhwPGo28B9bOZGjAgkw==
|
||||
dependencies:
|
||||
"@types/bignumber.js" "^5.0.0"
|
||||
"@types/crypto-js" "^4.0.2"
|
||||
|