'use client'; import { FileText, Loader2, Video } 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 [mediaType, setMediaType] = useState<'audio' | 'transcript' | null>(null); const [mediaSignedUrl, setMediaSignedUrl] = useState(null); const [transcriptContent, setTranscriptContent] = useState(null); const [selectedRunId, setSelectedRunId] = useState(null); const [mediaDownloadKey, setMediaDownloadKey] = useState(null); const [mediaLoading, setMediaLoading] = useState(false); const openAudioModal = useCallback( async (fileKey: string | null, runId: number) => { if (!fileKey || !accessToken) return; setMediaLoading(true); const signed = await getSignedUrl(fileKey, accessToken); if (signed) { setMediaType('audio'); setMediaSignedUrl(signed); setMediaDownloadKey(fileKey); setSelectedRunId(runId); setIsOpen(true); } setMediaLoading(false); }, [accessToken], ); const openTranscriptModal = useCallback( async (fileKey: string | null, runId: number) => { if (!fileKey || !accessToken) return; setMediaLoading(true); setTranscriptContent(null); const signed = await getSignedUrl(fileKey, accessToken, true); if (signed) { setMediaType('transcript'); setMediaSignedUrl(signed); setMediaDownloadKey(fileKey); setSelectedRunId(runId); setIsOpen(true); // Fetch transcript content with proper UTF-8 encoding try { const response = await fetch(signed); const text = await response.text(); setTranscriptContent(text); } catch (error) { console.error('Error fetching transcript:', error); } } setMediaLoading(false); }, [accessToken], ); return { openAudioModal, openTranscriptModal, dialog: ( {mediaType === 'audio' ? 'Recording Preview' : 'Transcript Preview'} {selectedRunId && ` - Run #${selectedRunId}`} {mediaLoading && (
Loading...
)} {!mediaLoading && mediaType === 'audio' && mediaSignedUrl && (
), }; } interface MediaPreviewButtonsProps { recordingUrl: string | null | undefined; transcriptUrl: string | null | undefined; runId: number; onOpenAudio: (fileKey: string | null, runId: number) => void; onOpenTranscript: (fileKey: string | null, runId: number) => void; onSelect?: (runId: number) => void; } export function MediaPreviewButtons({ recordingUrl, transcriptUrl, runId, onOpenAudio, onOpenTranscript, onSelect, }: MediaPreviewButtonsProps) { const handleOpenAudio = () => { onSelect?.(runId); onOpenAudio(recordingUrl ?? null, runId); }; const handleOpenTranscript = () => { onSelect?.(runId); onOpenTranscript(transcriptUrl ?? null, runId); }; return (
{recordingUrl && ( )} {transcriptUrl && ( )}
); }