'use client'; import { Headphones, Loader2 } from 'lucide-react'; import { useCallback, useState } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { downloadFile, getSignedUrl } from '@/lib/files'; interface MediaPreviewDialogProps { accessToken: string | null; } export function MediaPreviewDialog({ accessToken }: MediaPreviewDialogProps) { const [isOpen, setIsOpen] = useState(false); const [audioSignedUrl, setAudioSignedUrl] = useState(null); const [transcriptContent, setTranscriptContent] = useState(null); const [selectedRunId, setSelectedRunId] = useState(null); const [recordingKey, setRecordingKey] = useState(null); const [transcriptKey, setTranscriptKey] = useState(null); const [mediaLoading, setMediaLoading] = useState(false); const openPreview = useCallback( async (recordingUrl: string | null, transcriptUrl: string | null, runId: number) => { if (!accessToken || (!recordingUrl && !transcriptUrl)) return; setMediaLoading(true); setAudioSignedUrl(null); setTranscriptContent(null); setRecordingKey(recordingUrl); setTranscriptKey(transcriptUrl); setSelectedRunId(runId); setIsOpen(true); const [audioResult, transcriptResult] = await Promise.all([ recordingUrl ? getSignedUrl(recordingUrl, accessToken) : null, transcriptUrl ? getSignedUrl(transcriptUrl, accessToken, true) : null, ]); if (audioResult) { setAudioSignedUrl(audioResult); } if (transcriptResult) { try { const response = await fetch(transcriptResult); const text = await response.text(); setTranscriptContent(text); } catch (error) { console.error('Error fetching transcript:', error); } } setMediaLoading(false); }, [accessToken], ); return { openPreview, dialog: ( Run Preview {selectedRunId && ` - Run #${selectedRunId}`} {mediaLoading && (
Loading...
)} {!mediaLoading && audioSignedUrl && (
), }; } interface MediaPreviewButtonProps { recordingUrl: string | null | undefined; transcriptUrl: string | null | undefined; runId: number; onOpenPreview: (recordingUrl: string | null, transcriptUrl: string | null, runId: number) => void; onSelect?: (runId: number) => void; } export function MediaPreviewButton({ recordingUrl, transcriptUrl, runId, onOpenPreview, onSelect, }: MediaPreviewButtonProps) { if (!recordingUrl && !transcriptUrl) return null; const handleOpen = () => { onSelect?.(runId); onOpenPreview(recordingUrl ?? null, transcriptUrl ?? null, runId); }; return ( ); }