'use client'; import { useEffect, useState, useCallback } from 'react'; import { useEnableComments } from '@/hooks/useEnableComments'; import VideoCard from '@/components/VideoCard'; import ScrollableRow from '@/components/ScrollableRow'; interface DoubanRecommendation { doubanId: string; title: string; poster: string; rating: string; } interface DoubanRecommendationsProps { doubanId: number; } export default function DoubanRecommendations({ doubanId }: DoubanRecommendationsProps) { const [recommendations, setRecommendations] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const enableComments = useEnableComments(); const fetchRecommendations = useCallback(async () => { try { console.log('正在获取推荐'); setLoading(true); setError(null); // 检查localStorage缓存 const cacheKey = `douban_recommendations_${doubanId}`; const cached = localStorage.getItem(cacheKey); if (cached) { try { const { data, timestamp } = JSON.parse(cached); const cacheAge = Date.now() - timestamp; const cacheMaxAge = 7 * 24 * 60 * 60 * 1000; // 7天 if (cacheAge < cacheMaxAge) { console.log('使用缓存的推荐数据'); setRecommendations(data); setLoading(false); return; } } catch (e) { console.error('解析缓存失败:', e); } } const response = await fetch( `/api/douban-recommendations?id=${doubanId}` ); if (!response.ok) { throw new Error('获取推荐失败'); } const result = await response.json(); console.log('获取到推荐:', result.recommendations); const recommendationsData = result.recommendations || []; setRecommendations(recommendationsData); // 保存到localStorage try { localStorage.setItem(cacheKey, JSON.stringify({ data: recommendationsData, timestamp: Date.now() })); } catch (e) { console.error('保存缓存失败:', e); } } catch (err) { console.error('获取推荐失败:', err); setError(err instanceof Error ? err.message : '获取推荐失败'); } finally { setLoading(false); } }, [doubanId]); useEffect(() => { if (enableComments && doubanId) { fetchRecommendations(); } }, [enableComments, doubanId, fetchRecommendations]); if (!enableComments) { return null; } if (loading) { return (
); } if (error) { return (
{error}
); } if (recommendations.length === 0) { return null; } return ( {recommendations.map((rec) => (
))}
); }