"use client"; import { useEffect, useState } from "react"; import { BrainCircuit, ListRestart } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { ZenCard } from "@/components/ui/zen-card"; import { ModeWorkspace } from "@/components/layout/mode-workspace"; 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 { saveHistoryEntry } from "@/lib/history/storage"; 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 [castActive, setCastActive] = useState(false); const [guaData, setGuaData] = useState(null); const [completion, setCompletion] = useState(""); const [error, setError] = useState(""); const [isLoading, setIsLoading] = useState(false); const location = useRegionLocation(provinceCode, cityCode); const formReady = question.trim() !== "" && location !== null; useEffect(() => { setCastActive(false); setGuaData(null); }, [provinceCode, cityCode, castMode, question]); 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); try { const text = 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, ); await saveHistoryEntry({ mode: "liuyao", title: guaData!.result.guaTitle, question, summary: guaData!.result.guaResult, completion: text, hexagram: { guaMark: guaData!.result.guaMark, guaTitle: guaData!.result.guaTitle, guaResult: guaData!.result.guaResult, guaChange: guaData!.result.guaChange, }, meta: { 地域: location!.name, 起卦时间: `${calcDate} ${calcTime}`, 卦象: guaData!.result.guaTitle, }, }); } catch (e) { setError(e instanceof Error ? e.message : String(e)); } finally { setIsLoading(false); } } function handleReset() { setQuestion(""); setProvinceCode(""); setCityCode(""); setCalcDate(nowDateString()); setCalcTime(nowTimeString()); setCastMode("online"); setCastActive(false); setGuaData(null); setCompletion(""); setError(""); setIsLoading(false); } function handleGuaResult(data: GuaResult) { setGuaData(data); setCompletion(""); setError(""); } const downloadPreamble = guaData && location ? `# 六爻算卦 AI 解读\n\n- 问事:${question}\n- 地域:${location.name}\n- 时间:${calcDate} ${calcTime}\n- 卦象:${guaData.result.guaTitle}\n` : undefined; return ( ]/g, "-")}.md` : undefined } downloadPreamble={downloadPreamble} /> } >