import React, { ReactNode, RefObject, MouseEvent, ReactElement } from 'react'; import type { PromptsItemType } from './antdx'; import type { MessageType } from '../client/base'; import type { UploadProps } from 'antd'; import type { Messages } from './XAiMessage'; import type { SendContent } from './XAiSender'; export interface User { id: string; name: string; avatar?: string; } export interface MessageProps { _id: string; type: string; content: Record; createdAt: number; user: User; position?: 'left' | 'right' | 'center' | 'pop'; hasTime?: boolean; status?: 'pending' | 'sent' | 'fail'; } export interface QuickReplyItemProps { name: string; code: string; icon?: string; img?: string; isNew?: boolean; isHighlight?: boolean; } export interface ComposerHandle { setText: (text: string) => void; } export interface ScrollToEndOptions { animated?: boolean; force?: boolean; } export interface MessageContainerHandle { scrollToEnd: (options?: ScrollToEndOptions) => void; } export interface NavbarProps { title?: string; subtitle?: string; avatar?: string; } export interface ToolbarItemProps { id: string; icon: string; label: string; disabled?: boolean; } export interface IconButtonProps { icon: string; onClick: () => void; disabled?: boolean; } export interface RecorderProps { onStart?: () => void; onStop?: (audioBlob: Blob) => void; onError?: (error: Error) => void; } export type InputType = 'text' | 'voice'; export interface ChatbotMessageFields { messages?: MessageType[]; setMessages?: React.Dispatch>; /** 发送消息回调 */ onSend?: (content: SendContent) => void; /** 清空消息回调 */ onClear?: () => void; /** 停止生成回调 */ onStop?: () => void; } export interface ActionItem { key?: string; icon?: React.ReactNode; render?: (index: number, msg: any) => React.ReactNode; tooltip?: string; } /** * AI 聊天机器人组件 */ export interface XAiChatbotProps extends ChatbotMessageFields { /** 宽屏断点 */ wideBreakpoint?: string; /** 导航栏展示 */ navbarShow?: boolean; /** 导航栏配置 */ navbar?: NavbarProps; /** 导航栏渲染函数,会覆盖 navbar */ renderNavbar?: () => ReactNode; /** 是否加载中 */ loading?: boolean; /** 加载更多文案 */ loadMoreText?: string; /** 在消息列表上面的渲染函数 */ renderBeforeMessageList?: () => ReactNode; /** 消息列表 ref */ messagesRef?: RefObject; /** 下拉加载回调 */ onRefresh?: () => Promise; /** 滚动消息列表回调 */ onScroll?: (event: React.UIEvent) => void; /** 消息内容渲染函数 */ renderMessageContent?: (message: MessageProps) => ReactNode; /** 快捷短语列表 */ quickReplies?: QuickReplyItemProps[]; /** 快捷短语是否可见 */ quickRepliesVisible?: boolean; /** 输入框初始内容 */ text?: string; /** 空状态渲染插槽 */ empty?: ReactElement; /** 空状态图片 */ emptyStateImage?: string; /** 空状态文案 */ emptyStateText?: string; /** 输入框占位符 */ placeholder?: string; /** 输入方式 */ inputType?: InputType; /** 语音输入配置 */ recorder?: RecorderProps; /** 工具栏配置 */ toolbar?: ToolbarItemProps[]; /** AI头像 */ avatar?: ReactNode; /** 用户头像 */ userAvatar?: ReactNode; /** 发送按钮 */ sendBtn?: ReactNode; /** 是否展示清空按钮 */ clearBtnShow?: boolean; /** 工具栏点击回调 */ onToolbarClick?: (item: ToolbarItemProps, event: MouseEvent) => void; /** 工具栏打开/关闭回调 */ onAccessoryToggle?: (isAccessoryOpen: boolean) => void; /** 输入框右边图标按钮配置 */ rightAction?: IconButtonProps; /** 底部文案 */ footerTips?: string; /** 帮助消息点击回调 */ onSuggestMessageClick?: (item: PromptsItemType, id: string) => void; /** 消息左下角展示字段 */ messageTooltip?: (msg: Messages) => React.ReactNode; /** 消息右下角功能区 */ messageActions?: ActionItem[]; /** 消息右下角功能区点击回调 */ onMessagesActionsCallback?: (index: number, data: Messages) => void; /** 输入组件 */ Composer?: React.ElementType; /** 是否展示输入框 */ inputShow?: boolean; /** 多个chatbot唯一键 */ providerId?: string; /** 消息顶部 */ messageTop?: ReactNode; enableUpload?: boolean; uploadRequest?: UploadProps['customRequest']; }