242 lines
7.3 KiB
JavaScript
242 lines
7.3 KiB
JavaScript
"use client";
|
||
|
||
import React, { useState, useEffect, useCallback } from "react";
|
||
import { useRouter, useSearchParams } from "next/navigation";
|
||
import webviewBaseRequest from "@/utils/webviewBaseRequest";
|
||
import { Toast } from "antd-mobile";
|
||
import { InfiniteScroll } from "antd-mobile";
|
||
import { setCookie } from "cookies-next";
|
||
import copy from "@/utils/copy";
|
||
|
||
export default function SpringFestival() {
|
||
const router = useRouter();
|
||
const searchParams = useSearchParams();
|
||
|
||
const getBase = useCallback(
|
||
(webviewBase) => {
|
||
let searchParamsObj = null;
|
||
let currentBaseCode = searchParams.get("base");
|
||
if (currentBaseCode) {
|
||
let currentBase = JSON.parse(currentBaseCode);
|
||
searchParamsObj = { ...currentBase };
|
||
}
|
||
return searchParamsObj || webviewBase;
|
||
},
|
||
[searchParams]
|
||
);
|
||
|
||
const [data, setData] = useState([]);
|
||
const [more, setMore] = useState(true);
|
||
const [offset, setOffset] = useState(0);
|
||
const [isFetching, setIsFetching] = useState(true);
|
||
const [isLoading, setIsLoading] = useState(false);
|
||
|
||
const getData = async () => {
|
||
if (isLoading) return;
|
||
setIsLoading(true);
|
||
const webviewBase = webviewBaseRequest();
|
||
let base = getBase(webviewBase);
|
||
try {
|
||
const response = await fetch(`/api/activity/zone_discount`, {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
},
|
||
body: JSON.stringify({
|
||
...base,
|
||
offset: offset,
|
||
limit: 10,
|
||
}),
|
||
});
|
||
const _data = await response.json();
|
||
if (_data.ret === -1) {
|
||
Toast.show({
|
||
content: _data.msg,
|
||
});
|
||
return;
|
||
}
|
||
setOffset(_data.data.offset);
|
||
if (_data.data.more === 0) setMore(false);
|
||
setData((prev) => [...prev, ..._data.data.list]);
|
||
} catch (error) {
|
||
console.error(error);
|
||
} finally {
|
||
setIsFetching(false);
|
||
setIsLoading(false);
|
||
}
|
||
};
|
||
|
||
useEffect(() => {
|
||
setTimeout(() => {
|
||
getData();
|
||
}, 500);
|
||
}, []);
|
||
|
||
const InfiniteScrollContent = ({ hasMore }) => {
|
||
return (
|
||
<>
|
||
{hasMore ? (
|
||
<>
|
||
<span className="text-[#FFFFFF80]">加载中...</span>
|
||
</>
|
||
) : (
|
||
<span className="text-[#FFFFFF80]">--- 我是有底线的 ---</span>
|
||
)}
|
||
</>
|
||
);
|
||
};
|
||
|
||
const Card = ({ item }) => {
|
||
return (
|
||
<div
|
||
className="basis-1/2 px-1 aspect-[140/200] cursor-pointer"
|
||
onClick={() => {
|
||
//如果是app内的webview打开
|
||
const userAgent = navigator.userAgent;
|
||
if (/FromWebview/i.test(userAgent)) {
|
||
window.ReactNativeWebView.postMessage(
|
||
JSON.stringify({
|
||
type: "NAVIGATE",
|
||
data: {
|
||
page: "SpaceIntroduce",
|
||
params: { mid: item?.mid },
|
||
},
|
||
})
|
||
);
|
||
return;
|
||
}
|
||
//如果是h5的iframe打开
|
||
const webviewBase = webviewBaseRequest();
|
||
let base = getBase(webviewBase);
|
||
if (base?.b_token !== undefined) {
|
||
window.top.location.href = `https://app.tiefen.fun/space/person_space_introduce/${item?.mid}`;
|
||
return;
|
||
}
|
||
//如果直接从浏览器打开
|
||
copy(
|
||
`【${item?.name}】『ID:${item?.user_id}』,复制此条消息,打开铁粉空间APP,查看详情https://tiefen.fun/zone/${item?.user_id}`
|
||
);
|
||
setCookie("inviter", item?.user_id);
|
||
router.push("/");
|
||
}}
|
||
>
|
||
<div className="relative w-full">
|
||
<img
|
||
className="absolute top-0 left-0 w-full z-10"
|
||
// src={
|
||
// process.env.NEXT_PUBLIC_CDN_URL +
|
||
// "/public/images/spring_festival_card_bg.png"
|
||
// }
|
||
src="/images/spring_festival_card_bg.png"
|
||
alt=""
|
||
/>
|
||
<img
|
||
className="absolute top-0 left-0 w-full z-30"
|
||
// src={
|
||
// process.env.NEXT_PUBLIC_CDN_URL +
|
||
// "/public/images/spring_festival_card_top.png"
|
||
// }
|
||
src="/images/spring_festival_card_top.png"
|
||
alt=""
|
||
/>
|
||
<div className="absolute top-0 left-0 w-full z-20 p-[4.2%]">
|
||
<div className="relative">
|
||
<img
|
||
className="w-full aspect-square object-cover"
|
||
src={item?.avatar?.images[0]?.urls[0]}
|
||
alt=""
|
||
/>
|
||
<div className="absolute left-0 bottom-0 z-10 flex items-center justify-center w-full h-8 bg-gradient-to-r from-[#FF4A8FEB] to-[#FF8E3EEB]">
|
||
<p className="text-white text-sm">{item?.name}</p>
|
||
</div>
|
||
</div>
|
||
<div className="flex flex-row justify-around items-center mt-1">
|
||
<p className="text-xs text-[#68122280]">
|
||
空间原价{" "}
|
||
<span className="line-through">
|
||
¥{item?.original_price / 100}
|
||
</span>
|
||
</p>
|
||
<p className="text-2xl text-[#D71035] font-semibold">
|
||
<span className="text-sm">¥</span>
|
||
{item?.price / 100}
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
if (isFetching) {
|
||
return (
|
||
<section className="flex flex-1 justify-center container">
|
||
<span className="absolute top-1/2 loading loading-spinner loading-lg"></span>
|
||
</section>
|
||
);
|
||
}
|
||
|
||
// 获取当前时间
|
||
const currentDate = new Date();
|
||
// 设置活动结束日期:2025年2月5日
|
||
const targetDate = new Date("2025-02-05T00:00:00");
|
||
|
||
// 判断当前时间是否在活动结束时间之后
|
||
if (currentDate >= targetDate) {
|
||
return (
|
||
<section className="flex flex-col flex-1 bg-[#EE354F]">
|
||
<img
|
||
className="absolute top-0 left-0 z-0 w-full"
|
||
src={
|
||
process.env.NEXT_PUBLIC_CDN_URL +
|
||
"/public/images/spring_festival_bg.png"
|
||
}
|
||
alt=""
|
||
/>
|
||
<img
|
||
className="absolute top-[72px] left-0 z-10 w-full"
|
||
src={
|
||
process.env.NEXT_PUBLIC_CDN_URL +
|
||
"/public/images/spring_festival_title.png"
|
||
}
|
||
alt=""
|
||
/>
|
||
<div className="w-full aspect-[308/252]"></div>
|
||
<p className="text-center text-2xl font-bold text-white z-40">
|
||
活动已结束
|
||
</p>
|
||
</section>
|
||
);
|
||
}
|
||
|
||
return (
|
||
<section className="flex flex-col flex-1 bg-[#EE354F]">
|
||
<img
|
||
className="absolute top-0 left-0 z-0 w-full"
|
||
src={
|
||
process.env.NEXT_PUBLIC_CDN_URL +
|
||
"/public/images/spring_festival_bg.png"
|
||
}
|
||
alt=""
|
||
/>
|
||
<img
|
||
className="absolute top-[72px] left-0 z-10 w-full"
|
||
src={
|
||
process.env.NEXT_PUBLIC_CDN_URL +
|
||
"/public/images/spring_festival_title.png"
|
||
}
|
||
alt=""
|
||
/>
|
||
<div className="w-full aspect-[308/252]"></div>
|
||
<div className="flex flex-1 flex-row flex-wrap px-3 z-10 w-full">
|
||
{data?.map((item, index) => (
|
||
<Card key={index} item={item} />
|
||
))}
|
||
</div>
|
||
<InfiniteScroll loadMore={() => getData()} hasMore={more}>
|
||
<InfiniteScrollContent hasMore={more} />
|
||
</InfiniteScroll>
|
||
</section>
|
||
);
|
||
}
|