From 7a6e79a41c83cb59c872926bd61438739f67596d Mon Sep 17 00:00:00 2001 From: polyjitter Date: Sat, 21 Mar 2026 16:29:11 -0400 Subject: [PATCH 01/12] Added KnockRoomPrompt. --- .../knock-room-prompt/KnockRoomPrompt.tsx | 124 ++++++++++++++++++ src/app/components/knock-room-prompt/index.ts | 1 + src/app/features/lobby/RoomItem.tsx | 47 ++++++- 3 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 src/app/components/knock-room-prompt/KnockRoomPrompt.tsx create mode 100644 src/app/components/knock-room-prompt/index.ts diff --git a/src/app/components/knock-room-prompt/KnockRoomPrompt.tsx b/src/app/components/knock-room-prompt/KnockRoomPrompt.tsx new file mode 100644 index 000000000..dd6df494e --- /dev/null +++ b/src/app/components/knock-room-prompt/KnockRoomPrompt.tsx @@ -0,0 +1,124 @@ +import { useCallback, useEffect, useState } from 'react'; +import FocusTrap from 'focus-trap-react'; +import { + Dialog, + Overlay, + OverlayCenter, + OverlayBackdrop, + Header, + config, + Box, + Text, + IconButton, + Icon, + Icons, + color, + Button, + Spinner, +} from 'folds'; +import { MatrixError } from '$types/matrix-sdk'; +import { useMatrixClient } from '$hooks/useMatrixClient'; +import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; +import { stopPropagation } from '$utils/keyboard'; +import { createDebugLogger } from '$utils/debugLogger'; + +const debugLog = createDebugLogger('KockRoomPrompt'); + +type KnockRoomProps = { + roomId: string; + via?: string; + onDone: () => void; + onCancel: () => void; +}; +export function KnockRoomPrompt({ roomId, via, onDone, onCancel }: KnockRoomProps) { + const mx = useMatrixClient(); + const [reason, setReason] = useState(''); + + const [knockState, knockRoom] = useAsyncCallback( + useCallback(async () => { + debugLog.info('ui', 'Knock room button clicked', { roomId }); + mx.knockRoom(roomId, { viaServers: via || undefined, reason: reason.trim() || undefined }); + }, [mx, roomId, reason, via]) + ); + + const handleKnock = () => { + knockRoom(); + }; + + useEffect(() => { + if (knockState.status === AsyncStatus.Success) { + debugLog.info('ui', 'Successfully left room', { roomId }); + onDone(); + } + }, [knockState, onDone, roomId]); + + return ( + }> + + + +
+ + Knock on Room + + + + +
+ + + + Request to join this room. You can optionally leave a reason for the moderators. + +