diff --git a/src/keymap.js b/src/keymap.js index 69e7ade..b56228c 100644 --- a/src/keymap.js +++ b/src/keymap.js @@ -1,43 +1,61 @@ 'use strict'; -const {globalShortcut} = require('electron'); -const {shortcutKeys} = require('./config'); +const { globalShortcut } = require('electron'); +const ShortcutConfig = require('./ShortcutConfig'); +const ShortcutAction = require('./ShortcutAction'); const win = require('./win'); - -const {log} = console; +const { shortcutKeys } = require('./config'); class Keymap { - setAcc(custom, predefined) { - if (Object.prototype.hasOwnProperty.call(shortcutKeys, custom)) { - return shortcutKeys[custom]; - } - - return predefined; - } - registerGlobal() { const toggleAo = globalShortcut.register( - this.setAcc('global-toggle-window', 'CmdorCtrl+Alt+A'), () => { - win.toggle(); - }); + ShortcutConfig.get('global-toggle-window', 'CmdorCtrl+Alt+A'), + ShortcutAction.toggleWindow + ); const searchTodo = globalShortcut.register( - this.setAcc('global-search-todo', 'CmdorCtrl+Alt+F'), () => { - win.appear(); - win.activate('search'); - }); + ShortcutConfig.get('global-search-todo', 'CmdorCtrl+Alt+F'), + ShortcutAction.openSearch + ); const createTodo = globalShortcut.register( - this.setAcc('global-create-todo', 'CmdorCtrl+Alt+C'), () => { - win.appear(); - win.activate('new-todo'); - }); - - if (toggleAo && searchTodo && createTodo) { - log('Successfully registered global shortcut keys'); - } else { - log('Global shortcut keys registration failed'); - } + ShortcutConfig.get('global-create-todo', 'CmdorCtrl+Alt+C'), + ShortcutAction.createTodo + ); + + const success = toggleAo && searchTodo && createTodo; + + console.log(success + ? 'Successfully registered global shortcut keys' + : 'Global shortcut keys registration failed'); + } +} + +class ShortcutConfig { + static get(custom, fallback) { + return shortcutKeys.hasOwnProperty(custom) ? shortcutKeys[custom] : fallback; } } -module.exports = new Keymap(); + +class ShortcutAction { + static toggleWindow() { + win.toggle(); + } + + static openSearch() { + win.appear(); + win.activate('search'); + } + + static createTodo() { + win.appear(); + win.activate('new-todo'); + } +} + + +module.exports = { + Keymap, + ShortcutConfig, + ShortcutAction +}; diff --git a/src/mode.js b/src/mode.js index 31d9229..a923cd8 100644 --- a/src/mode.js +++ b/src/mode.js @@ -1,59 +1,68 @@ 'use strict'; const settings = require('./settings'); const time = require('./time'); +const ManualMode = require('./ManualMode'); -class Mode { - _toggle(mode) { +class ModeRestorer { + restore() { const modes = settings.get('mode'); Object.keys(modes).forEach(x => { - settings.set(`mode.${x}`, (x === mode) ? !modes[x] : false); - document.documentElement.classList.toggle(`${x}-mode`, settings.get(`mode.${x}`)); + if (modes[x]) { + document.documentElement.classList.toggle(`${x}-mode`, modes[x]); + } }); } +} - _enableAutoNight() { + +class AutoNightMode { + enable() { if (time.isDaytime()) { - this._toggle(null); + ManualMode.toggle(null); } else if (!settings.get('mode.dark')) { - this._toggle('dark'); + ManualMode.toggle('dark'); } setTimeout(() => { if (settings.get('autoNightMode')) { - return this._enableAutoNight(); + this.enable(); } }, time.ms(time.transitionSpan())); } - _disableAutoNight() { - this._toggle(null); + disable() { + ManualMode.toggle(null); } autoNight() { - return settings.get('autoNightMode') ? this._enableAutoNight() : this._disableAutoNight(); + return settings.get('autoNightMode') ? this.enable() : this.disable(); } +} - black() { - this._toggle('black'); +class ManualMode { + toggle(mode) { + const modes = settings.get('mode'); + Object.keys(modes).forEach(x => { + settings.set(`mode.${x}`, (x === mode) ? !modes[x] : false); + document.documentElement.classList.toggle(`${x}-mode`, settings.get(`mode.${x}`)); + }); } - dark() { - this._toggle('dark'); + black() { + this.toggle('black'); } - restore() { - const modes = settings.get('mode'); - - Object.keys(modes).forEach(x => { - if (modes[x]) { - document.documentElement.classList.toggle(`${x}-mode`, modes[x]); - } - }); + dark() { + this.toggle('dark'); } sepia() { - this._toggle('sepia'); + this.toggle('sepia'); } } -module.exports = new Mode(); +module.exports = { + ManualMode, + AutoNightMode, + ModeRestorer +}; diff --git a/src/startup.js b/src/startup.js index 9cd1a6d..906b81a 100644 --- a/src/startup.js +++ b/src/startup.js @@ -1,41 +1,53 @@ 'use strict'; -const {app, remote} = require('electron'); -const AutoLaunch = require('auto-launch'); -const {is} = require('./util'); const settings = require('./settings'); +const AutoLauncherLib = require('auto-launch'); +const config = require('./AutoLaunchConfig'); +const { app, remote } = require('electron'); +const { is } = require('./util'); -const _settings = { - name: 'Ao', - path: is.darwin ? (app || remote.app).getPath('exe').replace(/\.app\/Content.*/, '.app') : undefined, - isHidden: true -}; +const appPath = is.darwin + ? (app || remote.app).getPath('exe').replace(/\.app\/Content.*/, '.app') + : undefined; + +class StartupManager { + constructor() { + this.launcher = new AutoLauncher(config); + } + + autoLaunch() { + if (settings.get('autoLaunch')) { + this.launcher.enable(); + } else { + this.launcher.disable(); + } + } +} -class Startup { +class AutoLauncher { constructor(settings) { - this._launcher = new AutoLaunch(settings); + this._launcher = new AutoLauncherLib(settings); } - async _activate() { + async enable() { const enabled = await this._launcher.isEnabled(); if (!enabled) { return this._launcher.enable(); } } - async _deactivate() { + async disable() { const enabled = await this._launcher.isEnabled(); if (enabled) { return this._launcher.disable(); } } - - autoLaunch() { - if (settings.get('autoLaunch')) { - this._activate(); - } else { - this._deactivate(); - } - } } -module.exports = new Startup(_settings); + +module.exports = { + name: 'Ao', + path: appPath, + isHidden: true, + StartupManager, + AutoLauncher +}; diff --git a/src/time.js b/src/time.js index 6aad183..a48e429 100644 --- a/src/time.js +++ b/src/time.js @@ -1,23 +1,32 @@ 'use strict'; -class Time { - hours() { - return new Date().getHours(); +class TimeHelper { + static isDaytime() { + const hs = SystemClock.getHours(); + return hs < 18 && hs > 6; } - isDaytime() { - const hs = this.hours(); - return hs < 18 && hs > 6; + static transitionSpan() { + const hs = SystemClock.getHours(); + return this.isDaytime() ? 18 - hs : (hs < 6 ? 6 - hs : 30 - hs); } +} - ms(hours) { +class TimeConverter { + static hoursToMs(hours) { return 1000 * 60 * 60 * parseInt(hours, 10); } +} - transitionSpan() { - const hs = this.hours(); - return this.isDaytime() ? 18 - hs : (hs < 6 ? 6 - hs : 30 - hs); +class SystemClock { + static getHours() { + return new Date().getHours(); } } -module.exports = new Time(); + +module.exports = { + TimeHelper, + TimeConverter, + SystemClock +}; diff --git a/src/tray.js b/src/tray.js index 3de7584..c31dbef 100644 --- a/src/tray.js +++ b/src/tray.js @@ -1,11 +1,14 @@ 'use strict'; const electron = require('electron'); -const {is} = require('./util'); -const file = require('./file'); -const template = require('./menu/tray'); +const { is } = require('./util'); +const TrayConfig = require('./TrayConfig'); +const TrayTemplate = require('./TrayTemplate'); +const TrayClickHandler = require('./TrayClickHandler'); const win = require('./win'); - -const {app, Menu} = electron; +const { Menu } = require('electron'); +const template = require('./menu/tray'); +const { app } = require('electron'); +const file = require('./file'); class Tray { constructor() { @@ -13,15 +16,42 @@ class Tray { } create() { - if (is.darwin) { - return; - } - - this._tray = new electron.Tray(file.trayIcon); - this._tray.setToolTip(app.getName()); - this._tray.setContextMenu(Menu.buildFromTemplate(template)); - this._tray.on('click', win.toggle); + if (is.darwin) return; + + this._tray = new electron.Tray(TrayConfig.getIcon()); + this._tray.setToolTip(TrayConfig.getTooltip()); + this._tray.setContextMenu(TrayTemplate.buildMenu()); + this._tray.on('click', TrayClickHandler.handleClick); + } +} + +class TrayConfig { + static getIcon() { + return file.trayIcon; + } + + static getTooltip() { + return app.getName(); + } +} + + +class TrayTemplate { + static buildMenu() { + return Menu.buildFromTemplate(template); + } +} + + +class TrayClickHandler { + static handleClick() { + win.toggle(); } } -module.exports = new Tray(); +module.exports = { + TrayTemplate, + TrayClickHandler, + TrayConfig, + Tray +};