diff --git a/apps/desktop/dev-app-update.yml b/apps/desktop/dev-app-update.yml index 835cb1d58..f1b406b0b 100644 --- a/apps/desktop/dev-app-update.yml +++ b/apps/desktop/dev-app-update.yml @@ -1,2 +1,3 @@ provider: generic -url: http://localhost:8080 +url: http://localhost:8080/ +updaterCacheDirName: mqttx-updater diff --git a/apps/desktop/electron-builder.yml b/apps/desktop/electron-builder.yml index 89ca3b708..14f9d64cf 100644 --- a/apps/desktop/electron-builder.yml +++ b/apps/desktop/electron-builder.yml @@ -70,4 +70,4 @@ npmRebuild: false publish: provider: generic # TODO: change to our own server - url: http://localhost:8080 + url: http://localhost:8080/ diff --git a/apps/desktop/src/main/update.ts b/apps/desktop/src/main/update.ts index 2fa564e99..84bd36fe7 100644 --- a/apps/desktop/src/main/update.ts +++ b/apps/desktop/src/main/update.ts @@ -67,6 +67,12 @@ function useAppUpdater() { ipcMain.handle('check-for-updates', async () => { return await autoUpdater.checkForUpdates() }) + ipcMain.handle('download-update', async () => { + return await autoUpdater.downloadUpdate() + }) + ipcMain.handle('install-update', async () => { + autoUpdater.quitAndInstall() + }) } export { useAppUpdater } diff --git a/apps/desktop/src/preload/index.d.ts b/apps/desktop/src/preload/index.d.ts index 81d323dfa..be0139c23 100644 --- a/apps/desktop/src/preload/index.d.ts +++ b/apps/desktop/src/preload/index.d.ts @@ -7,8 +7,10 @@ declare global { electron: ElectronAPI api: { execute: (...args: any[]) => Promise - checkForUpdates: () => Promise onUpdateStatus: (callback: (event: Electron.IpcRendererEvent, updateEvent: UpdateEvent) => void) => void + checkForUpdates: () => Promise + downloadUpdate: () => Promise + installUpdate: () => Promise } } } diff --git a/apps/desktop/src/preload/index.ts b/apps/desktop/src/preload/index.ts index ef4cbc653..6cb1e38c5 100644 --- a/apps/desktop/src/preload/index.ts +++ b/apps/desktop/src/preload/index.ts @@ -4,10 +4,12 @@ import { contextBridge, ipcRenderer } from 'electron' // Custom APIs for renderer const api = { execute: (...args) => ipcRenderer.invoke('db:execute', ...args), - checkForUpdates: () => ipcRenderer.invoke('check-for-updates'), onUpdateStatus: callback => ipcRenderer.on('update-status', (event, status, data) => { callback(event, { status, data }) }), + checkForUpdates: () => ipcRenderer.invoke('check-for-updates'), + downloadUpdate: () => ipcRenderer.invoke('download-update'), + installUpdate: () => ipcRenderer.invoke('install-update'), } // Use `contextBridge` APIs to expose Electron APIs to diff --git a/apps/desktop/src/renderer/components.d.ts b/apps/desktop/src/renderer/components.d.ts index f21381ef3..2ec4bee26 100644 --- a/apps/desktop/src/renderer/components.d.ts +++ b/apps/desktop/src/renderer/components.d.ts @@ -37,6 +37,7 @@ declare module 'vue' { ElMain: typeof import('element-plus/es')['ElMain'] ElOption: typeof import('element-plus/es')['ElOption'] ElPopover: typeof import('element-plus/es')['ElPopover'] + ElProgress: typeof import('element-plus/es')['ElProgress'] ElRow: typeof import('element-plus/es')['ElRow'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] @@ -47,9 +48,7 @@ declare module 'vue' { RouterView: typeof import('vue-router')['RouterView'] SettingsView: typeof import('./../../../../packages/ui/src/components/SettingsView.vue')['default'] UpdateAvailable: typeof import('./src/components/update/Available.vue')['default'] + UpdateDownloadProgress: typeof import('./src/components/update/DownloadProgress.vue')['default'] UpdateView: typeof import('./src/components/update/View.vue')['default'] } - export interface ComponentCustomProperties { - vLoading: typeof import('element-plus/es')['ElLoadingDirective'] - } } diff --git a/apps/desktop/src/renderer/src/components/update/Available.vue b/apps/desktop/src/renderer/src/components/update/Available.vue index 96526c285..34933b3e9 100644 --- a/apps/desktop/src/renderer/src/components/update/Available.vue +++ b/apps/desktop/src/renderer/src/components/update/Available.vue @@ -19,8 +19,7 @@ function remindLater() { } function downloadUpdate() { - // TODO: download update - // window.api.downloadUpdate() + window.api.downloadUpdate() dialogVisible.value = false } diff --git a/apps/desktop/src/renderer/src/components/update/DownloadProgress.vue b/apps/desktop/src/renderer/src/components/update/DownloadProgress.vue new file mode 100644 index 000000000..b11367180 --- /dev/null +++ b/apps/desktop/src/renderer/src/components/update/DownloadProgress.vue @@ -0,0 +1,43 @@ + + + diff --git a/apps/desktop/src/renderer/src/components/update/View.vue b/apps/desktop/src/renderer/src/components/update/View.vue index 73e3eab98..9f30c7693 100644 --- a/apps/desktop/src/renderer/src/components/update/View.vue +++ b/apps/desktop/src/renderer/src/components/update/View.vue @@ -8,6 +8,7 @@ const changelog = ref('') const downloadProgressDialogVisible = ref(false) const downloadProgress = ref(null) +const updateDownloaded = ref(false) window.api.onUpdateStatus((_event, updateEvent) => { const { status } = updateEvent @@ -24,6 +25,9 @@ window.api.onUpdateStatus((_event, updateEvent) => { } else if (status === 'download-progress') { downloadProgressDialogVisible.value = true downloadProgress.value = updateEvent.data + } else if (status === 'update-downloaded') { + downloadProgressDialogVisible.value = true + updateDownloaded.value = true } else if (status === 'error') { ElMessage({ message: updateEvent.data.message, @@ -48,4 +52,9 @@ onMounted(async () => { :version="version" :release-notes="changelog" /> +