diff --git a/docs/core-checklist-status.md b/docs/core-checklist-status.md index 84b17b7..bbd378d 100644 --- a/docs/core-checklist-status.md +++ b/docs/core-checklist-status.md @@ -21,7 +21,7 @@ Legend: 12. Pinning - `DONE` (message/chat pin-unpin) 13. Reactions - `DONE` 14. Delivery Status - `DONE` (sent/delivered/read + reconnect reconciliation after backend restarts) -15. Typing Realtime - `PARTIAL` (typing start/stop + recording voice start/stop live; recording video start/stop wired in protocol, pending full UI emitter flow) +15. Typing Realtime - `DONE` (typing start/stop + recording voice start/stop + recording video start/stop in circle-video send flow) 16. Media & Attachments - `DONE` (upload/preview/download/gallery) 17. Voice Messages - `PARTIAL` (record/send/play/seek + global speed 1x/1.5x/2x; recorder now uses mime fallback + chunked capture; UX still being polished) 18. Circle Video Messages - `PARTIAL` (send/play present, recording UX basic) diff --git a/web/src/components/MessageComposer.tsx b/web/src/components/MessageComposer.tsx index 57d8397..b4292c9 100644 --- a/web/src/components/MessageComposer.tsx +++ b/web/src/components/MessageComposer.tsx @@ -828,6 +828,12 @@ export function MessageComposer() { if (!selectedFiles.length || !activeChatId || !me) { return; } + const isCircleVideoFlow = + selectedFiles.length === 1 && inferType(selectedFiles[0]) === "video" && sendAsCircle; + if (isCircleVideoFlow) { + emitTypingStopIfActive(); + sendRealtimeChatEvent("recording_video_start"); + } setIsUploading(true); setUploadError(null); setUploadProgress(0); @@ -895,6 +901,9 @@ export function MessageComposer() { } finally { setIsUploading(false); setUploadProgress(0); + if (isCircleVideoFlow) { + sendRealtimeChatEvent("recording_video_stop"); + } } if (previewUrl) { URL.revokeObjectURL(previewUrl);