diff --git a/frontend/components/dashboard/DetailPanel.tsx b/frontend/components/dashboard/DetailPanel.tsx
index 8ba0690b..4cb74a55 100644
--- a/frontend/components/dashboard/DetailPanel.tsx
+++ b/frontend/components/dashboard/DetailPanel.tsx
@@ -6,7 +6,6 @@ import { useRouter } from "next/navigation";
import { useEffect, useMemo, useRef, useState } from "react";
import { ForecastTable } from "@/components/dashboard/PanelSections";
import {
- useDashboardHistory,
useDashboardModal,
useDashboardStore,
useProAccess,
@@ -38,7 +37,6 @@ export function DetailPanel({
} = {}) {
const store = useDashboardStore();
const modal = useDashboardModal();
- const history = useDashboardHistory();
const { proAccess } = useProAccess();
const { locale, t } = useI18n();
const router = useRouter();
@@ -76,7 +74,7 @@ export function DetailPanel({
);
const [heavyContentReady, setHeavyContentReady] = useState(false);
const isOverlayOpen =
- Boolean(modal.futureModalDate) || history.historyState.isOpen;
+ Boolean(modal.futureModalDate);
const isVisible = isRail
? Boolean(store.selectedCity) && !isOverlayOpen
: store.isPanelOpen && Boolean(store.selectedCity) && !isOverlayOpen;
@@ -139,24 +137,20 @@ export function DetailPanel({
}
};
- const handleFeatureAccess = (feature: "today" | "history") => {
+ const handleTodayAccess = () => {
blurActiveElement();
if (!isPro) {
trackAppEvent("paywall_feature_clicked", {
entry: "detail_panel",
- feature,
+ feature: "today",
city: store.selectedCity,
user_state: isAuthenticated ? "logged_in" : "guest",
});
}
if (isPro) {
- if (feature === "today") {
- void modal.openTodayModal();
- return;
- }
- void history.openHistory();
+ void modal.openTodayModal();
return;
}
@@ -165,11 +159,7 @@ export function DetailPanel({
return;
}
- if (feature === "today") {
- void modal.openTodayModal();
- return;
- }
- void history.openHistory();
+ void modal.openTodayModal();
};
useEffect(() => {
@@ -348,21 +338,6 @@ export function DetailPanel({
{locale === "en-US" ? "Market" : "市场页"}
) : null}
-
diff --git a/frontend/components/dashboard/scan-terminal/city-detail-utils.ts b/frontend/components/dashboard/scan-terminal/city-detail-utils.ts
index 89a389dd..a9cee629 100644
--- a/frontend/components/dashboard/scan-terminal/city-detail-utils.ts
+++ b/frontend/components/dashboard/scan-terminal/city-detail-utils.ts
@@ -47,8 +47,8 @@ export function isFullEnoughForDeepAnalysis(detail?: CityDetail | null) {
return false;
}
return (
- countDetailModels(detail, detail.local_date) > 1 &&
- countDetailForecastDays(detail) > 1
+ countDetailModels(detail, detail.local_date) >= 1 &&
+ countDetailForecastDays(detail) >= 1
);
}
diff --git a/frontend/components/dashboard/scan-terminal/use-ai-pinned-city-workspace.ts b/frontend/components/dashboard/scan-terminal/use-ai-pinned-city-workspace.ts
index 57c8b98e..d13e7a05 100644
--- a/frontend/components/dashboard/scan-terminal/use-ai-pinned-city-workspace.ts
+++ b/frontend/components/dashboard/scan-terminal/use-ai-pinned-city-workspace.ts
@@ -30,6 +30,7 @@ export function useAiPinnedCityWorkspace({
const aiFullHydrationRef = useRef>(new Set());
const aiHydrationQueueRef = useRef([]);
const aiHydrationRunningRef = useRef(false);
+ const aiHydrationRetriesRef = useRef