import { useState, useEffect } from 'react'; import { getBriefing, getLatestBriefings, generateBriefing, formatBriefingDate, type Briefing } from '@/api/briefings'; interface BriefingPanelProps { userId: string; onClose: () => void; } /** 天气 emoji 映射 */ function weatherIcon(icon: string): string { return icon || '🌤️'; } /** 格式化提醒时间 */ function formatRemindTime(ts: string): string { try { const d = new Date(ts); return d.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' }); } catch { return ts; } } /** 获取今天的日期字符串 */ function todayStr(): string { const d = new Date(); return d.toISOString().slice(0, 10); } export function BriefingPanel({ userId, onClose }: BriefingPanelProps) { const [briefing, setBriefing] = useState(null); const [history, setHistory] = useState([]); const [loading, setLoading] = useState(true); const [generating, setGenerating] = useState(false); const [error, setError] = useState(''); const [selectedDate, setSelectedDate] = useState(todayStr()); const [viewMode, setViewMode] = useState<'today' | 'history'>('today'); // 加载今日简报 useEffect(() => { loadBriefing(todayStr()); loadHistory(); }, [userId]); const loadBriefing = async (date: string) => { setLoading(true); setError(''); try { const resp = await getBriefing(userId, date); if (resp.error) { setError(resp.error); setBriefing(null); } else if (resp.data?.briefing) { setBriefing(resp.data.briefing); } else { setBriefing(null); } } catch { setError('获取简报失败'); } setLoading(false); }; const loadHistory = async () => { try { const resp = await getLatestBriefings(userId, 7); if (resp.data?.briefings) { setHistory(resp.data.briefings); } } catch { // 静默失败 } }; const handleGenerate = async () => { setGenerating(true); setError(''); try { const resp = await generateBriefing(userId); if (resp.error) { setError(resp.error); } else if (resp.data?.success && resp.data.briefing) { setBriefing(resp.data.briefing); // 刷新历史 loadHistory(); } else { setError(resp.data?.error || '生成简报失败'); } } catch { setError('生成简报请求失败'); } setGenerating(false); }; const handleDateChange = (date: string) => { setSelectedDate(date); loadBriefing(date); }; return (
{/* 标签页切换 */}
{/* 今日简报视图 */} {viewMode === 'today' && (
{loading ? (
) : error ? (

{error}

) : briefing ? ( ) : (

今日简报尚未生成

简报会在每天早上自动生成

)} {/* 已生成时可手动重新生成 */} {briefing && (
)}
)} {/* 历史简报视图 */} {viewMode === 'history' && (
{history.length === 0 ? (
暂无历史简报
) : ( history.map((b) => ( )) )}
)}
); } /** 简报卡片展示组件 */ function BriefingCard({ briefing }: { briefing: Briefing }) { return (
{/* 日期 */}

{formatBriefingDate(briefing.date)}

{/* 天气卡片 */} {briefing.weather && briefing.weather.condition && (
{weatherIcon(briefing.weather.icon)}

{briefing.weather.temp.toFixed(0)}°C

{briefing.weather.location} · {briefing.weather.condition}

)} {/* 待办提醒 */} {briefing.reminders.length > 0 && (

📋 今日待办 ({briefing.reminders.length})

{briefing.reminders.map((r) => (
{r.title} {formatRemindTime(r.remind_at)}
))}
)} {/* 新闻列表 */} {briefing.news.length > 0 && briefing.news[0].title !== '未能获取今日新闻' && (

📰 今日新闻

{briefing.news.map((n, i) => (
{n.url ? ( {n.title} ) : ( {n.title} )} {n.summary && (

{n.summary}

)} {n.source && ( {n.source} )}
))}
)} {/* AI 摘要 */} {briefing.summary && (
🌸

昔涟的每日问候

{briefing.summary_source === 'fallback' && ( 本地生成 )}

{briefing.summary}

)}
); }