|
@@ -1,10 +1,10 @@
|
|
"use client";
|
|
"use client";
|
|
-import { CashbackTypes } from "@/api/cashback";
|
|
|
|
-import { UserVipInfo } from "@/api/user";
|
|
|
|
|
|
+import { getNewVip, LevelInfoItem, RewardInfoItem } from "@/api/user";
|
|
import CustomButton from "@/components/CustomButton";
|
|
import CustomButton from "@/components/CustomButton";
|
|
import HeaderBack from "@/components/HeaderBack";
|
|
import HeaderBack from "@/components/HeaderBack";
|
|
import VipProgress from "@/components/VipProgress";
|
|
import VipProgress from "@/components/VipProgress";
|
|
-import { server } from "@/utils/client";
|
|
|
|
|
|
+import feedback from "@/feedback";
|
|
|
|
+import { formatAmount } from "@/utils";
|
|
import { useRequest } from "ahooks";
|
|
import { useRequest } from "ahooks";
|
|
import clsx from "clsx";
|
|
import clsx from "clsx";
|
|
import React from "react";
|
|
import React from "react";
|
|
@@ -12,53 +12,29 @@ import List from "./List";
|
|
import styles from "./page.module.scss";
|
|
import styles from "./page.module.scss";
|
|
import VipCard from "./VipCard";
|
|
import VipCard from "./VipCard";
|
|
|
|
|
|
-const getVipApi = async () => {
|
|
|
|
- return server
|
|
|
|
- .request<UserVipInfo>({
|
|
|
|
- url: "/v1/api/user/user_vip_info",
|
|
|
|
- method: "POST",
|
|
|
|
- })
|
|
|
|
- .then((res) => {
|
|
|
|
- if (res.code === 200) return res.data;
|
|
|
|
- });
|
|
|
|
-};
|
|
|
|
-const getCashBackApi = async (): Promise<CashbackTypes> => {
|
|
|
|
- return server
|
|
|
|
- .request<CashbackTypes>({
|
|
|
|
- url: "/v1/api/front/activity_cash",
|
|
|
|
- method: "post",
|
|
|
|
- })
|
|
|
|
- .then((res) => {
|
|
|
|
- return res.data;
|
|
|
|
- })
|
|
|
|
- .catch((error) => {
|
|
|
|
- return {
|
|
|
|
- rules: [],
|
|
|
|
- last_period: { end_time: 0, start_time: 0 },
|
|
|
|
- next_period: {
|
|
|
|
- end_time: 0,
|
|
|
|
- start_time: 0,
|
|
|
|
- },
|
|
|
|
- amount: 0,
|
|
|
|
- bet: 0,
|
|
|
|
- status: "expired",
|
|
|
|
- max_amount: 0,
|
|
|
|
- } as CashbackTypes;
|
|
|
|
- });
|
|
|
|
-};
|
|
|
|
|
|
+export interface RewardItemData extends RewardInfoItem {
|
|
|
|
+ title: string;
|
|
|
|
+ renderType: 1 | 2;
|
|
|
|
+ img?: string;
|
|
|
|
+ endTime?: number;
|
|
|
|
+ typeStr?: string;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const renderType1 = [2, 3, 4];
|
|
|
|
|
|
const Page = () => {
|
|
const Page = () => {
|
|
const [actLevel, setActLevel] = React.useState<number>(0);
|
|
const [actLevel, setActLevel] = React.useState<number>(0);
|
|
const [opacity, setOpacity] = React.useState<number>(0);
|
|
const [opacity, setOpacity] = React.useState<number>(0);
|
|
const containerRef = React.useRef<HTMLDivElement | null>(null);
|
|
const containerRef = React.useRef<HTMLDivElement | null>(null);
|
|
|
|
|
|
- const { data: userVip } = useRequest<any, any>(getVipApi, {
|
|
|
|
- pollingErrorRetryCount: 1,
|
|
|
|
- });
|
|
|
|
- const { data: cashbackInfo } = useRequest<any, any>(getCashBackApi, {
|
|
|
|
|
|
+ const { data: userVip, run: runVip } = useRequest<any, any>(getNewVip, {
|
|
pollingErrorRetryCount: 1,
|
|
pollingErrorRetryCount: 1,
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+ const vipInfo = React.useMemo(() => {
|
|
|
|
+ return userVip?.data || {};
|
|
|
|
+ }, [userVip]);
|
|
|
|
+
|
|
React.useEffect(() => {
|
|
React.useEffect(() => {
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
const dom = containerRef.current;
|
|
const dom = containerRef.current;
|
|
@@ -84,32 +60,106 @@ const Page = () => {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
- const gridBoxCfg = React.useMemo(() => {
|
|
|
|
- return [
|
|
|
|
- {
|
|
|
|
|
|
+ const actVipInfo = React.useMemo(() => {
|
|
|
|
+ return vipInfo?.level_info?.find((item: LevelInfoItem) => item.id === actLevel);
|
|
|
|
+ }, [actLevel, vipInfo]);
|
|
|
|
+ const rewardsList = React.useMemo(() => {
|
|
|
|
+ if (!vipInfo?.reward_info?.length) return [];
|
|
|
|
+ const rewardCfg: any = {
|
|
|
|
+ 1: {
|
|
|
|
+ title: "VIP Upgrade Bônus",
|
|
|
|
+ img: "/vip/vip_pdn_icon.webp",
|
|
|
|
+ },
|
|
|
|
+ 2: {
|
|
|
|
+ title: "Bônus Diária",
|
|
|
|
+ typeStr: "day",
|
|
|
|
+ img: "/vip/vip_bs_icon.webp",
|
|
|
|
+ },
|
|
|
|
+ 3: {
|
|
title: "Bônus Semanal",
|
|
title: "Bônus Semanal",
|
|
|
|
+ typeStr: "week",
|
|
img: "/vip/vip_bs_icon.webp",
|
|
img: "/vip/vip_bs_icon.webp",
|
|
- value: "R$ 12.00 / R$ 23.00",
|
|
|
|
- type: "full",
|
|
|
|
},
|
|
},
|
|
- {
|
|
|
|
|
|
+ 4: {
|
|
title: "Bônus Mensal",
|
|
title: "Bônus Mensal",
|
|
|
|
+ typeStr: "month",
|
|
img: "/vip/vip_bm_icon.webp",
|
|
img: "/vip/vip_bm_icon.webp",
|
|
- value: "R$ 12.00 / R$ 23.00",
|
|
|
|
- type: "full",
|
|
|
|
},
|
|
},
|
|
- {
|
|
|
|
- title: "VIP Upgrade Bônus",
|
|
|
|
- img: "/vip/vip_pdn_icon.webp",
|
|
|
|
- value: "R$ 12.00",
|
|
|
|
|
|
+ 5: {
|
|
|
|
+ title: "Auxílio de falência",
|
|
|
|
+ img: "/vip/vip_af_icon.webp",
|
|
},
|
|
},
|
|
- {
|
|
|
|
|
|
+ 6: {
|
|
title: "Auxílio de falência",
|
|
title: "Auxílio de falência",
|
|
img: "/vip/vip_af_icon.webp",
|
|
img: "/vip/vip_af_icon.webp",
|
|
- value: "R$ 12.00",
|
|
|
|
|
|
+ },
|
|
|
|
+ };
|
|
|
|
+ const result: RewardItemData[] = [
|
|
|
|
+ {
|
|
|
|
+ ...rewardCfg[1],
|
|
|
|
+ ...actVipInfo,
|
|
|
|
+ renderType: 2,
|
|
},
|
|
},
|
|
];
|
|
];
|
|
- }, []);
|
|
|
|
|
|
+ let isFirst = true;
|
|
|
|
+ vipInfo?.reward_info.forEach((item: any) => {
|
|
|
|
+ const res: any = {
|
|
|
|
+ ...item,
|
|
|
|
+ ...(rewardCfg[item.type] || {}),
|
|
|
|
+ };
|
|
|
|
+ if (renderType1.includes(item.type)) {
|
|
|
|
+ res.renderType = 1;
|
|
|
|
+ } else {
|
|
|
|
+ res.renderType = 2;
|
|
|
|
+ }
|
|
|
|
+ if (item.type === 5 && item.status == 2) {
|
|
|
|
+ isFirst = false;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (item.type === 6 && isFirst) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ res.endTime = item.start_time - Date.now() / 1000;
|
|
|
|
+ result.push(res);
|
|
|
|
+ });
|
|
|
|
+ result.sort((a, b) => a.renderType - b.renderType);
|
|
|
|
+ return result;
|
|
|
|
+ }, [vipInfo, actVipInfo]);
|
|
|
|
+
|
|
|
|
+ const doClaim = async () => {
|
|
|
|
+ const res = await feedback.showModal({
|
|
|
|
+ content: (props) => {
|
|
|
|
+ return (
|
|
|
|
+ <div className="relative">
|
|
|
|
+ <div>23232</div>
|
|
|
|
+ <div onClick={() => props.doClose({ sdsds: 123123 })}>点击</div>
|
|
|
|
+ <div></div>
|
|
|
|
+ </div>
|
|
|
|
+ );
|
|
|
|
+ },
|
|
|
|
+ width: "80%",
|
|
|
|
+ useDefaultFooter: false,
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ const getBtn = (data: RewardItemData) => {
|
|
|
|
+ if (data.status === 2) {
|
|
|
|
+ return <img src="/vip/vip_claimed_icon.webp" alt="" className="w-[80px]" />;
|
|
|
|
+ }
|
|
|
|
+ let text = data.status === 1 ? "Unopened" : "Receber";
|
|
|
|
+ return (
|
|
|
|
+ <CustomButton
|
|
|
|
+ className={clsx("!py-[8px] !text-[12px]", {
|
|
|
|
+ "w-[157px]": data.renderType === 1,
|
|
|
|
+ "w-full": data.renderType === 2,
|
|
|
|
+ })}
|
|
|
|
+ onClick={doClaim}
|
|
|
|
+ type={data.status !== 1 ? "disable2" : "primary"}
|
|
|
|
+ >
|
|
|
|
+ {text}
|
|
|
|
+ </CustomButton>
|
|
|
|
+ );
|
|
|
|
+ };
|
|
|
|
|
|
return (
|
|
return (
|
|
<div className={clsx("flex h-[100%] flex-col", styles.pageContainer)}>
|
|
<div className={clsx("flex h-[100%] flex-col", styles.pageContainer)}>
|
|
@@ -124,37 +174,83 @@ const Page = () => {
|
|
/>
|
|
/>
|
|
<main className={"main-header hasFlag stickyFlag"} ref={containerRef}>
|
|
<main className={"main-header hasFlag stickyFlag"} ref={containerRef}>
|
|
<>
|
|
<>
|
|
- <VipCard actKey={actLevel} onChange={(level) => setActLevel(level)}></VipCard>
|
|
|
|
|
|
+ <VipCard
|
|
|
|
+ vipInfo={vipInfo}
|
|
|
|
+ actKey={actLevel}
|
|
|
|
+ onChange={(level) => setActLevel(level)}
|
|
|
|
+ ></VipCard>
|
|
<VipProgress
|
|
<VipProgress
|
|
actKey={actLevel}
|
|
actKey={actLevel}
|
|
onChange={(level) => setActLevel(level)}
|
|
onChange={(level) => setActLevel(level)}
|
|
></VipProgress>
|
|
></VipProgress>
|
|
<div className={styles.giftBox}>
|
|
<div className={styles.giftBox}>
|
|
- {gridBoxCfg.map((item) => {
|
|
|
|
- return (
|
|
|
|
- <div
|
|
|
|
- key={item.title}
|
|
|
|
- className={clsx(styles.giftItem, "rounded-[10px] py-[6px]", {
|
|
|
|
- "w-full": item.type === "full",
|
|
|
|
- "col-span-2": item.type === "full",
|
|
|
|
- })}
|
|
|
|
- >
|
|
|
|
- <div className="relative z-[1] flex h-[100%] flex-col items-start justify-between">
|
|
|
|
- <div className="text-[.13rem] font-bold">{item.title}</div>
|
|
|
|
- <div className="text-[.17rem] font-bold">{item.value}</div>
|
|
|
|
- <CustomButton
|
|
|
|
- className={clsx("!py-[8px] !text-[12px]", {
|
|
|
|
- "w-full": item.type !== "full",
|
|
|
|
- "w-[157px]": item.type == "full",
|
|
|
|
- })}
|
|
|
|
- >
|
|
|
|
- Unopened
|
|
|
|
- </CustomButton>
|
|
|
|
|
|
+ {!!rewardsList?.length &&
|
|
|
|
+ rewardsList.map((item) => {
|
|
|
|
+ return (
|
|
|
|
+ <div
|
|
|
|
+ key={item.title}
|
|
|
|
+ className={clsx(
|
|
|
|
+ styles.giftItem,
|
|
|
|
+ "rounded-[10px] py-[6px]",
|
|
|
|
+ {
|
|
|
|
+ "w-full": item.renderType === 1,
|
|
|
|
+ "col-span-2": item.renderType === 1,
|
|
|
|
+ [styles.claimed]: item.status === 2,
|
|
|
|
+ [styles.gray]:
|
|
|
|
+ vipInfo.vip_level <= 0 &&
|
|
|
|
+ [5, 6].includes(item.type),
|
|
|
|
+ }
|
|
|
|
+ )}
|
|
|
|
+ >
|
|
|
|
+ <div className="relative z-[1] flex h-[100%] flex-col items-start justify-between">
|
|
|
|
+ <div className="text-[.13rem] font-bold">
|
|
|
|
+ {item.title}
|
|
|
|
+ </div>
|
|
|
|
+ {item.renderType === 1 && (
|
|
|
|
+ <>
|
|
|
|
+ {!!item?.reward?.length &&
|
|
|
|
+ item?.reward.map((citem) => {
|
|
|
|
+ return (
|
|
|
|
+ <div
|
|
|
|
+ key={citem.coin_type}
|
|
|
|
+ className="text-[.17rem] font-black"
|
|
|
|
+ >
|
|
|
|
+ R$ {formatAmount(citem.amount)}{" "}
|
|
|
|
+ {!!item.double_pay && (
|
|
|
|
+ <>
|
|
|
|
+ / R${" "}
|
|
|
|
+ {formatAmount(
|
|
|
|
+ citem.amount *
|
|
|
|
+ item.multiple
|
|
|
|
+ )}
|
|
|
|
+ </>
|
|
|
|
+ )}
|
|
|
|
+ </div>
|
|
|
|
+ );
|
|
|
|
+ })}
|
|
|
|
+ </>
|
|
|
|
+ )}
|
|
|
|
+ {item.renderType === 2 && (
|
|
|
|
+ <>
|
|
|
|
+ {!!item?.reward?.length &&
|
|
|
|
+ item?.reward.map((citem) => {
|
|
|
|
+ return (
|
|
|
|
+ <div
|
|
|
|
+ key={citem.coin_type}
|
|
|
|
+ className="text-[.17rem] font-black"
|
|
|
|
+ >
|
|
|
|
+ R$ {formatAmount(citem.amount)}
|
|
|
|
+ </div>
|
|
|
|
+ );
|
|
|
|
+ })}
|
|
|
|
+ </>
|
|
|
|
+ )}
|
|
|
|
+ {getBtn(item)}
|
|
|
|
+ </div>
|
|
|
|
+ <img src={item.img} className={styles.img} alt="" />
|
|
</div>
|
|
</div>
|
|
- <img src={item.img} className={styles.img} alt="" />
|
|
|
|
- </div>
|
|
|
|
- );
|
|
|
|
- })}
|
|
|
|
|
|
+ );
|
|
|
|
+ })}
|
|
<div
|
|
<div
|
|
className={clsx(
|
|
className={clsx(
|
|
styles.giftItem,
|
|
styles.giftItem,
|