Browse Source

feat: 修改提取逻辑

year 3 months ago
parent
commit
3f30d4a6b3

+ 21 - 10
.env.local

@@ -1,13 +1,24 @@
+# 环境
 #baseurl
 #baseurl
-NEXT_PUBLIC_BASE_URL=https://hk-api.tiktokjakjkl.icu
+# NEXT_PUBLIC_BASE_URL=http://192.168.0.71:8800
+NEXT_PUBLIC_BASE_URL=http://192.168.0.84:8800
+# NEXT_PUBLIC_BASE_URL=https://3rd-api.tiktokjakjkl.icu
 #share link
 #share link
-NEXT_PUBLIC_SHARE_URL=https://hk-site.tiktokjakjkl.icu
+NEXT_PUBLIC_SHARE_URL=http://192.168.0.84:3000
+
 #firebase
 #firebase
-NEXT_PUBLIC_FIREBASE_APIKEY=AIzaSyCIE8xtySsYztsSgmQJx_aqPrrpHEuvgvw
-NEXT_PUBLIC_FIREBASE_AUTHDOMAIN=bcwin777-1bdda.firebaseapp.com
-NEXT_PUBLIC_FIREBASE_PROJECTID=bcwin777-1bdda
-NEXT_PUBLIC_FIREBASE_STORAGEBUCKET=bcwin777-1bdda.firebasestorage.app
-NEXT_PUBLIC_FIREBASE_MESSAGINGSENDERID=542456379513
-NEXT_PUBLIC_FIREBASE_APPID=1:542456379513:web:851a46fc639085170bfca8
-NEXT_PUBLIC_FIREBASE_MEASUREMENTID=G-GV6Y8DXHHD
-NEXT_PUBLIC_FIREBASE_KEYS=BOCfpA08vK6uxhMdRblnx9gPVBLx9WpTn9AutVNhHQQpVtXzDIKW0X6cmsNRaFDhyFDJfMqWjqC7mq6uDFIKU_M
+NEXT_PUBLIC_FIREBASE_APIKEY=AIzaSyDAWORGKhdyzb5KeqTi535VmD5gN2Cdle8
+NEXT_PUBLIC_FIREBASE_AUTHDOMAIN=bcwin-a99b1.firebaseapp.com
+
+
+
+
+NEXT_PUBLIC_FIREBASE_PROJECTID=bcwin-a99b1
+NEXT_PUBLIC_FIREBASE_STORAGEBUCKET=bcwin-a99b1.appspot.com
+NEXT_PUBLIC_FIREBASE_MESSAGINGSENDERID=1055413612814
+NEXT_PUBLIC_FIREBASE_APPID=1:1055413612814:web:7a563237de8e43849d275f
+
+
+
+NEXT_PUBLIC_FIREBASE_MEASUREMENTID=G-467M2BYJMS
+NEXT_PUBLIC_FIREBASE_KEYS=BAOsT7kii-ctLzGrgXe_wYhfuxlme1v4njnD0uPSKp3DpSnrUa2e709b9dRaeYVU7jF_qIx1y9tEv0CvilDCdnM

File diff suppressed because it is too large
+ 466 - 489
messages/br.json


+ 1 - 0
package.json

@@ -27,6 +27,7 @@
     "ahooks": "^3.8.0",
     "ahooks": "^3.8.0",
     "antd-mobile": "^5.37.1",
     "antd-mobile": "^5.37.1",
     "axios": "^1.7.2",
     "axios": "^1.7.2",
+    "bignumber.js": "^9.2.1",
     "clsx": "^2.1.1",
     "clsx": "^2.1.1",
     "dayjs": "^1.11.11",
     "dayjs": "^1.11.11",
     "env-cmd": "^10.1.0",
     "env-cmd": "^10.1.0",

+ 8 - 0
pnpm-lock.yaml

@@ -23,6 +23,9 @@ importers:
       axios:
       axios:
         specifier: ^1.7.2
         specifier: ^1.7.2
         version: 1.7.9
         version: 1.7.9
+      bignumber.js:
+        specifier: ^9.2.1
+        version: 9.2.1
       clsx:
       clsx:
         specifier: ^2.1.1
         specifier: ^2.1.1
         version: 2.1.1
         version: 2.1.1
