import { useWindowResize } from "@/hooks/useWindowResize"; import { useEffect, useRef, useState } from "react"; type ChatMessageInput = { placeholder: string; accentColor: string; height: number; onSend: (message: string) => void; }; export const ChatMessageInput = ({ placeholder, accentColor, height, onSend, }: ChatMessageInput) => { const [message, setMessage] = useState(""); const [inputTextWidth, setInputTextWidth] = useState(0); const [inputWidth, setInputWidth] = useState(0); const hiddenInputRef = useRef(null); const inputRef = useRef(null); const windowSize = useWindowResize(); const [isTyping, setIsTyping] = useState(false); const [inputHasFocus, setInputHasFocus] = useState(false); const handleSend = () => { if (message === "") { return; } onSend(message); setMessage(""); }; useEffect(() => { setIsTyping(true); const timeout = setTimeout(() => { setIsTyping(false); }, 500); return () => clearTimeout(timeout); }, [message]); useEffect(() => { if (hiddenInputRef.current) { setInputTextWidth(hiddenInputRef.current.clientWidth); } }, [hiddenInputRef, message]); useEffect(() => { if (inputRef.current) { setInputWidth(inputRef.current.clientWidth); } }, [hiddenInputRef, message, windowSize.width]); return (
0 ? Math.min(inputTextWidth, inputWidth - 20) - 4 : 0) + "px)", }} >
0 ? "12px" : "24px", caretShape: "block", }} placeholder={placeholder} value={message} onChange={(e) => { setMessage(e.target.value); }} onFocus={() => { setInputHasFocus(true); }} onBlur={() => { setInputHasFocus(false); }} onKeyDown={(e) => { if (e.key === "Enter") { handleSend(); } }} > {message.replaceAll(" ", "\u00a0")}
); };