aura-web/src/pages/AgentList/components/AgentListWebCard.tsx

73 lines
3.2 KiB
TypeScript

import { DeleteOutlined, EditOutlined, MessageOutlined } from '@ant-design/icons';
import { Button, Popconfirm, Space, Tag } from 'antd';
import dayjs from 'dayjs';
import { Link } from 'react-router-dom';
import type { Agent } from '../../../api';
import type { AgentListLogicOutput } from '../AgentListLogic';
interface Props {
agent: Agent;
logic: AgentListLogicOutput;
notifyDeleted: () => void;
}
export default function AgentListWebCard({ agent, logic, notifyDeleted }: Props) {
const { handleDelete, isImageUrl, getModelLabel } = logic;
const modelLabel = getModelLabel(agent.model);
return (
<div className="agent-card agent-list-web-card">
<div className="agent-list-web-card-head">
<div className="avatar agent-list-web-avatar" style={{ background: agent.avatar || 'var(--gradient-brand)' }}>
{isImageUrl(agent.avatar) ? <img src={agent.avatar} className="w-full h-full object-cover" alt="avatar" /> : (agent.name?.charAt(0) || '?').toUpperCase()}
</div>
<div className="agent-list-web-card-title-block">
<div className="agent-list-web-card-title">{agent.name}</div>
<div className="agent-list-web-card-meta"> {dayjs(agent.updated_at).format('YYYY-MM-DD')}</div>
</div>
</div>
<div className="agent-list-web-desc-box">
<div className="desc agent-list-web-desc">{agent.description || '还没有填写描述,可以补充这个智能体适合解决什么问题。'}</div>
</div>
<Space size={6} wrap className="agent-list-web-tags">
{agent.visibility === 'public' && <Tag bordered={false} className="agent-list-web-tag-success"></Tag>}
{agent.visibility === 'team' && <Tag bordered={false} className="agent-list-web-tag-info"></Tag>}
{agent.visibility === 'private' && <Tag bordered={false} className="agent-list-web-tag-neutral"></Tag>}
{modelLabel && (
<Tag bordered={false} className="agent-list-web-tag-brand">
<span className="agent-list-web-model-label">{modelLabel}</span>
</Tag>
)}
{(agent.fork_count ?? 0) > 0 && <Tag bordered={false} className="agent-list-web-tag-neutral">Fork {agent.fork_count}</Tag>}
</Space>
<div className="agent-list-web-card-actions">
<Link to={`/chat/${agent.id}`} className="agent-list-web-action-link">
<Button type="primary" block icon={<MessageOutlined />} className="agent-list-web-action-btn">
</Button>
</Link>
<Link to={`/agents/${agent.id}`} className="agent-list-web-action-link">
<Button block icon={<EditOutlined />} className="agent-list-web-action-btn">
</Button>
</Link>
<Popconfirm
title="确定删除该智能体?"
description="将删除其知识库与对话记录"
onConfirm={() => {
handleDelete(agent.id);
notifyDeleted();
}}
okText="删除"
cancelText="取消"
>
<Button danger icon={<DeleteOutlined />} className="agent-list-web-delete-btn" />
</Popconfirm>
</div>
</div>
);
}