"use client"; import { useEffect, useRef, useState } from "react"; import { BrainCircuit, ListRestart } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import Result from "@/components/result"; import ResultAI from "@/components/result-ai"; import DateTimePicker, { nowDateString, nowTimeString, } from "@/components/shared/datetime-picker"; import HexagramInput from "@/components/shared/hexagram-input"; import RegionSelect, { useRegionLocation, } from "@/components/shared/region-select"; import { streamAiCompletion } from "@/lib/ai/client-stream"; import type { GuaResult } from "@/lib/calc/hexagram"; import todayJson from "@/lib/data/today.json"; const todayData: string[] = todayJson; export default function LiuyaoForm() { const [question, setQuestion] = useState(""); const [provinceCode, setProvinceCode] = useState(""); const [cityCode, setCityCode] = useState(""); const [calcDate, setCalcDate] = useState(nowDateString); const [calcTime, setCalcTime] = useState(nowTimeString); const [castMode, setCastMode] = useState<"online" | "offline">("online"); const [guaData, setGuaData] = useState(null); const [completion, setCompletion] = useState(""); const [error, setError] = useState(""); const [isLoading, setIsLoading] = useState(false); const [showAi, setShowAi] = useState(false); const actionRef = useRef(null); const location = useRegionLocation(provinceCode, cityCode); const formReady = question.trim() !== "" && location !== null; useEffect(() => { if (guaData && actionRef.current) { actionRef.current.scrollIntoView({ behavior: "smooth", block: "nearest" }); } }, [guaData]); function validate(): string | null { if (!question.trim()) { return "请输入问事"; } if (!location) { return "请选择起卦省份"; } if (!guaData) { return "请先完成 6 次起卦(线上摇卦或线下录入)"; } return null; } async function handleAnalyze() { const err = validate(); if (err) { setError(err); return; } setError(""); setCompletion(""); setIsLoading(true); setShowAi(true); try { await streamAiCompletion( { mode: "liuyao", payload: { question, calcDate, calcTime, locationName: location!.name, longitude: location!.longitude, guaMark: guaData!.result.guaMark, guaTitle: guaData!.result.guaTitle, guaResult: guaData!.result.guaResult, guaChange: guaData!.result.guaChange, }, }, setCompletion, ); } catch (e) { setError(e instanceof Error ? e.message : String(e)); } finally { setIsLoading(false); } } function handleReset() { setQuestion(""); setProvinceCode(""); setCityCode(""); setCalcDate(nowDateString()); setCalcTime(nowTimeString()); setGuaData(null); setCompletion(""); setError(""); setShowAi(false); setIsLoading(false); } function handleGuaResult(data: GuaResult) { setGuaData(data); setShowAi(false); setCompletion(""); setError(""); } return (