fix: activity checker

This commit is contained in:
archer 2025-12-23 22:56:19 +08:00
parent c370791506
commit 1f212733c7
No known key found for this signature in database
GPG Key ID: 4446499B846D4A9E
2 changed files with 35 additions and 22 deletions

View File

@ -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<string>(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;

View File

@ -48,15 +48,13 @@ const Standard = ({
const [packageChange, setPackageChange] = useState<PackageChangeStatusEnum>();
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(