Fix unstable dashboard modal opening
This commit is contained in:
@@ -56,6 +56,12 @@ function DashboardScreen() {
|
|||||||
const store = useDashboardStore();
|
const store = useDashboardStore();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
void import("@/components/dashboard/GuideModal");
|
||||||
|
void import("@/components/dashboard/HistoryModal");
|
||||||
|
void import("@/components/dashboard/FutureForecastModal");
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onKeyDown = (event: KeyboardEvent) => {
|
const onKeyDown = (event: KeyboardEvent) => {
|
||||||
if (event.key !== "Escape") return;
|
if (event.key !== "Escape") return;
|
||||||
|
|||||||
@@ -649,7 +649,7 @@ export function DashboardStoreProvider({
|
|||||||
openGuide: () => setIsGuideOpen(true),
|
openGuide: () => setIsGuideOpen(true),
|
||||||
openHistory,
|
openHistory,
|
||||||
openTodayModal: async (forceRefresh?: boolean) => {
|
openTodayModal: async (forceRefresh?: boolean) => {
|
||||||
if (!selectedCity || loadingState.cityDetail) {
|
if (!selectedCity) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -659,35 +659,24 @@ export function DashboardStoreProvider({
|
|||||||
setSelectedForecastDate(cachedDetail.local_date);
|
setSelectedForecastDate(cachedDetail.local_date);
|
||||||
setFutureModalDate(cachedDetail.local_date);
|
setFutureModalDate(cachedDetail.local_date);
|
||||||
}
|
}
|
||||||
if (!proAccess.subscriptionActive) {
|
if (!proAccess.subscriptionActive) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 乐观 UI: 有缓存则立刻秒开 modal,不阻塞显示
|
setLoadingState((current) => ({
|
||||||
if (cachedDetail?.local_date) {
|
...current,
|
||||||
setSelectedForecastDate(cachedDetail.local_date);
|
refresh: !cachedDetail?.local_date,
|
||||||
setFutureModalDate(cachedDetail.local_date);
|
marketScan: true,
|
||||||
setLoadingState((current) => ({ ...current, marketScan: true }));
|
}));
|
||||||
} else {
|
|
||||||
setLoadingState((current) => ({
|
|
||||||
...current,
|
|
||||||
refresh: true,
|
|
||||||
marketScan: true,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 异步静默拉取最新气象与市场数据
|
|
||||||
try {
|
try {
|
||||||
const detail = await ensureCityDetail(selectedCity, true);
|
const detail = await ensureCityDetail(
|
||||||
|
selectedCity,
|
||||||
|
Boolean(forceRefresh),
|
||||||
|
);
|
||||||
setSelectedForecastDate(detail.local_date);
|
setSelectedForecastDate(detail.local_date);
|
||||||
setFutureModalDate(detail.local_date);
|
setFutureModalDate(detail.local_date);
|
||||||
|
|
||||||
|
const marketKey = getMarketScanCacheKey(selectedCity, detail.local_date);
|
||||||
try {
|
try {
|
||||||
// 如果缓存里没有或者想要强制刷新,则拉取最新市场数据
|
|
||||||
const marketKey = getMarketScanCacheKey(
|
|
||||||
selectedCity,
|
|
||||||
detail.local_date,
|
|
||||||
);
|
|
||||||
await ensureCityMarketScan(
|
await ensureCityMarketScan(
|
||||||
selectedCity,
|
selectedCity,
|
||||||
forceRefresh || !marketScanByCityName[marketKey],
|
forceRefresh || !marketScanByCityName[marketKey],
|
||||||
@@ -697,6 +686,7 @@ export function DashboardStoreProvider({
|
|||||||
} catch {}
|
} catch {}
|
||||||
} catch {
|
} catch {
|
||||||
if (cachedDetail?.local_date) {
|
if (cachedDetail?.local_date) {
|
||||||
|
setSelectedForecastDate(cachedDetail.local_date);
|
||||||
setFutureModalDate(cachedDetail.local_date);
|
setFutureModalDate(cachedDetail.local_date);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
Reference in New Issue
Block a user