const { CompositeDisposable, Emitter } = require('atom'); const AboutView = require('./components/about-view'); // Deferred requires let shell; module.exports = class About { constructor(initialState) { this.subscriptions = new CompositeDisposable(); this.emitter = new Emitter(); this.state = initialState; this.views = { aboutView: null }; this.subscriptions.add( atom.workspace.addOpener(uriToOpen => { if (uriToOpen === this.state.uri) { return this.deserialize(); } }) ); this.subscriptions.add( atom.commands.add('atom-workspace', 'about:view-release-notes', () => { shell = shell || require('electron').shell; shell.openExternal( this.state.updateManager.getReleaseNotesURLForCurrentVersion() ); }) ); } destroy() { if (this.views.aboutView) this.views.aboutView.destroy(); this.views.aboutView = null; if (this.state.updateManager) this.state.updateManager.dispose(); this.setState({ updateManager: null }); this.subscriptions.dispose(); } setState(newState) { if (newState && typeof newState === 'object') { let { state } = this; this.state = Object.assign({}, state, newState); this.didChange(); } } didChange() { this.emitter.emit('did-change'); } onDidChange(callback) { this.emitter.on('did-change', callback); } deserialize(state) { if (!this.views.aboutView) { this.setState(state); this.views.aboutView = new AboutView({ uri: this.state.uri, updateManager: this.state.updateManager, currentAtomVersion: this.state.currentAtomVersion, currentElectronVersion: this.state.currentElectronVersion, currentChromeVersion: this.state.currentChromeVersion, currentNodeVersion: this.state.currentNodeVersion, availableVersion: this.state.updateManager.getAvailableVersion() }); this.handleStateChanges(); } return this.views.aboutView; } handleStateChanges() { this.onDidChange(() => { if (this.views.aboutView) { this.views.aboutView.update({ updateManager: this.state.updateManager, currentAtomVersion: this.state.currentAtomVersion, currentElectronVersion: this.state.currentElectronVersion, currentChromeVersion: this.state.currentChromeVersion, currentNodeVersion: this.state.currentNodeVersion, availableVersion: this.state.updateManager.getAvailableVersion() }); } }); this.state.updateManager.onDidChange(() => { this.didChange(); }); } };