import { useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' import { Loader2, Search, Users } from 'lucide-react' import './DualReportPage.scss' interface ContactRanking { username: string displayName: string avatarUrl?: string messageCount: number sentCount: number receivedCount: number lastMessageTime?: number | null } function DualReportPage() { const navigate = useNavigate() const [year, setYear] = useState(0) const [rankings, setRankings] = useState([]) const [isLoading, setIsLoading] = useState(true) const [loadError, setLoadError] = useState(null) const [keyword, setKeyword] = useState('') useEffect(() => { const params = new URLSearchParams(window.location.hash.split('?')[1] || '') const yearParam = params.get('year') const parsedYear = yearParam ? parseInt(yearParam, 10) : 0 setYear(Number.isNaN(parsedYear) ? 0 : parsedYear) }, []) useEffect(() => { loadRankings() }, []) const loadRankings = async () => { setIsLoading(true) setLoadError(null) try { const result = await window.electronAPI.analytics.getContactRankings(200) if (result.success && result.data) { setRankings(result.data) } else { setLoadError(result.error || '加载好友列表失败') } } catch (e) { setLoadError(String(e)) } finally { setIsLoading(false) } } const yearLabel = year === 0 ? '全部时间' : `${year}年` const filteredRankings = useMemo(() => { if (!keyword.trim()) return rankings const q = keyword.trim().toLowerCase() return rankings.filter((item) => { return item.displayName.toLowerCase().includes(q) || item.username.toLowerCase().includes(q) }) }, [rankings, keyword]) const handleSelect = (username: string) => { const yearParam = year === 0 ? 0 : year navigate(`/dual-report/view?username=${encodeURIComponent(username)}&year=${yearParam}`) } if (isLoading) { return (

正在加载聊天排行...

) } if (loadError) { return (

加载失败:{loadError}

) } return (

双人年度报告

选择一位好友,生成你们的专属聊天报告

{yearLabel}
setKeyword(e.target.value)} placeholder="搜索好友(昵称/备注/wxid)" />
{filteredRankings.map((item, index) => ( ))} {filteredRankings.length === 0 ? (
没有匹配的好友
) : null}
) } export default DualReportPage