/* eslint-disable @typescript-eslint/no-explicit-any */ import { ThreadMessage } from '@janhq/core' import { RenderMarkdown } from './RenderMarkdown' import React, { Fragment, memo, useCallback, useMemo, useState } from 'react' import { IconCopy, IconCopyCheck, IconRefresh, IconTrash, IconPencil, IconInfoCircle, } from '@tabler/icons-react' import { useAppState } from '@/hooks/useAppState' import { cn } from '@/lib/utils' import { useMessages } from '@/hooks/useMessages' import ThinkingBlock from '@/containers/ThinkingBlock' import ToolCallBlock from '@/containers/ToolCallBlock' import { useChat } from '@/hooks/useChat' import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Textarea } from '@/components/ui/textarea' import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip' import { formatDate } from '@/utils/formatDate' import { AvatarEmoji } from '@/containers/AvatarEmoji' import TokenSpeedIndicator from '@/containers/TokenSpeedIndicator' import CodeEditor from '@uiw/react-textarea-code-editor' import '@uiw/react-textarea-code-editor/dist.css' import { useTranslation } from '@/i18n/react-i18next-compat' const CopyButton = ({ text }: { text: string }) => { const [copied, setCopied] = useState(false) const { t } = useTranslation() const handleCopy = () => { navigator.clipboard.writeText(text) setCopied(true) setTimeout(() => setCopied(false), 2000) } return ( ) } const EditDialog = ({ message, setMessage, }: { message: string setMessage: (message: string) => void }) => { const { t } = useTranslation() const [draft, setDraft] = useState(message) const handleSave = () => { if (draft !== message) { setMessage(draft) } } return (

{t('edit')}

{t('common:dialogs.editMessage.title')}