"use client"; import type { KeyboardEvent, RefObject } from "react"; import { useCallback, useState, useEffect } from "react"; interface ChatInputProps { onSend: (message: string) => void; disabled?: boolean; inputRef?: RefObject; } export function ChatInput({ onSend, disabled, inputRef }: ChatInputProps) { const [message, setMessage] = useState(""); const [version, setVersion] = useState(null); // Fetch version from static version.json (generated at build time) useEffect(() => { fetch("/version.json") .then((res) => res.json()) .then((data) => { if (data.version) { // Format as "version+commit" for full build identification const fullVersion = data.commit ? `${data.version}+${data.commit}` : data.version; setVersion(fullVersion); } }) .catch(() => { // Silently fail - version display is non-critical }); }, []); const handleSubmit = useCallback(() => { if (message.trim() && !disabled) { onSend(message); setMessage(""); } }, [message, onSend, disabled]); const handleKeyDown = useCallback( (e: KeyboardEvent) => { // Enter to send (without Shift) if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); handleSubmit(); } // Ctrl/Cmd + Enter to send (alternative) if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) { e.preventDefault(); handleSubmit(); } }, [handleSubmit] ); const characterCount = message.length; const maxCharacters = 4000; const isNearLimit = characterCount > maxCharacters * 0.9; const isOverLimit = characterCount > maxCharacters; return (
{/* Input Container */}