'use client'; import { AlertTriangle, History, X } from 'lucide-react'; import { useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import type { PlayRecord } from '@/lib/db.client'; import { clearAllPlayRecords, getAllPlayRecords, subscribeToDataUpdates, } from '@/lib/db.client'; import VideoCard from '@/components/VideoCard'; type PlayRecordItem = PlayRecord & { key: string; }; interface PlayRecordsPanelProps { isOpen: boolean; onClose: () => void; } const parseKey = (key: string) => { const [source, id] = key.split('+'); return { source, id }; }; const getProgress = (record: PlayRecord) => { if (record.total_time === 0) return 0; return (record.play_time / record.total_time) * 100; }; export default function PlayRecordsPanel({ isOpen, onClose, }: PlayRecordsPanelProps) { const [playRecords, setPlayRecords] = useState([]); const [loading, setLoading] = useState(false); const [showConfirmDialog, setShowConfirmDialog] = useState(false); const loadPlayRecords = async () => { setLoading(true); try { const allRecords = await getAllPlayRecords(); const sorted = Object.entries(allRecords) .map(([key, record]) => ({ ...record, key, })) .sort((a, b) => b.save_time - a.save_time); setPlayRecords(sorted); } catch (error) { console.error('加载播放记录失败:', error); setPlayRecords([]); } finally { setLoading(false); } }; const handleClearAll = async () => { try { await clearAllPlayRecords(); setPlayRecords([]); setShowConfirmDialog(false); } catch (error) { console.error('清空播放记录失败:', error); } }; useEffect(() => { if (!isOpen) return; loadPlayRecords(); }, [isOpen]); useEffect(() => { const unsubscribe = subscribeToDataUpdates( 'playRecordsUpdated', (newRecords: Record) => { if (!isOpen) return; const sorted = Object.entries(newRecords) .map(([key, record]) => ({ ...record, key, })) .sort((a, b) => b.save_time - a.save_time); setPlayRecords(sorted); } ); return () => { unsubscribe(); }; }, [isOpen]); return ( <>

播放记录

{playRecords.length > 0 && ( {playRecords.length} 项 )}
{playRecords.length > 0 && ( )}
{loading ? (
) : playRecords.length === 0 ? (

暂无播放记录

) : (
{playRecords.map((record) => { const { source, id } = parseKey(record.key); return (
setPlayRecords((prev) => prev.filter((item) => item.key !== record.key) ) } type={record.total_episodes > 1 ? 'tv' : ''} origin={record.origin} playTime={record.play_time} totalTime={record.total_time} />
); })}
)}
{showConfirmDialog && createPortal(
setShowConfirmDialog(false)} >
e.stopPropagation()} >

清空播放记录

确定要清空所有播放记录吗?此操作不可恢复。

, document.body )} ); }