import { useEffect, useMemo, useState } from 'react' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { Loader2 } from 'lucide-react' import { api, type MinuteKlineRow } from '@/lib/api' import { QK } from '@/lib/queryKeys' import { EChartsIntraday } from '@/components/EChartsIntraday' interface Props { symbol: string date: string | null height?: number prevClose?: number className?: string onPriceHover?: (price: number | null) => void } export function StockIntradayChart({ symbol, date, height = 520, prevClose, className, onPriceHover, }: Props) { const qc = useQueryClient() const [minuteDismissed, setMinuteDismissed] = useState(false) const minute = useQuery({ queryKey: QK.klineMinute(symbol, date ?? ''), queryFn: () => api.klineMinute(symbol, date ?? undefined), enabled: !!symbol && !!date, }) const fetchMinute = useMutation({ mutationFn: () => api.extendMinuteHistory(5, 'day'), onSuccess: () => { qc.invalidateQueries({ queryKey: ['kline-minute', symbol] }) qc.invalidateQueries({ queryKey: QK.dataStatus }) qc.invalidateQueries({ queryKey: QK.pipelineJobs }) setMinuteDismissed(false) }, }) const minuteRows: MinuteKlineRow[] = useMemo(() => minute.data?.rows ?? [], [minute.data?.rows]) // source=none 表示本地无数据且 TickFlow 也拉不到 (停牌/复牌延迟/非交易日) // 此时不弹"是否获取"询问窗, 只做静态提示, 避免误导用户去拉明知拉不到的数据 const sourceIsNone = minute.data?.source === 'none' useEffect(() => { setMinuteDismissed(false) onPriceHover?.(null) }, [date, onPriceHover]) if (!symbol || !date) return null return (