From b9f07d7f65350d2ca45480c76e6295ed583dbdab Mon Sep 17 00:00:00 2001
From: Dani Palou <dani@moodle.com>
Date: Thu, 9 May 2024 13:23:48 +0200
Subject: [PATCH] MOBILE-4470 quiz: Fix auto save popover not dismissed

---
 .../mod/data/components/action/action.ts      |  2 +-
 src/addons/mod/quiz/classes/auto-save.ts      |  2 +-
 .../module-completion/module-completion.ts    |  2 +-
 src/core/services/utils/dom.ts                | 26 ++++++++++++++-----
 4 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/src/addons/mod/data/components/action/action.ts b/src/addons/mod/data/components/action/action.ts
index 3d631249e..9105af4ab 100644
--- a/src/addons/mod/data/components/action/action.ts
+++ b/src/addons/mod/data/components/action/action.ts
@@ -200,7 +200,7 @@ export class AddonModDataActionComponent implements OnInit {
             });
         }
 
-        await CoreDomUtils.openPopover({
+        await CoreDomUtils.openPopoverWithoutResult({
             component: AddonModDataActionsMenuComponent,
             componentProps: { items },
             id: 'actionsmenu-popover',
diff --git a/src/addons/mod/quiz/classes/auto-save.ts b/src/addons/mod/quiz/classes/auto-save.ts
index bda15664a..bbe94a4c8 100644
--- a/src/addons/mod/quiz/classes/auto-save.ts
+++ b/src/addons/mod/quiz/classes/auto-save.ts
@@ -197,7 +197,7 @@ export class AddonModQuizAutoSave {
         };
         this.popoverShown = true;
 
-        this.popover = await CoreDomUtils.openPopover({
+        this.popover = await CoreDomUtils.openPopoverWithoutResult({
             component: AddonModQuizConnectionErrorComponent,
             event: <Event> event,
         });
diff --git a/src/core/features/course/components/module-completion/module-completion.ts b/src/core/features/course/components/module-completion/module-completion.ts
index eaf008b04..dccb6d573 100644
--- a/src/core/features/course/components/module-completion/module-completion.ts
+++ b/src/core/features/course/components/module-completion/module-completion.ts
@@ -131,7 +131,7 @@ export class CoreCourseModuleCompletionComponent
                 target = target.parentElement;
             }
 
-            CoreDomUtils.openPopover({
+            CoreDomUtils.openPopoverWithoutResult({
                 component: CoreCourseModuleCompletionDetailsComponent,
                 componentProps: {
                     completion: this.completion,
diff --git a/src/core/services/utils/dom.ts b/src/core/services/utils/dom.ts
index 7ecded4ce..ccf004160 100644
--- a/src/core/services/utils/dom.ts
+++ b/src/core/services/utils/dom.ts
@@ -548,7 +548,7 @@ export class CoreDomUtilsProvider {
             el.addEventListener('click', async (ev: Event) => {
                 const html = el.getAttribute('data-html');
 
-                await CoreDomUtils.openPopover({
+                await CoreDomUtils.openPopoverWithoutResult({
                     component: CoreBSTooltipComponent,
                     componentProps: {
                         content,
@@ -1534,7 +1534,7 @@ export class CoreDomUtilsProvider {
     }
 
     /**
-     * Opens a popover.
+     * Opens a popover and waits for it to be dismissed to return the result.
      *
      * @param options Options.
      * @returns Promise resolved when the popover is dismissed or will be dismissed.
@@ -1542,7 +1542,22 @@ export class CoreDomUtilsProvider {
     async openPopover<T = void>(options: OpenPopoverOptions): Promise<T | undefined> {
 
         const { waitForDismissCompleted, ...popoverOptions } = options;
-        const popover = await PopoverController.create(popoverOptions);
+        const popover = await this.openPopoverWithoutResult(popoverOptions);
+
+        const result = waitForDismissCompleted ? await popover.onDidDismiss<T>() : await popover.onWillDismiss<T>();
+        if (result?.data) {
+            return result?.data;
+        }
+    }
+
+    /**
+     * Opens a popover.
+     *
+     * @param options Options.
+     * @returns Promise resolved when the popover is displayed.
+     */
+    async openPopoverWithoutResult(options: Omit<PopoverOptions, 'showBackdrop'>): Promise<HTMLIonPopoverElement> {
+        const popover = await PopoverController.create(options);
         const zoomLevel = await CoreConfig.get(CoreConstants.SETTINGS_ZOOM_LEVEL, CoreConstants.CONFIG.defaultZoomLevel);
 
         await popover.present();
@@ -1559,10 +1574,7 @@ export class CoreDomUtilsProvider {
             }
         }
 
-        const result = waitForDismissCompleted ? await popover.onDidDismiss<T>() : await popover.onWillDismiss<T>();
-        if (result?.data) {
-            return result?.data;
-        }
+        return popover;
     }
 
     /**