feat: implement FutureForecastModal and PanelSections for advanced weather visualization and dashboard data display

This commit is contained in:
2569718930@qq.com
2026-04-22 02:30:49 +08:00
parent df1ce01625
commit 00eed52545
2 changed files with 45 additions and 18 deletions
@@ -736,6 +736,9 @@ export function FutureForecastModal() {
if (!cityName || !dateStr) return; if (!cityName || !dateStr) return;
let cancelled = false; let cancelled = false;
let intervalId: ReturnType<typeof setInterval> | null = null;
const refreshMarketScan = () => {
dashboardClient dashboardClient
.getCityMarketScan(cityName, { .getCityMarketScan(cityName, {
force: false, force: false,
@@ -751,9 +754,21 @@ export function FutureForecastModal() {
setFreshMarketScan(null); setFreshMarketScan(null);
} }
}); });
};
refreshMarketScan();
intervalId = setInterval(() => {
if (typeof document !== "undefined" && document.visibilityState === "hidden") {
return;
}
refreshMarketScan();
}, 3000);
return () => { return () => {
cancelled = true; cancelled = true;
if (intervalId != null) {
clearInterval(intervalId);
}
}; };
}, [ }, [
dateStr, dateStr,
@@ -924,6 +924,14 @@ export function ProbabilityDistribution({
row.probability > best.probability ? row : best, row.probability > best.probability ? row : best,
) )
: null; : null;
const displayTopLabel = topContractRow?.label || topProbabilityLabel || null;
const displayTopProbability =
topContractRow?.probability ??
(topProbability?.probability != null
? Number(topProbability.probability)
: null);
const displayTopProbabilityText = toPercent(displayTopProbability);
const displayUsesMarketBuckets = marketContractRows.length > 0;
const linkedMarketBucket = useMemo(() => { const linkedMarketBucket = useMemo(() => {
if (topContractRow?.marketBucket) return topContractRow.marketBucket; if (topContractRow?.marketBucket) return topContractRow.marketBucket;
if (topProbabilityTemp == null) return null; if (topProbabilityTemp == null) return null;
@@ -1092,10 +1100,14 @@ export function ProbabilityDistribution({
<div> <div>
<span className="prob-source-chip">{probabilityEngineLabel}</span> <span className="prob-source-chip">{probabilityEngineLabel}</span>
<strong> <strong>
{topProbability && topProbabilityText {displayTopLabel && displayTopProbabilityText
? locale === "en-US" ? locale === "en-US"
? `${topProbabilityLabel} is the top single bucket at ${topProbabilityText}` ? displayUsesMarketBuckets
: `${topProbabilityLabel} 单点最高,${topProbabilityText}` ? `${displayTopLabel} is the top displayed contract bucket at ${displayTopProbabilityText}`
: `${displayTopLabel} is the top single bucket at ${displayTopProbabilityText}`
: displayUsesMarketBuckets
? `${displayTopLabel} 为当前显示分布最高,${displayTopProbabilityText}`
: `${displayTopLabel} 单点最高,${displayTopProbabilityText}`
: locale === "en-US" : locale === "en-US"
? "Awaiting calibrated buckets" ? "Awaiting calibrated buckets"
: "等待校准概率桶"} : "等待校准概率桶"}