diff --git a/components/swift/chat/chat-input.tsx b/components/swift/chat/chat-input.tsx new file mode 100644 index 0000000..f5f440c --- /dev/null +++ b/components/swift/chat/chat-input.tsx @@ -0,0 +1,153 @@ +'use client'; + +/** + * Chat Input Component (v3.0) + * + * Text input onderaan chat panel met Enter to submit en Shift+Enter voor nieuwe regel. + * + * Epic: E2 (Chat Panel & Messages) + * Story: E2.S4 (ChatInput component) + */ + +import { useState, useRef, KeyboardEvent, ChangeEvent } from 'react'; +import { Send, Mic } from 'lucide-react'; +import { useSwiftStore } from '@/stores/swift-store'; +import { cn } from '@/lib/utils'; + +interface ChatInputProps { + placeholder?: string; + onSend?: (message: string) => void; + disabled?: boolean; +} + +export function ChatInput({ + placeholder = 'Typ of spreek wat je wilt doen...', + onSend, + disabled = false, +}: ChatInputProps) { + const [inputValue, setInputValue] = useState(''); + const textareaRef = useRef(null); + const addChatMessage = useSwiftStore((s) => s.addChatMessage); + + // Handle input change and auto-resize + const handleChange = (e: ChangeEvent) => { + setInputValue(e.target.value); + + // Auto-resize textarea + if (textareaRef.current) { + textareaRef.current.style.height = 'auto'; + textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`; + } + }; + + // Handle submit + const handleSubmit = () => { + const trimmedValue = inputValue.trim(); + if (!trimmedValue || disabled) return; + + // Add user message to store + addChatMessage({ + type: 'user', + content: trimmedValue, + }); + + // Call optional onSend callback + onSend?.(trimmedValue); + + // Clear input + setInputValue(''); + + // Reset textarea height + if (textareaRef.current) { + textareaRef.current.style.height = 'auto'; + } + + // Focus back on textarea + textareaRef.current?.focus(); + }; + + // Handle keyboard shortcuts + const handleKeyDown = (e: KeyboardEvent) => { + // Enter to submit (unless Shift is pressed) + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleSubmit(); + } + + // Shift+Enter for new line (default behavior, no need to handle) + }; + + return ( +
+
+ {/* Textarea input */} +