import { useState } from 'react'; import { Check, CircleHelp, LoaderCircle, X } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { respondCodingConversationInteraction } from '@/lib/coding-conversations'; import type { ConversationInteraction, ConversationInteractionResponse, } from '@/types/coding-conversation'; export function CodingInteractionPanel({ conversationId, interactions, onSettled, }: { conversationId: string; interactions: ConversationInteraction[]; onSettled?(): Promise | void; }) { const [values, setValues] = useState>({}); const [busyId, setBusyId] = useState(null); const [errors, setErrors] = useState>({}); const pendingInteractions = interactions.filter(({ status }) => status === 'pending'); if (pendingInteractions.length === 0) return null; const respond = (response: ConversationInteractionResponse) => { if (busyId) return; setBusyId(response.interactionId); setErrors((current) => { const next = { ...current }; delete next[response.interactionId]; return next; }); void respondCodingConversationInteraction(conversationId, response) .then(() => onSettled?.()) .catch((error) => { setErrors((current) => ({ ...current, [response.interactionId]: `${error instanceof Error ? error.message : String(error)}。请求可能已失效,请刷新对话。`, })); }) .finally(() => setBusyId((current) => current === response.interactionId ? null : current)); }; return (
{pendingInteractions.map((interaction) => { const busy = busyId === interaction.id; const value = values[interaction.id] ?? ''; return (
{interaction.kind === 'select' && (
{(interaction.options ?? []).map((option) => ( ))}
{ event.preventDefault(); const answer = value.trim(); if (answer) respond({ interactionId: interaction.id, value: answer }); }} > setValues((current) => ({ ...current, [interaction.id]: event.target.value, }))} />
)} {interaction.kind === 'confirm' && (
)} {(interaction.kind === 'input' || interaction.kind === 'editor') && (
{interaction.kind === 'editor' ? (