From 8f6f24f7578c58036be972d2255f685b1fdc6a3f Mon Sep 17 00:00:00 2001 From: colinislit Date: Sat, 27 Dec 2025 14:06:38 +0100 Subject: [PATCH] feat(swift): voeg chat input met keyboard shortcuts toe (E2.S4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit E2.S4 - ChatInput component (2 SP) - Textarea met multi-line support en auto-resize - Enter to submit functionaliteit - Shift+Enter voor nieuwe regel - Integration met store (addChatMessage) - Send en Mic buttons (Lucide icons) - Helper text met keyboard shortcuts Input Features: - Auto-resize textarea (max 8 lines / 128px) - Focus management (auto-focus na submit) - Disabled state support - Brand colors voor focus/hover states - Placeholder: "Typ of spreek wat je wilt doen..." Keyboard Shortcuts: - Enter: verstuur bericht (preventDefault als niet Shift) - Shift+Enter: nieuwe regel (default textarea behavior) - Auto-clear input na submit UI Components: - Send button (rechts, alleen enabled met content) - Mic button placeholder (voor E5.S3 voice input) - Helper text met tags voor shortcuts - Smooth transitions en hover effects ChatPanel Integration: - ChatInput component vervangen placeholder - Demo messages verwijderd (nu echte chatMessages uit store) - Auto-scroll werkt met nieuwe user messages Components Created: - components/swift/chat/chat-input.tsx (153 regels) Components Updated: - components/swift/chat/chat-panel.tsx (-108 demo messages, +ChatInput) Epic 2 Progress: 4/5 stories compleet (12 SP / 13 SP = 92%) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- components/swift/chat/chat-input.tsx | 153 +++++++++++++++++++++++++++ components/swift/chat/chat-panel.tsx | 108 ++----------------- 2 files changed, 162 insertions(+), 99 deletions(-) create mode 100644 components/swift/chat/chat-input.tsx 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 */} +