UNPKG

@lobehub/ui

Version:

Lobe UI is an open-source UI component library for building AIGC web apps

1 lines 8.51 kB
{"version":3,"file":"ChatListItem.mjs","names":[],"sources":["../../../../src/chat/ChatList/components/ChatListItem.tsx"],"sourcesContent":["import { App } from 'antd';\nimport { memo, type ReactNode, useCallback, useMemo, useState } from 'react';\n\nimport { type AlertProps } from '@/Alert';\nimport ChatItem from '@/chat/ChatItem';\nimport { type ChatMessage } from '@/chat/types';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport { type ChatListItemProps, type ListItemProps } from '../type';\nimport ChatActionsBar from './ChatActionsBar';\n\nconst ChatListItem = memo<ChatListItemProps>((props) => {\n const {\n renderMessagesExtra,\n showTitle,\n onActionsClick,\n onAvatarsClick,\n onMessageChange,\n variant,\n text,\n renderMessages,\n renderErrorMessages,\n renderActions,\n loading,\n groupNav,\n renderItems,\n showAvatar,\n ...item\n } = props;\n\n const [editing, setEditing] = useState(false);\n\n const { message } = App.useApp();\n\n const RenderItem = useMemo(() => {\n if (!renderItems || !item?.role) return;\n let renderFunction;\n if (renderItems?.[item.role]) renderFunction = renderItems[item.role];\n if (!renderFunction && renderItems?.['default']) renderFunction = renderItems['default'];\n if (!renderFunction) return;\n return renderFunction;\n }, [renderItems?.[item.role]]);\n\n const RenderMessage = useCallback(\n ({ editableContent, data }: { data: ChatMessage; editableContent: ReactNode }) => {\n if (!renderMessages || !item?.role) return;\n let RenderFunction;\n if (renderMessages?.[item.role]) RenderFunction = renderMessages[item.role];\n if (!RenderFunction && renderMessages?.['default'])\n RenderFunction = renderMessages['default'];\n if (!RenderFunction) return;\n return <RenderFunction {...data} editableContent={editableContent} />;\n },\n [renderMessages?.[item.role]],\n );\n\n const MessageExtra = useCallback(\n ({ data }: { data: ChatMessage }) => {\n if (!renderMessagesExtra || !item?.role) return;\n let RenderFunction;\n if (renderMessagesExtra?.[item.role]) RenderFunction = renderMessagesExtra[item.role];\n if (renderMessagesExtra?.['default']) RenderFunction = renderMessagesExtra['default'];\n if (!RenderFunction) return;\n return <RenderFunction {...data} />;\n },\n [renderMessagesExtra?.[item.role]],\n );\n\n const ErrorMessage = useCallback(\n ({ data }: { data: ChatMessage }) => {\n if (!renderErrorMessages || !item?.error?.type) return;\n let RenderFunction;\n if (renderErrorMessages?.[item.error.type])\n RenderFunction = renderErrorMessages[item.error.type].Render;\n if (!RenderFunction && renderErrorMessages?.['default'])\n RenderFunction = renderErrorMessages['default'].Render;\n if (!RenderFunction) return;\n return <RenderFunction {...data} />;\n },\n [renderErrorMessages],\n );\n\n const Actions = useCallback(\n ({ data }: { data: ChatMessage }) => {\n if (!renderActions || !item?.role) return;\n let RenderFunction;\n if (renderActions?.[item.role]) RenderFunction = renderActions[item.role];\n if (renderActions?.['default']) RenderFunction = renderActions['default'];\n if (!RenderFunction) RenderFunction = ChatActionsBar;\n\n const handleActionClick: ListItemProps['onActionsClick'] = async (action, data) => {\n switch (action.key) {\n case 'copy': {\n await copyToClipboard(data.content);\n message.success(text?.copySuccess || 'Copy Success');\n break;\n }\n case 'edit': {\n setEditing(true);\n }\n }\n\n onActionsClick?.(action, data);\n };\n\n return (\n <RenderFunction\n {...data}\n text={text}\n onActionClick={(actionKey) => handleActionClick?.(actionKey, data)}\n />\n );\n },\n [renderActions?.[item.role], text, onActionsClick],\n );\n\n const error = useMemo(() => {\n if (!item.error) return;\n const message = item.error?.message;\n let alertConfig = {};\n if (item.error.type && renderErrorMessages?.[item.error.type]) {\n alertConfig = renderErrorMessages[item.error.type]?.config as AlertProps;\n }\n return {\n message,\n ...alertConfig,\n };\n }, [renderErrorMessages, item.error]);\n\n if (RenderItem) return <RenderItem key={item.id} {...props} />;\n\n return (\n <ChatItem\n actions={<Actions data={item} />}\n avatar={item.meta}\n avatarAddon={groupNav}\n editing={editing}\n error={error}\n errorMessage={<ErrorMessage data={item} />}\n loading={loading}\n message={item.content}\n messageExtra={<MessageExtra data={item} />}\n placement={variant === 'bubble' ? (item.role === 'user' ? 'right' : 'left') : 'left'}\n primary={item.role === 'user'}\n showAvatar={showAvatar}\n showTitle={showTitle}\n text={text}\n time={item.updateAt || item.createAt}\n variant={variant}\n renderMessage={(editableContent) => (\n <RenderMessage data={item} editableContent={editableContent} />\n )}\n onAvatarClick={onAvatarsClick?.(item.role)}\n onChange={(value) => onMessageChange?.(item.id, value)}\n onEditingChange={setEditing}\n onDoubleClick={(e) => {\n if (item.id === 'default' || item.error) return;\n if (item.role && ['assistant', 'user'].includes(item.role) && e.altKey) {\n setEditing(true);\n }\n }}\n />\n );\n});\n\nChatListItem.displayName = 'ChatListItem';\n\nexport default ChatListItem;\n"],"mappings":"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"}