import { memo, useEffect, useRef, useState } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { cn } from '@/utils/cn' import type { SlideQuestion } from '../../../types' interface SlideFormInteractionProps { questions?: SlideQuestion[] disabled?: boolean messageTime?: string onSendMessage?: (content: string) => void } const COUNTDOWN_SECONDS = 30 export const SlideFormInteraction = memo( ({ questions, disabled, messageTime, onSendMessage, }: SlideFormInteractionProps) => { const [answers, setAnswers] = useState>({}) const [submitted, setSubmitted] = useState(false) const [seconds, setSeconds] = useState(messageTime ? COUNTDOWN_SECONDS : 0) const timerRef = useRef | null>(null) // 初始化已有答案 useEffect(() => { if (!questions) return const initial: Record = {} questions.forEach((q, i) => { if (q.answer != null) initial[i] = q.answer }) setAnswers(initial) }, [questions]) // 倒计时 useEffect(() => { if (!messageTime || seconds <= 0) return timerRef.current = setInterval(() => { setSeconds(s => { if (s <= 1) { clearInterval(timerRef.current!) handleSubmit() return 0 } return s - 1 }) }, 1000) return () => { if (timerRef.current) clearInterval(timerRef.current) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [messageTime]) function handleSubmit() { if (submitted) return setSubmitted(true) if (timerRef.current) clearInterval(timerRef.current) const content = { questions: questions?.map((q, idx) => ({ ...q, answer: answers[idx] ?? '', })), expected_user_action: 'slide_message_reply', } onSendMessage?.(JSON.stringify(content)) } if (!questions?.length) return null const isDisabled = disabled || submitted || seconds === 0 return (
{/* 标题 */}
✦ 补充信息
{/* 问题列表 */}
{questions.map((q, idx) => (
{q.type === 'input' || !q.options?.length ? ( setAnswers(prev => ({ ...prev, [idx]: e.target.value })) } disabled={isDisabled} className="h-8 text-sm" /> ) : (
{q.options.map(opt => { const selected = q.type === 'multiple' ? (answers[idx] ?? '').split(',').includes(opt) : answers[idx] === opt return ( ) })}
)}
))} {/* 底部:倒计时 + 提交 */}
{submitted || seconds === 0 ? ( '已自动运行' ) : ( <> {seconds}s 后自动运行 )}
) }, )