'use client'; import type { ChatRequestOptions, Message } from 'ai'; import cx from 'classnames'; import { motion } from 'framer-motion'; import { memo, useState, type Dispatch, type SetStateAction } from 'react'; import type { Vote } from '@/lib/db/schema'; import type { UIBlock } from './block'; import { DocumentToolCall, DocumentToolResult } from './document'; import { PencilEditIcon, SparklesIcon } from './icons'; import { Markdown } from './markdown'; import { MessageActions } from './message-actions'; import { PreviewAttachment } from './preview-attachment'; import { Weather } from './weather'; import equal from 'fast-deep-equal'; import { cn } from '@/lib/utils'; import { Button } from './ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip'; import { MessageEditor } from './message-editor'; const PurePreviewMessage = ({ chatId, message, block, setBlock, vote, isLoading, setMessages, reload, }: { chatId: string; message: Message; block: UIBlock; setBlock: Dispatch>; vote: Vote | undefined; isLoading: boolean; setMessages: ( messages: Message[] | ((messages: Message[]) => Message[]), ) => void; reload: ( chatRequestOptions?: ChatRequestOptions, ) => Promise; }) => { const [mode, setMode] = useState<'view' | 'edit'>('view'); return (
{message.role === 'assistant' && (
)}
{message.experimental_attachments && (
{message.experimental_attachments.map((attachment) => ( ))}
)} {message.content && mode === 'view' && (
{message.role === 'user' && ( Edit message )}
{message.content as string}
)} {message.content && mode === 'edit' && (
)} {message.toolInvocations && message.toolInvocations.length > 0 && (
{message.toolInvocations.map((toolInvocation) => { const { toolName, toolCallId, state, args } = toolInvocation; if (state === 'result') { const { result } = toolInvocation; return (
{toolName === 'getWeather' ? ( ) : toolName === 'createDocument' ? ( ) : toolName === 'updateDocument' ? ( ) : toolName === 'requestSuggestions' ? ( ) : (
{JSON.stringify(result, null, 2)}
)}
); } return (
{toolName === 'getWeather' ? ( ) : toolName === 'createDocument' ? ( ) : toolName === 'updateDocument' ? ( ) : toolName === 'requestSuggestions' ? ( ) : null}
); })}
)}
); }; export const PreviewMessage = memo( PurePreviewMessage, (prevProps, nextProps) => { if (prevProps.isLoading !== nextProps.isLoading) return false; if (prevProps.isLoading && nextProps.isLoading) return false; if (prevProps.message.content && nextProps.message.content) return false; if (!equal(prevProps.vote, nextProps.vote)) return false; return true; }, ); export const ThinkingMessage = () => { const role = 'assistant'; return (
Thinking...
); };