import React, { useState } from 'react'; import { Model, ModelStatus, Gender, ModelViewMode } from '../types/model'; import { PencilIcon, TrashIcon, StarIcon, UserIcon, TagIcon, CalendarIcon, EyeIcon, HeartIcon, ShareIcon, PhotoIcon } from '@heroicons/react/24/outline'; import { HeartIcon as HeartIconSolid } from '@heroicons/react/24/solid'; interface ModelCardProps { model: Model; viewMode: ModelViewMode; onEdit: () => void; onDelete: () => void; onSelect?: () => void; onFavorite?: (id: string) => void; isFavorite?: boolean; isLoading?: boolean; } const ModelCard: React.FC = ({ model, viewMode, onEdit, onDelete, onSelect, onFavorite, isFavorite = false, isLoading = false }) => { const [isHovered, setIsHovered] = useState(false); const [imageLoaded, setImageLoaded] = useState(false); const [imageError, setImageError] = useState(false); const getStatusColor = (status: ModelStatus) => { switch (status) { case ModelStatus.Active: return 'bg-green-100 text-green-800 border border-green-200'; case ModelStatus.Inactive: return 'bg-gray-100 text-gray-800 border border-gray-200'; case ModelStatus.Retired: return 'bg-red-100 text-red-800 border border-red-200'; case ModelStatus.Suspended: return 'bg-yellow-100 text-yellow-800 border border-yellow-200'; default: return 'bg-gray-100 text-gray-800 border border-gray-200'; } }; const getStatusText = (status: ModelStatus) => { switch (status) { case ModelStatus.Active: return '活跃'; case ModelStatus.Inactive: return '不活跃'; case ModelStatus.Retired: return '退役'; case ModelStatus.Suspended: return '暂停'; default: return '未知'; } }; const getGenderText = (gender: Gender) => { switch (gender) { case Gender.Male: return '男'; case Gender.Female: return '女'; case Gender.Other: return '其他'; default: return '未知'; } }; const avatarUrl = model.avatar_path || (model.photos.length > 0 ? model.photos[0].file_path : null); const renderRating = (rating: number) => { return (
{[...Array(5)].map((_, i) => ( ))} {rating.toFixed(1)}
); }; if (isLoading) { return (
); } if (viewMode === ModelViewMode.List) { // 列表视图 return (
{/* 头像 */}
{avatarUrl && !imageError ? ( {model.name} setImageLoaded(true)} onError={() => setImageError(true)} /> ) : (
)} {/* 状态指示器 */}
{/* 内容 */}

{model.name}

{model.stage_name && (

艺名: {model.stage_name}

)}
{getGenderText(model.gender)} {model.age && {model.age}岁} {model.height && {model.height}cm} {model.photos.length}
{/* 标签 */} {model.tags.length > 0 && (
{model.tags.slice(0, 3).map((tag, index) => ( {tag} ))} {model.tags.length > 3 && ( +{model.tags.length - 3} )}
)}
{/* 评分和操作 */}
{model.rating && renderRating(model.rating)}
); } // 网格视图 - 增强的现代化设计 return (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} onClick={onSelect} > {/* 装饰性背景 */}
{/* 封面图片容器 */}
{/* 图片 */} {avatarUrl && !imageError ? ( {model.name} setImageLoaded(true)} onError={() => setImageError(true)} /> ) : (

暂无照片

)} {/* 加载状态 */} {!imageLoaded && !imageError && avatarUrl && (
)} {/* 悬停遮罩 */}
{/* 状态标签 */}
{getStatusText(model.status)}
{/* 收藏按钮 */} {/* 照片数量指示器 */} {model.photos.length > 0 && (
{model.photos.length}
)} {/* 快速操作按钮 */}
{/* 模特信息 */}
{/* 标题和评分 */}

{model.name}

{model.stage_name && (

艺名: {model.stage_name}

)}
{/* 评分 */} {model.rating && (
{[...Array(5)].map((_, i) => ( ))}
{model.rating.toFixed(1)}
)}
{/* 基本信息 */}
{getGenderText(model.gender)} {model.age && ( {model.age}岁 )} {model.height && ( {model.height}cm )}
{/* 标签 */} {model.tags.length > 0 && (
{model.tags.slice(0, 2).map((tag, index) => ( {tag} ))} {model.tags.length > 2 && ( +{model.tags.length - 2} )}
)} {/* 操作按钮 */}
); }; export default ModelCard;