import React, { useMemo, useEffect } from 'react'; import { useActivity } from '../context/ActivityContext'; import { AwardListViewProps, PrizeItem } from '../types'; import AwardItemView from './AwardItemView'; import '../styles/index.css'; // 独立的奖励列表组件(不依赖 context) const StandaloneAwardListView = ({ activityInfo, customRedeem, callbackPoints, className = 'award-list-container', style, emptyClassName = 'award-empty', itemsClassName = 'award-items', emptyText = '暂无奖品' }: AwardListViewProps): React.ReactElement => { // 获取奖励活动数据 const awardActivity = activityInfo?.awardActivity; const prizes: PrizeItem[] = awardActivity?.items || []; const userInfo = activityInfo?.userInfo; // 需要奖励类型过滤 抽奖装扮 和 定时抽奖 不展示 const filteredPrizes = useMemo(() => { return prizes.filter(prize => prize.type !== 'SLOT_DRESSING' && prize.type !== 'SLOT_SCHEDULED'); }, [prizes]); if (!awardActivity || filteredPrizes.length === 0) { return (
{emptyText}
); } return (
{/* 奖品网格列表 */}
{filteredPrizes.map(prize => ( ))}
); }; // 依赖 context 的奖励列表组件 const ContextAwardListView = ({ customRedeem, callbackPoints, className = 'award-list-container', style, loadingClassName = 'award-loading', errorClassName = 'award-error', emptyClassName = 'award-empty', itemsClassName = 'award-items', loadingText = '加载中...', errorText = '加载失败', emptyText = '暂无奖品' }: Omit): React.ReactElement => { const { activityInfo: contextActivityInfo, loading, error, userInfo } = useActivity(); // 获取奖励活动数据 const awardActivity = contextActivityInfo?.awardActivity; const prizes: PrizeItem[] = awardActivity?.items || []; // 需要奖励类型过滤 抽奖装扮 和 定时抽奖 不展示 const filteredPrizes = useMemo(() => { return prizes.filter(prize => prize.type !== 'SLOT_DRESSING' && prize.type !== 'SLOT_SCHEDULED'); }, [prizes]); useEffect(() => { if (userInfo?.points && callbackPoints) { callbackPoints(userInfo.points); } }, [userInfo, callbackPoints]); if (loading) { return (
{loadingText}
); } if (error) { return (
{errorText}: {error}
); } if (!awardActivity || filteredPrizes.length === 0) { return (
{emptyText}
); } return (
{/* 奖品网格列表 */}
{filteredPrizes.map(prize => ( ))}
{/* 活动信息 */} {awardActivity.isEndingSoon && awardActivity.isEndingSoon() && (
⚠️ 活动即将结束,请及时兑换!
)}
); }; // 主组件:根据是否有 activityInfo 选择使用哪个子组件 const AwardListView = (props: AwardListViewProps): React.ReactElement => { // 如果传入了 activityInfo,使用独立组件(不会触发 useActivity) if (props.activityInfo) { return ; } // 否则使用依赖 context 的组件 return ; }; export default AwardListView;