From 52fd0e34107327a229607a9477553cb3cfa39e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=85=E8=88=AA?= <602869941@qq.com> Date: Thu, 25 Jul 2024 13:42:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- latest.yml | 8 + main.js | 457 ++++++++++++------- package-lock.json | 106 ++++- package.json | 10 +- preload.js | 69 +-- src/assets/updateBg.png | Bin 0 -> 30650 bytes src/components/UpdateModal/index.module.scss | 36 +- src/components/UpdateModal/index.tsx | 101 +++- src/render.d.ts | 24 +- 9 files changed, 554 insertions(+), 257 deletions(-) create mode 100644 latest.yml create mode 100644 src/assets/updateBg.png diff --git a/latest.yml b/latest.yml new file mode 100644 index 0000000..16a19d8 --- /dev/null +++ b/latest.yml @@ -0,0 +1,8 @@ +version: 0.0.3 +files: + - url: 智汇享 Setup 0.0.3.exe + sha512: E8CIX2h4+VYvFcdIxUUolwfZgG+ZAQTdIAoVmyst11/x6aTA19Mx2/Lfuy5wCuMC0YA8ci5oXD91CEIev7r+TQ== + size: 117050951 +path: 智汇享 Setup 0.0.3.exe +sha512: E8CIX2h4+VYvFcdIxUUolwfZgG+ZAQTdIAoVmyst11/x6aTA19Mx2/Lfuy5wCuMC0YA8ci5oXD91CEIev7r+TQ== +releaseDate: '2024-07-24T02:13:28.542Z' diff --git a/main.js b/main.js index 66d6199..41c10ae 100644 --- a/main.js +++ b/main.js @@ -1,177 +1,304 @@ -const { app, BrowserWindow, screen, Tray, nativeImage, Menu, ipcMain, clipboard, dialog, webFrame, Notification } = require('electron'); +const { + app, + BrowserWindow, + screen, + Tray, + nativeImage, + Menu, + ipcMain, + clipboard, + dialog, + webFrame, + Notification +} = require('electron'); const path = require('node:path') +const {autoUpdater, CancellationToken} = require('electron-updater'); +const cancellationToken = new CancellationToken() app.allowRendererProcessReuse = false; let mainWindow = null; let isMaximized = false; class AppWindow extends BrowserWindow { - constructor(config) { - const basicConfig = { - webPreferences: { - contextIsolation: false, - nodeIntegration: true, - enableRemoteModule: true, - nodeIntegrationInWorker: true, - allowMediaDevices: true, - preload: path.join(__dirname, 'preload.js') - }, - show: false, - frame: false, - backgroundColor: '#00000000', - transparent: true, - }; - const finalConfig = { ...basicConfig, ...config }; - super(finalConfig); + constructor(config) { + const basicConfig = { + webPreferences: { + contextIsolation: false, + nodeIntegration: true, + enableRemoteModule: true, + nodeIntegrationInWorker: true, + allowMediaDevices: true, + preload: path.join(__dirname, 'preload.js') + }, + show: false, + frame: false, + backgroundColor: '#00000000', + transparent: true, + }; + const finalConfig = {...basicConfig, ...config}; + super(finalConfig); + const env = process.argv.find((arg) => arg.startsWith('--env='))?.split('=')[1]; + if (env === 'development') { + // 开发 + this.loadURL('http://localhost:3000'); + } else { + // 测试 | 生产 + this.loadFile(path.resolve(__dirname, './dist/index.html')); + } + this.once('ready-to-show', () => { + this.show(); + }); + } +} + +function showWindow() { + // 如果主窗口已经存在但被最小化了,则恢复显示 + if (mainWindow && mainWindow.isMinimized()) { + mainWindow.show(); + } + // 如果主窗口已存在但不是焦点窗口,则将其置为焦点 + if (mainWindow && !mainWindow.isFocused()) { + mainWindow.show(); + mainWindow.focus(); + } + // 如果主窗口还没有被创建,则创建它 + if (!mainWindow) { + createWindow(); + } +} + +function createTray() { + const iconPath = `${__dirname}/src/assets/icon.png`; + const trayIcon = nativeImage.createFromPath(iconPath); + const tray = new Tray(trayIcon); + const contextMenu = Menu.buildFromTemplate([ + { + label: '打开', click: () => { + showWindow() + }, + // icon: iconPath, + }, + { + label: '退出', click: async () => { + await mainWindow.webContents.send('quit'); + app.quit(); + mainWindow = null; + }, + // icon: iconPath, + }, + { + label: '退出到系统托盘', click: () => { + mainWindow.hide(); + }, + // icon: iconPath, + }, + ]); + tray.setToolTip('智汇享'); + tray.setContextMenu(contextMenu); + tray.on('click', () => { + if (mainWindow.isVisible()) { + mainWindow.hide() + } else { + mainWindow.show() + } + }); +} + +function createWindow() { + mainWindow = new AppWindow(); + mainWindow.focus(); +} + +function createNotification(user) { + const notification = new Notification({ + title: `${user.name} 邀请你加入`, + body: user.body, + // icon: path.join(`${__dirname}/src/assets/avatar.png`) + }); + notification.show(); + mainWindow.focus(); +} + +app.on('ready', () => { const env = process.argv.find((arg) => arg.startsWith('--env='))?.split('=')[1]; if (env === 'development') { - // 开发 - this.loadURL('http://localhost:3000'); - } else { - // 测试 | 生产 - this.loadFile(path.resolve(__dirname, './dist/index.html')); + Object.defineProperty(app, 'isPackaged', { + get() { + return true + } + }) + autoUpdater.updateConfigPath = path.join('latest.yml') + // autoUpdater.updateConfigPath = path.join('http://test.bossmei.top/electron/latest.yml') } - this.once('ready-to-show', () => { - this.show(); + // autoUpdater.updateConfigPath = path.join('http://test.bossmei.top/electron/latest.yml') + console.log(123123123) + createWindow() + updateHandle() // 检查更新 + createTray() + // 监听f12打开控制台 + mainWindow.webContents.on('before-input-event', (event, input) => { + if (input.key === 'F12') { + mainWindow.webContents.openDevTools() + } + }); + // 监听移动 + mainWindow.on('move', () => { + // 如果是全屏自动恢复到上次窗口大小 + if (isMaximized) { + mainWindow.setResizable(true) + mainWindow.unmaximize() + isMaximized = false; + } + if (mainWindow.isMaximized()) { + isMaximized = true; + } + }); + // 放大缩小退出窗口 + ipcMain.handle('setViewStatus', async (event, status) => { + switch (status) { + case 'quit': + await mainWindow.webContents.send('quit'); + app.quit(); + mainWindow = null; + break; + case 'maximize': + mainWindow.maximize() + mainWindow.setResizable(false) + break; + case 'unmaximize': + mainWindow.setResizable(true) + mainWindow.unmaximize() + break; + case 'minimize': + mainWindow.minimize() + break; + } + }); + // 导出是否全屏 + ipcMain.handle('getIsMaximized', () => { + return mainWindow.isMaximized(); + }); + // 复制文字 + ipcMain.handle('setWriteText', (event, text) => { + clipboard.writeText(text) + }); + // 加入房间通知 + ipcMain.handle('joinNotification', (event, user) => { + createNotification(user) + }); + // 通知下载包 + ipcMain.handle('updateDownload', (event, data) => { + if (data === '0') { // 取消下载 + cancleDownloadUpdate() + } else if (data === '1') { // 开始下载 + downloadUpdate() + } else if (data === '2') { // 下载完成 点击安装 + quitAndInstall() + } + }); + // 设置桌面应用基础属性 + ipcMain.handle('setMainWindowSize', (event, config) => { + // 设置最小窗口尺寸 + mainWindow.setMinimumSize(config.width, config.height); + // 设置最大尺寸 + const primaryDisplay = screen.getPrimaryDisplay() + const {width, height} = primaryDisplay.workAreaSize + if (config.key === 'login') { + mainWindow.setMaximumSize(config.width, config.height); + } else { + mainWindow.setMaximumSize(width, height); + } + // 设置窗口尺寸 + mainWindow.setSize(config.width, config.height) + // 设置窗口位置使其居中于当前屏幕 + const display = screen.getDisplayMatching({...mainWindow.getBounds()}); + const x = Math.round((display.workArea.width - mainWindow.getSize()[0]) / 2); + const y = Math.round((display.workArea.height - mainWindow.getSize()[1]) / 2); + mainWindow.setPosition(x, y); }); - } -} -function showWindow() { - // 如果主窗口已经存在但被最小化了,则恢复显示 - if (mainWindow && mainWindow.isMinimized()) { - mainWindow.show(); - } - // 如果主窗口已存在但不是焦点窗口,则将其置为焦点 - if (mainWindow && !mainWindow.isFocused()) { - mainWindow.show(); - mainWindow.focus(); - } - // 如果主窗口还没有被创建,则创建它 - if (!mainWindow) { - createWindow(); - } -} -function createTray() { - const iconPath = `${__dirname}/src/assets/icon.png`; - const trayIcon = nativeImage.createFromPath(iconPath); - const tray = new Tray(trayIcon); - const contextMenu = Menu.buildFromTemplate([ - { - label: '打开', click: () => { - showWindow() - }, - // icon: iconPath, - }, - { - label: '退出', click: async () => { - await mainWindow.webContents.send('quit'); - app.quit(); - mainWindow = null; - }, - // icon: iconPath, - }, - { - label: '退出到系统托盘', click: () => { - mainWindow.hide(); - }, - // icon: iconPath, - }, - ]); - tray.setToolTip('智汇享'); - tray.setContextMenu(contextMenu); - tray.on('click', () => { - if (mainWindow.isVisible()) { - mainWindow.hide() - } else { - mainWindow.show() - } - }); -} -function createWindow() { - mainWindow = new AppWindow(); - mainWindow.focus(); -} -function createNotification(user) { - const notification = new Notification({ - title: `${user.name} 邀请你加入`, - body: user.body, - // icon: path.join(`${__dirname}/src/assets/avatar.png`) - }); - notification.show(); - mainWindow.focus(); -} -app.on('ready', () => { - createWindow() - createTray() - // 监听f12打开控制台 - mainWindow.webContents.on('before-input-event', (event, input) => { - if (input.key === 'F12') { - mainWindow.webContents.openDevTools() - } - }); - // 监听移动 - mainWindow.on('move', () => { - // 如果是全屏自动恢复到上次窗口大小 - if (isMaximized) { - mainWindow.setResizable(true) - mainWindow.unmaximize() - isMaximized = false; - } - if (mainWindow.isMaximized()) { - isMaximized = true; - } - }); - // 放大缩小退出窗口 - ipcMain.handle('setViewStatus', async (event, status) => { - switch (status) { - case 'quit': - await mainWindow.webContents.send('quit'); - app.quit(); - mainWindow = null; - break; - case 'maximize': - mainWindow.maximize() - mainWindow.setResizable(false) - break; - case 'unmaximize': - mainWindow.setResizable(true) - mainWindow.unmaximize() - break; - case 'minimize': - mainWindow.minimize() - break; - } - }); - // 导出是否全屏 - ipcMain.handle('getIsMaximized', () => { - return mainWindow.isMaximized(); - }); - // 复制文字 - ipcMain.handle('setWriteText', (event, text) => { - clipboard.writeText(text) - }); - // 加入房间通知 - ipcMain.handle('joinNotification', (event, user) => { - createNotification(user) - }); - // 设置桌面应用基础属性 - ipcMain.handle('setMainWindowSize', (event, config) => { - // 设置最小窗口尺寸 - mainWindow.setMinimumSize(config.width, config.height); - // 设置最大尺寸 - const primaryDisplay = screen.getPrimaryDisplay() - const { width, height } = primaryDisplay.workAreaSize - if (config.key === 'login') { - mainWindow.setMaximumSize(config.width, config.height); - } else { - mainWindow.setMaximumSize(width, height); - } - // 设置窗口尺寸 - mainWindow.setSize(config.width, config.height) - // 设置窗口位置使其居中于当前屏幕 - const display = screen.getDisplayMatching({ ...mainWindow.getBounds() }); - const x = Math.round((display.workArea.width - mainWindow.getSize()[0]) / 2); - const y = Math.round((display.workArea.height - mainWindow.getSize()[1]) / 2); - mainWindow.setPosition(x, y); - }); }); +// 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写 +function updateHandle() { + autoUpdater.checkForUpdates() + // autoUpdater.checkForUpdatesAndNotify().catch(); + const message = { + error: '检查更新出错', + checking: '正在检查更新……', + updateAva: '检测到新版本,正在下载……', + updateNotAva: '现在使用的就是最新版本,不用更新' + } + autoUpdater.setFeedURL('http://test.bossmei.top/electron') + autoUpdater.autoDownload = false // 不自动下载安装包 + autoUpdater.autoInstallOnAppQuit = false // 不自动安装 + // eslint-disable-next-line handle-callback-err + autoUpdater.on('error', function (error) { + // sendUpdateError(JSON.stringify(error)) + sendUpdateMessage(message.error) + }) + autoUpdater.on('checking-for-update', function () { + console.log('开始检测') + console.log('checking-for-update') + sendUpdateMessage(message.checking) + }) + autoUpdater.on('update-available', function (info) { + console.log('update-available', info) + let messageStr = JSON.stringify({type: '0'}) + // todo 延迟5秒打开弹窗(逻辑要改) + setTimeout(() => { + sendUpdateMessage(messageStr) + }, 5000) + // sendUpdateMessage(message.updateAva) + }) + autoUpdater.on('update-not-available', function (info) { + console.log(info) + // sendUpdateMessage(message.updateNotAva) + }) + // 更新下载进度事件 + autoUpdater.on('download-progress', function (progressObj) { + let message = JSON.stringify({ + type: '1', + value: progressObj.percent + }) + sendUpdateMessage(message) + console.log(progressObj.percent) + // mainWindow.webContents.send('downloadProgress', progressObj) + }) + autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) { + console.log('下载完成---------------') + let message = JSON.stringify({ + type: '3', + }) + // sendUpdateMessage(message) + autoUpdater.quitAndInstall() + ipcMain.on('isUpdateNow', (e, arg) => { + console.log(arg) + console.log('开始更新') + // some code here to handle event + autoUpdater.quitAndInstall() + }) + // mainWindow.webContents.send('isUpdateNow') + }) +} + +// 通过main进程发送事件给renderer进程,提示更新信息 +// type: 0 检测到需要更新(打开窗口) 1 正在下载更新包 +function sendUpdateMessage(text) { + mainWindow.webContents.send('update', text) +} + +// 下载最新的包 +function downloadUpdate() { + autoUpdater.downloadUpdate(cancellationToken) +} + +// 取消下载 +function cancleDownloadUpdate() { + autoUpdater.downloadUpdate(cancellationToken) + // stop download + cancellationToken.cancel() +} + +// 完成下载立即安装 +function quitAndInstall() { + autoUpdater.quitAndInstall(); +} diff --git a/package-lock.json b/package-lock.json index 746ad92..6ce43e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "multi.person.meeting", - "version": "0.0.0", + "version": "0.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "multi.person.meeting", - "version": "0.0.0", + "version": "0.0.1", "dependencies": { "@ant-design/icons": "^5.3.7", "@microsoft/signalr": "^8.0.0", @@ -18,6 +18,7 @@ "crypto-js": "^4.2.0", "dayjs": "^1.11.11", "electron-squirrel-startup": "^1.0.1", + "electron-updater": "^6.2.1", "os": "^0.1.2", "path": "^0.12.7", "postcss-px-to-viewport-8-plugin": "^1.2.5", @@ -3123,8 +3124,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-hidden": { "version": "1.2.4", @@ -4413,7 +4413,6 @@ "version": "4.3.5", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -5165,6 +5164,33 @@ "integrity": "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==", "dev": true }, + "node_modules/electron-updater": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.2.1.tgz", + "integrity": "sha512-83eKIPW14qwZqUUM6wdsIRwVKZyjmHxQ4/8G+1C6iS5PdDt7b1umYQyj1/qPpH510GmHEQe4q0kCPe3qmb3a0Q==", + "dependencies": { + "builder-util-runtime": "9.2.4", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.3.8", + "tiny-typed-emitter": "^2.1.0" + } + }, + "node_modules/electron-updater/node_modules/builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/electron/node_modules/@electron/get": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/@electron/get/-/get-2.0.3.tgz", @@ -6299,7 +6325,6 @@ "version": "10.1.0", "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -7608,7 +7633,6 @@ "version": "4.1.0", "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -7733,8 +7757,7 @@ "node_modules/lazy-val": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" }, "node_modules/lazystream": { "version": "1.0.1", @@ -7821,6 +7844,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -10294,8 +10322,7 @@ "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/scheduler": { "version": "0.23.2", @@ -10334,7 +10361,6 @@ "version": "7.6.2", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -11068,6 +11094,11 @@ "node": ">=0.10.0" } }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, "node_modules/tldraw": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/tldraw/-/tldraw-2.3.0.tgz", @@ -14183,8 +14214,7 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "aria-hidden": { "version": "1.2.4", @@ -15142,7 +15172,6 @@ "version": "4.3.5", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -15791,6 +15820,32 @@ "integrity": "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==", "dev": true }, + "electron-updater": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.2.1.tgz", + "integrity": "sha512-83eKIPW14qwZqUUM6wdsIRwVKZyjmHxQ4/8G+1C6iS5PdDt7b1umYQyj1/qPpH510GmHEQe4q0kCPe3qmb3a0Q==", + "requires": { + "builder-util-runtime": "9.2.4", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.3.8", + "tiny-typed-emitter": "^2.1.0" + }, + "dependencies": { + "builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "requires": { + "debug": "^4.3.4", + "sax": "^1.2.4" + } + } + } + }, "enabled": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/enabled/-/enabled-2.0.0.tgz", @@ -16533,7 +16588,6 @@ "version": "10.1.0", "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -17514,7 +17568,6 @@ "version": "4.1.0", "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -17616,8 +17669,7 @@ "lazy-val": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" }, "lazystream": { "version": "1.0.1", @@ -17688,6 +17740,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -19468,8 +19525,7 @@ "sax": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "scheduler": { "version": "0.23.2", @@ -19505,8 +19561,7 @@ "semver": { "version": "7.6.2", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==" }, "semver-compare": { "version": "1.0.0", @@ -20109,6 +20164,11 @@ "resolved": "https://registry.npmmirror.com/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==" }, + "tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, "tldraw": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/tldraw/-/tldraw-2.3.0.tgz", diff --git a/package.json b/package.json index e16f68a..a351bd9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multi.person.meeting", "private": true, - "version": "0.0.0", + "version": "0.0.3", "main": "main.js", "authors": "yj", "description": "test", @@ -33,6 +33,7 @@ "crypto-js": "^4.2.0", "dayjs": "^1.11.11", "electron-squirrel-startup": "^1.0.1", + "electron-updater": "^6.2.1", "os": "^0.1.2", "path": "^0.12.7", "postcss-px-to-viewport-8-plugin": "^1.2.5", @@ -63,7 +64,12 @@ "buildDependenciesFromSource": true, "compression": "normal", "productName": "智汇享", - "publish": [], + "publish": [ + { + "provider": "generic", + "url": "http://test.bossmei.top/electron" + } + ], "files": [ "!*.log" ], diff --git a/preload.js b/preload.js index f47e665..39122e2 100644 --- a/preload.js +++ b/preload.js @@ -1,32 +1,41 @@ // // 在 preload 脚本中。 -const { ipcRenderer } = require('electron') +const {ipcRenderer, contextBridge} = require('electron') + +// contextBridge.exposeInMainWorld("elecAPI", { +// onUpdate: (callback) => ipcRenderer.on("update", callback), +// checkForUpdate: () => ipcRenderer.send("checkForUpdate"), +// }); window.electron = { - // 设置窗口大小 - setMainWindowSize: (config) => { - ipcRenderer.invoke('setMainWindowSize', { ...config }) - }, - // 设置窗口状态 - setViewStatus: (status) => { - ipcRenderer.invoke('setViewStatus', status) - }, - // 获取当前是否全屏 - getIsMaximized: () => { - return ipcRenderer.invoke('getIsMaximized') - }, - // 复制文字 - setWriteText: (text) => { - return ipcRenderer.invoke('setWriteText', text) - }, - // 加入房间通知 - joinNotification: (user) => { - ipcRenderer.invoke('joinNotification', user) - }, - // 监听退出 - onQuit: (callback) => { - ipcRenderer.on('quit', callback) - }, - // 监听更新 - onUpdate: (callback) => { - ipcRenderer.on('update', callback) - }, -} \ No newline at end of file + // 设置窗口大小 + setMainWindowSize: (config) => { + ipcRenderer.invoke('setMainWindowSize', {...config}) + }, + // 设置窗口状态 + setViewStatus: (status) => { + ipcRenderer.invoke('setViewStatus', status) + }, + // 获取当前是否全屏 + getIsMaximized: () => { + return ipcRenderer.invoke('getIsMaximized') + }, + // 复制文字 + setWriteText: (text) => { + return ipcRenderer.invoke('setWriteText', text) + }, + // 加入房间通知 + joinNotification: (user) => { + ipcRenderer.invoke('joinNotification', user) + }, + // 监听退出 + onQuit: (callback) => { + ipcRenderer.on('quit', callback) + }, + // 监听更新 + onUpdate: (callback) => { + ipcRenderer.on('update', callback) + }, + // 通知下载最新的包 + onDownload: (type) => { + ipcRenderer.invoke('updateDownload', type) + }, +} diff --git a/src/assets/updateBg.png b/src/assets/updateBg.png new file mode 100644 index 0000000000000000000000000000000000000000..c54625b49e3138e32ade73e909ead62b62631529 GIT binary patch literal 30650 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 { - useImperativeHandle(ref, () => ({ - changeModal: (data: any) => { - setIsUpdateModal(true) - } - })) - const [isUpdateModal, setIsUpdateModal] = useState(false); - return ( - <> - setIsUpdateModal(false)} - centered - width={'400px'} - > -
+import {Flex, Modal, Progress} from 'antd'; +import {forwardRef, useImperativeHandle, useState} from "react"; -
-
- - ) +const UpdateModal = forwardRef((props: any, ref: any) => { + useImperativeHandle(ref, () => ({ + changeModal: (data: any) => { + let dataJson = JSON.parse(data) + console.log(dataJson) + setIsUpdateModal(true) + getContent() + if (dataJson.type === '0') { // 打开弹窗 + setIsUpdateModal(true) + } else if (dataJson.type === '1') { // 下载中 返回进度值 + console.log('下载中', dataJson.value.toFixed(2)) + setProgress(dataJson.value.toFixed(2)) + } + } + })) + const [isUpdateModal, setIsUpdateModal] = useState(false); + const [progress, setProgress] = useState(0); // 下载进度值 + const [updateContent, setUpdateContent] = useState('') // 版本更新内容 + + function getContent() { + fetch('http://test.bossmei.top/electron/update.txt') // 配置服务器地址 + .then(async response => { + if (response.status === 200) { + return setUpdateContent(await response.text()) + } + throw new Error('Network response was not ok.'); + }) + .then(textContent => { + console.log(textContent); + }) + .catch(error => { + console.error('There has been a problem with your fetch operation:', error); + }); + } + + function closeModal() { + window.electron.onDownload('0') // 取消下载 + setIsUpdateModal(false) + } + + return ( + <> + closeModal()} + centered + width={'338px'} + > +
+
+ {updateContent} +
+ { + !progress ? +
+
window.electron.onDownload('1')}>立即更新 +
+
setIsUpdateModal(false)}>暂不更新
+
: +
+ 下载进度:{progress}% + + + +
+ } +
+
+ + ) }) -export default UpdateModal \ No newline at end of file +export default UpdateModal diff --git a/src/render.d.ts b/src/render.d.ts index a732862..993b57c 100644 --- a/src/render.d.ts +++ b/src/render.d.ts @@ -1,15 +1,17 @@ // electron-env.d.ts export interface IElectronAPI { - setMainWindowSize: (config: any) => void; - setViewStatus: (status: 'quit' | 'maximize' | 'minimize' | 'unmaximize') => void; - getIsMaximized: () => Promise; - setWriteText: (text: string) => void; - onQuit: (callBack:Function) => void; - onUpdate: (callBack:Function) => void; - joinNotification: (data: { name: string, body: string }) => void + setMainWindowSize: (config: any) => void; + setViewStatus: (status: 'quit' | 'maximize' | 'minimize' | 'unmaximize') => void; + getIsMaximized: () => Promise; + setWriteText: (text: string) => void; + onQuit: (callBack: Function) => void; + onUpdate: (callBack: Function) => void; + joinNotification: (data: { name: string, body: string }) => void; + onDownload: (data: string) => void } + declare global { - interface Window { - electron: IElectronAPI; - } -} \ No newline at end of file + interface Window { + electron: IElectronAPI; + } +}