import {useState} from "react" import {Text} from "react-native" import {useLocalSearchParams,useRouter} from "expo-router" import {useQuery,useQueryClient} from "@tanstack/react-query" import {useSession} from "../../src/state/session" import {useAccounts} from "../../src/state/accounts" import {Body,Button,ErrorMessage,Field,Panel,Screen,Title,styles} from "../../src/components/ui" import {publicationAvailable,type Candidate} from "../../src/lib/candidates" import type {Budget,Preview} from "../../src/lib/plans" export default function CreatePlan(){ const {candidate_id}=useLocalSearchParams<{candidate_id:string}>(),{session,client}=useSession(),{selected:account}=useAccounts(),router=useRouter(),cache=useQueryClient() const [quantity,setQuantity]=useState(""),[fee,setFee]=useState(""),[preview,setPreview]=useState(null),[busy,setBusy]=useState(false),[error,setError]=useState("") const candidate=useQuery({queryKey:["candidate",session?.user.id,candidate_id],enabled:!!session&&typeof candidate_id==="string",queryFn:({signal})=>client(`/api/v1/candidates/${encodeURIComponent(candidate_id)}`,{signal})}) const budget=useQuery({queryKey:["budget",session?.user.id,account?.id],enabled:account?.mode==="simulation",queryFn:({signal})=>client(`/api/v1/accounts/${account!.id}/budget`,{signal})}) const c=candidate.data,eligible=!!c&&publicationAvailable(c)&&account?.mode==="simulation",currentPreview=preview?.account_id===account?.id?preview:null async function calculate(){if(!c||!account)return;setBusy(true);setError("");setPreview(null);try{setPreview(await client("/api/v1/plan-previews",{method:"POST",body:{account_id:account.id,candidate_revision_id:c.id,expected_candidate_version:c.version,quantity,fee_budget:fee}}))}catch(e){setError(e instanceof Error?e.message:"预览失败");void candidate.refetch();void budget.refetch()}finally{setBusy(false)}} async function confirm(){if(!currentPreview)return;setBusy(true);setError("");try{await client(`/api/v1/plan-previews/${currentPreview.id}/confirm`,{method:"POST",body:{}});await cache.invalidateQueries({queryKey:["plans"]});await cache.invalidateQueries({queryKey:["budget"]});router.replace("/(tabs)/plans")}catch(e){setError(e instanceof Error?e.message:"确认失败");setPreview(null);void candidate.refetch();void budget.refetch()}finally{setBusy(false)}} return 创建模拟买入计划确认计划仅保留资金预算;提醒与计划不会产生交易或扣款。{candidate.error&&} {c&&{c.content.name} · {c.content.symbol}候选修订 {c.revision} · 区间 ¥{c.content.reference_plan.entry_low}–{c.content.reference_plan.entry_high}风险价格 ¥{c.content.reference_plan.stop_loss} · 有效截止 {new Date(c.valid_until).toLocaleString("zh-CN")}}{!account&&<>请先创建或选择模拟账户。