1 const { Menu, app, shell, ipcMain, dialog , nativeImage} = require('electron')
2 const settings = require('electron-settings')
3 global.language = settings.get('browserSetting.core.lang') || app.getLocale()
4 const i18n = require('../i18n.js')
6 const path = require('path')
7 const logger = require('../logger')
8 const log = logger.create('menu')
10 let advNav = settings.get('browserSetting.app.navAdvancedState') || 'normal'
11 let btmAmountUnit = settings.get('browserSetting.core.btmAmountUnit') || 'BTM'
14 const logFolder = {logFolder: path.join(app.getPath('userData'), 'logs')}
15 const loggerOptions = Object.assign(logFolder)
16 logger.setup(loggerOptions)
18 let menuTempl = function () {
22 const name = app.getName()
24 if (process.platform === 'darwin') {
27 label: i18n.t('desktop.applicationMenu.app.about', { name }),
34 label: i18n.t('desktop.applicationMenu.app.services', { name }),
42 label: i18n.t('desktop.applicationMenu.app.hide', { name }),
43 accelerator: 'Command+H',
47 label: i18n.t('desktop.applicationMenu.app.hideOthers', { name }),
48 accelerator: 'Command+Alt+H',
52 label: i18n.t('desktop.applicationMenu.app.showAll', { name }),
62 label: i18n.t('desktop.applicationMenu.app.quit', { name }),
63 accelerator: 'CommandOrControl+Q',
70 label: i18n.t('desktop.applicationMenu.app.label', { name }),
77 label: i18n.t('desktop.applicationMenu.account.label'),
79 label: i18n.t('desktop.applicationMenu.account.new'),
80 accelerator: 'CommandOrControl+N',
81 click: (item, focusedWindow) => {
83 focusedWindow.webContents.send('redirect', '/accounts/create')
92 label: i18n.t('desktop.applicationMenu.edit.label'),
95 label: i18n.t('desktop.applicationMenu.edit.undo'),
96 accelerator: 'CommandOrControl+Z',
100 label: i18n.t('desktop.applicationMenu.edit.redo'),
101 accelerator: 'Shift+CommandOrControl+Z',
108 label: i18n.t('desktop.applicationMenu.edit.cut'),
109 accelerator: 'CommandOrControl+X',
113 label: i18n.t('desktop.applicationMenu.edit.copy'),
114 accelerator: 'CommandOrControl+C',
118 label: i18n.t('desktop.applicationMenu.edit.paste'),
119 accelerator: 'CommandOrControl+V',
123 label: i18n.t('desktop.applicationMenu.edit.selectAll'),
124 accelerator: 'CommandOrControl+A',
132 const defaultLanguage = i18n.getBestMatchedLangCode(app.getLocale())
133 let currentLanguage = settings.get('browserSetting.core.lang') || defaultLanguage
134 const LanguageMenu = [{
135 label: i18n.t('desktop.applicationMenu.view.default'),
137 click: (item, focusedWindow) => {
139 i18n.changeLanguage(defaultLanguage, (err, t) => {
140 if (err) return log.error('something went wrong loading', err)
141 focusedWindow.webContents.send('lang', defaultLanguage)
149 label: i18n.t('desktop.applicationMenu.view.langCodes.zh'),
151 checked: currentLanguage === 'zh',
152 click: (item, focusedWindow) => {
154 i18n.changeLanguage('zh', (err, t) => {
155 if (err) return log.error('something went wrong loading', err)
156 focusedWindow.webContents.send('lang', 'zh')
163 label: i18n.t('desktop.applicationMenu.view.langCodes.en'),
165 checked: currentLanguage === 'en',
166 click: (item, focusedWindow) => {
168 i18n.changeLanguage('en', (err, t) => {
169 if (err) return log.error('something went wrong loading', err)
170 focusedWindow.webContents.send('lang', 'en')
180 label: i18n.t('desktop.applicationMenu.view.label'),
182 label: i18n.t('desktop.applicationMenu.view.btmAmountUnit'),
186 checked: btmAmountUnit === 'BTM',
187 click: (item, focusedWindow) => {
189 focusedWindow.webContents.send('btmAmountUnitState', 'BTM')
195 checked: btmAmountUnit === 'mBTM',
196 click: (item, focusedWindow) => {
198 focusedWindow.webContents.send('btmAmountUnitState', 'mBTM')
204 checked: btmAmountUnit === 'NEU',
205 click: (item, focusedWindow) => {
207 focusedWindow.webContents.send('btmAmountUnitState', 'NEU')
212 label: i18n.t('desktop.applicationMenu.view.advNav'),
214 checked: advNav === 'advance',
215 click: (item, focusedWindow) => {
217 if(advNav === 'advance'){
218 focusedWindow.webContents.send('toggleNavState', 'normal')
220 focusedWindow.webContents.send('toggleNavState', 'advance')
227 label: i18n.t('desktop.applicationMenu.view.languages'),
228 submenu: LanguageMenu
232 const devToolsMenu =[]
234 label: i18n.t('desktop.applicationMenu.develop.devTools'),
235 accelerator: (() => {
236 if (process.platform === 'darwin') {
237 return 'Alt+Command+I'
239 return 'Ctrl+Shift+I'
242 click: (item, focusedWindow) => {
244 focusedWindow.toggleDevTools()
248 label: i18n.t('desktop.applicationMenu.develop.fullScreen'),
249 accelerator: (() => {
250 if (process.platform === 'darwin') {
251 return 'Ctrl+Command+F'
256 click: (item, focusedWindow) => {
258 focusedWindow.setFullScreen(!focusedWindow.isFullScreen())
262 label: i18n.t('desktop.applicationMenu.develop.logFiles'),
265 shell.showItemInFolder(path.join(app.getPath('userData'), 'logs', 'bytomd', 'bytomd.log'))
273 label: (global.mining.isMining) ? i18n.t('desktop.applicationMenu.develop.stopMining') : i18n.t('desktop.applicationMenu.develop.startMining'),
274 accelerator: 'CommandOrControl+Shift+M',
276 click: (item, focusedWindow) => {
278 if (global.mining.isMining) {
279 stopMining(focusedWindow)
281 startMining(focusedWindow)
288 label: i18n.t('desktop.applicationMenu.develop.label'),
289 submenu: devToolsMenu,
294 const logo = nativeImage.createFromPath( path.join(__dirname, '../../static/images/app-icon/png/app-logo.png'))
296 if (process.platform === 'freebsd' || process.platform === 'linux' ||
297 process.platform === 'sunos' || process.platform === 'win32') {
300 label: i18n.t('desktop.applicationMenu.app.about', { app: name }),
303 title: `${i18n.t('desktop.applicationMenu.app.about')} ${name}`,
304 message: `${name} \n\n${i18n.t('desktop.applicationMenu.help.version')}: ${app.getVersion()}\nLicense: AGPL-3.0-only`,
305 buttons: [i18n.t('desktop.global.ok')],
308 dialog.showMessageBox( options )
315 label: i18n.t('desktop.applicationMenu.help.bytomWiki'),
317 shell.openExternal('https://github.com/bytom/bytom/wiki')
320 label: i18n.t('desktop.applicationMenu.help.reportBug'),
322 shell.openExternal('https://github.com/bytom/bytom/issues')
327 label: i18n.t('desktop.applicationMenu.help.label'),
335 const startMining = (focusedWindow) => {
336 focusedWindow.webContents.send('mining', 'true')
337 global.mining.isMining = true
341 const stopMining = (focusedWindow) => {
342 focusedWindow.webContents.send('mining', 'false')
343 global.mining.isMining = false
347 const createMenu = function () {
348 menu = Menu.buildFromTemplate(menuTempl())
349 Menu.setApplicationMenu(menu)
352 settings.watch('browserSetting.app.navAdvancedState', newValue => {
354 menu.items[3].submenu.items[1].checked = ( advNav === 'advance' )
357 settings.watch('browserSetting.core.btmAmountUnit', newValue => {
358 btmAmountUnit = newValue
359 menu.items[3].submenu.items[0].submenu.items[0].checked = ( btmAmountUnit === 'BTM' )
360 menu.items[3].submenu.items[0].submenu.items[1].checked = ( btmAmountUnit === 'mBTM' )
361 menu.items[3].submenu.items[0].submenu.items[2].checked = ( btmAmountUnit === 'NEU' )
364 settings.watch('browserSetting.core.lang', newValue => {
365 i18n.changeLanguage(newValue, (err, t) => {
366 if (err) return log.error('i18n: something went wrong loading', err)
371 ipcMain.on('refresh-menu', function() {
375 module.exports = createMenu()