@@ -860,6 +863,9 @@ packages:
   balanced-match@1.0.2:
   balanced-match@1.0.2:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
 
 
+  bignumber.js@9.2.1:
+    resolution: {integrity: sha512-+NzaKgOUvInq9TIUZ1+DRspzf/HApkCwD4btfuasFTdrfnOxqx853TgDpMolp+uv4RpRp7bPcEU2zKr9+fRmyw==}
+
   binary-extensions@2.3.0:
   binary-extensions@2.3.0:
     resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
     resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
     engines: {node: '>=8'}
     engines: {node: '>=8'}
@@ -3309,6 +3315,8 @@ snapshots:
 
 
   balanced-match@1.0.2: {}
   balanced-match@1.0.2: {}
 
 
+  bignumber.js@9.2.1: {}
+
   binary-extensions@2.3.0: {}
   binary-extensions@2.3.0: {}
 
 
   brace-expansion@1.1.11:
   brace-expansion@1.1.11:

+ 55 - 0
src/api/activity.ts

@@ -0,0 +1,55 @@
+import { server } from "@/utils/client";
+
+export interface GetJackpotRequestParams {}
+
+export interface GetJackpotResponse {
+    Background: string;
+    act_page: number;
+    act_promotion_url: string;
+    act_time_type: number;
+    background_type: number;
+    display_end_time: number;
+    display_start_time: number;
+    end_at: number;
+    id: number;
+    list: Record<number | string, JackpotItem>;
+    name: string;
+    pay_amount: number;
+    remark: string;
+    reward: number;
+    start_at: number;
+    total_bet: number;
+    type: number;
+}
+interface JackpotItem {
+    arr: {
+        id: number;
+        max: number;
+        min: number;
+        show_max: number;
+        show_min: number;
+    }[];
+    coin_type: number;
+    extra_bet: number;
+    extra_num: number;
+    extra_pay_amount: number;
+    id: number;
+    img: string;
+    is_suss: boolean;
+    is_unlock: boolean;
+    time?: string;
+}
+
+export const getJackpotInfo = (data: GetJackpotRequestParams) => {
+    return server.post<GetJackpotResponse>({
+        url: "/v1/api/user/activity/secretBonusInfo",
+        data,
+    });
+};
+
+export const claimActivityReward = (data: { id: number; activity_id: number }) => {
+    return server.post<any>({
+        url: "/v1/api/user/activity/claimActivityReward",
+        data,
+    });
+};

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

@@ -164,6 +164,16 @@ const PaySection = () => {
     );
     );
 };
 };
 
 
+/**
+ * 神秘彩金
+ */
+
+// const JackpotSection = () => {
+//     const token = getToken();
+
+//     return <div className={clsx("test1232 h-[.4rem] w-[.4rem] bg-[red]")}>2323</div>;
+// };
+
 /**
 /**
  * 红包雨
  * 红包雨
  */
  */

+ 173 - 60
src/app/[locale]/(doings)/jackpot/page.tsx

@@ -1,78 +1,180 @@
 "use client";
 "use client";
+import { claimActivityReward, getJackpotInfo, GetJackpotResponse } from "@/api/activity";
+import { formatAmount } from "@/utils";
+import { Toast } from "antd-mobile";
 import clsx from "clsx";
 import clsx from "clsx";
+import dayjs from "dayjs";
+import { useTranslations } from "next-intl";
+import { useSearchParams } from "next/navigation";
 import React from "react";
 import React from "react";
 import styles from "./style.module.scss";
 import styles from "./style.module.scss";
 
 
