import { useCallback, useEffect, useRef } from 'react' import { Message, TextContentBlock } from '@janhq/core' import { TextArea, Button } from '@janhq/joi' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { twMerge } from 'tailwind-merge' import { editPromptAtom } from '@/containers/Providers/Jotai' import useMessageUpdateMutation from '@/hooks/useMessageUpdateMutation' import { editMessageAtom, updateMessageAtom, } from '@/helpers/atoms/ChatMessage.atom' import { spellCheckAtom } from '@/helpers/atoms/Setting.atom' type Props = { message: Message } const EditChatInput: React.FC = ({ message }) => { const [editPrompt, setEditPrompt] = useAtom(editPromptAtom) const spellCheck = useAtomValue(spellCheckAtom) const textareaRef = useRef(null) const textAreaRef = useRef(null) const setEditMessage = useSetAtom(editMessageAtom) const updateMessageState = useSetAtom(updateMessageAtom) const updateCortexMessage = useMessageUpdateMutation() const onPromptChange = useCallback( (e: React.ChangeEvent) => { setEditPrompt(e.target.value) }, [setEditPrompt] ) useEffect(() => { if (textAreaRef.current) { textAreaRef.current.focus() } }, [message.id]) useEffect(() => { if (!textAreaRef.current) return textAreaRef.current.style.height = '40px' textAreaRef.current.style.height = textAreaRef.current.scrollHeight + 'px' textAreaRef.current.style.overflow = textAreaRef.current.clientHeight >= 390 ? 'auto' : 'hidden' }, [editPrompt]) useEffect(() => { const messageContent = message.content[0] if (!messageContent) return if (messageContent.type === 'text') { const textMessageBlock = messageContent as TextContentBlock setEditPrompt(textMessageBlock.text.value) } }, [setEditPrompt, message]) const updateMessage = useCallback(() => { const updateMessage: TextContentBlock = { text: { annotations: [], value: editPrompt, }, type: 'text', } updateCortexMessage.mutate({ threadId: message.thread_id, messageId: message.id, data: { content: [updateMessage], }, }) updateMessageState( message.id, message.thread_id, [updateMessage], message.status ) setEditMessage('') }, [ updateMessageState, updateCortexMessage, setEditMessage, message, editPrompt, ]) const onKeyDown = useCallback( async (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault() updateMessage() } }, [updateMessage] ) return (