import classnames from 'classnames'; import React from 'react'; import type { BubbleProps } from './interface'; import Style from './style/index'; import { Markdown, useProviderContext } from '@agentscope-ai/chat'; import Cards from './Cards'; import Spin from './Spin'; import Avatar from './Avatar'; import AvatarStyle from './style/avatar'; export interface BubbleRef { /** * @description 气泡组件的原生DOM元素引用,用于直接操作DOM * @descriptionEn Native DOM element reference of the bubble component for direct DOM manipulation */ nativeElement: HTMLElement; } export interface BubbleContextProps { /** * @description 气泡内容更新时的回调函数,用于触发重新渲染 * @descriptionEn Callback function when bubble content updates for triggering re-render */ onUpdate?: VoidFunction; } export const BubbleContext = React.createContext({}); const Bubble: React.FC = (props) => { const { isLast, className, rootClassName, style, classNames = {}, styles = {}, avatar, content = '', cards, msgStatus, id, role, // @ts-ignore variant, } = props; const placement = { 'assistant': 'start', 'user': 'end', }[role] || 'start' const { getPrefixCls } = useProviderContext(); const prefixCls = getPrefixCls('bubble'); const mergedCls = classnames( prefixCls, rootClassName, className, `${prefixCls}-${placement}`, ); let contentNode; // @ts-ignore const isEmpty = !content?.length && !cards?.length; if (props.msgStatus === 'generating' && (isEmpty)) { contentNode = } else { contentNode = content ? ( ) : null } const isAssistant = placement === 'assistant' || placement === 'start'; const variantClassname = `${prefixCls}-content-${variant || (isAssistant ? 'borderless' : 'filled')}`; let fullContent: React.ReactNode = (
{ avatar && } { contentNode &&
{contentNode}
}
); return <>