From 1f212733c7ee956b9143079aafa959b8d0e0dbe4 Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Tue, 23 Dec 2025 22:56:19 +0800 Subject: [PATCH] fix: activity checker --- .../support/activity/ActivityAdModal.tsx | 49 ++++++++++++------- .../app/src/pageComponents/price/Standard.tsx | 8 ++- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/projects/app/src/components/support/activity/ActivityAdModal.tsx b/projects/app/src/components/support/activity/ActivityAdModal.tsx index 41a0bfa76..15d35b8cc 100644 --- a/projects/app/src/components/support/activity/ActivityAdModal.tsx +++ b/projects/app/src/components/support/activity/ActivityAdModal.tsx @@ -14,6 +14,8 @@ import { ModalCloseButton } from '@chakra-ui/react'; import { useSystemStore } from '@/web/common/system/useSystemStore'; +import { useLocalStorageState } from 'ahooks'; +import { useRouter } from 'next/router'; const CLOSED_AD_KEY = 'activity_ad_closed'; const CLOSED_AD_DURATION = 24 * 60 * 60 * 1000; // 24 hours @@ -22,21 +24,10 @@ const ActivityAdModal = () => { const { isOpen, onOpen, onClose } = useDisclosure(); const { t } = useTranslation(); const { feConfigs } = useSystemStore(); + const router = useRouter(); // Check if ad was recently closed - const shouldShowAd = useMemo(() => { - const closedData = localStorage.getItem(CLOSED_AD_KEY); - if (!closedData) return true; - - try { - const { timestamp } = JSON.parse(closedData); - const now = Date.now(); - // Show if 24 hours passed - return now - timestamp > CLOSED_AD_DURATION; - } catch { - return true; - } - }, []); + const [closedData, setClosedData] = useLocalStorageState(CLOSED_AD_KEY); const { data } = useRequest2( async () => { @@ -46,6 +37,25 @@ const ActivityAdModal = () => { { manual: false, onSuccess(res) { + const shouldShowAd = (() => { + if (!res?.id) return false; + if (!closedData) return true; + + try { + const { timestamp, adId } = JSON.parse(closedData) as { + timestamp: number; + adId: string; + }; + // 不同的广告 id,一定展示 + if (adId && res.id !== adId) return true; + const now = Date.now(); + // Show if 24 hours passed + return now - timestamp > CLOSED_AD_DURATION; + } catch { + return true; + } + })(); + if (res?.activityAdImage && shouldShowAd) { onOpen(); } @@ -55,16 +65,21 @@ const ActivityAdModal = () => { const handleClose = useCallback(() => { if (data?.id) { - localStorage.setItem(CLOSED_AD_KEY, JSON.stringify({ timestamp: Date.now(), adId: data.id })); + setClosedData(JSON.stringify({ timestamp: Date.now(), adId: data.id })); } onClose(); - }, [data?.id, onClose]); + }, [data?.id, onClose, setClosedData]); const handleJoin = useCallback(() => { if (data?.activityAdLink) { - window.open(data.activityAdLink, '_blank'); + if (data.activityAdLink.startsWith('/')) { + router.push(data.activityAdLink); + handleClose(); + } else { + window.open(data.activityAdLink, '_blank'); + } } - }, [data?.activityAdLink]); + }, [data?.activityAdLink, handleClose, router]); if (!data?.activityAdImage) { return null; diff --git a/projects/app/src/pageComponents/price/Standard.tsx b/projects/app/src/pageComponents/price/Standard.tsx index 0a833b374..bd4499f9e 100644 --- a/projects/app/src/pageComponents/price/Standard.tsx +++ b/projects/app/src/pageComponents/price/Standard.tsx @@ -48,15 +48,13 @@ const Standard = ({ const [packageChange, setPackageChange] = useState(); const { subPlans, feConfigs } = useSystemStore(); - const [selectSubMode, setSelectSubMode] = useState<`${SubModeEnum}`>( - subPlans?.activityExpirationTime ? SubModeEnum.year : SubModeEnum.month - ); + const [selectSubMode, setSelectSubMode] = useState<`${SubModeEnum}`>(SubModeEnum.month); const hasActivityExpiration = !!subPlans?.activityExpirationTime && selectSubMode === SubModeEnum.year; useEffect(() => { - setSelectSubMode(hasActivityExpiration ? SubModeEnum.year : SubModeEnum.month); - }, [hasActivityExpiration]); + setSelectSubMode(subPlans?.activityExpirationTime ? SubModeEnum.year : SubModeEnum.month); + }, [subPlans?.activityExpirationTime]); // 获取优惠券 const { data: coupons = [], runAsync: getCoupons } = useRequest2(