blob: 1d3ac22347e3189a2dcea62cfd2550eab187d164 [file] [log] [blame]
import React from 'react';
import { Card, Typography, Space } from 'antd';
import { EyeOutlined, UserOutlined } from '@ant-design/icons';
import type { WorkCardProps } from './types';
import { useNavigate } from 'react-router';
const { Text, Title } = Typography;
const { Meta } = Card;
const WorkCard: React.FC<WorkCardProps> = ({ artwork }) => {
const handleImageError = (e: React.SyntheticEvent<HTMLImageElement, Event>) => {
const target = e.target as HTMLImageElement;
target.src = 'https://via.placeholder.com/300x200?text=No+Image';
};
const nav = useNavigate()
const handleClick = () => {
nav(`/work/${artwork.id}`)
}
const formatViews = (views: number): string => {
return views.toLocaleString();
};
return (
<Card
hoverable
style={{ marginBottom: 16 }}
cover={
<img
alt={artwork.title}
src={artwork.cover}
style={{
height: 200,
objectFit: 'cover',
borderRadius: '8px 8px 0 0'
}}
onError={handleImageError}
/>
}
actions={[
<Space key="views">
<EyeOutlined />
<Text type="secondary">{formatViews(artwork.views)}</Text>
</Space>,
<Space key="author">
<UserOutlined />
<Text type="secondary">{artwork.author}</Text>
</Space>,
]}
onClick={handleClick}
>
<Meta
title={
<div style={{ marginBottom: 8 }}>
<Title level={4} style={{ margin: 0, fontSize: 16 }}>
{artwork.title}
</Title>
</div>
}
description={
<Space direction="vertical" size="small" style={{ width: '100%' }}>
<Text type="secondary" style={{ fontSize: 12 }}>
分类: {artwork.category.name}
</Text>
{artwork.category.children.length > 0 && (
<Space wrap size={[4, 4]}>
{artwork.category.children.map((child, index) => (
<Text
key={index}
code
style={{
fontSize: 11,
padding: '2px 6px',
backgroundColor: '#f5f5f5',
borderRadius: 4
}}
>
{child}
</Text>
))}
</Space>
)}
</Space>
}
/>
</Card>
);
};
export default WorkCard;