doctor-mail/apps/web/src/components/models/post/LetterCard.tsx

128 lines
4.8 KiB
TypeScript
Raw Normal View History

2025-01-25 19:51:08 +08:00
import {
2025-01-25 21:22:20 +08:00
EyeOutlined,
LikeOutlined,
LikeFilled,
UserOutlined,
BankOutlined,
CalendarOutlined,
FileTextOutlined,
SendOutlined,
2025-01-25 19:51:08 +08:00
} from "@ant-design/icons";
import { Button, Typography, Space, Tooltip } from "antd";
import toast from "react-hot-toast";
import { useState } from "react";
import { getBadgeStyle } from "@web/src/app/main/letter/list/utils";
import { PostDto } from "@nice/common";
import dayjs from "dayjs";
2025-01-25 21:22:20 +08:00
import PostLikeButton from "./detail/PostHeader/PostLikeButton";
2025-01-24 15:05:03 +08:00
const { Title, Paragraph, Text } = Typography;
2025-01-22 23:19:58 +08:00
interface LetterCardProps {
2025-01-25 21:22:20 +08:00
letter: PostDto;
2025-01-22 23:19:58 +08:00
}
export function LetterCard({ letter }: LetterCardProps) {
2025-01-24 15:05:03 +08:00
2025-01-25 21:22:20 +08:00
return (
<div className="w-full p-4 bg-white transition-all duration-300 ease-in-out group">
2025-01-25 21:22:20 +08:00
<div className="flex flex-col gap-3">
{/* Title & Priority */}
<div className="flex justify-between items-start">
<Title level={4} className="!mb-0 flex-1">
<a
href={`/${letter.id}/detail`}
2025-01-25 21:22:20 +08:00
target="_blank"
className="text-primary transition-all duration-300 relative
2025-01-24 17:37:51 +08:00
before:absolute before:bottom-0 before:left-0 before:w-0 before:h-[2px] before:bg-primary-600
2025-01-24 15:05:03 +08:00
group-hover:before:w-full before:transition-all before:duration-300
2025-01-25 19:51:08 +08:00
group-hover:text-primary-600 group-hover:scale-105 group-hover:drop-shadow-md">
2025-01-25 21:22:20 +08:00
{letter.title}
</a>
</Title>
</div>
2025-01-22 23:19:58 +08:00
2025-01-25 21:22:20 +08:00
{/* Meta Info */}
<div className="flex justify-between items-center text-sm text-secondary">
<Space size="middle">
<Space>
<UserOutlined className=" text-secondary-400"></UserOutlined>
<Text>
{letter.author?.showname || '匿名用户'}
</Text>
</Space>
<Space>
<BankOutlined className="text-secondary-400" />
<Text>{letter.receivers.map(item => item.department?.name).toString()}</Text>
</Space>
<Space>
<SendOutlined className=" text-secondary-400"></SendOutlined>
<Text >
{letter.receivers.map(item => item.showname).toString()}
</Text>
</Space>
</Space>
<Space>
<CalendarOutlined className="text-secondary-400" />
<Text type="secondary">
{dayjs(letter.createdAt).format("YYYY-MM-DD")}
</Text>
</Space>
</div>
2025-01-22 23:19:58 +08:00
2025-01-25 21:22:20 +08:00
{/* Content Preview */}
{letter.content && (
<div className="flex items-start gap-2">
<FileTextOutlined className="text-gray-400 mt-1" />
<Paragraph
ellipsis={{ rows: 2 }}
className="!mb-3 text-gray-600 flex-1">
{letter.content}
</Paragraph>
</div>
)}
2025-01-24 15:05:03 +08:00
2025-01-25 21:22:20 +08:00
{/* Badges & Interactions */}
<div className="flex justify-between items-center">
<Space size="small" wrap className="flex-1">
<Badge type="category" value={"11"} />
<Badge type="status" value={"22"} />
</Space>
2025-01-24 15:05:03 +08:00
2025-01-25 21:22:20 +08:00
<div className="flex items-center gap-4">
<div className="flex items-center gap-1 text-gray-500">
<EyeOutlined className="text-lg" />
<span className="text-sm">{letter.views}</span>
</div>
<PostLikeButton post={letter as any}></PostLikeButton>
</div>
</div>
</div>
</div>
);
2025-01-22 23:19:58 +08:00
}
2025-01-25 00:46:59 +08:00
export function Badge({
2025-01-25 21:22:20 +08:00
type,
value,
className = "",
2025-01-24 15:05:03 +08:00
}: {
2025-01-25 21:22:20 +08:00
type: "priority" | "category" | "status";
value: string;
className?: string;
2025-01-24 15:05:03 +08:00
}) {
2025-01-25 21:22:20 +08:00
return (
value && (
<span
className={`
2025-01-24 15:05:03 +08:00
inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium
2025-01-22 23:19:58 +08:00
${getBadgeStyle(type, value)}
2025-01-24 15:05:03 +08:00
transition-all duration-200 ease-in-out transform hover:scale-105
${className}
2025-01-25 00:46:59 +08:00
`}>
2025-01-25 21:22:20 +08:00
{value?.toUpperCase()}
</span>
)
);
2025-01-22 23:19:58 +08:00
}