Fix modal closing in composer

This commit is contained in:
Lim Chee Aun 2025-03-07 12:13:13 +08:00
parent 457cf8c620
commit 7a4ebd0930
3 changed files with 66 additions and 68 deletions

View file

@ -530,7 +530,7 @@ function Compose({
enableOnFormTags: true,
// Use keyup because Esc keydown will close the confirm dialog on Safari
keyup: true,
ignoreEventWhen: (e) => {
ignoreEventWhen: () => {
const modals = document.querySelectorAll('#modal-container > *');
const hasModal = !!modals;
const hasOnlyComposer =
@ -543,7 +543,7 @@ function Compose({
if (!standalone && confirmClose()) {
onClose();
}
}, [standalone, confirmClose, onClose]);
}, []);
const prevBackgroundDraft = useRef({});
const draftKey = () => {
@ -1638,10 +1638,8 @@ function Compose({
</div>
{showMentionPicker && (
<Modal
onClick={(e) => {
if (e.target === e.currentTarget) {
setShowMentionPicker(false);
}
onClose={() => {
setShowMentionPicker(false);
}}
>
<MentionModal
@ -1687,10 +1685,8 @@ function Compose({
)}
{showEmoji2Picker && (
<Modal
onClick={(e) => {
if (e.target === e.currentTarget) {
setShowEmoji2Picker(false);
}
onClose={() => {
setShowEmoji2Picker(false);
}}
>
<CustomEmojisModal
@ -1732,10 +1728,8 @@ function Compose({
)}
{showGIFPicker && (
<Modal
onClick={(e) => {
if (e.target === e.currentTarget) {
setShowGIFPicker(false);
}
onClose={() => {
setShowGIFPicker(false);
}}
>
<GIFPickerModal

108
src/locales/en.po generated
View file

@ -108,7 +108,7 @@ msgstr ""
#: src/components/account-info.jsx:430
#: src/components/account-info.jsx:1143
#: src/components/compose.jsx:2703
#: src/components/compose.jsx:2697
#: src/components/media-alt-modal.jsx:46
#: src/components/media-modal.jsx:358
#: src/components/status.jsx:1770
@ -420,10 +420,10 @@ msgstr ""
#: src/components/account-info.jsx:2140
#: src/components/account-sheet.jsx:38
#: src/components/compose.jsx:877
#: src/components/compose.jsx:2659
#: src/components/compose.jsx:3133
#: src/components/compose.jsx:3342
#: src/components/compose.jsx:3572
#: src/components/compose.jsx:2653
#: src/components/compose.jsx:3127
#: src/components/compose.jsx:3336
#: src/components/compose.jsx:3566
#: src/components/drafts.jsx:59
#: src/components/embed-modal.jsx:13
#: src/components/generic-accounts.jsx:143
@ -614,8 +614,8 @@ msgstr "{0, plural, one {File {1} is not supported.} other {Files {2} are not su
#: src/components/compose.jsx:650
#: src/components/compose.jsx:668
#: src/components/compose.jsx:1747
#: src/components/compose.jsx:1833
#: src/components/compose.jsx:1741
#: src/components/compose.jsx:1827
msgid "{maxMediaAttachments, plural, one {You can only attach up to 1 file.} other {You can only attach up to # files.}}"
msgstr ""
@ -736,7 +736,7 @@ msgid "Posting on <0/>"
msgstr "Posting on <0/>"
#: src/components/compose.jsx:1432
#: src/components/compose.jsx:3191
#: src/components/compose.jsx:3185
#: src/components/shortcuts-settings.jsx:715
#: src/pages/list.jsx:362
msgid "Add"
@ -764,39 +764,39 @@ msgctxt "Submit button in composer"
msgid "Post"
msgstr "Post"
#: src/components/compose.jsx:1759
#: src/components/compose.jsx:1753
msgid "Downloading GIF…"
msgstr "Downloading GIF…"
#: src/components/compose.jsx:1787
#: src/components/compose.jsx:1781
msgid "Failed to download GIF"
msgstr "Failed to download GIF"
#: src/components/compose.jsx:1963
#: src/components/compose.jsx:2040
#: src/components/compose.jsx:1957
#: src/components/compose.jsx:2034
#: src/components/nav-menu.jsx:239
msgid "More…"
msgstr ""
#: src/components/compose.jsx:2472
#: src/components/compose.jsx:2466
msgid "Uploaded"
msgstr ""
#: src/components/compose.jsx:2485
#: src/components/compose.jsx:2479
msgid "Image description"
msgstr "Image description"
#: src/components/compose.jsx:2486
#: src/components/compose.jsx:2480
msgid "Video description"
msgstr "Video description"
#: src/components/compose.jsx:2487
#: src/components/compose.jsx:2481
msgid "Audio description"
msgstr "Audio description"
#. placeholder {0}: prettyBytes( imageSize, )
#. placeholder {1}: prettyBytes(imageSizeLimit)
#: src/components/compose.jsx:2523
#: src/components/compose.jsx:2517
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower."
msgstr "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower."
@ -804,13 +804,13 @@ msgstr "File size too large. Uploading might encounter issues. Try reduce the fi
#. placeholder {3}: i18n.number(height)
#. placeholder {4}: i18n.number(newWidth)
#. placeholder {5}: i18n.number( newHeight, )
#: src/components/compose.jsx:2535
#: src/components/compose.jsx:2529
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px."
msgstr "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px."
#. placeholder {6}: prettyBytes( videoSize, )
#. placeholder {7}: prettyBytes(videoSizeLimit)
#: src/components/compose.jsx:2543
#: src/components/compose.jsx:2537
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower."
msgstr "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower."
@ -818,149 +818,149 @@ msgstr "File size too large. Uploading might encounter issues. Try reduce the fi
#. placeholder {9}: i18n.number(height)
#. placeholder {10}: i18n.number(newWidth)
#. placeholder {11}: i18n.number( newHeight, )
#: src/components/compose.jsx:2555
#: src/components/compose.jsx:2549
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px."
msgstr "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px."
#: src/components/compose.jsx:2563
#: src/components/compose.jsx:2557
msgid "Frame rate too high. Uploading might encounter issues."
msgstr "Frame rate too high. Uploading might encounter issues."
#: src/components/compose.jsx:2623
#: src/components/compose.jsx:2873
#: src/components/compose.jsx:2617
#: src/components/compose.jsx:2867
#: src/components/shortcuts-settings.jsx:726
#: src/pages/catchup.jsx:1074
#: src/pages/filters.jsx:412
msgid "Remove"
msgstr ""
#: src/components/compose.jsx:2640
#: src/components/compose.jsx:2634
#: src/compose.jsx:84
msgid "Error"
msgstr ""
#: src/components/compose.jsx:2665
#: src/components/compose.jsx:2659
msgid "Edit image description"
msgstr "Edit image description"
#: src/components/compose.jsx:2666
#: src/components/compose.jsx:2660
msgid "Edit video description"
msgstr "Edit video description"
#: src/components/compose.jsx:2667
#: src/components/compose.jsx:2661
msgid "Edit audio description"
msgstr "Edit audio description"
#: src/components/compose.jsx:2712
#: src/components/compose.jsx:2761
#: src/components/compose.jsx:2706
#: src/components/compose.jsx:2755
msgid "Generating description. Please wait…"
msgstr "Generating description. Please wait…"
#. placeholder {12}: e.message
#: src/components/compose.jsx:2732
#: src/components/compose.jsx:2726
msgid "Failed to generate description: {12}"
msgstr "Failed to generate description: {12}"
#: src/components/compose.jsx:2733
#: src/components/compose.jsx:2727
msgid "Failed to generate description"
msgstr "Failed to generate description"
#: src/components/compose.jsx:2739
#: src/components/compose.jsx:2745
#: src/components/compose.jsx:2751
#: src/components/compose.jsx:2797
#: src/components/compose.jsx:2791
msgid "Generate description…"
msgstr ""
#. placeholder {13}: e?.message ? `: ${e.message}` : ''
#: src/components/compose.jsx:2784
#: src/components/compose.jsx:2778
msgid "Failed to generate description{13}"
msgstr "Failed to generate description{13}"
#. placeholder {0}: localeCode2Text(lang)
#: src/components/compose.jsx:2799
#: src/components/compose.jsx:2793
msgid "({0}) <0>— experimental</0>"
msgstr ""
#: src/components/compose.jsx:2818
#: src/components/compose.jsx:2812
msgid "Done"
msgstr ""
#. placeholder {0}: i + 1
#: src/components/compose.jsx:2854
#: src/components/compose.jsx:2848
msgid "Choice {0}"
msgstr "Choice {0}"
#: src/components/compose.jsx:2901
#: src/components/compose.jsx:2895
msgid "Multiple choices"
msgstr ""
#: src/components/compose.jsx:2904
#: src/components/compose.jsx:2898
msgid "Duration"
msgstr ""
#: src/components/compose.jsx:2935
#: src/components/compose.jsx:2929
msgid "Remove poll"
msgstr ""
#: src/components/compose.jsx:3150
#: src/components/compose.jsx:3144
msgid "Search accounts"
msgstr "Search accounts"
#: src/components/compose.jsx:3204
#: src/components/compose.jsx:3198
#: src/components/generic-accounts.jsx:228
msgid "Error loading accounts"
msgstr ""
#: src/components/compose.jsx:3348
#: src/components/compose.jsx:3342
msgid "Custom emojis"
msgstr ""
#: src/components/compose.jsx:3368
#: src/components/compose.jsx:3362
msgid "Search emoji"
msgstr "Search emoji"
#: src/components/compose.jsx:3399
#: src/components/compose.jsx:3393
msgid "Error loading custom emojis"
msgstr ""
#: src/components/compose.jsx:3410
#: src/components/compose.jsx:3404
msgid "Recently used"
msgstr "Recently used"
#: src/components/compose.jsx:3411
#: src/components/compose.jsx:3405
msgid "Others"
msgstr "Others"
#. placeholder {0}: i18n.number(emojis.length - max)
#: src/components/compose.jsx:3449
#: src/components/compose.jsx:3443
msgid "{0} more…"
msgstr ""
#: src/components/compose.jsx:3587
#: src/components/compose.jsx:3581
msgid "Search GIFs"
msgstr "Search GIFs"
#: src/components/compose.jsx:3602
#: src/components/compose.jsx:3596
msgid "Powered by GIPHY"
msgstr "Powered by GIPHY"
#: src/components/compose.jsx:3610
#: src/components/compose.jsx:3604
msgid "Type to search GIFs"
msgstr ""
#: src/components/compose.jsx:3708
#: src/components/compose.jsx:3702
#: src/components/media-modal.jsx:464
#: src/components/timeline.jsx:893
msgid "Previous"
msgstr ""
#: src/components/compose.jsx:3726
#: src/components/compose.jsx:3720
#: src/components/media-modal.jsx:483
#: src/components/timeline.jsx:910
msgid "Next"
msgstr ""
#: src/components/compose.jsx:3743
#: src/components/compose.jsx:3737
msgid "Error loading GIFs"
msgstr ""

View file

@ -1,8 +1,12 @@
import { useEffect } from 'preact/hooks';
// NOTE: The order of initialized close watchers is important
// Last one will intercept first if there are multiple/nested close watchers
// So if this hook reruns, the previous close watcher will be destroyed, the new one will be created and the order will change
function useCloseWatcher(fn, deps = []) {
if (!fn || typeof fn !== 'function') return;
useEffect(() => {
console.log('useCloseWatcher');
const watcher = new CloseWatcher();
watcher.addEventListener('close', fn);
return () => {