'use client'; import classNames from 'classnames'; import type { FC, ReactNode } from 'react'; import { useCallback, useContext, useState } from 'react'; import { MessageDetailContext } from '@/context/MessageDetailContext'; import { SettingsContext } from '@/context/SettingsContext'; import { Model, Role } from '@/utils/constants'; import type { ChatResponse, Message as MessageType } from '@/utils/constants'; import { formatMessage, FormatMessageMode } from '@/utils/formatMessage'; import { getContent, getRole } from '@/utils/message'; import { disableScroll, scrollToTop } from '@/utils/scroll'; import { ChatGPTIcon } from './icons/ChatGPTIcon'; import { HeroiconsUser } from './icons/HeroiconsUser'; /** * 单个消息气泡 */ export const Message: FC = (props) => { const { settings } = useContext(SettingsContext)!; const { setMessageDetail, setFormatMessageMode } = useContext(MessageDetailContext)!; const role = getRole(props); const content = getContent(props); const isError = !!(props as MessageType).isError; const isUser = role === Role.user; const isAssistant = role === Role.assistant; const [lastTapTime, setLastTapTime] = useState(0); const handleTap = useCallback(() => { const currentTime = new Date().getTime(); const tapLength = currentTime - lastTapTime; if (tapLength < 500 && tapLength > 0) { scrollToTop(); disableScroll(); setMessageDetail(content); setFormatMessageMode(isAssistant ? FormatMessageMode.partial : FormatMessageMode.zero); // 处理双击事件 } else { // 处理单击事件 } setLastTapTime(currentTime); }, [lastTapTime, setLastTapTime, content, setMessageDetail, isAssistant, setFormatMessageMode]); return (
{isAssistant ? ( ) : ( )}
{/* 三角箭头 */}
); }; /** * 系统消息 */ export const SystemMessage: FC<{ children: ReactNode }> = ({ children }) => { return
{children}
; };