Sfoglia il codice sorgente

feat: 修改签到

year 3 mesi fa
parent
commit
8209017317

+ 3 - 2
src/app/[locale]/(TabBar)/[[...share]]/@actionWidget/Service.tsx

@@ -303,7 +303,7 @@ const SignInSection: FC = () => {
         };
     });
     useEffect(() => {
-        getSignData({ active_id: 14 });
+        getSignData({ activity_id: 20 });
     }, []);
 
     const signInHandle = () => {
@@ -325,6 +325,7 @@ const SignInSection: FC = () => {
         </>
     );
 };
+
 const ServiceWidget: FC<Props> = (props) => {
     const { services } = props;
 
@@ -364,7 +365,7 @@ const ServiceWidget: FC<Props> = (props) => {
                 {/*客服*/}
                 <CustomerSection services={services} />
                 {/* 签到 */}
-                {/*<SignInSection />*/}
+                {/* <SignInSection /> */}
             </div>
 
             <div

+ 16 - 2
src/app/[locale]/(doings)/jackpot/page.tsx

@@ -3,6 +3,7 @@ import { claimActivityReward, getJackpotInfo, GetJackpotResponse } from "@/api/a
 import GlobalNotify from "@/components/ModalPopup/GlobalNotifyModal";
 import { formatAmount } from "@/utils";
 import { Toast } from "antd-mobile";
+import BigNumber from "bignumber.js";
 import clsx from "clsx";
 import dayjs from "dayjs";
 import { useTranslations } from "next-intl";
@@ -46,7 +47,7 @@ const Jackpot: React.FC = () => {
     const [actKey, setActKey] = React.useState<number | string>(2);
     const [infoData, setInfoData] = React.useState<GetJackpotResponse>();
     const activeId = searchParams.get("activity_id");
-    const [amount, setAmount] = React.useState<string>("0.00");
+    const [amount, setAmount] = React.useState<any>({});
     const [visible, setVisible] = React.useState<boolean>(false);
 
     const images = React.useMemo(() => {
@@ -143,7 +144,20 @@ const Jackpot: React.FC = () => {
                 id: curTabData.id,
             });
             if (res.code === 200 && res?.data?.code === 1) {
-                setAmount(formatAmount(res?.data?.data?.amount));
+                if (res?.data?.reward) {
+                    const amountObj: any = {};
+                    res?.data?.reward.forEach((item: any) => {
+                        amountObj[`coin_${item.coin_type}`] = formatAmount(item.amount);
+                    });
+                    res?.data?.reward.forEach((item: any) => {
+                        amountObj[`coin_${item.coin_type}`] = formatAmount(
+                            new BigNumber(amountObj[`coin_${item.coin_type}`] || 0)
+                                .plus(item.amount)
+                                .toString()
+                        );
+                    });
+                    setAmount(amountObj);
+                }
                 setVisible(true);
                 getInfoData();
             } else {

+ 94 - 4
src/app/[locale]/(doings)/signIn/page.tsx

@@ -1,19 +1,100 @@
 "use client";
 /* eslint-disable @next/next/no-img-element */
+import { claimActivityReward } from "@/api/activity";
+import { UserVipInfo } from "@/api/user";
+import GlobalNotify from "@/components/ModalPopup/GlobalNotifyModal";
 import { BoxListCom } from "@/components/ModalPopup/SignInModal";
 import { useSignStore } from "@/stores/useSignStore";
+import { formatAmount } from "@/utils";
+import { server } from "@/utils/client";
+import { Toast } from "antd-mobile";
+import BigNumber from "bignumber.js";
 import { useTranslations } from "next-intl";
-import { FC, useEffect } from "react";
+import { useSearchParams } from "next/navigation";
+import { FC, useEffect, useMemo, useState } from "react";
+
+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 SignIn: FC = () => {
+    const searchParams = useSearchParams();
+    const activity_id = Number(searchParams.get("activity_id"));
     const t = useTranslations("signInPage");
+    const tCode = useTranslations();
+    const [vipInfo, setVipInfo] = useState<UserVipInfo | null>(null);
+    const [visible, setVisible] = useState(false);
+    const [amount, setAmount] = useState({});
+
+    useEffect(() => {
+        getVipInfo();
+    }, []);
+    const getVipInfo = async () => {
+        const vipInfoRes = await getVipApi();
+        if (vipInfoRes) {
+            setVipInfo(vipInfoRes);
+        }
+    };
+
     const { getSignData, signData } = useSignStore((state) => ({
         signData: state.signData,
         getSignData: state.getSignData,
     }));
     useEffect(() => {
-        getSignData({ active_id: 3 });
+        getSignData({ activity_id });
     }, []);
+
+    const curData = useMemo(() => {
+        if (!signData || !signData.list || signData.cur_num == undefined) return null;
+        return signData.list[signData.cur_num];
+    }, [signData]);
+
+    const doClaim = async () => {
+        if (!curData) return null;
+        try {
+            const res = await claimActivityReward({
+                activity_id,
+                id: curData.id as number,
+            });
+            if (res.code === 200 && res?.data?.code === 1) {
+                getSignData({ activity_id });
+                if (res?.data?.reward) {
+                    const amountObj: any = {};
+                    res?.data?.reward.forEach((item: any) => {
+                        amountObj[`coin_${item.coin_type}`] = formatAmount(item.amount);
+                    });
+                    //extra_reward
+                    res?.data?.reward.forEach((item: any) => {
+                        amountObj[`coin_${item.coin_type}`] = formatAmount(
+                            new BigNumber(amountObj[`coin_${item.coin_type}`] || 0)
+                                .plus(item.amount)
+                                .toString()
+                        );
+                    });
+                    setAmount(amountObj);
+                }
+
+                setVisible(true);
+            } else {
+                throw new Error(tCode(`code.400`));
+            }
+        } catch (error: any) {
+            if (error) {
+                Toast.show({
+                    content: error.message || error.toString(),
+                    maskClickable: false,
+                });
+            }
+        }
+    };
+
     return (
         <>
             <div className="relative h-[100%] w-[100%]">
@@ -37,7 +118,7 @@ const SignIn: FC = () => {
                             />
                             <div className="relative left-[10%] h-[100%]">
                                 <p className="h-[50%] text-[0.12rem] font-bold leading-[0.2rem]">
-                                    VIP0
+                                    VIP {vipInfo?.vip_level || 0}
                                 </p>
                                 <p className="h-[50%] text-[0.1rem] font-bold leading-[0.12rem]">
                                     quanto maior o nível VlP, mais abundantes s?o as recompensas
@@ -67,7 +148,10 @@ const SignIn: FC = () => {
                         <PayBoxList type="page" />
                     </div> */}
                     {/* 签到按钮 */}
-                    <div className={"relative mt-[0.25rem] flex h-[.6045rem] justify-center"}>
+                    <div
+                        className={"relative mt-[0.25rem] flex h-[.6045rem] justify-center"}
+                        onClick={doClaim}
+                    >
                         <img src="/sign/button.png" className={"h-[100%]"} alt="" />
                         <span className="absolute text-[0.16rem] font-bold leading-[0.375rem] text-[white]">
                             Sign-in
@@ -101,6 +185,12 @@ const SignIn: FC = () => {
                         </div>
                     </div>
                 </div>
+                <GlobalNotify
+                    amount={amount}
+                    visible={visible}
+                    onChange={() => setVisible(false)}
+                    deraction={5000}
+                ></GlobalNotify>
             </div>
         </>
     );

+ 23 - 9
src/components/ModalPopup/GlobalNotifyModal/index.tsx

@@ -3,7 +3,10 @@ import Image from "next/image";
 import React, { FC } from "react";
 
 interface Prop {
-    amount: string;
+    amount?: {
+        coin_1?: string;
+        coin_2?: string;
+    };
     visible: boolean;
     onChange?: (visible: boolean) => void; // 可选的回调函数,用于更新父组件的 visible 状态
     deraction?: number;
@@ -19,6 +22,11 @@ const GlobalNotify: FC<Prop> = ({ amount, visible = false, onChange, deraction =
         };
     }, [onChange]);
 
+    const coinType: any = {
+        coin_1: "Saldo",
+        coin_2: "Bônus",
+    };
+
     React.useEffect(() => {
         if (visible && deraction > 0) {
             setTimeout(() => {
@@ -44,14 +52,20 @@ const GlobalNotify: FC<Prop> = ({ amount, visible = false, onChange, deraction =
                                 <p className={"text-[0.2083rem] font-semibold text-[#532e0a]"}>
                                     GANHE UM BÔNUS DE
                                 </p>
-                                <p
-                                    className={
-                                        "text-[0.5rem] font-black leading-[0.5rem]" +
-                                        " text-[#ec5c52]"
-                                    }
-                                >
-                                    {amount}
-                                </p>
+                                {amount &&
+                                    Object.keys(amount).map((key: string) => {
+                                        return (
+                                            <p
+                                                key={key}
+                                                className={
+                                                    "text-[0.3rem] font-black leading-[0.5rem]" +
+                                                    " text-[#ec5c52]"
+                                                }
+                                            >
+                                                {coinType[key]}:{(amount as any)[key] || 0}
+                                            </p>
+                                        );
+                                    })}
                             </div>
                         </div>
                         {/*title*/}

+ 7 - 7
src/components/ModalPopup/SignInModal/index.tsx

@@ -45,7 +45,7 @@ export const BoxListCom = forwardRef<BoxList, BoxParams>(function BoxListCom(
                                     <div
                                         className={`relative text-center ${styles.text} text-[white]`}
                                     >
-                                        <p>Day{startDays + index}</p>
+                                        <p>Day{item.id}</p>
                                     </div>
                                     <div className={`relative ${styles.box} w-[100%]`}>
                                         {/*onClick={(e) => handleOpening(startDays + index)}*/}
@@ -54,7 +54,7 @@ export const BoxListCom = forwardRef<BoxList, BoxParams>(function BoxListCom(
                                             src={
                                                 item.is_suss
                                                     ? "/sign/box/box-open.png"
-                                                    : item.is_unlock_extra_reward
+                                                    : item.extra_num
                                                       ? "/sign/box_pay/gift.png"
                                                       : "/sign/box/box.png"
                                             }
@@ -73,27 +73,27 @@ export const BoxListCom = forwardRef<BoxList, BoxParams>(function BoxListCom(
                                                 />
                                             ) : null}
                                         </div>
-                                        {item.is_unlock_extra_reward ? (
+                                        {item.extra_num ? (
                                             <div className="absolute bottom-0 left-0 right-0 mx-auto h-[30%] w-[90%] rounded border-[0.02rem] border-[green] bg-[black]">
                                                 <p
                                                     className={`${styles.green} text-center font-bold text-[green]`}
                                                 >
-                                                    Extra +{item.extra_num}R
+                                                    Extra +{item.extra_num}
                                                 </p>
                                             </div>
                                         ) : null}
                                     </div>
-                                    {item.is_unlock_extra_reward ? (
+                                    {item.extra_num ? (
                                         <div
                                             className={`${styles.lock} relative mt-[0.05rem] flex justify-center text-center font-bold text-[yellow]`}
                                         >
                                             <img
-                                                id={"opened" + (startDays + index)}
+                                                id={"opened" + item.id}
                                                 src="/sign/lock.png"
                                                 className={"block h-[100%]"}
                                                 alt=""
                                             />
-                                            <span className="block">+{item.extra_num}</span>
+                                            <span className="block">+{item.num}</span>
                                         </div>
                                     ) : null}
                                 </div>

+ 10 - 3
src/stores/useSignStore.ts

@@ -59,6 +59,8 @@ export interface SignType {
      * 活动类型
      */
     type: number;
+
+    cur_num: number;
 }
 
 export interface List {
@@ -104,13 +106,13 @@ interface State {
 }
 
 interface Action {
-    getSignData: (data: { active_id: number }) => void;
+    getSignData: (data: { activity_id: number }) => void;
 }
 
 const initState: State = {
     signData: {},
 };
-const getSignDetailsApi = (data: { active_id: number }) => {
+const getSignDetailsApi = (data: { activity_id: number }) => {
     return server.post<SignType | []>({
         url: "/v1/api/user/activity/signInInfo",
         data,
@@ -122,7 +124,12 @@ export const useSignStore = create<State & Action>()((set, get) => {
         getSignData: (data) => {
             if (Object.keys(get().signData).length === 0 && getToken()) {
                 getSignDetailsApi(data).then((res) => {
-                    const resultData = Array.isArray(res.data) ? {} : res.data;
+                    const resultData: any = Array.isArray(res.data) ? {} : res.data;
+                    if (resultData?.list) {
+                        resultData?.list.sort((a: any, b: any) => {
+                            return a.id - b.id;
+                        });
+                    }
                     set((value) => ({ ...value, signData: resultData }));
                 });
             }