'use client'; /* eslint-disable @next/next/no-img-element */ import React, { MutableRefObject, useEffect, useState } from 'react'; import { Message } from './ChatWindow'; import { cn } from '@/lib/utils'; import { BookCopy, Disc3, Volume2, StopCircle, Layers3, Plus, Languages, Loader2 } 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'; import { SearchPDFs } from './SearchPDFs'; import { Select } from './ui/Select'; 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); const [translating, setTranslating] = useState(false); const [currentLanguage, setCurrentLanguage] = useState('english'); useEffect(() => { const regex = /\[(\d+)\]/g; if ( message.role === 'assistant' && message?.sources && message.sources.length > 0 ) { return setParsedMessage( message.content.replace( regex, (_, number) => `${number}`, ), ); } setSpeechMessage(message.content.replace(regex, '')); setParsedMessage(message.content); }, [message.content, message.sources, message.role]); const handleTranslate = async (language: string) => { if (language === currentLanguage) return; setTranslating(true); try { const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/translate`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ text: message.content, targetLanguage: language }), }); if (!response.ok) throw new Error('Translation failed'); const data = await response.json(); setParsedMessage(data.translatedText); setCurrentLanguage(language); } catch (error) { console.error('Translation error:', error); } finally { setTranslating(false); } }; const { speechStatus, start, stop } = useSpeech({ text: speechMessage }); return (
{message.role === 'user' && (

{message.content}

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

Sources

)}

Answer

{translating && ( )}