From 02656b34bd97dbd2e969574b0778328eeca0428d Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Mon, 21 Feb 2022 11:18:19 +0800 Subject: [PATCH] feat: desktop auto update or notify and menu --- desktop/package.json | 5 +- desktop/src/main/config.ts | 11 ++++ desktop/src/main/index.ts | 14 ++--- desktop/src/main/menu.ts | 119 +++++++++++++++++++++++++++++++++++++ desktop/src/main/update.ts | 36 +++++++++++ desktop/yarn.lock | 58 ++++++++++++++++++ 6 files changed, 233 insertions(+), 10 deletions(-) create mode 100644 desktop/src/main/config.ts create mode 100644 desktop/src/main/menu.ts create mode 100644 desktop/src/main/update.ts diff --git a/desktop/package.json b/desktop/package.json index 8b19aa14..3e56d2a0 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -31,7 +31,10 @@ "typescript": "~4.5.4" }, "dependencies": { + "electron-log": "^4.4.6", "electron-squirrel-startup": "^1.0.0", - "electron-window-state": "^5.0.3" + "electron-update-notifier": "^1.5.3", + "electron-window-state": "^5.0.3", + "update-electron-app": "^2.0.1" } } diff --git a/desktop/src/main/config.ts b/desktop/src/main/config.ts new file mode 100644 index 00000000..95e010ef --- /dev/null +++ b/desktop/src/main/config.ts @@ -0,0 +1,11 @@ +import { app } from 'electron'; + +const isDev = !app.isPackaged; +const webUrl = isDev + ? 'http://localhost:11011' + : 'https://nightly.paw.msgbyte.com'; + +export const config = { + isDev, + webUrl, +}; diff --git a/desktop/src/main/index.ts b/desktop/src/main/index.ts index 8fd647e0..71e53c8d 100644 --- a/desktop/src/main/index.ts +++ b/desktop/src/main/index.ts @@ -1,11 +1,8 @@ import { app, BrowserWindow } from 'electron'; -import path from 'path'; import windowStateKeeper from 'electron-window-state'; - -const isDev = !app.isPackaged; -const webUrl = isDev - ? 'http://localhost:11011' - : 'https://nightly.paw.msgbyte.com'; +import { config } from './config'; +import './update'; +import './menu'; // Handle creating/removing shortcuts on Windows when installing/uninstalling. if (require('electron-squirrel-startup')) { @@ -28,18 +25,17 @@ const createWindow = (): void => { minHeight: 640, minWidth: 960, center: true, - icon: path.resolve(__dirname, '../assets/logo@192.png'), webPreferences: { nodeIntegration: false, sandbox: true, }, }); - mainWindow.loadURL(webUrl); + mainWindow.loadURL(config.webUrl); mainWindowState.manage(mainWindow); - if (isDev) { + if (config.isDev) { // Open the DevTools. mainWindow.webContents.openDevTools(); } diff --git a/desktop/src/main/menu.ts b/desktop/src/main/menu.ts new file mode 100644 index 00000000..1a8488a4 --- /dev/null +++ b/desktop/src/main/menu.ts @@ -0,0 +1,119 @@ +import { + app, + Menu, + MenuItem, + MenuItemConstructorOptions, + shell, +} from 'electron'; +import { config } from './config'; +import { checkUpdates } from './update'; + +const isMac = process.platform === 'darwin'; + +const template = [ + // { role: 'appMenu' } + ...(isMac + ? [ + { + label: app.name, + submenu: [ + { role: 'about' }, + { type: 'separator' }, + { role: 'services' }, + { type: 'separator' }, + { role: 'hide' }, + { role: 'hideOthers' }, + { role: 'unhide' }, + { type: 'separator' }, + { role: 'quit' }, + ], + }, + ] + : []), + // { role: 'fileMenu' } + { + label: 'File', + submenu: [isMac ? { role: 'close' } : { role: 'quit' }], + }, + // { role: 'editMenu' } + { + label: 'Edit', + submenu: [ + { role: 'undo' }, + { role: 'redo' }, + { type: 'separator' }, + { role: 'cut' }, + { role: 'copy' }, + { role: 'paste' }, + ...(isMac + ? [ + { role: 'pasteAndMatchStyle' }, + { role: 'delete' }, + { role: 'selectAll' }, + { type: 'separator' }, + { + label: 'Speech', + submenu: [{ role: 'startSpeaking' }, { role: 'stopSpeaking' }], + }, + ] + : [{ role: 'delete' }, { type: 'separator' }, { role: 'selectAll' }]), + ], + }, + // { role: 'viewMenu' } + { + label: 'View', + submenu: [ + { role: 'reload' }, + { role: 'forceReload' }, + { role: 'toggleDevTools' }, + { type: 'separator' }, + { role: 'resetZoom' }, + { role: 'zoomIn' }, + { role: 'zoomOut' }, + { type: 'separator' }, + { role: 'togglefullscreen' }, + ], + }, + // { role: 'windowMenu' } + { + label: 'Window', + submenu: [ + { role: 'minimize' }, + { role: 'zoom' }, + ...(isMac + ? [ + { type: 'separator' }, + { role: 'front' }, + { type: 'separator' }, + { role: 'window' }, + ] + : [{ role: 'close' }]), + ], + }, + { + role: 'help', + submenu: [ + { + label: 'Github', + click: async () => { + await shell.openExternal('https://github.com/msgbyte/tailchat'); + }, + }, + { + label: '打开网页版', + click: async () => { + await shell.openExternal(config.webUrl); + }, + }, + { + label: '检查更新', + click: async () => { + await checkUpdates(); + }, + }, + ], + }, +] as Array; + +const menu = Menu.buildFromTemplate(template); +Menu.setApplicationMenu(menu); diff --git a/desktop/src/main/update.ts b/desktop/src/main/update.ts new file mode 100644 index 00000000..506acb09 --- /dev/null +++ b/desktop/src/main/update.ts @@ -0,0 +1,36 @@ +import { app } from 'electron'; +import { + setUpdateNotification, + checkForUpdates, +} from 'electron-update-notifier'; +import updateElectronApp from 'update-electron-app'; +import logger from 'electron-log'; + +const repo = 'msgbyte/tailchat'; + +app.whenReady().then(() => { + switch (process.platform) { + // case 'darwin': // NOTICE: require codesign + case 'win32': + updateElectronApp({ + repo, + logger, + }); + break; + default: + setUpdateNotification({ + repository: repo, // Optional, use repository field from your package.json when not specified + silent: true, // Optional, notify when new version available, otherwise remain silent + }); + } +}); + +/** + * 手动检查更新 + */ +export function checkUpdates(): Promise { + return checkForUpdates({ + repository: repo, + silent: false, + }); +} diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 240d2b15..0dc54453 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -558,6 +558,13 @@ aws4@^1.8.0: resolved "https://registry.npmmirror.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@^0.24.0: + version "0.24.0" + resolved "https://registry.npmmirror.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -834,6 +841,11 @@ compare-version@^0.1.2: resolved "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1069,6 +1081,16 @@ electron-installer-redhat@^3.2.0: word-wrap "^1.2.3" yargs "^16.0.2" +electron-is-dev@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/electron-is-dev/-/electron-is-dev-0.3.0.tgz#14e6fda5c68e9e4ecbeff9ccf037cbd7c05c5afe" + integrity sha512-jLttuuq8QK67n3mXmIe9pkrO7IH3LGIk12xJkhTmc852U2sCJaRAOpRGPSh+1Xnzck5v9escd9YXzuze9nGejg== + +electron-log@^4.4.6: + version "4.4.6" + resolved "https://registry.npmmirror.com/electron-log/-/electron-log-4.4.6.tgz#e7824fc725370384f6edaaac0480c423e570dc69" + integrity sha512-nirYgRdY+F+vclr8ijdwy2vW03IzFpDHTaKNWu76dEN21Y76+smcES5knS7cgHUUB0qNLOi8vZO36taakjbSXA== + electron-notarize@^1.1.1: version "1.1.1" resolved "https://registry.npmmirror.com/electron-notarize/-/electron-notarize-1.1.1.tgz#3ed274b36158c1beb1dbef14e7faf5927e028629" @@ -1140,6 +1162,15 @@ electron-squirrel-startup@^1.0.0: dependencies: debug "^2.2.0" +electron-update-notifier@^1.5.3: + version "1.5.3" + resolved "https://registry.npmmirror.com/electron-update-notifier/-/electron-update-notifier-1.5.3.tgz#23c4e6f255e2b8a8cc24061c742c180e2fd5fe99" + integrity sha512-nIru/heVVrlv8WI578KfaB/8oXlpLdkiAgzv6fb5x8O2kkWDymDGo4QJrWJPtPzB/TABnJhUURocN37r6XJdXQ== + dependencies: + axios "^0.24.0" + compare-versions "^3.6.0" + github-url-to-object "^4.0.4" + electron-window-state@^5.0.3: version "5.0.3" resolved "https://registry.npmmirror.com/electron-window-state/-/electron-window-state-5.0.3.tgz#4f36d09e3f953d87aff103bf010f460056050aa8" @@ -1388,6 +1419,11 @@ flora-colossus@^1.0.0: debug "^4.1.1" fs-extra "^7.0.0" +follow-redirects@^1.14.4: + version "1.14.9" + resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -1545,6 +1581,13 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-url-to-object@^4.0.4: + version "4.0.6" + resolved "https://registry.npmmirror.com/github-url-to-object/-/github-url-to-object-4.0.6.tgz#5ea8701dc8c336b8d582dc3fa5bf964165c3b365" + integrity sha512-NaqbYHMUAlPcmWFdrAB7bcxrNIiiJWJe8s/2+iOc9vlcHlwHqSGrPk+Yi3nu6ebTwgsZEa7igz+NH2vEq3gYwQ== + dependencies: + is-url "^1.1.0" + glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1888,6 +1931,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-url@^1.1.0, is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-windows@^1.0.1: version "1.0.2" resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -3389,6 +3437,16 @@ universalify@^2.0.0: resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +update-electron-app@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/update-electron-app/-/update-electron-app-2.0.1.tgz#229dbeb4534f51ec949e6a46ae1ac32f68a17eed" + integrity sha512-e4xEner89UZZaBGYJbYlMdL1uUrC0VjOsTAL2N4opPjzFtn+j7mdsJJsnyXZzUVeLY+8tuCX4XEsUM98oBHmZg== + dependencies: + electron-is-dev "^0.3.0" + github-url-to-object "^4.0.4" + is-url "^1.2.4" + ms "^2.1.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"