Browse Source

feat: 修改

year 3 days ago
parent
commit
ecf359eed3

File diff suppressed because it is too large
+ 0 - 0
public/iconfont.js


File diff suppressed because it is too large
+ 0 - 0
public_original/iconfont.js


+ 34 - 1
src/app/[locale]/(TabBar)/[[...share]]/@actionWidget/Scroll.tsx

@@ -1,12 +1,45 @@
 "use client";
-
 import SvgIcon from "@/components/SvgIcon";
+import feedback from "@/feedback";
+import { useRouter } from "@/i18n/routing";
+import React from "react";
 
 const Scroll = () => {
+    const router = useRouter();
     const scrollToTop = () => {
         const parentEle = document.querySelector("#maincontainer");
         parentEle!.scrollTo({ top: 0, behavior: "smooth" });
     };
+
+    React.useEffect(() => {
+        setInterval(() => {
+            doShowWin();
+        }, 5000);
+    }, []);
+
+    const doShowWin = async () => {
+        if (feedback.hasShow()) return;
+        const res = await feedback.showModal({
+            content: (
+                <div>
+                    <div className="rechargeTip-main-title flex w-full items-center justify-center text-[18px] font-black text-[var(--textColor1)]">
+                        🎉 Parabéns! 🎉
+                    </div>
+                    <div className="flex w-full items-center justify-center break-all px-[15px] py-[20px] indent-1 text-[14px]">
+                        O jogador [5*****67] faturou
+                        <span className="contents text-[#db8432]">R$ {Math.random()}</span> no Lucky
+                        Monkey. Tente a sorte você também!
+                    </div>
+                </div>
+            ),
+            width: "80%",
+            confirmText: "Depósito",
+        });
+        if (res?.confirm) {
+            router.push("/deposit");
+        }
+    };
+
     return (
         <div className="mt-[.5rem] flex justify-center pb-[.5rem]">
             <div className="h-[40px]" onClick={scrollToTop}>

+ 41 - 3
src/app/[locale]/(enter)/components/Form/index.tsx

@@ -139,9 +139,10 @@ interface FormInitStateTypes extends FormProps {
 export type FormType = "login" | "register";
 interface Props {
     type?: FormType;
+    isCanSubmit?: boolean;
 }
 const FormComponent: FC<Props> = (props) => {
-    const { type = "register" } = props;
+    const { type = "register", isCanSubmit = true } = props;
     const isStrictMode = useSystemStore().identity_verify.register === 1;
     const { setUserInfo } = useUserInfoStore();
     const t = useTranslations();
@@ -152,6 +153,7 @@ const FormComponent: FC<Props> = (props) => {
     const formRef = useRef<any>(null);
     /// 密码可见
     const [visible, setVisible] = useState(false);
+    const [isRemeber, setIsRemeber] = useState(true);
     const spanClassName = clsx("iconfont", {
         "icon-kejian": visible,
         "icon-bukejian": !visible,
@@ -174,9 +176,24 @@ const FormComponent: FC<Props> = (props) => {
 
     useEffect(() => {
         formRef.current?.resetFields();
+        if (type === "login") {
+            setTimeout(() => {
+                const cacheLogin = Local.getKey("ban_cache_login");
+                if (cacheLogin) {
+                    formRef.current?.setFieldsValue({
+                        pwd: cacheLogin.pwd,
+                        mobile: {
+                            preValue: "55",
+                            realValue: cacheLogin.user_phone.replace(/^\d{2}/, ""),
+                        },
+                    });
+                }
+            }, 100);
+        }
     }, [type]);
 
     const onFinish = (values: FormInitStateTypes) => {
+        if (!isCanSubmit) return;
         const { mobile } = values;
         const newValue = {
             ...values,
@@ -215,10 +232,20 @@ const FormComponent: FC<Props> = (props) => {
                 });
             });
             if (loginResult?.code === 200) {
+                if (type === "login") {
+                    if (isRemeber) {
+                        Local.setKey("ban_cache_login", {
+                            user_phone: values.user_phone,
+                            pwd: values.pwd,
+                        });
+                    } else {
+                        Local.removeKey("ban_cache_login");
+                    }
+                }
+                sessionStorage.setItem("ShowProxy", "1");
                 sessionStorage.removeItem("dialogShow");
                 eventLogin();
                 setCookies("Token", loginResult.data.token as string);
-                // Local.setKey("wss", loginResult.data.gate);
                 setUserInfo(loginResult.data);
                 resolve(loginResult);
                 return loginResult;
@@ -358,7 +385,18 @@ const FormComponent: FC<Props> = (props) => {
                     />
                 </Form.Item>
                 {type === "login" && (
-                    <div className="mb-[.3rem]">
+                    <div
+                        className="mb-[.3rem] flex items-center"
+                        onClick={() => {
+                            setIsRemeber(!isRemeber);
+                        }}
+                    >
+                        <i
+                            className={clsx("iconfont mr-[.1rem] text-[.16rem] text-[#ff5a00]", {
+                                "icon-xuanzhong": isRemeber,
+                                "icon-gouxuan-weixuanzhong-xianxingfangkuang": !isRemeber,
+                            })}
+                        ></i>
                         <span className="text-[.12rem]">Lembrar a senha</span>
                     </div>
                 )}

+ 23 - 2
src/app/[locale]/(enter)/register/page.tsx

@@ -40,6 +40,7 @@ const getCashBackApi = async () => {
 
 const Login = () => {
     const searchParams = useSearchParams();
+    const [isCanRegist, setIsCanRegist] = React.useState<boolean>(true);
 
     const router = useRouter();
     const [act, setAct] = React.useState<FormType>(
@@ -133,13 +134,33 @@ const Login = () => {
                     </div> */}
                     <div className="px-[.1rem]">
                         <div className="min-h-[0] flex-1 overflow-auto rounded-[.1rem] bg-[var(--main-background)] p-[.15rem]">
-                            <Form type={act} />
-                            <div className="mt-[.2rem] leading-[1]">
+                            <Form type={act} isCanSubmit={isCanRegist} />
+                            <div
+                                className="mt-[.2rem] flex items-center leading-[1]"
+                                onClick={() => {
+                                    setIsCanRegist(!isCanRegist);
+                                }}
+                            >
+                                <i
+                                    className={clsx(
+                                        "iconfont mr-[.1rem] text-[.16rem] text-[#ff5a00]",
+                                        {
+                                            "icon-xuanzhong": isCanRegist,
+                                            "icon-gouxuan-weixuanzhong-xianxingfangkuang":
+                                                !isCanRegist,
+                                        }
+                                    )}
+                                ></i>
                                 <span className="text-[.12rem] leading-[1]">
                                     Eu aceito todas as Políticas e Privacidade e confirmo que tenho
                                     peloamenos 18 anos
                                 </span>
                             </div>
+                            {!isCanRegist && (
+                                <div className="mt-[.1rem] text-[#db2828]">
+                                    Por favor, confirme esta opção
+                                </div>
+                            )}
                         </div>
                     </div>
                 </div>

+ 16 - 0
src/app/[locale]/(navbar)/deposit/@PrizeWidget/page.tsx

@@ -0,0 +1,16 @@
+import { PrizeTypes } from "@/api/home";
+import { server } from "@/utils/server";
+import HomePrize from "../../../(TabBar)/[[...share]]/_home/HomePrize";
+
+const getPrizeApi = () => {
+    return server.request<PrizeTypes[]>({
+        url: "/v1/api/front/games_notice_win",
+        method: "post",
+    });
+};
+const Page = async () => {
+    const result = await getPrizeApi();
+    if (!result.data) return null;
+    return <HomePrize type={"notice"} data={result.data ?? []}></HomePrize>;
+};
+export default Page;

+ 8 - 1
src/app/[locale]/(navbar)/deposit/layout.tsx

@@ -13,16 +13,23 @@ export const generateMetadata = async () => {
 export default async function Layout({
     children,
     params: { locale },
+    ...props
 }: {
     children: ReactNode;
     params: { locale: string };
+    PrizeWidget: any;
 }) {
+    const { PrizeWidget } = props;
+
     return (
         <div className="depositePage flex h-[100%] flex-col">
             <Suspense>
                 <HeaderBack showBack={true} />
             </Suspense>
-            <main className={"main-header hasFlag"}>{children}</main>
+            <main className={"main-header hasFlag"}>
+                <Suspense fallback={null}>{PrizeWidget}</Suspense>
+                {children}
+            </main>
         </div>
     );
 }

+ 25 - 14
src/app/[locale]/providers.tsx

@@ -4,7 +4,7 @@ import { useSystemStore } from "@/stores/useSystemStore";
 import { ConfigProvider } from "antd-mobile";
 import ptBR from "antd-mobile/es/locales/pt-BR";
 import { ThemeProviderProps } from "next-themes/dist/types";
-import { ReactNode, useEffect, useMemo, useState } from "react";
+import { ReactNode, useEffect, useState } from "react";
 
 import { server } from "@/utils/client";
 import { useDebounceEffect, useRequest } from "ahooks";
@@ -23,13 +23,14 @@ import { useActivityStore } from "@/stores/useActivityStore";
 import { useGlobalNoticeStore } from "@/stores/useGlobalNoticeStore";
 import { getToken as getUserToken } from "@/utils/Cookies";
 
+import Agent, { AgentSuffix } from "@/components/Agent";
+import feedback from "@/feedback";
 import { PollingState, usePollingStore } from "@/stores/usePollingStore";
 import { useSuspensionStore } from "@/stores/useSuspensionStore";
 import { useUserInfoStore } from "@/stores/useUserInfoStore";
 import { useVipStore } from "@/stores/useVipStore";
 import { useWalletStore } from "@/stores/useWalletStore";
 
-import styles from "./style.module.scss";
 export interface ProvidersProps {
     children: ReactNode;
     themeProps?: Omit<ThemeProviderProps, "children">;
@@ -353,17 +354,29 @@ export default function SidebarLayout({ children, themeProps }: ProvidersProps)
     }));
     const pathname = usePathname();
 
-    const isShowBg = useMemo(() => {
+    useEffect(() => {
         const local = pathname.split("/")[1];
-
-        if (`/${local}` === pathname) return true;
-        return [
-            `/${local}/freeGames`,
-            `/${local}/replayGames`,
-            `/${local}/promo`,
-            `/${local}/gameList`,
-        ].includes(pathname);
+        doShowProxyCheck();
     }, [pathname]);
+
+    const doShowProxyCheck = async () => {
+        const showProxy = sessionStorage.getItem("ShowProxy");
+        if (showProxy) {
+            await feedback.showModal({
+                content: <Agent step={1}></Agent>,
+                width: "90%",
+                useDefaultFooter: false,
+                suffix: <AgentSuffix></AgentSuffix>,
+            });
+            await feedback.showModal({
+                content: <Agent step={2}></Agent>,
+                width: "90%",
+                useDefaultFooter: false,
+                suffix: <AgentSuffix></AgentSuffix>,
+            });
+            sessionStorage.removeItem("ShowProxy");
+        }
+    };
     return (
         <div id={"app"} className="relative h-[100%] overflow-hidden">
             <motion.div
@@ -404,9 +417,7 @@ export default function SidebarLayout({ children, themeProps }: ProvidersProps)
                 <PollingClient />
                 {/*长链接*/}
                 {/*<WssClient />*/}
-                <section className={clsx(isShowBg && styles.homePage, "relative h-[100%]")}>
-                    {children}
-                </section>
+                <section className={clsx("relative h-[100%]")}>{children}</section>
             </motion.div>
         </div>
     );

+ 251 - 0
src/components/Agent/index.module.scss

@@ -0,0 +1,251 @@
+.agentBox {
+    padding: 0 0.1rem;
+    color: var(--textColor1);
+    font-family: iconfont !important;
+}
+.reffer {
+    font-family: iconfont !important;
+}
+.intro {
+    height: 370px;
+    overflow: auto;
+    div {
+        padding: 0.04rem 0;
+        font-size: 13px;
+        font-weight: 400;
+    }
+}
+.invitationDialog {
+    .first {
+        position: relative;
+        z-index: 20;
+        .leftArrow {
+            background: var(--primary4);
+            height: 1.9px;
+            left: -56px;
+            position: absolute;
+            top: 56px;
+            transform: rotate(155deg);
+            width: 60px;
+            z-index: 0;
+            &:before {
+                background: var(--primary4);
+                bottom: -4px;
+                clip-path: polygon(100% 0, 0 0, 50% 80%);
+                content: "";
+                height: 9.7px;
+                left: 56px;
+                position: absolute;
+                transform: rotate(268deg);
+                width: 9.7px;
+                z-index: -1;
+            }
+        }
+        .rightArrow {
+            background: var(--primary4);
+            height: 1.9px;
+            position: absolute;
+            right: -56px;
+            top: 56px;
+            transform: rotate(-150deg);
+            width: 60px;
+            z-index: 0;
+            &:before {
+                background: var(--primary4);
+                bottom: -4px;
+                clip-path: polygon(100% 0, 0 0, 50% 80%);
+                content: "";
+                height: 9.7px;
+                right: 56px;
+                position: absolute;
+                transform: rotate(-268deg);
+                width: 9.7px;
+                z-index: -1;
+            }
+        }
+    }
+    .secLeft {
+        position: relative;
+    }
+    .secRight {
+        position: relative;
+    }
+    .sec {
+        left: 50%;
+        position: absolute;
+        top: 0.2rem;
+        transform: translate(-50%);
+        .leftArrow {
+            background: var(--primary4);
+            height: 1.9px;
+            left: -48px;
+            position: absolute;
+            top: 50%;
+            transform: rotate(180deg);
+            width: 46px;
+            z-index: 0;
+            &:before {
+                background: var(--primary4);
+                bottom: -4px;
+                clip-path: polygon(100% 0, 0 0, 50% 80%);
+                content: "";
+                height: 9.7px;
+                left: 46px;
+                position: absolute;
+                transform: rotate(268deg);
+                width: 9.7px;
+                z-index: -1;
+            }
+        }
+        .rightArrow {
+            background: var(--primary4);
+            height: 1.9px;
+            position: absolute;
+            right: -46px;
+            top: 50%;
+            transform: rotate(180deg);
+            width: 46px;
+            z-index: 0;
+            &:before {
+                background: var(--primary4);
+                bottom: -4px;
+                clip-path: polygon(100% 0, 0 0, 50% 80%);
+                content: "";
+                height: 9.7px;
+                right: 46px;
+                position: absolute;
+                transform: rotate(-268deg);
+                width: 9.7px;
+                z-index: -1;
+            }
+        }
+    }
+    .secLeft,
+    .secRight {
+        position: relative;
+        &:before {
+            border: 1px dashed var(--primary4);
+            content: "";
+            height: 1px;
+            position: absolute;
+            top: 53px;
+            width: 19.5px;
+            z-index: 0;
+        }
+        &:after {
+            border: 1px dashed var(--primary4);
+            content: "";
+            height: 1px;
+            position: absolute;
+            top: 53px;
+            width: 19.5px;
+            z-index: 0;
+        }
+    }
+    .secLeft,
+    .secRight {
+        position: relative;
+        &:before {
+            border: 1px dashed var(--primary4);
+            content: "";
+            height: 1px;
+            position: absolute;
+            top: 53px;
+            width: 19.5px;
+            z-index: 0;
+        }
+        &:after {
+            border: 1px dashed var(--primary4);
+            content: "";
+            height: 1px;
+            position: absolute;
+            top: 53px;
+            width: 19.5px;
+            z-index: 0;
+        }
+    }
+    .secLeft:before,
+    .secRight:before {
+        left: 0;
+        transform: rotate(120deg);
+    }
+    .secLeft:after,
+    .secRight:after {
+        right: 0;
+        transform: rotate(-120deg);
+    }
+    .third {
+        left: 50%;
+        position: absolute;
+        transform: translate(-50%);
+        .leftArrow {
+            background: var(--primary4);
+            height: 1.9px;
+            left: -20px;
+            position: absolute;
+            top: 50%;
+            transform: rotate(180deg);
+            width: 20px;
+            z-index: 0;
+            &:before {
+                background: var(--primary4);
+                bottom: -4px;
+                clip-path: polygon(100% 0, 0 0, 50% 80%);
+                content: "";
+                height: 9.7px;
+                left: 20px;
+                position: absolute;
+                transform: rotate(268deg);
+                width: 9.7px;
+                z-index: -1;
+            }
+        }
+        .rightArrow {
+            background: var(--primary4);
+            height: 1.9px;
+            position: absolute;
+            right: -20px;
+            top: 50%;
+            transform: rotate(180deg);
+            width: 20px;
+            z-index: 0;
+            &:before {
+                background: var(--primary4);
+                bottom: -4px;
+                clip-path: polygon(100% 0, 0 0, 50% 80%);
+                content: "";
+                height: 9.7px;
+                right: 20px;
+                position: absolute;
+                transform: rotate(-268deg);
+                width: 9.7px;
+                z-index: -1;
+            }
+        }
+    }
+    .thirdLeft {
+        &::before {
+            border: 1px dashed var(--primary4);
+            content: "";
+            height: 1px;
+            position: absolute;
+            top: 50%;
+            width: 19.5px;
+            z-index: 0;
+        }
+    }
+    .thirdRight {
+        &::before {
+            border: 1px dashed var(--primary4);
+            content: "";
+            height: 1px;
+            position: absolute;
+            top: 50%;
+            width: 19.5px;
+            z-index: 0;
+        }
+    }
+}
+.price {
+    color: var(--textColor6);
+}

+ 310 - 0
src/components/Agent/index.tsx

@@ -0,0 +1,310 @@
+"use client";
+import useReffer from "@/hooks/useReffer";
+import { getToken } from "@/utils/Cookies";
+import { copyText } from "@/utils/methods";
+import { Toast } from "antd-mobile";
+import clsx from "clsx";
+import { useTranslations } from "next-intl";
+import React from "react";
+import CustomButton from "../CustomButton";
+import styles from "./index.module.scss";
+
+interface Props {
+    step?: 1 | 2;
+    locale?: string;
+}
+
+export const AgentSuffix = ({ locale = "br" }: { locale?: string }) => {
+    const tc = useTranslations();
+
+    const url = useReffer({ locale });
+    const text = `🎁 Seu amigo te presenteou com 3 a 5 BRL – PEGUE AGORA! 💸 💰 Deposite 7 BRL e ganhe
+                +7 BRL de bônus! 🚀 🎁 Primeiro depósito? Multiplique seu dinheiro com 150% de bônus
+                real! 👉 Resgate agora antes que expire!`;
+
+    const doCopy = () => {
+        copyText(`${text} ${decodeURIComponent(url)}`);
+        Toast.show({ icon: "success", content: tc("SummaryPage.copySuc"), maskClickable: false });
+    };
+
+    return (
+        <div className={clsx("mt-[.08rem] flex w-[100%] items-stretch", styles.reffer)}>
+            <div className="flex-1 overflow-hidden whitespace-nowrap !rounded-[6px] bg-[#7a7879] px-[.1rem] py-[.06rem] text-[12px] font-[400] text-[#fff]">
+                {text}
+            </div>
+            <CustomButton
+                type="primary"
+                className="ml-[.05rem] w-[57px] !rounded-[6px] !py-[0.06rem] !text-[12px]"
+                onClick={doCopy}
+            >
+                Copy
+            </CustomButton>
+        </div>
+    );
+};
+
+const Agent: React.FC<Props> = ({ step = 1, locale = "br" }) => {
+    const token = getToken();
+    const url = useReffer({ locale });
+
+    const SHARE_SOURCE = React.useMemo(() => {
+        return [
+            {
+                icon: "/summary/Facebook.webp",
+                label: "Facebook",
+                shareUrl: `https://www.facebook.com/sharer/sharer.php?u=${url}`,
+            },
+            {
+                icon: "/summary/WhatsApp.webp",
+                label: "WhatsApp",
+                shareUrl: `https://api.whatsapp.com/send?text=${url}`,
+            },
+            {
+                icon: "/summary/Telegram.webp",
+                label: "Telegram",
+                shareUrl: `https://t.me/share/url?url=${url}`,
+            },
+            {
+                icon: "/summary/Twitter.webp",
+                label: "X",
+                shareUrl: `https://x.com/intent/post?text=${url}`,
+            },
+            {
+                icon: "/summary/Email.webp",
+                label: "Email",
+                shareUrl: `mailto: ?&subject=&cc=&bcc=&body=${url}`,
+            },
+        ];
+    }, [url]);
+
+    return (
+        <div className={clsx(styles.agentBox)}>
+            {step == 1 && (
+                <>
+                    <div className="flex justify-center pb-[.1rem] text-[.14rem] text-[16px] font-black">
+                        ❤️ Bem vindo ao 8g.game ❤️
+                    </div>
+                    <div className={styles.intro}>
+                        <div className="break-all">
+                            💵 💰 Ganhe MAIS DE R$10.000 por mês com nosso SUPER PROGRAMA DE
+                            MARKETING!
+                        </div>
+                        <div className="break-all">
+                            📢 Convide seus amigos e ganhe R$30 para cada um que fizer uma recarga!
+                        </div>
+                        <div className="break-all">
+                            💰 Comissões multinível – pagamentos diários e renda crescente!
+                        </div>
+                        <div className="break-all">
+                            ⚡️ Saque seu dinheiro na hora – sem burocracia!
+                        </div>
+                        <div className="break-all">
+                            🔥 Cadastre-se agora e desbloqueie TRÊS SUPER RECOMPENSAS!
+                        </div>
+                        <div className="break-all">
+                            🎁 Ganhe R$3 ou R$5 imediatamente ao se cadastrar – GRÁTIS!
+                        </div>
+                        <div className="break-all">
+                            🎟 Além disso, receba uma raspadinha da sorte – prêmio mínimo de R$7 e a
+                            chance de ganhar até R$77 ou prêmios incríveis como iPhone 16 e Nintendo
+                            Switch!
+                        </div>
+                        <div className="break-all">
+                            💰 Bônus de até 150% no seu primeiro depósito – multiplique seus ganhos!
+                        </div>
+                        <div className="">
+                            <span>
+                                🎁 💎 Benefícios exclusivos – DESBLOQUEIE 5 TIPOS DE RECOMPENSAS
+                                TODOS OS DIAS!
+                            </span>
+                            <div className="break-all">
+                                🏆 1. Jackpot Diário – quanto maior sua posição no ranking, maior o
+                                prêmio!
+                            </div>
+                            <div className="break-all">
+                                🎡 2. Participe da Roleta da Sorte e concorra a MacBook, Apple Watch
+                                e mais prêmios exclusivos!
+                            </div>
+                            <div className="break-all">
+                                💲 3. Colete pontos de missão e troque por dinheiro real – até
+                                R$1000 em saque imediato!
+                            </div>
+                            <div className="break-all">
+                                🎫 4. Colete Cartões HAPPY e troque por R$100 na hora!
+                            </div>
+                            <div className="break-all">
+                                🎁 5. Bônus surpresa em dinheiro real – a qualquer momento, você
+                                pode ser premiado!
+                            </div>
+                        </div>
+                        <div className="">
+                            <span>❤️ Proteção tripla de bônus – NUNCA SAIA PERDENDO!</span>
+                            <div className="break-all">
+                                🛡 Fundo de resgate – continue jogando com segurança!
+                            </div>
+                            <div className="break-all">
+                                🔄 Reembolso diário de perdas – dinheiro de volta todos os dias!
+                            </div>
+                            <div className="break-all">
+                                💰 Reembolso semanal de perdas – não perca a chance de recuperar
+                                ainda mais!
+                            </div>
+                        </div>
+                        <div className="">
+                            <span>🔥 📢 Jogue, ganhe e retire seu dinheiro instantaneamente!</span>
+                        </div>
+                    </div>
+                </>
+            )}
+            {step === 2 && (
+                <>
+                    <div className={clsx(styles.invitationDialog, "w-[100%]")}>
+                        <div className="flex aspect-[2.125/1] w-full flex-col items-center justify-center">
+                            <div className="flex w-full items-center justify-center">
+                                <div className={clsx("w-[60px]", styles.first)}>
+                                    <div className={styles.leftArrow}></div>
+                                    <div className={styles.rightArrow}></div>
+                                    <img
+                                        src="https://down8g.sp-slots1.com/cdn-cgi/image/format=auto/source/public/images/14/profile/5.png?t=100"
+                                        alt=""
+                                        loading="eager"
+                                        decoding="async"
+                                        className="pic z-10 w-full rounded-[50%]"
+                                    />
+                                </div>
+                            </div>
+                            <div className="relative flex w-[80%] flex-row items-center justify-between">
+                                <div className={clsx("w-[50px]", styles.secLeft)}>
+                                    <img
+                                        src="https://down8g.sp-slots1.com/cdn-cgi/image/format=auto/source/public/images/14/profile/3.png?t=100"
+                                        alt=""
+                                        loading="eager"
+                                        decoding="async"
+                                        className="pic z-10 w-full rounded-[50%]"
+                                    />
+                                </div>
+                                <div className={clsx("w-[50px]", styles.secRight)}>
+                                    <img
+                                        src="https://down8g.sp-slots1.com/cdn-cgi/image/format=auto/source/public/images/14/profile/4.png?t=100"
+                                        alt=""
+                                        loading="eager"
+                                        decoding="async"
+                                        className="pic z-10 w-full rounded-[50%]"
+                                    />
+                                </div>
+                                <div className={styles.sec}>
+                                    <div className="rounded-[var(--borderRadius)] border-[1px] border-solid border-[#1a7835] bg-[var(--primary6)] px-[10px] text-[12px] text-[var(--textColor3)]">
+                                        {" "}
+                                        Direto{" "}
+                                    </div>
+                                    <div className={styles.leftArrow}></div>
+                                    <div className={styles.rightArrow}></div>
+                                </div>
+                            </div>
+                            <div className="relative mt-[10px] flex w-[95%] flex-row items-center justify-between">
+                                <div
+                                    className={clsx(
+                                        "flex items-center justify-center gap-[20px]",
+                                        styles.thirdLeft
+                                    )}
+                                >
+                                    <img
+                                        src="https://down8g.sp-slots1.com/cdn-cgi/image/format=auto/source/public/images/14/profile/10.png?t=100"
+                                        alt=""
+                                        loading="eager"
+                                        decoding="async"
+                                        className="pic w-[40px] rounded-[50%]"
+                                    />
+                                    <img
+                                        src="https://down8g.sp-slots1.com/cdn-cgi/image/format=auto/source/public/images/14/profile/6.png?t=100"
+                                        alt=""
+                                        loading="eager"
+                                        decoding="async"
+                                        className="pic w-[40px] rounded-[50%]"
+                                    />
+                                </div>
+                                <div
+                                    className={clsx(
+                                        "flex items-center justify-center gap-[20px]",
+                                        styles.thirdRight
+                                    )}
+                                >
+                                    <img
+                                        src="https://down8g.sp-slots1.com/cdn-cgi/image/format=auto/source/public/images/14/profile/7.png?t=100"
+                                        alt=""
+                                        loading="eager"
+                                        decoding="async"
+                                        className="pic w-[40px] rounded-[50%]"
+                                    />
+                                    <img
+                                        src="https://down8g.sp-slots1.com/cdn-cgi/image/format=auto/source/public/images/14/profile/8.png?t=100"
+                                        alt=""
+                                        loading="eager"
+                                        decoding="async"
+                                        className="pic w-[40px] rounded-[50%]"
+                                    />
+                                </div>
+                                <div className={styles.third}>
+                                    <div className="rounded-[var(--borderRadius)] border-[1px] border-solid border-[#1a7835] bg-[var(--primary6)] px-[10px] text-[12px] text-[var(--textColor3)]">
+                                        {" "}
+                                        Nivel1{" "}
+                                    </div>
+                                    <div className={styles.leftArrow}></div>
+                                    <div className={styles.rightArrow}></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div className="flex w-full flex-col items-center justify-center gap-[10px]">
+                        <div className="flex w-full items-center justify-center break-all px-[30px] py-[15px] text-center font-black text-[var(--textColor4)]">
+                            CONVIDAR AMIGOS PARA RECEBERRECOMPENSAS
+                        </div>
+                        <div className="flex flex-col rounded-[10px] border-[1px] border-solid border-[#1a7835] px-[10px] py-[1px]">
+                            <span className="text-[12px]">
+                                Você traz <span className={styles.price}>1</span> amigo para
+                                recarregar, ganha <span className={styles.price}>R$30</span>
+                            </span>
+                        </div>
+                        <div className="flex flex-col rounded-[10px] border-[1px] border-solid border-[#1a7835] px-[10px] py-[1px]">
+                            <span className="text-[12px]">
+                                Você traz <span className={styles.price}>10</span> amigo para
+                                recarregar, ganha <span className={styles.price}>R$300</span>
+                            </span>
+                        </div>
+                        <div className="flex flex-col rounded-[10px] border-[1px] border-solid border-[#1a7835] px-[10px] py-[1px]">
+                            <span className="text-[12px]">
+                                Você traz <span className={styles.price}>100</span> amigo para
+                                recarregar, ganha <span className={styles.price}>R$3000</span>
+                            </span>
+                        </div>
+                        <div className="flex flex-col rounded-[10px] border-[1px] border-solid border-[#1a7835] px-[10px] py-[1px]">
+                            <span className="text-[12px]">
+                                Você traz <span className={styles.price}>1000</span> amigo para
+                                recarregar, ganha <span className={styles.price}>R$30000</span>
+                            </span>
+                        </div>
+                    </div>
+                </>
+            )}
+            <div className="flex items-center justify-between pt-[.15rem]">
+                {SHARE_SOURCE.map((item) => {
+                    return (
+                        <a
+                            href={token ? item.shareUrl : ""}
+                            target={"_blank"}
+                            className={clsx("block w-[.4rem] text-center")}
+                            key={item.label}
+                        >
+                            <img className={"inline-block w-[36px]"} src={item.icon} alt="" />
+                            <br />
+                            <span className="text-[.1rem] text-[#5f7880]">{item.label}</span>
+                        </a>
+                    );
+                })}
+            </div>
+        </div>
+    );
+};
+
+export default Agent;

+ 2 - 2
src/components/Fields/MobileField.tsx

@@ -10,7 +10,7 @@ interface MobileValue {
     preValue: string | number;
     realValue: string;
 }
-const columns = [["86", "01", "02", "03"]];
+const columns = [["55", "01", "02", "03"]];
 
 interface MobileFieldProps {
     value?: MobileValue;
@@ -19,7 +19,7 @@ interface MobileFieldProps {
 }
 
 const MobileField: FC<MobileFieldProps> = ({
-    value = { preValue: "86", realValue: "" },
+    value = { preValue: "55", realValue: "" },
     onChange,
     code = true,
 }) => {

+ 23 - 5
src/components/FooterTip/index.tsx

@@ -1,17 +1,17 @@
 /* eslint-disable react/jsx-no-comment-textnodes */
 "use client";
-import { useTranslations } from "next-intl";
 
 const FooterTip = () => {
-    const t = useTranslations("LoginPage");
+    const url =
+        typeof window != undefined
+            ? `${window?.location?.protocol}//${window?.location?.hostname}`
+            : "";
     return (
         <div className={"mt-[.2rem] px-[.1rem] text-center text-[.12rem]"}>
             <div>
                 <div className="text-center text-[.13rem]">
                     <span>Bem-vindo ao </span>
-                    <span className="font-[900] text-[var(--textColor4)]">
-                        {location.protocol}//{location.hostname}
-                    </span>
+                    {window && <span className="font-[900] text-[var(--textColor4)]">{url}</span>}
                 </div>
                 <div className="text-[.12rem]">
                     Proporcionar a você uma experiência de jogo sem precedentes
@@ -22,6 +22,24 @@ const FooterTip = () => {
                 <img className="h-[.28rem]" src="/home/autorizado1.webp" alt="" />
                 <img className="h-[.28rem]" src="/home/gordonMoody.webp" alt="" />
             </div>
+            {/* <span
+                onClick={async () => {
+                    await feedback.showModal({
+                        content: <Agent step={1}></Agent>,
+                        width: "90%",
+                        useDefaultFooter: false,
+                        suffix: <AgentSuffix></AgentSuffix>,
+                    });
+                    await feedback.showModal({
+                        content: <Agent step={2}></Agent>,
+                        width: "90%",
+                        useDefaultFooter: false,
+                        suffix: <AgentSuffix></AgentSuffix>,
+                    });
+                }}
+            >
+                232323
+            </span> */}
         </div>
     );
 };

+ 5 - 0
src/enums/index.tsx

@@ -153,3 +153,8 @@ export const LanguageMap = new Map<string, Record<string, string>>([
     ["br", { text: "Português", icon: "icon-baxi" }],
     ["en", { text: "English", icon: "icon-zu" }],
 ]);
+
+export enum FeedbackStatusEnum {
+    NONE = "none",
+    RUNNING = "running",
+}

+ 65 - 0
src/feedback/WrapHoc/index.module.scss

@@ -0,0 +1,65 @@
+.wrapBox {
+    position: fixed;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    z-index: 100;
+}
+
+.wrapBoxContainer {
+    height: 100%;
+    max-width: 4.02rem;
+    margin: 0 auto;
+    position: relative;
+    .mask {
+        height: 100%;
+        background: rgba(0, 0, 0, 0.5); /* 半透明白色背景 */
+        padding: 20px;
+        color: black; /* 文字颜色 */
+        text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.8); /* 文字阴影 */
+        backdrop-filter: blur(5px); /* 应用模糊效果 */
+        max-width: 4.02rem;
+        margin: 0 auto;
+        position: absolute;
+        left: 0;
+        top: 0;
+        width: 100%;
+    }
+    .container {
+        height: 100%;
+        width: 100%;
+        position: relative;
+        z-index: 101;
+        &.top {
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            justify-content: flex-start;
+        }
+        &.center {
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            justify-content: center;
+        }
+        &.bottom {
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            justify-content: flex-end;
+        }
+        &.left {
+            display: flex;
+            flex-direction: row;
+            align-items: center;
+            justify-content: flex-start;
+        }
+        &.right {
+            display: flex;
+            flex-direction: row;
+            align-items: center;
+            justify-content: flex-end;
+        }
+    }
+}

+ 80 - 0
src/feedback/WrapHoc/index.tsx

@@ -0,0 +1,80 @@
+import clsx from "clsx";
+import React from "react";
+import styles from "./index.module.scss";
+
+export enum WrapHocPosition {
+    top = "top",
+    bottom = "bottom",
+    center = "center",
+    left = "left",
+    right = "right",
+}
+
+interface Props {
+    children: React.ReactNode;
+    position?: WrapHocPosition;
+    animateTime?: number;
+    locale?: string;
+    [key: string]: any;
+}
+
+const WrapHoc: React.FC<Props> = ({
+    children,
+    animateTime = 300,
+    position = WrapHocPosition.center,
+
+    ...props
+}) => {
+    const [visible, setVisible] = React.useState(false);
+    React.useEffect(() => {
+        setVisible(true);
+        return () => {
+            setVisible(false);
+        };
+    }, []);
+
+    const close = (resData: any) => {
+        if (animateTime) {
+            setTimeout(() => {
+                doClose(resData);
+            }, animateTime);
+            return;
+        }
+        doClose(resData);
+    };
+    const doClose = (resData: any) => {
+        setVisible(false);
+        if (typeof props?.callback === "function") {
+            props?.callback(resData);
+        }
+    };
+    const show = () => {
+        setVisible(true);
+    };
+
+    const newProps = {
+        ...props,
+        close,
+        show,
+    };
+
+    if (!visible) return null;
+    return (
+        <div className={styles.wrapBox}>
+            <div className={clsx(styles.wrapBoxContainer)}>
+                <div className={styles.mask}></div>
+                <div className={clsx(styles.container, styles[position])}>
+                    {React.Children.map(children, (child) => {
+                        return React.isValidElement(child)
+                            ? React.cloneElement(child, {
+                                  ...newProps,
+                              })
+                            : null;
+                    })}
+                </div>
+            </div>
+        </div>
+    );
+};
+
+export default WrapHoc;

+ 34 - 0
src/feedback/dialog/component.module.scss

@@ -0,0 +1,34 @@
+.modalBox {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    position: relative;
+    transform: translateY(-50px) scale(1);
+    transition: all 0.2s ease-in-out;
+    opacity: 0.2;
+    &.showed {
+        transform: translateY(0) scale(1);
+        opacity: 1;
+    }
+    .modalBoxContainer {
+        background-color: var(--primary1);
+        border-radius: 0.1rem;
+        padding: 0.1rem;
+        width: 100%;
+    }
+    .closeBtn {
+        margin-top: 0.1rem;
+        background-color: var(--primary1);
+        border-radius: 0.06rem;
+        padding: 0.08rem;
+        cursor: pointer;
+    }
+    .footer {
+        padding-top: 0.1rem;
+    }
+    .confirmBtn {
+        font-size: 14px;
+        padding: 10px 0;
+        width: 100%;
+    }
+}

+ 80 - 0
src/feedback/dialog/component.tsx

@@ -0,0 +1,80 @@
+import CustomButton from "@/components/CustomButton";
+import SvgIcon from "@/components/SvgIcon";
+import clsx from "clsx";
+import React from "react";
+import styles from "./component.module.scss";
+import { ModalBoxResType } from "./index";
+
+interface Props {
+    callback?: (p: keyof ModalBoxResType) => void;
+    className?: string;
+    content?: React.ReactNode;
+    suffix?: React.ReactNode;
+    footer?: React.ReactNode;
+    useDefaultFooter?: boolean;
+    confirmText?: string;
+    clsssName?: string;
+    [key: string]: any;
+}
+
+const Components: React.FC<Props> = ({
+    className,
+    content,
+    suffix,
+    footer,
+    confirmText = "comfirm",
+    useDefaultFooter = true,
+    clsssName,
+    callback,
+    ...props
+}) => {
+    const [animateType, setAnimateType] = React.useState<number>(0);
+    React.useEffect(() => {
+        setTimeout(() => {
+            setAnimateType(1);
+        }, 100);
+    }, []);
+
+    const doClose = (p: keyof ModalBoxResType) => {
+        setAnimateType(0);
+        if (typeof props?.close === "function") {
+            props.close(p);
+        }
+    };
+
+    return (
+        <div
+            className={clsx(styles.modalBox, clsssName, {
+                [styles.showed]: animateType === 1,
+            })}
+            style={{
+                width: typeof props.width === "number" ? `${props.width}px` : props.width,
+            }}
+        >
+            <div className={clsx(styles.modalBoxContainer, className)}>
+                {content}
+                {useDefaultFooter && (
+                    <div className={styles.footer}>
+                        {!footer && (
+                            <CustomButton
+                                className={styles.confirmBtn}
+                                type={"primary"}
+                                onClick={() => doClose("confirm")}
+                            >
+                                {confirmText}
+                            </CustomButton>
+                        )}
+                    </div>
+                )}
+
+                {footer}
+            </div>
+            {suffix}
+            <div className={styles.closeBtn} onClick={() => doClose("cancel")}>
+                <SvgIcon iconClass="icon-a-H7_celan_guanbi_btnpng" size={16}></SvgIcon>
+            </div>
+        </div>
+    );
+};
+
+export default Components;

+ 76 - 0
src/feedback/dialog/index.tsx

@@ -0,0 +1,76 @@
+import feedbackStatus from "@/feedback/status";
+import RootSiblings from "../sibling";
+import WrapHoc from "../WrapHoc";
+import ModalComponent from "./component";
+
+const moduleName = "Modal";
+const siblingKey = "Component";
+
+export interface ModalState {
+    title?: string;
+    content?: string | React.ReactNode;
+    confirmText?: string;
+    cancelText?: string;
+    cancelColor?: string;
+    confirmColor?: string;
+    cancelBgColor?: string;
+    confirmBgColor?: string;
+    width?: number | string;
+    showCancel?: boolean;
+    titleStyle?: React.CSSProperties;
+    contentStyle?: React.CSSProperties;
+    useDefaultFooter?: boolean;
+    suffix?: string | React.ReactNode;
+    callback?: (p: keyof ModalBoxResType) => void;
+}
+
+export interface ModalBoxResType {
+    cancel: boolean;
+    confirm: boolean;
+}
+
+export const showModal = (opts: ModalState = {}): Promise<ModalBoxResType> => {
+    return new Promise((resolve) => {
+        const siblingCom = feedbackStatus.get(moduleName, siblingKey);
+        const res: ModalBoxResType = {
+            confirm: false,
+            cancel: false,
+        };
+        const defaultProps = {
+            title: "",
+            content: "",
+            cancelBgColor: "#fff",
+            cancelColor: "#999",
+            confirmColor: "#fff",
+            width: 500,
+            showCancel: true,
+        };
+        const useProps = {
+            ...defaultProps,
+            ...opts,
+        };
+        const modalCallback = (cbRes: keyof ModalBoxResType) => {
+            const sCom = feedbackStatus.get(moduleName, siblingKey);
+            sCom.destroy();
+            res[cbRes] = true;
+            feedbackStatus.removeKey(moduleName, siblingKey);
+            resolve(res);
+        };
+        if (!siblingCom) {
+            const siblings = new RootSiblings(
+                (
+                    <WrapHoc animateTime={200} {...useProps} callback={modalCallback}>
+                        <ModalComponent />
+                    </WrapHoc>
+                )
+            );
+            feedbackStatus.set(moduleName, siblingKey, siblings);
+        } else {
+            siblingCom.update(
+                <WrapHoc animateTime={200} {...useProps} callback={modalCallback}>
+                    <ModalComponent />
+                </WrapHoc>
+            );
+        }
+    });
+};

+ 12 - 0
src/feedback/index.tsx

@@ -0,0 +1,12 @@
+import { FeedbackStatusEnum } from "@/enums";
+import { showModal } from "./dialog";
+import feedbackStatus from "./status";
+
+const feedConfig = {
+    showModal: showModal,
+    hasShow: () => {
+        return feedbackStatus.getStatus() === FeedbackStatusEnum.RUNNING;
+    },
+};
+
+export default feedConfig;

+ 75 - 0
src/feedback/sibling.tsx

@@ -0,0 +1,75 @@
+import { NextIntlClientProvider } from "next-intl";
+import { ReactElement } from "react";
+import ReactDOM from "react-dom/client";
+import BrMessage from "../../messages/br.json";
+import EnMessage from "../../messages/en.json";
+
+class SiblingH5 {
+    private content: ReactElement | null = null;
+    private containerId: string = "";
+    private containerRoot: ReactDOM.Root | null = null;
+    private messages: any;
+    private lang: string;
+    constructor(el: ReactElement, target?: string) {
+        this.messages = {
+            br: BrMessage,
+            en: EnMessage,
+        };
+        this.lang = document.querySelector("html")?.lang || "br";
+        this.content = el;
+        this.containerId =
+            target ||
+            `Sibling_${new Date().getTime()}_${parseInt(`${Math.random() * 100000}`, 10)}`;
+        this.init();
+        return this;
+    }
+    init() {
+        const container = document.querySelector(`#${this.containerId}`);
+        if (!container) {
+            const div = document.createElement("div");
+            div.className = "sibling-h5";
+            div.id = this.containerId;
+            document.body.appendChild(div);
+            this.containerRoot = ReactDOM.createRoot(div);
+        }
+        if (this.containerRoot)
+            this.containerRoot.render(
+                <NextIntlClientProvider
+                    locale={this.lang}
+                    messages={{
+                        ...(this.messages[this.lang] || {}),
+                    }}
+                >
+                    {this.content}
+                </NextIntlClientProvider>
+            );
+
+        return this;
+    }
+    update(el: ReactElement) {
+        this.content = el;
+        if (this.containerRoot)
+            this.containerRoot.render(
+                <NextIntlClientProvider
+                    locale={this.lang}
+                    messages={{
+                        ...(this.messages[this.lang] || {}),
+                    }}
+                >
+                    {this.content}
+                </NextIntlClientProvider>
+            );
+    }
+    destroy() {
+        const container = document.querySelector(`#${this.containerId}`);
+        if (this.containerRoot) {
+            this.containerRoot.unmount();
+            this.containerRoot = null;
+        }
+        if (container) {
+            document.body.removeChild(container);
+        }
+    }
+}
+
+export default SiblingH5;

+ 48 - 0
src/feedback/status.ts

@@ -0,0 +1,48 @@
+import { FeedbackStatusEnum } from "@/enums";
+
+const CacheMap: Record<string, Record<string, any>> = {};
+
+class FeedBackStatus {
+    current: number = 0;
+    waitList: string[] = [];
+    status: FeedbackStatusEnum = FeedbackStatusEnum.NONE;
+    set(module: string, key: string, value: any) {
+        if (!CacheMap[module]) {
+            CacheMap[module] = {};
+        }
+        CacheMap[module][key] = value;
+        this.status = FeedbackStatusEnum.RUNNING;
+    }
+    get(module: string, key: string) {
+        if (!CacheMap[module]) {
+            return null;
+        }
+        return CacheMap[module][key];
+    }
+    removeKey(module: string, key: string) {
+        this.status = FeedbackStatusEnum.NONE;
+        if (!CacheMap[module]) {
+            return;
+        }
+        delete CacheMap[module][key];
+    }
+    removeModule(module: string) {
+        if (!CacheMap[module]) {
+            return;
+        }
+        delete CacheMap[module];
+    }
+    getAll() {
+        return CacheMap;
+    }
+    getStatus() {
+        return this.status;
+    }
+    setStatus(status: FeedbackStatusEnum) {
+        this.status = status;
+    }
+}
+
+const feedbackStatus = new FeedBackStatus();
+
+export default feedbackStatus;

+ 28 - 0
src/hooks/useReffer.ts

@@ -0,0 +1,28 @@
+import { getShareLinkApi } from "@/api/config";
+import { useUserInfoStore } from "@/stores/useUserInfoStore";
+import React from "react";
+
+const useReffer = ({ locale = "br" }: { locale: string }) => {
+    const { userInfo } = useUserInfoStore();
+    const [BASE_URL, setBaseUrl] = React.useState("");
+    const url = React.useMemo(() => {
+        const shareUrl = `${BASE_URL}?share_id=${userInfo ? userInfo.referrer_code : "xxxxxx"}`;
+        return encodeURIComponent(`${shareUrl}`);
+    }, [BASE_URL, userInfo]);
+    React.useEffect(() => {
+        init();
+    }, []);
+
+    const init = async () => {
+        const res = await getShareLinkApi();
+        let url = `${window.location.protocol}//${window.location.host}/${locale}/`;
+        if (res.code === 200) {
+            const rurl = res.data.find((item) => item.type === 2)?.url;
+            if (rurl) url = rurl;
+        }
+        setBaseUrl(url);
+    };
+    return url;
+};
+
+export default useReffer;

+ 35 - 7
src/styles/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 4978020 */
-  src: url('iconfont.woff2?t=1753077251211') format('woff2'),
-       url('iconfont.woff?t=1753077251211') format('woff'),
-       url('iconfont.ttf?t=1753077251211') format('truetype');
+  src: url('iconfont.woff2?t=1753147444402') format('woff2'),
+       url('iconfont.woff?t=1753147444402') format('woff'),
+       url('iconfont.ttf?t=1753147444402') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,38 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-xianshikejian:before {
+  content: "\e8d4";
+}
+
+.icon-gouxuan-weixuanzhong-xianxingfangkuang:before {
+  content: "\e77b";
+}
+
+.icon-xuanzhong:before {
+  content: "\e61c";
+}
+
+.icon-icon_mc_person:before {
+  content: "\e602";
+}
+
+.icon-baxi1:before {
+  content: "\e697";
+}
+
+.icon-wenjian:before {
+  content: "\e601";
+}
+
+.icon-daojishi:before {
+  content: "\e60d";
+}
+
+.icon-huodejiangli:before {
+  content: "\e67e";
+}
+
 .icon-exit-full:before {
   content: "\e97f";
 }
@@ -161,10 +193,6 @@
   content: "\e68e";
 }
 
-.icon-Group10:before {
-  content: "\e68f";
-}
-
 .icon-Group8:before {
   content: "\e690";
 }

BIN
src/styles/iconfont/iconfont.ttf


BIN
src/styles/iconfont/iconfont.woff


BIN
src/styles/iconfont/iconfont.woff2


+ 2 - 0
src/utils/storage/index.ts

@@ -1,6 +1,8 @@
 type StorageType = "localStorage" | "sessionStorage";
 interface StorageKey {
     ban_pixel_type: "kwai_pixel" | "facebook_pixel";
+    ban_cache_login: { pwd: string; user_phone: string };
+
     ban_pixel_id: string;
     ban_click_id: string;
     channel_code: string;

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