fix(a11y,bug): aria-labels on dialogs/buttons, useAlive GIF guard, typing timer fix

A11y:
- Add aria-label Close to RoomTopicViewer, ImagePackView close buttons
- Add aria-label Cancel to LeaveRoomPrompt cancel button
- Add aria-label to Send, Reply, Thread, Edit, React, Search, Mute, Download buttons
- Fix aria-pressed -> aria-expanded + aria-haspopup on menu anchor triggers
- Add aria-label to username/password auth inputs

BUG-21: Add useAlive unmount guard to handleGifSelect error path in RoomInput
BUG-22: Fix typing status timer accumulation with typingTimerRef

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lotus Bot
2026-05-20 21:26:18 -04:00
parent a77929de8b
commit 60c2c97ba6
10 changed files with 35 additions and 16 deletions
+5 -3
View File
@@ -6,6 +6,7 @@ type TypingStatusUpdater = (typing: boolean) => void;
export const useTypingStatusUpdater = (mx: MatrixClient, roomId: string): TypingStatusUpdater => {
const statusSentTsRef = useRef<number>(0);
const typingTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
const sendTypingStatus: TypingStatusUpdater = useMemo(() => {
statusSentTsRef.current = 0;
@@ -19,9 +20,10 @@ export const useTypingStatusUpdater = (mx: MatrixClient, roomId: string): Typing
const sentTs = Date.now();
statusSentTsRef.current = sentTs;
// Don't believe server will timeout typing status;
// Clear typing status after timeout if already not;
setTimeout(() => {
// Cancel any previous pending timeout before scheduling a new one
if (typingTimerRef.current !== undefined) clearTimeout(typingTimerRef.current);
typingTimerRef.current = setTimeout(() => {
typingTimerRef.current = undefined;
if (statusSentTsRef.current === sentTs) {
mx.sendTyping(roomId, false, TYPING_TIMEOUT_MS);
statusSentTsRef.current = 0;