import { useEffect, useRef, useState } from "react"; import { Paperclip } from "lucide-react"; import type { RecordingMode } from "@/hooks/use-recording-mode"; import { AudioLevelBars } from "@/components/audio/audio-level-bars"; import { useAudioSource } from "@/components/audio/use-audio-source"; import { AttachmentStrip } from "@/features/compose/attachment-strip"; import type { PendingAttachment } from "@/features/compose/attachment-strip"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; interface RecordingOverlayProps { step: "recording" | "reviewing"; mediaStream: MediaStream | null; recordingMode: RecordingMode; reviewBlob: Blob | null; error: string | null; onClose: () => void; attachments: PendingAttachment[]; onRemoveAttachment: (id: string) => void; onAddFiles: () => void; isDragging: boolean; dropZoneProps: { onDragOver: (e: React.DragEvent) => void; onDragEnter: (e: React.DragEvent) => void; onDragLeave: (e: React.DragEvent) => void; onDrop: (e: React.DragEvent) => void; }; /** Mirror the video horizontally. Defaults to true (selfie-view for webcam). */ mirror?: boolean; /** How video fills its container. Defaults to "cover". Use "contain" for screen recordings. */ objectFit?: "cover" | "contain"; } function RecordingTimer() { const [elapsed, setElapsed] = useState(0); useEffect(() => { const interval = setInterval(() => { setElapsed((prev) => prev + 1); }, 1000); return () => clearInterval(interval); }, []); const minutes = Math.floor(elapsed / 60); const seconds = elapsed % 60; const display = `${minutes}:${seconds.toString().padStart(2, "0")}`; return (
{display}
); } function ReviewPlayback({ blob, isVideo, mirror = true, objectFit = "cover", }: { blob: Blob; isVideo: boolean; mirror?: boolean; objectFit?: "cover" | "contain"; }) { const urlRef = useRef(null); const [objectUrl, setObjectUrl] = useState(null); const audioElRef = useRef(null); const [audioEl, setAudioEl] = useState(null); const audioSource = useAudioSource(isVideo ? null : audioEl); useEffect(() => { const url = URL.createObjectURL(blob); urlRef.current = url; setObjectUrl(url); return () => { URL.revokeObjectURL(url); urlRef.current = null; }; }, [blob]); if (!objectUrl) return null; if (isVideo) { return (