diff --git a/frontend/src/components/activity/ActivityCard.jsx b/frontend/src/components/activity/ActivityCard.jsx index 90f4662..d800509 100644 --- a/frontend/src/components/activity/ActivityCard.jsx +++ b/frontend/src/components/activity/ActivityCard.jsx @@ -1,13 +1,15 @@ -import React from 'react'; +import React, { useState } from 'react'; import { motion } from 'framer-motion'; -import { CalendarOutlined, RightOutlined } from '@ant-design/icons'; +import { CalendarOutlined } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; import styles from './activity.module.less'; -import { hoverScale, imageFadeIn } from '../../animation'; +import { hoverScale } from '../../animation'; -const ActivityCard = ({ activity, index }) => { +const ActivityCard = ({ activity }) => { const navigate = useNavigate(); + const [isLoaded, setIsLoaded] = useState(false); + const [hasError, setHasError] = useState(false); const handleCardClick = () => { navigate(`/activity/${activity.id}`); @@ -17,7 +19,6 @@ const ActivityCard = ({ activity, index }) => { const now = new Date(); const start = new Date(startTime); if (now < start) return '即将开始'; - // Simple logic, can be enhanced return '报名中'; }; @@ -27,6 +28,10 @@ const ActivityCard = ({ activity, index }) => { return date.toLocaleDateString('zh-CN', { month: 'long', day: 'numeric' }); }; + const imgSrc = hasError + ? 'https://via.placeholder.com/600x400?text=No+Image' + : (activity.display_banner_url || activity.banner_url || activity.cover_image || 'https://via.placeholder.com/600x400'); + return ( { style={{ willChange: 'transform' }} >
+ {/* Placeholder / Skeleton Background */} +
+ setIsLoaded(true)} + onError={() => { + setHasError(true); + setIsLoaded(true); // Show placeholder image + }} loading="lazy" />