"use client"; import { useState } from "react"; import { readStreamableValue } from "ai/rsc"; import { BrainCircuit } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import ResultAI from "@/components/result-ai"; import BaziChartDisplay from "@/components/modes/bazi-chart"; import DateTimePicker, { nowDateString } from "@/components/shared/datetime-picker"; import RegionSelect, { useRegionLocation, } from "@/components/shared/region-select"; import { calculateBazi, type BaziChart } from "@/lib/calc/bazi"; import { getBaziAnswer } from "@/app/actions/bazi"; import { ERROR_PREFIX } from "@/lib/constant"; export default function BaziForm() { const [date, setDate] = useState(nowDateString()); const [time, setTime] = useState("12:00"); const [unknownHour, setUnknownHour] = useState(false); const [gender, setGender] = useState<"male" | "female">("male"); const [provinceCode, setProvinceCode] = useState(""); const [cityCode, setCityCode] = useState(""); const [question, setQuestion] = useState(""); const [chart, setChart] = useState(null); const [completion, setCompletion] = useState(""); const [error, setError] = useState(""); const [isLoading, setIsLoading] = useState(false); const [showAi, setShowAi] = useState(false); const location = useRegionLocation(provinceCode, cityCode); function buildInput() { if (!location) { return null; } return { date, time: unknownHour ? "12:00" : time, gender, longitude: location.longitude, unknownHour, }; } function handleCalculate() { const input = buildInput(); if (!input) { setError("请选择出生地域"); return; } if (!question.trim()) { setError("请输入问事"); return; } setError(""); setChart(calculateBazi(input)); setShowAi(false); setCompletion(""); } async function handleAnalyze() { const input = buildInput(); if (!input || !chart) { return; } setError(""); setCompletion(""); setIsLoading(true); setShowAi(true); try { const { data, error: apiError } = await getBaziAnswer( input, question, location!.name, ); if (apiError) { setError(apiError); return; } if (data) { let ret = ""; for await (const delta of readStreamableValue(data)) { if (typeof delta === "string" && delta.startsWith(ERROR_PREFIX)) { setError(delta.slice(ERROR_PREFIX.length)); return; } ret += delta ?? ""; setCompletion(ret); } } } catch (err) { setError(err instanceof Error ? err.message : String(err)); } finally { setIsLoading(false); } } return (
{(["male", "female"] as const).map((g) => ( ))}