+// const tabCftg = React.useMemo(() => {
+//     return [
+//         {
+//             image: "/jackpot/2.png",
+//             text: "Dia 2",
+//             key: 2,
+//         },
+//         {
+//             image: "/jackpot/3.png",
+//             text: "Dia 3",
+//             key: 3,
+//         },
+//         {
+//             image: "/jackpot/7.png",
+//             text: "Dia 7",
+//             key: 7,
+//         },
+//         {
+//             image: "/jackpot/15.png",
+//             text: "Dia 15",
+//             key: 15,
+//         },
+//         {
+//             image: "/jackpot/30.png",
+//             text: "Dia 30",
+//             key: 30,
+//         },
+//     ];
+// }, []);
+
 const Jackpot: React.FC = () => {
 const Jackpot: React.FC = () => {
-    const [actKey, setActKey] = React.useState<number>(2);
-    const tabCftg = React.useMemo(() => {
+    const searchParams = useSearchParams();
+    const t = useTranslations();
+    const [actKey, setActKey] = React.useState<number | string>(2);
+    const [infoData, setInfoData] = React.useState<GetJackpotResponse>();
+    const activeId = searchParams.get("activity_id");
+    const images = React.useMemo(() => {
         return [
         return [
-            {
-                image: "/jackpot/2.png",
-                text: "Dia 2",
-                key: 2,
-            },
-            {
-                image: "/jackpot/3.png",
-                text: "Dia 3",
-                key: 3,
-            },
-            {
-                image: "/jackpot/7.png",
-                text: "Dia 7",
-                key: 7,
-            },
-            {
-                image: "/jackpot/15.png",
-                text: "Dia 15",
-                key: 15,
-            },
-            {
-                image: "/jackpot/30.png",
-                text: "Dia 30",
-                key: 30,
-            },
+            "/jackpot/2.png",
+            "/jackpot/3.png",
+            "/jackpot/7.png",
+            "/jackpot/15.png",
+            "/jackpot/30.png",
         ];
         ];
     }, []);
     }, []);
+    const curTabData: any = React.useMemo(() => {
+        return infoData?.list[`${actKey}`] || {};
+    }, [actKey, infoData]);
+
     const list = React.useMemo(() => {
     const list = React.useMemo(() => {
         const base = [
         const base = [
             {
             {
                 left: "Ãmbito do depósito",
                 left: "Ãmbito do depósito",
                 right: "Bónus Misterioso",
                 right: "Bónus Misterioso",
             },
             },
-            {
-                left: "12323",
-                right: "R$ 1,999.00",
-            },
-            {
-                left: "12323",
-                right: "R$ 1,999.00",
-            },
-            {
-                left: "123223233",
-                right: "R$ 1,999.00",
-            },
         ];
         ];
+        if (curTabData?.arr) {
+            for (let i = 0; i < curTabData.arr.length; i++) {
+                const item = curTabData.arr[i];
+                base.push({
+                    left: `R$ ${formatAmount(item.min)}-${formatAmount(item.max)}`,
+                    right: `R$ ${formatAmount(item.show_min)}-${formatAmount(item.show_max)}`,
+                });
+            }
+        }
         return base;
         return base;
+    }, [curTabData]);
+    React.useEffect(() => {
+        getInfoData();
+        // eslint-disable-next-line react-hooks/exhaustive-deps
     }, []);
     }, []);
 
 
+    const getInfoData = async () => {
+        if (!activeId) return;
+        try {
+            const res = await getJackpotInfo({ activity_id: Number(activeId) });
+            if (res.code === 200) {
+                if (res.data.list) {
+                    const keys = Object.keys(res.data.list);
+                    const result: any = {};
+                    let initKey = 0;
+                    if (keys.length > 0) {
+                        for (let i = 0; i < keys.length; i++) {
+                            const curKey = keys[i];
+                            const curItem = res.data.list[curKey];
+                            if (i === 0) {
+                                initKey = Number(curKey);
+                            }
+                            if (curItem?.is_unlock && !curItem?.is_suss) {
+                                initKey = Number(curKey);
+                            }
+                            let time = null;
+                            if (res.data) {
+                                time = dayjs(res.data.start_at * 1000)
+                                    .add(Number(curKey), "day")
+                                    .format("YYYY-MM-DD HH:mm");
+                            }
+                            result[curKey] = {
+                                ...curItem,
+                                time,
+                            };
+                        }
+                    }
+                    setInfoData({ ...res.data, list: result });
+                    setActKey(Number(initKey));
+                } else {
+                    throw new Error(t(`activity.claimError`));
+                }
+            } else {
+                throw new Error(t(`code.${res.code}`));
+            }
+        } catch (error: any) {
+            if (error) {
+                Toast.show({
+                    content: error.message || error.toString(),
+                    maskClickable: false,
+                });
+            }
+        }
+    };
+
+    const doClaim = async () => {
+        try {
+            const res = await claimActivityReward({
+                activity_id: Number(activeId),
+                id: curTabData.id,
+            });
+            if (res.code === 200 && res?.data?.code === 1) {
+                await getInfoData();
+                Toast.show({
+                    content: "Reclamação bem-sucedida",
+                    maskClickable: false,
+                });
+            } else {
+                throw new Error(t(`code.400`));
+            }
+        } catch (error: any) {
+            if (error) {
+                Toast.show({
+                    content: error.message || error.toString(),
+                    maskClickable: false,
+                });
+            }
+        }
+    };
+
     return (
     return (
         <div className={styles.main}>
         <div className={styles.main}>
             <div className={styles.container}>
             <div className={styles.container}>
                 <div className={styles.tab}>
                 <div className={styles.tab}>
-                    {tabCftg.map((item) => {
-                        return (
-                            <div
-                                className={clsx(styles.tabItem, {
-                                    [styles.active]: actKey === item.key,
-                                })}
-                                key={item.key}
-                            >
-                                <img src={item.image} />
-                                <span>{item.text}</span>
-                            </div>
-                        );
-                    })}
+                    {infoData?.list &&
+                        Object.keys(infoData?.list).map((key: string | number, idx: number) => {
+                            const item = infoData?.list[key];
+                            return (
+                                <div
+                                    className={clsx(styles.tabItem, {
+                                        [styles.active]: actKey === Number(key),
+                                    })}
+                                    key={key}
+                                    onClick={() => setActKey(Number(key))}
+                                >
+                                    <img src={images[idx]} />
+                                    <span>Dia {key}</span>
+                                </div>
+                            );
+                        })}
                 </div>
                 </div>
                 <div className={clsx(styles.intro)}>
                 <div className={clsx(styles.intro)}>
                     <div
                     <div
@@ -83,13 +185,19 @@ const Jackpot: React.FC = () => {
                     >
                     >
                         <div className={clsx("flex flex-row justify-between")}>
                         <div className={clsx("flex flex-row justify-between")}>
                             <div className={clsx(styles.name, styles.date)}>Hora de registo:</div>
                             <div className={clsx(styles.name, styles.date)}>Hora de registo:</div>
-                            <div>2025-04-11 16:30</div>
+                            <div>
+                                {infoData?.display_start_time
+                                    ? dayjs(infoData?.display_start_time * 1000).format(
+                                          "YYYY-MM-DD HH:mm"
+                                      )
+                                    : ""}
+                            </div>
                         </div>
                         </div>
                         <div className={clsx("flex flex-row justify-between")}>
                         <div className={clsx("flex flex-row justify-between")}>
                             <div className={clsx(styles.name, styles.coin)}>
                             <div className={clsx(styles.name, styles.coin)}>
-                                Depósito total de 2 Dias:
+                                Depósito total de {actKey} Dias:
                             </div>
                             </div>
-                            <div>R$ 5,000.00</div>
+                            <div>R$ {formatAmount(curTabData.extra_pay_amount)}</div>
                         </div>
                         </div>
                     </div>
                     </div>
                     <div className={clsx(styles.introBottom, styles.big)}>
                     <div className={clsx(styles.introBottom, styles.big)}>
@@ -99,26 +207,31 @@ const Jackpot: React.FC = () => {
                         <div
                         <div
                             className={clsx(
                             className={clsx(
                                 styles.date,
                                 styles.date,
-                                "relative mt-[.08rem] flex flex-row items-center pl-[.3rem] text-[.15rem] font-bold"
+                                "relative mt-[.08rem] flex h-[.2rem] w-[1.8rem] flex-row items-center pl-[.3rem] text-[.15rem] font-bold"
                             )}
                             )}
                         >
                         >
-                            2025-04-11 16:30
+                            {curTabData.time}
                         </div>
                         </div>
                         <div
                         <div
                             className={clsx(
                             className={clsx(
                                 styles.coin,
                                 styles.coin,
-                                "relative mt-[.08rem] flex flex-row items-center pl-[.3rem] text-[.15rem] font-bold"
+                                "relative mt-[.08rem] flex h-[.2rem] w-[1.8rem] flex-row items-center pl-[.3rem] text-[.15rem] font-bold"
                             )}
                             )}
                         >
                         >
                             Bónus misterioso
                             Bónus misterioso
                         </div>
                         </div>
                         <div className={clsx("mt-[.08rem] text-[.18rem] font-bold text-[#ffd200]")}>
                         <div className={clsx("mt-[.08rem] text-[.18rem] font-bold text-[#ffd200]")}>
-                            R$1,999.00
+                            R$ {formatAmount(curTabData.extra_num)}
                         </div>
                         </div>
                     </div>
                     </div>
                 </div>
                 </div>
                 <div className={clsx("mt-[.2rem] flex flex-row justify-center")}>
                 <div className={clsx("mt-[.2rem] flex flex-row justify-center")}>
-                    <div className={clsx(styles.btn)}>
+                    <div
+                        className={clsx(styles.btn, {
+                            [styles.disabled]: !(!curTabData.is_suss && curTabData.is_unlock),
+                        })}
+                        onClick={doClaim}
+                    >
                         <span className={clsx("mt-[.1rem] text-[.2rem] font-[900]")}>RECEBER</span>
                         <span className={clsx("mt-[.1rem] text-[.2rem] font-[900]")}>RECEBER</span>
                     </div>
                     </div>
                 </div>
                 </div>

+ 6 - 6
src/app/[locale]/(navbar)/betrecord/style.module.scss

@@ -15,12 +15,12 @@
         border-radius: 0.15rem;
         border-radius: 0.15rem;
         margin: 0 0.1rem 0.1rem;
         margin: 0 0.1rem 0.1rem;
     }
     }
-    :global(.adm-list-body-inner) {
-        // @extend .commonBorder;
-        // box-shadow: $-input-shadow;
-        // border-radius: 0.15rem;
-        // border-top-width: 1px;
-    }
+    // :global(.adm-list-body-inner) {
+    //     // @extend .commonBorder;
+    //     // box-shadow: $-input-shadow;
+    //     // border-radius: 0.15rem;
+    //     // border-top-width: 1px;
+    // }
     :global(.adm-list-item-content) {
     :global(.adm-list-item-content) {
         border-top: none;
         border-top: none;
     }
     }

+ 3 - 1
src/utils/client/index.ts

@@ -17,8 +17,10 @@ const server = new Request({
             return config;
             return config;
         },
         },
         responseInterceptorCatch: async (err) => {
         responseInterceptorCatch: async (err) => {
-            const { response } = err;
+            console.log(2233, err);
+            const { response }: any = err;
             if (!response) return err;
             if (!response) return err;
+            // if (response.status !== 200) return Promise.reject(response.message);
             // @ts-ignore
             // @ts-ignore
             const { code } = response.data;
             const { code } = response.data;
             switch (code) {
             switch (code) {

+ 7 - 0
src/utils/index.ts

@@ -1,4 +1,5 @@
 // 设置根节点html的字体大小用于移动端适配使用
 // 设置根节点html的字体大小用于移动端适配使用
+import BigNumber from "bignumber.js";
 export const setupFontSize = () => {
 export const setupFontSize = () => {
     console.count("setupFontSize");
     console.count("setupFontSize");
     (function (doc, win) {
     (function (doc, win) {
@@ -64,3 +65,9 @@ export const isNE = (value: string) => {
 export const isInStandaloneMode = () =>
 export const isInStandaloneMode = () =>
     window.matchMedia("(display-mode: standalone)").matches ||
     window.matchMedia("(display-mode: standalone)").matches ||
     document.referrer.includes("android-app://");
     document.referrer.includes("android-app://");
+
+export const formatAmount = (amount: string | number) => {
+    if (!amount) return new BigNumber(0).toFormat(2);
+
+    return new BigNumber(amount).toFormat(2);
+};

Some files were not shown because too many files changed in this diff