Files
atom/packages/about/lib/update-manager.js
2018-08-21 15:27:37 -07:00

147 lines
3.7 KiB
JavaScript

const {Emitter, CompositeDisposable} = require('atom')
const Unsupported = 'unsupported'
const Idle = 'idle'
const CheckingForUpdate = 'checking'
const DownloadingUpdate = 'downloading'
const UpdateAvailableToInstall = 'update-available'
const UpToDate = 'no-update-available'
const ErrorState = 'error'
let UpdateManager = class UpdateManager {
constructor () {
this.emitter = new Emitter()
this.currentVersion = atom.getVersion()
this.availableVersion = atom.getVersion()
this.resetState()
this.listenForAtomEvents()
}
listenForAtomEvents () {
this.subscriptions = new CompositeDisposable()
this.subscriptions.add(
atom.autoUpdater.onDidBeginCheckingForUpdate(() => {
this.setState(CheckingForUpdate)
}),
atom.autoUpdater.onDidBeginDownloadingUpdate(() => {
this.setState(DownloadingUpdate)
}),
atom.autoUpdater.onDidCompleteDownloadingUpdate(({releaseVersion}) => {
this.setAvailableVersion(releaseVersion)
}),
atom.autoUpdater.onUpdateNotAvailable(() => {
this.setState(UpToDate)
}),
atom.autoUpdater.onUpdateError(() => {
this.setState(ErrorState)
}),
atom.config.observe('core.automaticallyUpdate', (value) => {
this.autoUpdatesEnabled = value
this.emitDidChange()
})
)
// TODO: When https://github.com/atom/electron/issues/4587 is closed we can add this support.
// atom.autoUpdater.onUpdateAvailable =>
// @find('.about-updates-item').removeClass('is-shown')
// @updateAvailable.addClass('is-shown')
}
dispose () {
this.subscriptions.dispose()
}
onDidChange (callback) {
return this.emitter.on('did-change', callback)
}
emitDidChange () {
this.emitter.emit('did-change')
}
getAutoUpdatesEnabled () {
return this.autoUpdatesEnabled && this.state !== UpdateManager.State.Unsupported
}
setAutoUpdatesEnabled (enabled) {
return atom.config.set('core.automaticallyUpdate', enabled)
}
getErrorMessage () {
return atom.autoUpdater.getErrorMessage()
}
getState () {
return this.state
}
setState (state) {
this.state = state
this.emitDidChange()
}
resetState () {
this.state = atom.autoUpdater.platformSupportsUpdates() ? atom.autoUpdater.getState() : Unsupported
this.emitDidChange()
}
getAvailableVersion () {
return this.availableVersion
}
setAvailableVersion (version) {
this.availableVersion = version
if (this.availableVersion !== this.currentVersion) {
this.state = UpdateAvailableToInstall
} else {
this.state = UpToDate
}
this.emitDidChange()
}
checkForUpdate () {
atom.autoUpdater.checkForUpdate()
}
restartAndInstallUpdate () {
atom.autoUpdater.restartAndInstallUpdate()
}
getReleaseNotesURLForCurrentVersion () {
return this.getReleaseNotesURLForVersion(this.currentVersion)
}
getReleaseNotesURLForAvailableVersion () {
return this.getReleaseNotesURLForVersion(this.availableVersion)
}
getReleaseNotesURLForVersion (appVersion) {
// Dev versions will not have a releases page
if (appVersion.indexOf('dev') > -1) {
return 'https://atom.io/releases'
}
if (!appVersion.startsWith('v')) {
appVersion = `v${appVersion}`
}
const releaseRepo = appVersion.indexOf('nightly') > -1 ? 'atom-nightly-releases' : 'atom'
return `https://github.com/atom/${releaseRepo}/releases/tag/${appVersion}`
}
}
UpdateManager.State = {
Unsupported: Unsupported,
Idle: Idle,
CheckingForUpdate: CheckingForUpdate,
DownloadingUpdate: DownloadingUpdate,
UpdateAvailableToInstall: UpdateAvailableToInstall,
UpToDate: UpToDate,
Error: ErrorState
}
module.exports = UpdateManager