Files
mini-programs/src/components/ListCard/index.tsx
2025-09-07 18:54:36 +08:00

153 lines
4.9 KiB
TypeScript

import { View, Text, Image } from "@tarojs/components";
import Taro from "@tarojs/taro";
import img from "../../config/images";
import { ListCardProps } from "../../../types/list/types";
import "./index.scss";
const ListCard: React.FC<ListCardProps> = ({
id,
title,
start_time,
location,
distance_km,
current_players,
max_players,
skill_level_min,
skill_level_max,
play_type,
image_list = [],
court_type,
key
}) => {
const renderItemImage = (src: string) => {
return <Image src={src} className="image" mode="aspectFill"
lazyLoad
defaultSource='https://images.unsplash.com/photo-1554068865-24cecd4e34b8?w=200&h=200&fit=crop&crop=center'
/>;
};
const handleViewDetail = () => {
console.log('id', id)
Taro.navigateTo({
url: `/pages/detail/index?id=${id || 1}&from=list&autoShare=0`,
});
};
// 根据图片数量决定展示样式
const renderImages = () => {
if (image_list?.length === 0) return null;
if (image_list?.length === 1) {
return (
<View className="single-image">
<View className="image-container">{renderItemImage(image_list?.[0])}</View>
</View>
);
}
if (image_list?.length === 2) {
return (
<View className="double-image">
<View className="image-container">{renderItemImage(image_list?.[0])}</View>
<View className="image-container">{renderItemImage(image_list?.[1])}</View>
</View>
);
}
// 3张或更多图片
return (
<View className="triple-image">
<View className="image-container">{renderItemImage(image_list?.[0])}</View>
<View className="image-container">{renderItemImage(image_list?.[1])}</View>
<View className="image-container">{renderItemImage(image_list?.[2])}</View>
</View>
);
};
return (
<View className="listCard" key={key}>
<View className="listItem" onClick={handleViewDetail}>
{/* 左侧内容区域 */}
<View className="content">
{/* 标题 */}
{title && <View className="titleWrapper">
<Text className="title">{title}</Text>
<Image
src={img.ICON_LIST_RIGHT_ARROW}
className="title-right-arrow"
mode="aspectFit"
/>
</View>}
{/* 时间信息 */}
<View className="date-time">
<Text>{start_time}</Text>
</View>
{/* 地点,室内外,距离 */}
<View className="location">
{location &&
<Text className="location-text location-position">{location}</Text>}
<Text className="location-text location-time-distance">
{court_type && `${court_type}`}
{distance_km && `${distance_km}km`}
</Text>
</View>
{/* 底部信息行:头像组、报名人数、技能等级、比赛类型 */}
<View className="bottom-info">
<View className="left-section">
<View className="avatar-group">
{Array.from({ length: 3 }).map(
(_, index) => (
<View key={index} className="avatar">
<Image
className="avatar-image"
src="https://images.unsplash.com/photo-1554068865-24cecd4e34b8?w=200&h=200&fit=crop&crop=center"
mode="aspectFill"
/>
</View>
)
)}
</View>
</View>
<View className="tags">
<View className="tag">
<Text className="tag-text">
{current_players}/
<Text className="tag-text-max">{max_players}</Text>
</Text>
</View>
<View className="tag">
<Text className="tag-text">{skill_level_min} {skill_level_max}</Text>
</View>
{play_type && <View className="tag">
<Text className="tag-text">{play_type}</Text>
</View>}
</View>
</View>
</View>
{/* 右侧图片区域 */}
<View className="image-section">{renderImages()}</View>
</View>
{/* 畅打球局 */}
<View className="smoothPlayingGame">
<View className="smoothWrapper">
<Image src={img.ICON_LIST_PLAYING_GAME} className="iconListPlayingGame" />
<Text className="smoothTitle"></Text>
</View>
<View className="line" />
<View>:</View>
<View className="localAreaWrapper">
<Image className="localArea" src="https://images.unsplash.com/photo-1554068865-24cecd4e34b8?w=200&h=200&fit=crop&crop=center" />
<Text className="localAreaText"></Text>
</View>
</View>
</View>
);
};
export default ListCard;