"use client"; import React, { MutableRefObject, useEffect, useState } from "react"; import { Message } from "./ChatWindow"; import { cn } from "@/lib/utils"; import { BookCopy, Disc3, Volume2, StopCircle, Layers3, Plus } from "lucide-react"; import Markdown from "markdown-to-jsx"; import Copy from "./MessageActions/Copy"; import Rewrite from "./MessageActions/Rewrite"; import MessageSources from "./MessageSources"; import SearchImages from "./SearchImages"; import SearchVideos from "./SearchVideos"; import { useSpeech } from "react-text-to-speech"; const MessageBox = ({ message, messageIndex, history, loading, dividerRef, isLast, rewrite, sendMessage, }: { message: Message; messageIndex: number; history: Message[]; loading: boolean; dividerRef?: MutableRefObject; isLast: boolean; rewrite: (messageId: string) => void; sendMessage: (message: string) => void; }) => { const [parsedMessage, setParsedMessage] = useState(message.content); const [speechMessage, setSpeechMessage] = useState(message.content); useEffect(() => { const regex = /\[(\d+)]/g; if (message.role === "assistant" && message?.sources && message.sources.length > 0) { return setParsedMessage( message.content.replaceAll( regex, (_, number) => `${number}`, ), ); } setSpeechMessage(message.content.replaceAll(regex, "")); setParsedMessage(message.content); }, [message.content, message.sources, message.role]); const { speechStatus, start, stop } = useSpeech({ text: speechMessage }); return (
{message.role === "user" && (

{message.content}

)} {message.role === "assistant" && (
{message.sources && message.sources.length > 0 && (

Sources

)}

Answer

{parsedMessage} {loading && isLast ? null : (
{/* */}
)} {isLast && message.suggestions && message.suggestions.length > 0 && message.role === "assistant" && !loading && ( <>

Related

{message.suggestions.map((suggestion, index) => (
{ sendMessage(suggestion); }} className="cursor-pointer flex flex-row justify-between font-medium space-x-2 items-center" >

{suggestion}

))}
)}
)}
); }; export default MessageBox;