From 84977704bdfa004817d2606e3c88dc2fc9421331 Mon Sep 17 00:00:00 2001 From: Manoj Vivek Date: Sun, 19 Feb 2023 22:37:55 +0530 Subject: [PATCH] Added about in help menu --- desktop-app/src/main/menu.ts | 60 ++++++++++++++++++++++++++++++++++++ desktop-app/src/main/util.ts | 37 ++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/desktop-app/src/main/menu.ts b/desktop-app/src/main/menu.ts index 05d3201d..64c04d4a 100644 --- a/desktop-app/src/main/menu.ts +++ b/desktop-app/src/main/menu.ts @@ -4,7 +4,11 @@ import { shell, BrowserWindow, MenuItemConstructorOptions, + clipboard, + dialog, } from 'electron'; +import path from 'path'; +import { getEnvironmentInfo, getPackageJson } from './util'; interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions { selector?: string; @@ -167,6 +171,54 @@ export default class MenuBuilder { { label: 'Bring All to Front', selector: 'arrangeInFront:' }, ], }; + const aboutClick = () => { + const iconPath = path.join(__dirname, '../resources/icons/64x64.png'); + const title = 'Responsively'; + const { description } = getPackageJson(); + const { + appVersion, + electronVersion, + chromeVersion, + nodeVersion, + v8Version, + osInfo, + } = getEnvironmentInfo(); + + const usefulInfo = `Version: ${appVersion}\nElectron: ${electronVersion}\nChrome: ${chromeVersion}\nNode.js: ${nodeVersion}\nV8: ${v8Version}\nOS: ${osInfo}`; + const detail = description + ? `${description}\n\n${usefulInfo}` + : usefulInfo; + let buttons = ['OK', 'Copy']; + let cancelId = 0; + let defaultId = 1; + if (process.platform === 'linux') { + buttons = ['Copy', 'OK']; + cancelId = 1; + defaultId = 0; + } + dialog + .showMessageBox(BrowserWindow.getAllWindows()[0], { + type: 'none', + buttons, + title, + message: title, + detail, + noLink: true, + icon: iconPath, + cancelId, + defaultId, + }) + .then(({ response }) => { + if (response === defaultId) { + clipboard.writeText(usefulInfo, 'clipboard'); + } + return null; + }) + .catch((err) => { + console.error('Error opening about', err); + }); + }; + const subMenuHelp: MenuItemConstructorOptions = { label: 'Help', submenu: [ @@ -198,6 +250,14 @@ export default class MenuBuilder { ); }, }, + { + type: 'separator', + }, + { + label: 'About', + accelerator: 'F1', + click: aboutClick, + }, ], }; diff --git a/desktop-app/src/main/util.ts b/desktop-app/src/main/util.ts index c0e512b1..a5a924c6 100644 --- a/desktop-app/src/main/util.ts +++ b/desktop-app/src/main/util.ts @@ -1,6 +1,9 @@ /* eslint import/prefer-default-export: off */ import { URL } from 'url'; import path from 'path'; +import { app } from 'electron'; +import fs from 'fs-extra'; +import os from 'os'; export function resolveHtmlPath(htmlFileName: string) { if (process.env.NODE_ENV === 'development') { @@ -41,3 +44,37 @@ export function isValidCliArgURL(arg?: string): boolean { isCliArgResult = false; return false; } + +export const getPackageJson = () => { + let appPath; + if (process.env.NODE_ENV === 'production') appPath = app.getAppPath(); + else appPath = process.cwd(); + + const pkgPath = path.join(appPath, 'package.json'); + if (fs.existsSync(pkgPath)) { + const pkgContent = fs.readFileSync(pkgPath, 'utf-8'); + return JSON.parse(pkgContent); + } + console.error(`cant find package.json in: '${appPath}'`); + return {}; +}; + +export const getEnvironmentInfo = () => { + const pkg = getPackageJson(); + const appVersion = pkg.version || 'Unknown'; + const electronVersion = process.versions.electron || 'Unknown'; + const chromeVersion = process.versions.chrome || 'Unknown'; + const nodeVersion = process.versions.node || 'Unknown'; + const v8Version = process.versions.v8 || 'Unknown'; + const osInfo = + `${os.type()} ${os.arch()} ${os.release()}`.trim() || 'Unknown'; + + return { + appVersion, + electronVersion, + chromeVersion, + nodeVersion, + v8Version, + osInfo, + }; +};