diff --git a/dashboard/src/components/app/Updates.vue b/dashboard/src/components/app/Updates.vue
index 73bacbda3..07735c41b 100644
--- a/dashboard/src/components/app/Updates.vue
+++ b/dashboard/src/components/app/Updates.vue
@@ -3,16 +3,19 @@
import { ref, onMounted, useTemplateRef } from 'vue';
import { marked } from 'marked';
import { Button, Switch, Dialog, Checkbox } from '@cloudron/pankow';
+import { ISTATES } from '../../constants.js';
import SettingsItem from '../SettingsItem.vue';
import AppsModel from '../../models/AppsModel.js';
import UpdaterModel from '../../models/UpdaterModel.js';
import ProfileModel from '../../models/ProfileModel.js';
+import TasksModel from '../../models/TasksModel.js';
const props = defineProps([ 'app' ]);
const appsModel = AppsModel.create();
const updaterModel = UpdaterModel.create();
const profileModel = ProfileModel.create();
+const tasksModel = TasksModel.create();
const dialog = useTemplateRef('dialog');
const update = ref(null);
@@ -36,6 +39,21 @@ async function onAutoUpdatesEnabledChange(value) {
autoUpdatesEnabledBusy.value = false;
}
+async function waitForTask(id) {
+ if (!id) return;
+
+ const [error, result] = await tasksModel.get(id);
+ if (error) return console.error(error);
+
+ // task done, refresh menu
+ if (!result.active) {
+ await onCheck();
+ return;
+ }
+
+ setTimeout(waitForTask.bind(null, id), 2000);
+}
+
async function onCheck() {
busyCheck.value = true;
@@ -54,7 +72,7 @@ async function onUpdate() {
busyUpdate.value = true;
updateError.value = '';
- let [error] = await appsModel.update(props.app.id, update.value.manifest, skipBackup.value);
+ const [error, result] = await appsModel.update(props.app.id, update.value.manifest, skipBackup.value);
if (error) {
busyUpdate.value = false;
if (error.status === 400) updateError.value = error.body ? error.body.message : 'Internal error';
@@ -65,8 +83,7 @@ async function onUpdate() {
dialog.value.close();
- [error] = await appsModel.checkUpdate(props.app.id);
- if (error) return console.error(error);
+ waitForTask(result);
}
function onAskUpdate() {
@@ -142,7 +159,7 @@ onMounted(async () => {
-
+
diff --git a/dashboard/src/models/AppsModel.js b/dashboard/src/models/AppsModel.js
index 5fc287279..598291830 100644
--- a/dashboard/src/models/AppsModel.js
+++ b/dashboard/src/models/AppsModel.js
@@ -342,7 +342,7 @@ function create() {
}
if (result.status !== 202) return [result];
- return [null];
+ return [null, result.body.taskId];
},
async backups(id) {
// we fetch probably enough to avoid pagination
diff --git a/dashboard/src/views/AppConfigureView.vue b/dashboard/src/views/AppConfigureView.vue
index 7daad2378..228f26ae8 100644
--- a/dashboard/src/views/AppConfigureView.vue
+++ b/dashboard/src/views/AppConfigureView.vue
@@ -159,7 +159,7 @@ function isViewEnabled(view, errorState) {
return errorState === ISTATES.PENDING_SERVICES_CHANGE;
} else if (view === 'email') {
return errorState === ISTATES.PENDING_SERVICES_CHANGE;
- } else if (view === 'update') {
+ } else if (view === 'updates') {
return errorState === ISTATES.PENDING_UPDATE;
}