瀏覽代碼

feat: 增加钱包弹窗增加钱包轮询

Before 8 月之前
父節點
當前提交
291e338a44

+ 3 - 3
.env.third

@@ -1,7 +1,7 @@
 #baseurl
-NEXT_PUBLIC_BASE_URL=http://104.251.122.140:8800
-#sharelink
-NEXT_PUBLIC_SHARE_URL=http://104.251.122.140:3000
+NEXT_PUBLIC_BASE_URL=https://3rd-api.tiktokjakjkl.icu
+#share link
+NEXT_PUBLIC_SHARE_URL=https://3rd-site.tiktokjakjkl.icu
 #firebase
 NEXT_PUBLIC_FIREBASE_APIKEY=AIzaSyDAWORGKhdyzb5KeqTi535VmD5gN2Cdle8
 NEXT_PUBLIC_FIREBASE_AUTHDOMAIN=bcwin-a99b1.firebaseapp.com

+ 2 - 2
.env.uat

@@ -1,7 +1,7 @@
 #baseurl
-NEXT_PUBLIC_BASE_URL=https://3rd-api.tiktokjakjkl.icu
+NEXT_PUBLIC_BASE_URL=https://ot-api.tiktokjakjkl.icu
 #share link
-NEXT_PUBLIC_SHARE_URL=https://3rd-site.tiktokjakjkl.icu
+NEXT_PUBLIC_SHARE_URL=https://ot-site.tiktokjakjkl.icu
 #firebase
 NEXT_PUBLIC_FIREBASE_APIKEY=AIzaSyCIE8xtySsYztsSgmQJx_aqPrrpHEuvgvw
 NEXT_PUBLIC_FIREBASE_AUTHDOMAIN=bcwin777-1bdda.firebaseapp.com

+ 13 - 1
messages/br.json

@@ -140,11 +140,23 @@
 
     "deposits": "Depósitos",
     "saques": "Saques",
-    "Saldo": "Saldo",
+    "balance": "Saldo",
+
     "bonus":  "Bônus",
+    "bonusArticle":"Bônus Article",
+    "bonusDesc1": "O saldo de ouro colorido será transferido automaticamente para sua carteira principal após a conclusão dos requisitos de volume de codificação",
+    "bonusDesc2": "Se houver um saldo de ouro no momento do início do levantamento, a carteira de ouro será esvaziada",
+    "bonusDesc3": "O ouro colorido não pode mais ser usado em crash, esportes ou outros jogos restritos",
     "free": "Free",
+    "freeArticle": "Free Article",
+    "freeDesc1": "As moedas grátis só podem ser usadas nos jogos grátis especificados",
+    "freeDesc2": "Completar a quantidade de código de moeda livre, o saldo é transferido automaticamente para a carteira de dinheiro",
     "replay": "Replay",
+    "replayArticle": "Replay Article",
+    "replayDesc1": "As moedas de repetição só podem ser jogadas nos jogos de repetição especificados",
+    "replayDesc2": "Termine a quantidade de codificação de moedas de repetição, e o saldo será transferido automaticamente para a carteira de dinheiro",
     "modalTitle": "Proxima retirada de bonus",
+    "modalBottomTips": " FALTA APOSTAR R$ ",
     "expTips": "{exp} Bet to ",
     "main": "Principais",
     "gratis": "Grátis",

+ 9 - 1
messages/en.json

@@ -119,7 +119,6 @@
     "Depósito": "Depósito",
     "Sacar": "Sacar",
     "Conta": "Conta",
-    "Saldo": "Saldo",
     "Sair": "Sair",
     "Deseja": "Deseja sair?",
     "Cancelar": "Cancelar",
@@ -141,8 +140,17 @@
 
     "deposits": "Depósitos",
     "saques": "Saques",
+    "balance": "Saldo",
     "bonus":  "Bônus",
+    "bonusArticle":"Bônus Article",
+    "bonusDesc1": "O saldo de ouro colorido será transferido automaticamente para sua carteira principal após a conclusão dos requisitos de volume de codificação",
+    "bonusDesc2": "Se houver um saldo de ouro no momento do início do levantamento, a carteira de ouro será esvaziada",
+    "bonusDesc3": "O ouro colorido não pode mais ser usado em crash, esportes ou outros jogos restritos",
     "free": "Free",
