blob: fd79cec0ae1939957ef2caad489254956dafc74c [file] [log] [blame]
// import React, { useEffect, useState, useRef } from 'react';
// import './Promotion.css';
// const Promotion = () => {
// const [promotions, setPromotions] = useState([]);
// const [coldResources, setColdResources] = useState([]);
// const [loading, setLoading] = useState(true);
// // 轮播索引
// const [promoIndex, setPromoIndex] = useState(0);
// const [coldIndex, setColdIndex] = useState(0);
// // 计时器引用,用于清理
// const promoTimerRef = useRef(null);
// const coldTimerRef = useRef(null);
// useEffect(() => {
// fetchData();
// }, []);
// // 自动轮播:促销活动
// useEffect(() => {
// if (promotions.length === 0) return;
// // 清理旧的计时器
// clearInterval(promoTimerRef.current);
// promoTimerRef.current = setInterval(() => {
// setPromoIndex(prev => (prev + 1) % promotions.length);
// }, 5000);
// return () => clearInterval(promoTimerRef.current);
// }, [promotions]);
// // 自动轮播:冷门资源
// useEffect(() => {
// if (coldResources.length === 0) return;
// clearInterval(coldTimerRef.current);
// coldTimerRef.current = setInterval(() => {
// setColdIndex(prev => (prev + 1) % coldResources.length);
// }, 5000);
// return () => clearInterval(coldTimerRef.current);
// }, [coldResources]);
// const fetchData = async () => {
// try {
// const promoResponse = await fetch(`/echo/promotions/active`);
// const promoData = await promoResponse.json();
// setPromotions(promoData);
// const coldResponse = await fetch(`/echo/resources/cold`);
// const coldData = await coldResponse.json();
// setColdResources(coldData);
// } catch (error) {
// console.error('获取数据失败:', error);
// } finally {
// setLoading(false);
// }
// };
// if (loading) {
// return <div className="promotion-container">加载中...</div>;
// }
// // 手动切换
// const prevPromo = () => setPromoIndex((promoIndex - 1 + promotions.length) % promotions.length);
// const nextPromo = () => setPromoIndex((promoIndex + 1) % promotions.length);
// const prevCold = () => setColdIndex((coldIndex - 1 + coldResources.length) % coldResources.length);
// const nextCold = () => setColdIndex((coldIndex + 1) % coldResources.length);
// const currentPromo = promotions[promoIndex];
// const currentCold = coldResources[coldIndex];
// return (
// <div className="promotion-container carousel-container">
// {/* 促销活动轮播 */}
// <section className="carousel-section">
// <h2>当前促销活动</h2>
// {promotions.length === 0 ? (
// <div className="empty-state">暂无促销活动</div>
// ) : (
// <div
// className="carousel"
// onMouseEnter={() => clearInterval(promoTimerRef.current)}
// onMouseLeave={() => {
// promoTimerRef.current = setInterval(() => {
// setPromoIndex(prev => (prev + 1) % promotions.length);
// }, 3000);
// }}
// >
// <button className="arrow left" onClick={prevPromo}>&lt;</button>
// <div className="slide">
// <div><strong>种子类型:</strong>{currentPromo.category}</div>
// <div><strong>促销时间:</strong>
// {new Date(currentPromo.promotion_start_time).toLocaleString()} ~{' '}
// {new Date(currentPromo.promotion_end_time).toLocaleString()}
// </div>
// <div><strong>下载折扣:</strong>{currentPromo.download_discount ?? '无'}</div>
// <div><strong>上传奖励:</strong>{currentPromo.upload_reward ?? '无'}</div>
// {currentPromo.description && (
// <div><strong>详细描述:</strong>{currentPromo.description}</div>
// )}
// </div>
// <button className="arrow right" onClick={nextPromo}>&gt;</button>
// </div>
// )}
// </section>
// {/* 冷门资源轮播 */}
// <section className="carousel-section">
// <h2>冷门资源推荐</h2>
// {coldResources.length === 0 ? (
// <div className="empty-state">暂无冷门资源推荐</div>
// ) : (
// <div
// className="carousel"
// onMouseEnter={() => clearInterval(coldTimerRef.current)}
// onMouseLeave={() => {
// coldTimerRef.current = setInterval(() => {
// setColdIndex(prev => (prev + 1) % coldResources.length);
// }, 3000);
// }}
// >
// <button className="arrow left" onClick={prevCold}>&lt;</button>
// <div className="slide cold-slide">
// <img src={currentCold.poster} alt={currentCold.title} className="resource-poster" />
// <div className="resource-info">
// <div><strong>标题:</strong>{currentCold.title}</div>
// <div><strong>下载量:</strong>{currentCold.download_count} | <strong>种子数:</strong>{currentCold.seed_count}</div>
// <div><strong>激励:</strong>
// {currentCold.incentives?.download_exempt && <span className="incentive-badge">免下载量</span>}
// {currentCold.incentives?.extra_seed_bonus && <span className="incentive-badge">做种加成</span>}
// {!(currentCold.incentives?.download_exempt || currentCold.incentives?.extra_seed_bonus) && '无'}
// </div>
// </div>
// </div>
// <button className="arrow right" onClick={nextCold}>&gt;</button>
// </div>
// )}
// </section>
// </div>
// );
// };
// export default Promotion;
import React, { useEffect, useState, useRef } from 'react';
import './Promotion.css';
const Promotion = () => {
const [promotions, setPromotions] = useState([]);
const [coldResources, setColdResources] = useState([]);
const [loading, setLoading] = useState(true);
const [promoIndex, setPromoIndex] = useState(0);
const [coldIndex, setColdIndex] = useState(0);
const promoTimerRef = useRef(null);
const coldTimerRef = useRef(null);
useEffect(() => {
fetchData();
}, []);
useEffect(() => {
if (promotions.length === 0) return;
clearInterval(promoTimerRef.current);
promoTimerRef.current = setInterval(() => {
setPromoIndex(prev => (prev + 1) % promotions.length);
}, 5000);
return () => clearInterval(promoTimerRef.current);
}, [promotions]);
useEffect(() => {
if (coldResources.length === 0) return;
clearInterval(coldTimerRef.current);
coldTimerRef.current = setInterval(() => {
setColdIndex(prev => (prev + 1) % coldResources.length);
}, 5000);
return () => clearInterval(coldTimerRef.current);
}, [coldResources]);
const fetchData = async () => {
try {
const promoResponse = await fetch(`/echo/promotions/active`);
const promoData = await promoResponse.json();
setPromotions(promoData);
const coldResponse = await fetch(`/echo/resources/cold`);
const coldData = await coldResponse.json();
setColdResources(coldData);
} catch (error) {
console.error('获取数据失败:', error);
} finally {
setLoading(false);
}
};
if (loading) {
return <div className="promotion-container">加载中...</div>;
}
const prevPromo = () => setPromoIndex((promoIndex - 1 + promotions.length) % promotions.length);
const nextPromo = () => setPromoIndex((promoIndex + 1) % promotions.length);
const prevCold = () => setColdIndex((coldIndex - 1 + coldResources.length) % coldResources.length);
const nextCold = () => setColdIndex((coldIndex + 1) % coldResources.length);
const currentPromo = promotions[promoIndex];
const currentCold = coldResources[coldIndex];
return (
<div className="promotion-container carousel-container">
{/* 促销活动轮播 */}
<section className="carousel-section">
<h2>当前促销活动</h2>
{promotions.length === 0 || !currentPromo ? (
<div className="empty-state">暂无促销活动</div>
) : (
<div
className="carousel"
onMouseEnter={() => clearInterval(promoTimerRef.current)}
onMouseLeave={() => {
promoTimerRef.current = setInterval(() => {
setPromoIndex(prev => (prev + 1) % promotions.length);
}, 3000);
}}
>
<button className="arrow left" onClick={prevPromo}>&lt;</button>
<div className="slide">
<div><strong>种子类型:</strong>{currentPromo?.category ?? '未知'}</div>
<div><strong>促销时间:</strong>
{currentPromo?.promotion_start_time && currentPromo?.promotion_end_time
? `${new Date(currentPromo.promotion_start_time).toLocaleString()} ~ ${new Date(currentPromo.promotion_end_time).toLocaleString()}`
: '未知'}
</div>
<div><strong>下载折扣:</strong>{currentPromo?.download_discount ?? '无'}</div>
<div><strong>上传奖励:</strong>{currentPromo?.upload_reward ?? '无'}</div>
{currentPromo?.description && (
<div><strong>详细描述:</strong>{currentPromo.description}</div>
)}
</div>
<button className="arrow right" onClick={nextPromo}>&gt;</button>
</div>
)}
</section>
{/* 冷门资源轮播 */}
<section className="carousel-section">
<h2>冷门资源推荐</h2>
{coldResources.length === 0 || !currentCold ? (
<div className="empty-state">暂无冷门资源推荐</div>
) : (
<div
className="carousel"
onMouseEnter={() => clearInterval(coldTimerRef.current)}
onMouseLeave={() => {
coldTimerRef.current = setInterval(() => {
setColdIndex(prev => (prev + 1) % coldResources.length);
}, 3000);
}}
>
<button className="arrow left" onClick={prevCold}>&lt;</button>
<div className="slide cold-slide">
<img src={currentCold.poster} alt={currentCold.title} className="resource-poster" />
<div className="resource-info">
<div><strong>标题:</strong>{currentCold.title}</div>
<div><strong>下载量:</strong>{currentCold.download_count ?? 0} | <strong>种子数:</strong>{currentCold.seed_count ?? 0}</div>
<div><strong>激励:</strong>
{currentCold.incentives?.download_exempt && <span className="incentive-badge">免下载量</span>}
{currentCold.incentives?.extra_seed_bonus && <span className="incentive-badge">做种加成</span>}
{!currentCold.incentives?.download_exempt && !currentCold.incentives?.extra_seed_bonus && '无'}
</div>
</div>
</div>
<button className="arrow right" onClick={nextCold}>&gt;</button>
</div>
)}
</section>
</div>
);
};
export default Promotion;