/* eslint-disable @typescript-eslint/no-unused-vars */ import React, { useContext, useEffect, useState } from 'react' import { ChatCompletionRole, MessageStatus, ThreadMessage } from '@janhq/core' import hljs from 'highlight.js' import { useAtomValue } from 'jotai' import { Marked } from 'marked' import { markedHighlight } from 'marked-highlight' import { twMerge } from 'tailwind-merge' import LogoMark from '@/containers/Brand/Logo/Mark' import BubbleLoader from '@/containers/Loader/Bubble' import { displayDate } from '@/utils/datetime' import MessageToolbar from '../MessageToolbar' import { getCurrentChatMessagesAtom } from '@/helpers/atoms/ChatMessage.atom' const marked = new Marked( markedHighlight({ langPrefix: 'hljs', highlight(code, lang) { if (lang === undefined || lang === '') { return hljs.highlightAuto(code).value } try { return hljs.highlight(code, { language: lang }).value } catch (err) { return hljs.highlight(code, { language: 'javascript' }).value } }, }), { renderer: { code(code, lang, escaped) { // Make a copy paste return `
          ${
            escaped ? code : decodeURIComponent(code)
          }
          
` }, }, } ) const SimpleTextMessage: React.FC = (props) => { let text = '' if (props.content && props.content.length > 0) { text = props.content[0]?.text?.value ?? '' } const parsedText = marked.parse(text) const isUser = props.role === ChatCompletionRole.User const isSystem = props.role === ChatCompletionRole.System const [tokenCount, setTokenCount] = useState(0) const [lastTimestamp, setLastTimestamp] = useState() const [tokenSpeed, setTokenSpeed] = useState(0) const messages = useAtomValue(getCurrentChatMessagesAtom) useEffect(() => { if (props.status === MessageStatus.Ready) { return } const currentTimestamp = new Date().getTime() // Get current time in milliseconds if (!lastTimestamp) { // If this is the first update, just set the lastTimestamp and return if (props.content[0]?.text?.value !== '') setLastTimestamp(currentTimestamp) return } const timeDiffInSeconds = (currentTimestamp - lastTimestamp) / 1000 // Time difference in seconds const totalTokenCount = tokenCount + 1 const averageTokenSpeed = totalTokenCount / timeDiffInSeconds // Calculate average token speed setTokenSpeed(averageTokenSpeed) setTokenCount(totalTokenCount) // eslint-disable-next-line react-hooks/exhaustive-deps }, [props.content]) return (
{!isUser && !isSystem && } {isUser && (
)}
{props.role}

{displayDate(props.created)}

{messages[messages.length - 1]?.id === props.id && (props.status === MessageStatus.Pending || tokenSpeed > 0) && (

Token Speed: {Number(tokenSpeed).toFixed(2)}/s

)}
{props.status === MessageStatus.Pending && (!props.content[0] || props.content[0].text.value === '') ? ( ) : ( <>
)}
) } export default React.memo(SimpleTextMessage)