const { CompositeDisposable } = require('atom'); const semver = require('semver'); const UpdateManager = require('./update-manager'); const About = require('./about'); const StatusBarView = require('./components/about-status-bar'); let updateManager; // The local storage key for the available update version. const AvailableUpdateVersion = 'about:version-available'; const AboutURI = 'atom://about'; module.exports = { activate() { this.subscriptions = new CompositeDisposable(); this.createModel(); let availableVersion = window.localStorage.getItem(AvailableUpdateVersion); if ( atom.getReleaseChannel() === 'dev' || (availableVersion && semver.lte(availableVersion, atom.getVersion())) ) { this.clearUpdateState(); } this.subscriptions.add( updateManager.onDidChange(() => { if ( updateManager.getState() === UpdateManager.State.UpdateAvailableToInstall ) { window.localStorage.setItem( AvailableUpdateVersion, updateManager.getAvailableVersion() ); this.showStatusBarIfNeeded(); } }) ); this.subscriptions.add( atom.commands.add('atom-workspace', 'about:clear-update-state', () => { this.clearUpdateState(); }) ); }, deactivate() { this.model.destroy(); if (this.statusBarTile) this.statusBarTile.destroy(); if (updateManager) { updateManager.dispose(); updateManager = undefined; } }, clearUpdateState() { window.localStorage.removeItem(AvailableUpdateVersion); }, consumeStatusBar(statusBar) { this.statusBar = statusBar; this.showStatusBarIfNeeded(); }, deserializeAboutView(state) { if (!this.model) { this.createModel(); } return this.model.deserialize(state); }, createModel() { updateManager = updateManager || new UpdateManager(); this.model = new About({ uri: AboutURI, currentAtomVersion: atom.getVersion(), currentElectronVersion: process.versions.electron, currentChromeVersion: process.versions.chrome, currentNodeVersion: process.version, updateManager: updateManager }); }, isUpdateAvailable() { let availableVersion = window.localStorage.getItem(AvailableUpdateVersion); return availableVersion && semver.gt(availableVersion, atom.getVersion()); }, showStatusBarIfNeeded() { if (this.isUpdateAvailable() && this.statusBar) { let statusBarView = new StatusBarView(); if (this.statusBarTile) { this.statusBarTile.destroy(); } this.statusBarTile = this.statusBar.addRightTile({ item: statusBarView, priority: -100 }); return this.statusBarTile; } } };