Skip to content

Commit f44ace3

Browse files
authored
Merge pull request #523 from nextcloud/fix/noid/multiple-dialogs
Prevent opening the assistant dialog multiple times
2 parents 5b0b242 + f8b9b98 commit f44ace3

1 file changed

Lines changed: 20 additions & 3 deletions

File tree

src/assistant.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import Aura from '@primeuix/themes/aura'
1111

1212
window.assistantPollTimerId = null
1313

14-
// TODO add param to lock on specific task type
15-
1614
/**
1715
* Creates an assistant modal and return a promise which provides the result
1816
*
@@ -63,6 +61,12 @@ export async function openAssistantForm({
6361
const selectedTaskTypeId = taskType ?? (await getLastSelectedTaskType())?.data
6462

6563
return new Promise((resolve, reject) => {
64+
if (OCA.Assistant.isAssistantDialogOpen) {
65+
reject(new Error('Assistant dialog is already open'))
66+
return
67+
}
68+
OCA.Assistant.isAssistantDialogOpen = true
69+
6670
let modalMountPoint
6771
const content = document.querySelector('#content') ?? document.querySelector('#content-vue')
6872

@@ -121,6 +125,7 @@ export async function openAssistantForm({
121125
modalMountPoint.addEventListener('cancel', () => {
122126
cancelTaskPolling()
123127
app.unmount()
128+
OCA.Assistant.isAssistantDialogOpen = false
124129
reject(new Error('User cancellation'))
125130
})
126131
const syncSubmit = (inputs, taskTypeId, newTaskCustomId = '') => {
@@ -144,6 +149,7 @@ export async function openAssistantForm({
144149
if (finishedTask.status === TASK_STATUS_STRING.successful) {
145150
if (closeOnResult) {
146151
app.unmount()
152+
OCA.Assistant.isAssistantDialogOpen = false
147153
} else {
148154
view.outputs = finishedTask?.output
149155
}
@@ -305,6 +311,7 @@ export async function openAssistantForm({
305311
data.detail.button.onClick(lastTask)
306312
}
307313
app.unmount()
314+
OCA.Assistant.isAssistantDialogOpen = false
308315
})
309316
})
310317
}
@@ -487,7 +494,9 @@ export function handleNotification(event) {
487494
async function showAssistantTaskResult(taskId) {
488495
getTask(taskId).then(response => {
489496
console.debug('showing results for task', response.data?.ocs?.data?.task)
490-
openAssistantTask(response.data?.ocs?.data?.task, {})
497+
openAssistantTask(response.data?.ocs?.data?.task, {}).catch(error => {
498+
console.error(error.message)
499+
})
491500
}).catch(error => {
492501
if (error.response?.status === 401) {
493502
showError(t('assistant', 'Please log in to view the task result'))
@@ -516,6 +525,11 @@ export async function openAssistantTask(
516525
actionButtons = undefined,
517526
mountPoint = null,
518527
} = {}) {
528+
if (OCA.Assistant.isAssistantDialogOpen) {
529+
throw new Error('Assistant dialog is already open')
530+
}
531+
OCA.Assistant.isAssistantDialogOpen = true
532+
519533
const { createApp } = await import('vue')
520534
const { default: AssistantTextProcessingModal } = await import('./components/AssistantTextProcessingModal.vue')
521535

@@ -567,6 +581,7 @@ export async function openAssistantTask(
567581
modalMountPoint.addEventListener('cancel', () => {
568582
cancelTaskPolling()
569583
app.unmount()
584+
OCA.Assistant.isAssistantDialogOpen = false
570585
})
571586
modalMountPoint.addEventListener('submit', (data) => {
572587
scheduleTask(task.appId, task.identifier ?? '', data.detail.selectedTaskTypeId, data.detail.inputs)
@@ -575,6 +590,7 @@ export async function openAssistantTask(
575590
})
576591
.catch(error => {
577592
app.unmount()
593+
OCA.Assistant.isAssistantDialogOpen = false
578594
console.error('Assistant scheduling error', error)
579595
showError(
580596
t('assistant', 'Assistant failed to schedule your task')
@@ -754,6 +770,7 @@ export async function openAssistantTask(
754770
data.detail.button.onClick(lastTask)
755771
}
756772
app.unmount()
773+
OCA.Assistant.isAssistantDialogOpen = false
757774
})
758775
}
759776

0 commit comments

Comments
 (0)