import { useState } from 'react' import { useChatStore } from '../../stores/chatStore' import { Button } from '../shared/Button' type QuestionOption = { label: string description?: string } type Question = { question: string header?: string options?: QuestionOption[] } type AskUserInput = { questions?: Question[] question?: string options?: QuestionOption[] } type Props = { toolUseId: string input: unknown } /** * Parse the AskUserQuestion input which may come in different shapes. */ function parseInput(input: unknown): Question[] { if (!input || typeof input !== 'object') return [] const obj = input as AskUserInput // Shape 1: { questions: [...] } if (Array.isArray(obj.questions)) { return obj.questions } // Shape 2: { question: "...", options: [...] } if (typeof obj.question === 'string') { return [{ question: obj.question, options: obj.options }] } return [] } export function AskUserQuestion({ toolUseId: _toolUseId, input }: Props) { const { sendMessage } = useChatStore() const questions = parseInput(input) const [activeTab, setActiveTab] = useState(0) const [selections, setSelections] = useState>({}) const [freeText, setFreeText] = useState('') const [submitted, setSubmitted] = useState(false) if (questions.length === 0) return null const handleSelect = (qIndex: number, label: string) => { if (submitted) return setSelections((prev) => { // Toggle: deselect if already selected if (prev[qIndex] === label) { const next = { ...prev } delete next[qIndex] return next } return { ...prev, [qIndex]: label } }) setFreeText('') } const handleSubmit = () => { if (submitted) return const parts: string[] = [] for (let i = 0; i < questions.length; i++) { const selected = selections[i] if (selected) parts.push(selected) } const response = freeText.trim() || parts.join('; ') || '' if (!response) return setSubmitted(true) sendMessage(response) } // All questions must be answered (via selection or free text) to enable submit const allAnswered = freeText.trim().length > 0 || questions.every((_, i) => selections[i] !== undefined) const activeQuestion = questions[activeTab] return (
{/* Header */}
help
Claude needs your input {submitted && ( Answered )}
{/* Question tabs — horizontal tab bar (only show when multiple questions) */} {questions.length > 1 && (
{questions.map((q, i) => { const isActive = activeTab === i const isAnswered = selections[i] !== undefined const tabLabel = q.header || `Q${i + 1}` return ( ) })}
)} {/* Active question content */}

{activeQuestion.question}

{/* Option cards */} {activeQuestion.options && activeQuestion.options.length > 0 && (
{activeQuestion.options.map((opt, optIndex) => { const isSelected = selections[activeTab] === opt.label return ( ) })}
)} {/* Free text input */} {!submitted && (
{ setFreeText(e.target.value) if (e.target.value.trim()) setSelections({}) }} onKeyDown={(e) => { if (e.key === 'Enter' && allAnswered) handleSubmit() }} placeholder="Type your answer..." className="w-full px-3 py-2 text-sm bg-[var(--color-surface)] border border-[var(--color-outline-variant)]/40 rounded-[var(--radius-md)] text-[var(--color-text-primary)] placeholder:text-[var(--color-text-tertiary)] focus:outline-none focus:border-[var(--color-secondary)] focus:ring-1 focus:ring-[var(--color-secondary)]/30" />
)} {/* Submitted answer display */} {submitted && (
check_circle Answered: {freeText.trim() || Object.values(selections).join(', ')}
)}
{/* Submit button */} {!submitted && (
)}
) }