import React, { useEffect, useState } from 'react'; import { Download, Search, Calendar, Filter, MessageSquare, Mic, Video, Eye, X, Play, User, Bot, Clock } from 'lucide-react'; import { Button, Input, TableHeader, TableRow, TableHead, TableCell, Badge, Drawer } from '../components/UI'; import { CallLog, InteractionType } from '../types'; import { fetchHistory, fetchHistoryDetail } from '../services/backendApi'; export const HistoryPage: React.FC = () => { const [logs, setLogs] = useState([]); const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState<'all' | 'connected' | 'missed'>('all'); const [sourceFilter, setSourceFilter] = useState<'all' | 'debug' | 'external'>('all'); const [typeFilter, setTypeFilter] = useState<'all' | InteractionType>('all'); const [isLoading, setIsLoading] = useState(true); const [selectedLog, setSelectedLog] = useState(null); const [isDetailLoading, setIsDetailLoading] = useState(false); useEffect(() => { const loadHistory = async () => { setIsLoading(true); try { const list = await fetchHistory(); setLogs(list); } catch (error) { console.error(error); alert('加载历史记录失败,请检查后端服务。'); } finally { setIsLoading(false); } }; loadHistory(); }, []); const filteredLogs = logs.filter(log => { const matchesSearch = log.agentName.toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = statusFilter === 'all' || log.status === statusFilter; const matchesSource = sourceFilter === 'all' || log.source === sourceFilter; const matchesType = typeFilter === 'all' || log.type === typeFilter; return matchesSearch && matchesStatus && matchesSource && matchesType; }); const handleExport = () => { // Generate CSV content const headers = ['ID', 'Agent', 'Source', 'Type', 'Status', 'Start Time', 'Duration']; const rows = filteredLogs.map(log => [ log.id, log.agentName, log.source, log.type, log.status, log.startTime, log.duration ].join(',')); const csvContent = "data:text/csv;charset=utf-8," + [headers.join(','), ...rows].join('\n'); const encodedUri = encodeURI(csvContent); const link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", "history_logs.csv"); document.body.appendChild(link); link.click(); document.body.removeChild(link); }; const openDetail = async (log: CallLog) => { setSelectedLog(log); setIsDetailLoading(true); try { const detail = await fetchHistoryDetail(log.id, log); setSelectedLog(detail); } catch (error) { console.error(error); alert('加载通话详情失败。'); } finally { setIsDetailLoading(false); } }; return (

历史记录

setSearchTerm(e.target.value)} />
编号 代理小助手 类型 来源 接听状态 通话接通时间 通话时长 {!isLoading && filteredLogs.map(log => ( openDetail(log)}> #{log.id} {log.agentName}
{log.type === 'text' && } {log.type === 'audio' && } {log.type === 'video' &&
{log.source === 'debug' ? '调试' : '外部'} {log.status === 'connected' ? '已接通' : '未接通'} {log.startTime} {log.duration}
))} {!isLoading && filteredLogs.length === 0 && ( 暂无记录 )} {isLoading && ( 加载中... )}
{selectedLog && ( setSelectedLog(null)} title="通话详情与对话记录" >

{selectedLog.agentName}

{selectedLog.type} Record
ID: #{selectedLog.id}
时间: {selectedLog.startTime}
时长: {selectedLog.duration}
状态: {selectedLog.status}
{isDetailLoading && (
详情加载中...
)} {!isDetailLoading && (selectedLog.details && selectedLog.details.length > 0) ? ( selectedLog.details.map((detail, index) => (
{detail.role === 'user' ? : }
{detail.role === 'user' ? 'User' : 'Assistant'} {detail.timestamp}
{/* Video Frames */} {selectedLog.type === 'video' && detail.role === 'user' && detail.imageUrls && detail.imageUrls.length > 0 && (
{detail.imageUrls.map((url, i) => (
{`Frame
))}
)} {/* Content */}
{detail.content}
{/* Audio Player Placeholder */} {selectedLog.type !== 'text' && (
00:05
)}
)) ) : !isDetailLoading ? (

暂无对话记录

) : null}
)}
); };