import { Tray, Menu, nativeImage } from 'electron' import path from 'path' import ms from 'ms' import Banner from './banner' import Settings from './settings' export default class TrayUtility { static tray: Tray | null = null static build() { const [paused, interval] = Settings.getStatus() const status = paused ? `Paused for: ${ms(interval)}` : `Next break: ${ms(interval)}` const template: Parameters[0] = [ { label: status, type: 'normal', enabled: false }, { type: 'separator' }, { label: 'Take a break now', type: 'normal', click: () => Banner.open(), }, ] template.push( paused ? { label: 'Break pause', click: () => { Settings.save('paused', 0) this.build() }, } : { label: 'Pause for...', submenu: Menu.buildFromTemplate( // Minutes to pause [10, 30, 60, 120, 360] .map((minutes) => minutes * 60 * 1000) .map((time) => ({ label: ms(time), click: () => { Settings.save('paused', Date.now() + time) this.build() }, })) ), } ) template.push( { label: 'Settings', click: () => Settings.open() }, { type: 'separator' }, { label: 'Quit', role: 'quit' } ) const menu = Menu.buildFromTemplate(template) this.tray?.setContextMenu(menu) } static init() { if (!this.tray) { const file = path.join(__dirname, '../../assets/tray.png') const resized = nativeImage.createFromPath(file).resize({ width: 24, height: 24 }) resized.setTemplateImage(true) resized.isMacTemplateImage = true this.tray = new Tray(resized) this.build() } } }