+    "freeArticle": "Free Article",
+    "freeDesc1": "As moedas grátis só podem ser usadas nos jogos grátis especificados",
+    "freeDesc2": "Completar a quantidade de código de moeda livre, o saldo é transferido automaticamente para a carteira de dinheiro",
+
     "replay": "Replay",
     "modalTitle": "Proxima retirada de bonus",
     "expTips": "{exp} Bet to ",

+ 2 - 2
src/app/[locale]/(TabBar)/deposit/DepositData.tsx

@@ -28,8 +28,8 @@ const RewardsText: FC<RewardsProps> = (props) => {
             // let text = item.ratio > 0 ? `${item.ratio}%` : `${item.reward}`;
             // 根据coin_type添加后缀
             const suffixes = {
-                1: t("ProfilePage.Saldo"),
-                2: t("ProfilePage.Saldo"),
+                1: t("ProfilePage.balance"),
+                2: t("ProfilePage.balance"),
                 3: t("ProfilePage.free"),
                 4: t("ProfilePage.replay"),
             };

+ 141 - 32
src/app/[locale]/(TabBar)/profile/ProfileHeader.tsx

@@ -2,6 +2,7 @@
 import { UserInfoRep, UserVipInfo, Wallet } from "@/api/user";
 import TipsModal, { ModalProps } from "@/components/TipsModal";
 import { Link, useRouter } from "@/i18n/routing";
+import { useWalletStore } from "@/stores/useWalletStore";
 import { WalletEnum } from "@/types";
 import { vipImages } from "@/utils/constant";
 import { flatPoint, percentage } from "@/utils/methods";
@@ -65,34 +66,125 @@ const VipCard = (props: { userVip: UserVipInfo }) => {
 const Progress = (props: { percent: number }) => {
     const { percent } = props;
     return (
-        <ProgressBar
-            percent={percent}
-            className={"mr-[0.0694rem] flex-1"}
-            style={{
-                "--fill-color": "var(--primary-color)",
-                "--track-width": "0.0694rem",
-            }}
-        />
+        <div className="flex">
+            <ProgressBar
+                percent={percent}
+                className={"mr-[0.0694rem] flex-1"}
+                style={{
+                    "--fill-color": "var(--primary-color)",
+                    "--track-width": "0.0694rem",
+                }}
+            />
+            <span className={"text-primary-color"}>{percent}%</span>
+        </div>
     );
 };
-// 现金
-const Balance = (props: { wallet: Wallet }) => {
-    const { wallet } = props;
-    const num = 1;
+const WalletContent = (props: {
+    percentage: number;
+    type: string;
+    difference: number;
+    current: number;
+}) => {
+    const { percentage, type, difference, current } = props;
     const t = useTranslations("ProfilePage");
     return (
         <div>
+            <div className={"mb-[0.12rem] text-[0.12rem]"}>
+                <span className={"mr-[10px]"}>{type}</span>
+                <i className={"mr-[10px] indent-[10px] text-[0.1528rem] font-bold"}>R$</i>
+                <span>{current}</span>
+            </div>
+
+            <Progress percent={percentage} />
+
             <div>
-                <span>{t("Saldo")}</span>
-                <span></span>
-                <span>{wallet.score}</span>
+                <span>{t("modalBottomTips")}</span>
+                <span>{difference.toFixed(2)}</span>
             </div>
+        </div>
+    );
+};
+// 现金
+const BalanceContent = (props: { wallet: Wallet }) => {
+    const { wallet } = props;
+    const t = useTranslations("ProfilePage");
+    return (
+        <>
+            <WalletContent
+                difference={wallet.target_score_rollover - wallet.current_score_rollover}
+                type={t("balance")}
+                current={wallet.score || 0}
+                percentage={percentage(wallet.current_score_rollover, wallet.target_score_rollover)}
+            />
+        </>
+    );
+};
 
-            <Progress percent={num} />
+const BonusContent = (props: { wallet: Wallet }) => {
+    const { wallet } = props;
+    const t = useTranslations("ProfilePage");
+    return (
+        <div>
+            <WalletContent
+                difference={wallet.target_point_rollover - wallet.current_point_rollover}
+                type={t("bonus")}
+                current={wallet.point || 0}
+                percentage={percentage(wallet.current_point_rollover, wallet.target_point_rollover)}
+            />
+            <p className={"text-center"}>{t("bonusArticle")}</p>
+            <ul className={"ml-[0.1389rem] list-decimal text-[0.12rem] text-[#666]"}>
+                <li>{t("bonusDesc1")}</li>
+                <li>{t("bonusDesc2")}</li>
+                <li>{t("bonusDesc3")}</li>
+            </ul>
         </div>
     );
 };
 
+const FreeContent = (props: { wallet: Wallet }) => {
+    const { wallet } = props;
+    const t = useTranslations("ProfilePage");
+    return (
+        <div>
+            <WalletContent
+                difference={wallet.target_free_score_rollover - wallet.current_free_score_rollover}
+                type={t("free")}
+                current={wallet.free_score || 0}
+                percentage={percentage(
+                    wallet.current_free_score_rollover,
+                    wallet.target_free_score_rollover
+                )}
+            />
+            <p className={"text-center"}>{t("freeArticle")}</p>
+            <ul className={"ml-[0.1389rem] list-decimal text-[0.12rem] text-[#666]"}>
+                <li>{t("freeDesc1")}</li>
+                <li>{t("freeDesc2")}</li>
+            </ul>
+        </div>
+    );
+};
+const ReplayContent = (props: { wallet: Wallet }) => {
+    const { wallet } = props;
+    const t = useTranslations("ProfilePage");
+    return (
+        <div>
+            <WalletContent
+                difference={wallet.target_lose_score_rollover - wallet.current_lose_score_rollover}
+                type={t("replay")}
+                current={wallet.free_score || 0}
+                percentage={percentage(
+                    wallet.current_lose_score_rollover,
+                    wallet.target_lose_score_rollover
+                )}
+            />
+            <p className={"text-center"}>{t("replayArticle")}</p>
+            <ul className={"ml-[0.1389rem] list-decimal text-[0.12rem] text-[#666]"}>
+                <li>{t("replayDesc1")}</li>
+                <li>{t("replayDesc2")}</li>
+            </ul>
+        </div>
+    );
+};
 const WalletCard = (props: { userMoney: Wallet }) => {
     const { userMoney } = props;
     const t = useTranslations("ProfilePage");
@@ -107,7 +199,12 @@ const WalletCard = (props: { userMoney: Wallet }) => {
         router.push(`/${key}`);
     };
     const tipsRef = useRef<ModalProps>(null);
-    const [tipsStatus, setTipsStatus] = useState<keyof typeof WalletEnum>("Balance");
+    const [tipsStatus, setTipsStatus] = useState<keyof typeof WalletEnum>("Bonus");
+
+    const modalHandler = (key: keyof typeof WalletEnum) => {
+        setTipsStatus(key);
+        tipsRef.current?.onOpen();
+    };
 
     return (
         <>
@@ -123,19 +220,30 @@ const WalletCard = (props: { userMoney: Wallet }) => {
                 }
             >
                 {/*现金*/}
-                {tipsStatus === WalletEnum.Balance ? <Balance wallet={userMoney} /> : null}
+                {tipsStatus === WalletEnum.Balance ? <BalanceContent wallet={userMoney} /> : null}
                 {/*  彩金*/}
-                {/*<div>彩金</div>*/}
+                {tipsStatus === WalletEnum.Bonus ? <BonusContent wallet={userMoney} /> : null}
                 {/* 免费币 */}
-                {/*<div>免费币</div>*/}
+                {tipsStatus === WalletEnum.Free ? <FreeContent wallet={userMoney} /> : null}
                 {/*  重玩币 */}
-                {/*<div>重玩币</div>*/}
+                {tipsStatus === WalletEnum.Replay ? <ReplayContent wallet={userMoney} /> : null}
             </TipsModal>
             <div className="coin">
                 <span className="coin_left__icon iconfont icon-icon-wallet"></span>
                 <div className={"coin_right_wallet"}>
                     <div className={"wallet_left_border"}>
-                        <span>{t("Saldo")}</span>
+                        <div className={"wallet_header"}>
+                            <span>{t("balance")}</span>
+                            <Image
+                                className="wallet_header__icon"
+                                src="/img/a.png"
+                                alt="question"
+                                onClick={() => modalHandler(WalletEnum.Balance)}
+                                width={15}
+                                height={15}
+                            />
+                        </div>
+
                         <div className="num">
                             <span className="uppercase">brl </span>
                             <span>{userMoney.score || 0.0}</span>
@@ -148,7 +256,7 @@ const WalletCard = (props: { userMoney: Wallet }) => {
                                 className="wallet_header__icon"
                                 src="/img/a.png"
                                 alt="question"
-                                onClick={() => tipsRef.current?.onOpen()}
+                                onClick={() => modalHandler(WalletEnum.Bonus)}
                                 width={15}
                                 height={15}
                             />
@@ -167,9 +275,9 @@ const WalletCard = (props: { userMoney: Wallet }) => {
                                 alt="question"
                                 width={15}
                                 height={15}
-                                onClick={(event) => {
-                                    event.stopPropagation();
-                                    setVisible(true);
+                                onClick={(e) => {
+                                    e.stopPropagation();
+                                    modalHandler(WalletEnum.Free);
                                 }}
                             />
                         </div>
@@ -185,9 +293,9 @@ const WalletCard = (props: { userMoney: Wallet }) => {
                                 className="wallet_header__icon"
                                 src="/img/a.png"
                                 alt="question"
-                                onClick={(event) => {
-                                    event.stopPropagation();
-                                    setVisible(true);
+                                onClick={(e) => {
+                                    e.stopPropagation();
+                                    modalHandler(WalletEnum.Replay);
                                 }}
                                 width={15}
                                 height={15}
@@ -204,13 +312,14 @@ const WalletCard = (props: { userMoney: Wallet }) => {
     );
 };
 export const ProfileHeader = (props: Props) => {
-    const { userInfo, userMoney, userVip } = props;
+    const { userInfo, userVip } = props;
     const t = useTranslations("ProfilePage");
 
+    const wallet = useWalletStore((state) => state.wallet);
     const router = useRouter();
 
     const handler = () => {
-        if (!!userMoney.score) {
+        if (!!wallet.score) {
             router.push("/withdraw");
         } else {
             Toast.show("no monry");
@@ -236,7 +345,7 @@ export const ProfileHeader = (props: Props) => {
                 {/*vipcard*/}
                 <VipCard userVip={userVip} />
 
-                <WalletCard userMoney={userMoney} />
+                <WalletCard userMoney={wallet} />
             </div>
 
             <div className="link">

+ 1 - 1
src/app/[locale]/(navbar)/betrecord/CashRecord.tsx

@@ -7,7 +7,7 @@ import { useRef } from "react";
 import Message from "./components/list";
 
 const Bets = () => {
-    const params = useRef({ current_page: 0, page_size: 20, use_page: true });
+    const params = useRef({ current_page: 0, page_size: 20, use_page: true, bet_type: 1 });
     const [sourceData, setSourceData] = useSetState<{
         list: RecordBillsResp[];
         page: Partial<Pagination>;

+ 1 - 1
src/app/[locale]/(navbar)/betrecord/FreeRecord.tsx

@@ -7,7 +7,7 @@ import { useRef } from "react";
 import Message from "./components/list";
 
 const Bets = () => {
-    const params = useRef({ current_page: 0, page_size: 20, use_page: true });
+    const params = useRef({ current_page: 0, page_size: 20, use_page: true, bet_type: 3 });
     const [sourceData, setSourceData] = useSetState<{
         list: RecordBillsResp[];
         page: Partial<Pagination>;

+ 1 - 1
src/app/[locale]/(navbar)/betrecord/ReplayRecord.tsx

@@ -7,7 +7,7 @@ import { useRef } from "react";
 import Message from "./components/list";
 
 const Bets = () => {
-    const params = useRef({ current_page: 0, page_size: 20, use_page: true });
+    const params = useRef({ current_page: 0, page_size: 20, use_page: true, bet_type: 4 });
     const [sourceData, setSourceData] = useSetState<{
         list: RecordBillsResp[];
         page: Partial<Pagination>;

+ 2 - 2
src/app/[locale]/(navbar)/doings/discount/DepositData.tsx

@@ -27,8 +27,8 @@ const RewardsText: FC<RewardsProps> = (props) => {
         .map((item) => {
             // 根据coin_type添加后缀
             const suffixes = {
-                1: t("ProfilePage.Saldo"),
-                2: t("ProfilePage.Saldo"),
+                1: t("ProfilePage.balance"),
+                2: t("ProfilePage.balance"),
                 3: t("ProfilePage.free"),
                 4: t("ProfilePage.replay"),
             };

+ 17 - 0
src/components/Footer/index.tsx

@@ -8,7 +8,9 @@ import { useTranslations } from "next-intl";
 import { ChangeEvent, FC, ReactNode, useEffect } from "react";
 import "./style.scss";
 
+import { getUserMoneyApi } from "@/api/user";
 import { useGlobalNoticeStore } from "@/stores/useGlobalNoticeStore";
+import { useWalletStore } from "@/stores/useWalletStore";
 import { useRequest } from "ahooks";
 
 /**
@@ -70,6 +72,7 @@ const Footer: FC = () => {
         setNotices: state.setNotices,
     }));
 
+    const setWallet = useWalletStore((state) => state.setWallet);
     const { run } = useRequest(getGlobalNoticeApi, {
         pollingInterval: 10000,
         manual: true,
@@ -80,9 +83,23 @@ const Footer: FC = () => {
         },
     });
 
+    const { run: walletRun } = useRequest(getUserMoneyApi, {
+        pollingInterval: 5000,
+        pollingWhenHidden: true,
+        pollingErrorRetryCount: 3,
+        staleTime: 5000,
+        manual: true,
+        refreshDeps: [token],
+        onError: (error) => {},
+        onSuccess: (res) => {
+            setWallet(res.data);
+        },
+    });
+
     useEffect(() => {
         if (getToken()) {
             run();
+            walletRun();
         }
     }, []);
 

+ 1 - 23
src/components/Header/HeaderRight.tsx

@@ -1,8 +1,6 @@
-import { getUserMoneyApi } from "@/api/user";
 import { Link } from "@/i18n/routing";
 import { useWalletStore } from "@/stores/useWalletStore";
 import { getToken } from "@/utils/Cookies";
-import { useRequest } from "ahooks";
 import { useTranslations } from "next-intl";
 import styles from "./style.module.scss";
 
@@ -10,28 +8,8 @@ const HeaderRight = () => {
     const t = useTranslations("Header");
 
     const token = getToken();
-    const score = useWalletStore((state) => state.score);
-    const setScore = useWalletStore((state) => state.setScore);
-    const getUserMoneyHandler = () => {
-        if (token) {
-            return getUserMoneyApi();
-        }
-        return Promise.reject();
-    };
+    const score = useWalletStore((state) => state.wallet.score);
 
-    useRequest(getUserMoneyHandler, {
-        pollingInterval: 8000,
-        pollingWhenHidden: true,
-        pollingErrorRetryCount: 3,
-        staleTime: 5000,
-        refreshDeps: [token],
-        onError: (error) => {},
-        onSuccess: (res) => {
-            if (res.data.score) {
-                setScore(res.data.score);
-            }
-        },
-    });
     return (
         <div className={styles.headerRight}>
             <div className={styles.right}>

+ 29 - 2
src/stores/useWalletStore.ts

@@ -2,7 +2,7 @@ import { Wallet } from "@/api/user";
 import { create } from "zustand";
 
 interface State {
-    wallet: Partial<Wallet>;
+    wallet: Wallet;
     score: Wallet["score"];
 }
 
@@ -12,7 +12,34 @@ interface Action {
     reset: () => void;
 }
 const initialState: State = {
-    wallet: {},
+    wallet: {
+        avatar_url: "",
+        currency: "",
+        current_free_score_rollover: 0,
+        current_lose_score_rollover: 0,
+        current_point_rollover: 0,
+        current_score_rollover: 0,
+        deposit: 0,
+        first_pay_time: 0,
+        free_score: 0,
+        lock_point: 0,
+        lock_score: 0,
+        lose_score: 0,
+        nick_name: "",
+        point: 0,
+        score: 0,
+        target_free_score_rollover: 0,
+        target_lose_score_rollover: 0,
+        target_point_rollover: 0,
+        target_score_rollover: 0,
+        total_free_score_rollover: 0,
+        total_lose_score_rollover: 0,
+        total_point_rollover: 0,
+        total_receive_red_packet: 0,
+        total_red_packet: 0,
+        total_score_rollover: 0,
+        user_name: "",
+    },
     score: undefined,
 };
 export const useWalletStore = create<State & Action>()((set) => {

+ 2 - 1
src/utils/methods/index.ts

@@ -81,7 +81,8 @@ export let copyText = function (text: string) {
  */
 export const percentage = (current: number, source: number) => {
     if (!source) return 0;
-    return (current * 100) / source;
+    const num = (current * 100) / source;
+    return num > 100 ? 100 : num;
 };
 
 /**