import { useEffect, useState } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { Copy, Check, Eye } from 'lucide-react' import { sessionsApi } from '@/api' import { ExportPreviewModal } from '@/components/session/ExportPreviewModal' import type { Session, SessionExport } from '@/types' import { cn } from '@/lib/utils' export function SessionDetailPage() { const { id } = useParams<{ id: string }>() const navigate = useNavigate() const [session, setSession] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) const [isExporting, setIsExporting] = useState(false) const [exportFormat, setExportFormat] = useState<'markdown' | 'text' | 'html'>('markdown') const [exportContent, setExportContent] = useState(null) const [showPreview, setShowPreview] = useState(false) const [copied, setCopied] = useState(false) useEffect(() => { if (id) { loadSession() } }, [id]) const loadSession = async () => { setIsLoading(true) setError(null) try { const data = await sessionsApi.get(id!) setSession(data) } catch (err) { setError('Failed to load session') console.error(err) } finally { setIsLoading(false) } } const getFilename = () => { if (!session) return 'export.txt' const ext = exportFormat === 'markdown' ? 'md' : exportFormat === 'html' ? 'html' : 'txt' return `session-${session.ticket_number || session.id}.${ext}` } const fetchExportContent = async () => { if (!session) return null const options: SessionExport = { format: exportFormat, include_timestamps: true, include_tree_info: true, } return await sessionsApi.export(session.id, options) } const handlePreview = async () => { setIsExporting(true) try { const content = await fetchExportContent() if (content) { setExportContent(content) setShowPreview(true) } } catch (err) { console.error('Export failed:', err) } finally { setIsExporting(false) } } const handleCopy = async () => { setIsExporting(true) try { const content = await fetchExportContent() if (content) { await navigator.clipboard.writeText(content) setCopied(true) setTimeout(() => setCopied(false), 2000) } } catch (err) { console.error('Copy failed:', err) } finally { setIsExporting(false) } } const handleDownload = () => { if (!exportContent || !session) return const blob = new Blob([exportContent], { type: 'text/plain' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = getFilename() document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) } const formatDate = (dateString: string) => { return new Date(dateString).toLocaleString() } if (isLoading) { return (
) } if (error || !session) { return (
{error || 'Session not found'}
) } return (
{/* Header */}

{session.ticket_number || 'Session Details'}

{session.completed_at ? 'Completed' : 'In Progress'} {session.client_name && Client: {session.client_name}}
{/* Export */}
{/* Timeline */}

Decision Timeline

Session started: {formatDate(session.started_at)}
{session.decisions.map((decision, index) => (
{decision.question && (

{decision.question}

)} {decision.answer && (

Answer: {decision.answer}

)} {decision.action_performed && (

Action: {decision.action_performed}

)} {decision.notes && (

Notes: {decision.notes}

)}

{formatDate(decision.timestamp)}

))} {session.completed_at && (
Session completed: {formatDate(session.completed_at)}
)}
{/* Export Preview Modal */} setShowPreview(false)} content={exportContent || ''} filename={getFilename()} format={exportFormat} onDownload={handleDownload} />
) } export default SessionDetailPage