diff --git a/package.json b/package.json index 4a7140a8..a69369cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "impro", - "version": "0.20.0", + "version": "0.20.1", "type": "module", "scripts": { "start": "rm -rf \"${BUILD_DIR:-build}\" && NODE_ENV=development eleventy --serve", diff --git a/src/js/components/account-switcher-dialog.js b/src/js/components/account-switcher-dialog.js index d9cd800c..39488cb9 100644 --- a/src/js/components/account-switcher-dialog.js +++ b/src/js/components/account-switcher-dialog.js @@ -92,7 +92,7 @@ class AccountSwitcherDialog extends Component { data-testid="account-switcher-dialog" @click=${(event) => { if ( - event.target.tagName === "DIALOG" && + event.target === event.currentTarget && this.state.$pendingAction.get() === null ) { this.close(); diff --git a/src/js/components/add-to-lists-dialog.js b/src/js/components/add-to-lists-dialog.js index 4506b999..f9069ba2 100644 --- a/src/js/components/add-to-lists-dialog.js +++ b/src/js/components/add-to-lists-dialog.js @@ -103,7 +103,7 @@ class AddToListsDialog extends Component { class="bottom-sheet add-to-lists-dialog" data-testid="add-to-lists-dialog" @click=${(event) => { - if (event.target.tagName === "DIALOG") { + if (event.target === event.currentTarget) { this.close(); } }} diff --git a/src/js/components/animated-sidebar.js b/src/js/components/animated-sidebar.js index e518ac6a..89374931 100644 --- a/src/js/components/animated-sidebar.js +++ b/src/js/components/animated-sidebar.js @@ -39,7 +39,7 @@ class AnimatedSidebar extends Component { html` { - if (event.target.tagName === "DIALOG") { + if (event.target === event.currentTarget) { this.close(); } }} diff --git a/src/js/components/context-menu.js b/src/js/components/context-menu.js index 342db01f..b20f61de 100644 --- a/src/js/components/context-menu.js +++ b/src/js/components/context-menu.js @@ -64,7 +64,7 @@ class ContextMenu extends Component { class="bottom-sheet context-menu" @click=${(e) => { // close the dialog if the user clicks outside of it - if (e.target.tagName === "DIALOG") { + if (e.target === e.currentTarget) { this.close(); } }} diff --git a/src/js/components/create-list-dialog.js b/src/js/components/create-list-dialog.js index d9445b64..db68ed85 100644 --- a/src/js/components/create-list-dialog.js +++ b/src/js/components/create-list-dialog.js @@ -78,7 +78,7 @@ class CreateListDialog extends Component { autofocus class="bottom-sheet bottom-sheet-fullscreen no-handle form-dialog create-list-dialog" @click=${async (event) => { - if (!isCropping && event.target.tagName === "DIALOG") { + if (!isCropping && event.target === event.currentTarget) { if (await this.confirmClose()) { this.close(); } diff --git a/src/js/components/drafts-dialog.js b/src/js/components/drafts-dialog.js index e4cb66e3..195370c7 100644 --- a/src/js/components/drafts-dialog.js +++ b/src/js/components/drafts-dialog.js @@ -232,7 +232,7 @@ class DraftsDialog extends Component { class="bottom-sheet bottom-sheet-stacked no-handle drafts-dialog" data-testid="drafts-dialog" @click=${(event) => { - if (event.target.tagName === "DIALOG") { + if (event.target === event.currentTarget) { this.close(); } }} diff --git a/src/js/components/edit-list-details-dialog.js b/src/js/components/edit-list-details-dialog.js index e1436f4d..a88cfa22 100644 --- a/src/js/components/edit-list-details-dialog.js +++ b/src/js/components/edit-list-details-dialog.js @@ -96,7 +96,7 @@ class EditListDetailsDialog extends Component { html` { - if (!isCropping && event.target.tagName === "DIALOG") { + if (!isCropping && event.target === event.currentTarget) { if (await this.confirmClose()) { this.close(); } diff --git a/src/js/components/edit-profile-dialog.js b/src/js/components/edit-profile-dialog.js index f605d2ee..937a67eb 100644 --- a/src/js/components/edit-profile-dialog.js +++ b/src/js/components/edit-profile-dialog.js @@ -106,7 +106,7 @@ class EditProfileDialog extends Component { html` { - if (!isCropping && event.target.tagName === "DIALOG") { + if (!isCropping && event.target === event.currentTarget) { if (await this.confirmClose()) { this.close(); } diff --git a/src/js/components/emoji-picker-dialog.js b/src/js/components/emoji-picker-dialog.js index 56116a41..73000e7c 100644 --- a/src/js/components/emoji-picker-dialog.js +++ b/src/js/components/emoji-picker-dialog.js @@ -41,7 +41,7 @@ class EmojiPickerDialog extends Component { dialog.addEventListener("emoji-click", this._handleEmojiClick); dialog.addEventListener("click", (event) => { // A click whose target is the dialog itself means the backdrop was clicked - if (event.target === dialog) { + if (event.target === event.currentTarget) { this.close(); } }); diff --git a/src/js/components/gif-picker-dialog.js b/src/js/components/gif-picker-dialog.js index 1fd32fc8..91ddf140 100644 --- a/src/js/components/gif-picker-dialog.js +++ b/src/js/components/gif-picker-dialog.js @@ -409,7 +409,7 @@ class GifPickerDialog extends Component { aria-label="GIF picker" autofocus @click=${(event) => { - if (event.target.tagName === "DIALOG") { + if (event.target === event.currentTarget) { this.close(); } }} diff --git a/src/js/components/image-alt-text-dialog.js b/src/js/components/image-alt-text-dialog.js index 1f340852..cc876685 100644 --- a/src/js/components/image-alt-text-dialog.js +++ b/src/js/components/image-alt-text-dialog.js @@ -54,7 +54,7 @@ class ImageAltTextDialog extends Component { class="image-alt-text-dialog bottom-sheet bottom-sheet-stacked" autofocus @click=${(e) => { - if (e.target.tagName === "DIALOG") { + if (e.target === e.currentTarget) { this.close(); } }} diff --git a/src/js/components/lightbox-image-group.js b/src/js/components/lightbox-image-group.js index e41f3ada..3413f76d 100644 --- a/src/js/components/lightbox-image-group.js +++ b/src/js/components/lightbox-image-group.js @@ -64,7 +64,7 @@ class LightboxDialog extends Component { class="lightbox" autofocus @click=${(e) => { - if (e.target.tagName === "DIALOG") { + if (e.target === e.currentTarget) { this.close(); } }} diff --git a/src/js/components/manage-list-members-dialog.js b/src/js/components/manage-list-members-dialog.js index cbd5dfa8..dd522642 100644 --- a/src/js/components/manage-list-members-dialog.js +++ b/src/js/components/manage-list-members-dialog.js @@ -178,7 +178,7 @@ class ManageListMembersDialog extends Component { data-testid="manage-list-members-dialog" autofocus @click=${(event) => { - if (event.target.tagName === "DIALOG") { + if (event.target === event.currentTarget) { this.close(); } }} diff --git a/src/js/components/new-chat-dialog.js b/src/js/components/new-chat-dialog.js index 1c1a6bdf..99c4ff97 100644 --- a/src/js/components/new-chat-dialog.js +++ b/src/js/components/new-chat-dialog.js @@ -165,7 +165,7 @@ class NewChatDialog extends Component { data-testid="new-chat-dialog" autofocus @click=${(event) => { - if (event.target.tagName === "DIALOG") { + if (event.target === event.currentTarget) { this.close(); } }} diff --git a/src/js/components/post-composer.js b/src/js/components/post-composer.js index 3a091747..a4ffa583 100644 --- a/src/js/components/post-composer.js +++ b/src/js/components/post-composer.js @@ -613,7 +613,7 @@ class PostComposer extends Component { class="post-composer bottom-sheet bottom-sheet-fullscreen no-handle" autofocus @click=${async (e) => { - if (e.target.tagName === "DIALOG") { + if (e.target === e.currentTarget) { if (await this.confirmClose()) { this.close(); } @@ -1446,7 +1446,8 @@ class PostComposer extends Component { !!el.closest("button") || el.tagName === "TEXTAREA" || el.isContentEditable || - !!el.closest("[contenteditable]"), + !!el.closest("[contenteditable]") || + !!el.closest("gif-picker-dialog"), disableWhenKeyboardOpen: true, }); diff --git a/src/js/components/post-notifications-dialog.js b/src/js/components/post-notifications-dialog.js index cf9f273a..fe75e3bd 100644 --- a/src/js/components/post-notifications-dialog.js +++ b/src/js/components/post-notifications-dialog.js @@ -35,7 +35,7 @@ class PostNotificationsDialog extends Component { { - if (event.target.tagName === "DIALOG") { + if (event.target === event.currentTarget) { this.close(); } }} diff --git a/src/js/components/reactions-dialog.js b/src/js/components/reactions-dialog.js index b010cd1c..a45edae5 100644 --- a/src/js/components/reactions-dialog.js +++ b/src/js/components/reactions-dialog.js @@ -117,7 +117,7 @@ class ReactionsDialog extends Component { class="bottom-sheet reactions-dialog" data-testid="reactions-dialog" @click=${(event) => { - if (event.target.tagName === "DIALOG") this._close(); + if (event.target === event.currentTarget) this._close(); }} @cancel=${(event) => { event.preventDefault(); diff --git a/src/js/components/report-dialog.js b/src/js/components/report-dialog.js index a7bd56c5..1d1ff2ca 100644 --- a/src/js/components/report-dialog.js +++ b/src/js/components/report-dialog.js @@ -651,7 +651,7 @@ class ReportDialog extends Component { { - if (e.target.tagName === "DIALOG") { + if (e.target === e.currentTarget) { this.close(); } }} diff --git a/src/js/dialogHelpers.js b/src/js/dialogHelpers.js index 68695f29..fc755d1e 100644 --- a/src/js/dialogHelpers.js +++ b/src/js/dialogHelpers.js @@ -26,7 +26,7 @@ function waitForExitMotion(dialog) { resolve(); }; const onMotionEnd = (event) => { - if (event.target === dialog) finish(); + if (event.target === event.currentTarget) finish(); }; const timeoutId = setTimeout(finish, 400); diff --git a/src/js/modals/modal.js b/src/js/modals/modal.js index 5d641590..ea195e5e 100644 --- a/src/js/modals/modal.js +++ b/src/js/modals/modal.js @@ -83,7 +83,7 @@ export class Modal { update(); dialog.addEventListener("click", (event) => { - if (event.target.tagName === "DIALOG") dismissIfAllowed(); + if (event.target === event.currentTarget) dismissIfAllowed(); }); document.body.appendChild(dialog); scrollLock = scrollLocks.acquire({ target: dialog }); diff --git a/src/js/templates/postEmbed.template.js b/src/js/templates/postEmbed.template.js index 304be4e8..9d862f47 100644 --- a/src/js/templates/postEmbed.template.js +++ b/src/js/templates/postEmbed.template.js @@ -382,7 +382,7 @@ function openAltTextDialog(altText) { dialog.dataset.testid = "alt-text-dialog"; dialog.addEventListener("close", () => dialog.remove()); dialog.addEventListener("click", (e) => { - if (e.target === dialog) closeWithAnimation(dialog); + if (e.target === e.currentTarget) closeWithAnimation(dialog); }); dialog.addEventListener("cancel", (e) => { e.preventDefault(); diff --git a/tests/unit/specs/components/post-composer.test.js b/tests/unit/specs/components/post-composer.test.js index 8bc2d1ac..f802bfcc 100644 --- a/tests/unit/specs/components/post-composer.test.js +++ b/tests/unit/specs/components/post-composer.test.js @@ -2652,6 +2652,25 @@ describe("post-composer", () => { await waitFor(() => !dialog.open); }); + it("dismissing the gif picker via its backdrop keeps the composer open", async () => { + const element = createPostComposer(); + element.dataLayer = makeTestDataLayer({ + api: { getFeaturedGifs: async () => ({ next: "", results: [] }) }, + }); + connectElement(element); + element.open(); + element.querySelector('[data-testid="composer-gif-button"]').click(); + await nextFrame(); + const composerDialog = element.querySelector(".post-composer"); + const gifDialog = element.querySelector(".gif-picker-dialog"); + assert(gifDialog.open); + gifDialog.dispatchEvent( + new globalThis.window.MouseEvent("click", { bubbles: true }), + ); + await waitFor(() => !gifDialog.open); + assert(composerDialog.open); + }); + it("closes on the dialog cancel event with no content", async () => { const element = createPostComposer(); connectElement(element);