diff --git a/src/app/components/ConsentRequiredPrompt.tsx b/src/app/components/ConsentRequiredPrompt.tsx index d683c81b1..8ba637fe9 100644 --- a/src/app/components/ConsentRequiredPrompt.tsx +++ b/src/app/components/ConsentRequiredPrompt.tsx @@ -44,6 +44,9 @@ export function ConsentRequiredPrompt() { const [opened, setOpened] = useState(false); const [blockedCount, setBlockedCount] = useState(0); const snoozedUntil = useRef(0); + // [Gitea #311] Closing via Retry also deactivates the focus trap; that must + // not snooze, or a retry that fails again (terms not accepted yet) is silent. + const closingForRetry = useRef(false); const blocked = useRef(new Map()); const modalStyle = useModalStyle(440); const server = mx.getDomain() ?? 'Your homeserver'; @@ -74,6 +77,8 @@ export function ConsentRequiredPrompt() { }, [consentUri]); const retry = useCallback(() => { + closingForRetry.current = true; + snoozedUntil.current = 0; setOpen(false); setOpened(false); const pending = Array.from(blocked.current.entries()); @@ -97,7 +102,13 @@ export function ConsentRequiredPrompt() { focusTrapOptions={{ initialFocus: '#consent-review', fallbackFocus: '#consent-later', - onDeactivate: later, + onDeactivate: () => { + if (closingForRetry.current) { + closingForRetry.current = false; + return; + } + later(); + }, clickOutsideDeactivates: true, escapeDeactivates: true, }}