/** * ConversationList - 会话列表组件 * * 现代感设计的会话列表,支持: * - 分组显示(今天、昨天、更早) * - 新建会话 * - 会话切换 * - 会话删除 * - 智能体图标 */ import React, { useMemo } from 'react'; import { Button, Typography, Dropdown, Empty } from 'antd'; import { PlusOutlined, MessageOutlined, DeleteOutlined, MoreOutlined, RobotOutlined, } from '@ant-design/icons'; import type { Conversation, ConversationGroup } from './hooks/useConversations'; import './styles/conversation-list.css'; const { Text } = Typography; /** * ConversationList Props */ export interface ConversationListProps { /** 分组会话列表 */ groups: ConversationGroup[]; /** 当前会话 ID */ currentId: string | null; /** 会话点击回调 */ onSelect: (id: string) => void; /** 新建会话回调 */ onNew: () => void; /** 删除会话回调 */ onDelete?: (id: string) => void; /** 标题 */ title?: string; /** Logo */ logo?: React.ReactNode; /** 自定义类名 */ className?: string; /** 是否加载中 */ loading?: boolean; } /** * 会话列表组件 */ export const ConversationList: React.FC = ({ groups, currentId, onSelect, onNew, onDelete, title = 'AI 助手', logo, className = '', loading = false, }) => { // 会话项菜单 const getMenuItems = (conv: Conversation) => [ { key: 'delete', icon: , label: '删除对话', danger: true, onClick: () => onDelete?.(conv.id), }, ]; // 是否为空 const isEmpty = useMemo(() => { return groups.every(g => g.conversations.length === 0); }, [groups]); return (
{/* 头部 */}
{logo || } {title}
{/* 新建会话按钮 */}
{/* 会话列表 */}
{isEmpty ? ( ) : ( groups.map(group => (
{group.label}
{group.conversations.map(conv => (
onSelect(conv.id)} >
{conv.agentIcon ? ( {conv.agentIcon} ) : ( )}
{conv.title || '新对话'}
{conv.lastMessage && (
{conv.lastMessage}
)}
{onDelete && (
))}
)) )}
); }; export default ConversationList;