const etch = require('etch') const EtchComponent = require('../etch-component') const UpdateManager = require('../update-manager') const $ = etch.dom module.exports = class UpdateView extends EtchComponent { constructor (props) { super(props) if ( this.props.updateManager.getAutoUpdatesEnabled() && this.props.updateManager.getState() === UpdateManager.State.Idle ) { this.props.updateManager.checkForUpdate() } } handleAutoUpdateCheckbox (e) { atom.config.set('core.automaticallyUpdate', e.target.checked) } shouldUpdateActionButtonBeDisabled () { let { state } = this.props.updateManager return ( state === UpdateManager.State.CheckingForUpdate || state === UpdateManager.State.DownloadingUpdate ) } executeUpdateAction () { if ( this.props.updateManager.state === UpdateManager.State.UpdateAvailableToInstall ) { this.props.updateManager.restartAndInstallUpdate() } else { this.props.updateManager.checkForUpdate() } } renderUpdateStatus () { let updateStatus = '' switch (this.props.updateManager.state) { case UpdateManager.State.Idle: updateStatus = $.div( { className: 'about-updates-item is-shown about-default-update-message' }, this.props.updateManager.getAutoUpdatesEnabled() ? 'Atom will check for updates automatically' : 'Automatic updates are disabled please check manually' ) break case UpdateManager.State.CheckingForUpdate: updateStatus = $.div( { className: 'about-updates-item app-checking-for-updates' }, $.span( { className: 'about-updates-label icon icon-search' }, 'Checking for updates...' ) ) break case UpdateManager.State.DownloadingUpdate: updateStatus = $.div( { className: 'about-updates-item app-downloading-update' }, $.span({ className: 'loading loading-spinner-tiny inline-block' }), $.span({ className: 'about-updates-label' }, 'Downloading update') ) break case UpdateManager.State.UpdateAvailableToInstall: updateStatus = $.div( { className: 'about-updates-item app-update-available-to-install' }, $.span( { className: 'about-updates-label icon icon-squirrel' }, 'New update' ), $.span( { className: 'about-updates-version' }, this.props.availableVersion ), $.a( { className: 'about-updates-release-notes', onclick: this.props.viewUpdateReleaseNotes }, 'Release Notes' ) ) break case UpdateManager.State.UpToDate: updateStatus = $.div( { className: 'about-updates-item app-up-to-date' }, $.span({ className: 'icon icon-check' }), $.span( { className: 'about-updates-label is-strong' }, 'Atom is up to date!' ) ) break case UpdateManager.State.Unsupported: updateStatus = $.div( { className: 'about-updates-item app-unsupported' }, $.span( { className: 'about-updates-label is-strong' }, 'Your system does not support automatic updates' ), $.a( { className: 'about-updates-instructions', onclick: this.props.viewUpdateInstructions }, 'How to update' ) ) break case UpdateManager.State.Error: updateStatus = $.div( { className: 'about-updates-item app-update-error' }, $.span({ className: 'icon icon-x' }), $.span( { className: 'about-updates-label app-error-message is-strong' }, this.props.updateManager.getErrorMessage() ) ) break } return updateStatus } render () { return $.div( { className: 'about-updates group-start' }, $.div( { className: 'about-updates-box' }, $.div({ className: 'about-updates-status' }, this.renderUpdateStatus()), $.button( { className: 'btn about-update-action-button', disabled: this.shouldUpdateActionButtonBeDisabled(), onclick: this.executeUpdateAction.bind(this), style: { display: this.props.updateManager.state === UpdateManager.State.Unsupported ? 'none' : 'block' } }, this.props.updateManager.state === 'update-available' ? 'Restart and install' : 'Check now' ) ), $.div( { className: 'about-auto-updates', style: { display: this.props.updateManager.state === UpdateManager.State.Unsupported ? 'none' : 'block' } }, $.label( {}, $.input({ className: 'input-checkbox', type: 'checkbox', checked: this.props.updateManager.getAutoUpdatesEnabled(), onchange: this.handleAutoUpdateCheckbox.bind(this) }), $.span({}, 'Automatically download updates') ) ) ) } }