import { useEffect, useRef, useState } from 'react'; import { Paperclip } from 'lucide-react'; import type { RecordingMode } from '@/stores/media-settings-store'; import { CenteredWaveform } from '@/components/audio/centered-waveform'; import { useAudioSource } from '@/components/audio/use-audio-source'; import { useObjectUrl } from '@/hooks/use-object-url'; 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'; import { KeyHint } from '@/components/key-hint'; import { useComposeIntentStore } from '@/stores/compose-intent-store'; 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 objectUrl = useObjectUrl(blob); const [audioEl, setAudioEl] = useState(null); const audioSource = useAudioSource(isVideo ? null : audioEl); if (!objectUrl) return null; if (isVideo) { return (