浏览代码

no message

zhejiushizhuce 2 年之前
父节点
当前提交
5a8c4c1990

+ 10 - 1
src/App.js

@@ -52,7 +52,7 @@ import * as toast from "react-toastify";
 import {useBlocker} from "react-router";
 import FontFaceObserver from 'fontfaceobserver';
 import {getTurnplate} from "@features/turnplateSlice";
-import {LOCAL_WHEEL_INVITE_CODE} from "@constants/localkey";
+import {LOCAL_ACTIVITY_C, LOCAL_WHEEL_INVITE_CODE} from "@constants/localkey";
 import LoadingFull from "@components/Loading/LoadingFull";
 const App = () => {
     const dispatch = useDispatch();
@@ -102,6 +102,14 @@ const App = () => {
         else {
             localStorageSet(LOCAL_WHEEL_INVITE_CODE,"")
         }
+        let cname="c";
+        let ccode=getUrlParam(cname);
+        if (ccode!=null){
+            localStorageSet(LOCAL_ACTIVITY_C,ccode);
+        }
+        else{
+            localStorageSet(LOCAL_ACTIVITY_C,"");
+        }
     }
     const reProgressierInstallBanner=()=>{
         if (window.NewProgressierInstallBanner!=null)return;
@@ -146,6 +154,7 @@ const App = () => {
             // dispatch(reqTurnplateIndex());
             //rest code
             localStorageSet(LOCAL_WHEEL_INVITE_CODE,"");
+            localStorageSet(LOCAL_ACTIVITY_C,"");
             dispatch(reqMailCheck());
         }
         else

二进制
src/assets/moneyrain/Close_bai.png


二进制
src/assets/moneyrain/bofang_bai.png


二进制
src/assets/moneyrain/huodongrukou5_jianbian.png


二进制
src/assets/moneyrain/money.png


二进制
src/assets/moneyrain/rain_bg1.png


二进制
src/assets/moneyrain/rain_bg3.png


二进制
src/assets/moneyrain/rain_card.png


二进制
src/assets/moneyrain/shijian_bai.png


二进制
src/assets/promotion/banner_2.png


文件差异内容过多而无法显示
+ 10 - 0
src/assets/promotion/icon_2.svg


文件差异内容过多而无法显示
+ 1047 - 0
src/components/AutoBanner/tetrte.js


+ 2 - 1
src/constants/localkey.js

@@ -8,6 +8,7 @@ const LOCAL_GAME_URL="LOCAL_GAME_URL_";
 const LOCAL_CUSTOM_LOCK="LOCAL_CUSTOM_LOCK";
 const LOCAL_WHEEL_RETAIN="LOCAL_WHEEL_RETAIN";
 const LOCAL_WHEEL_INVITE_CODE="LOCAL_WHEEL_INVITE_CODE";
+const LOCAL_ACTIVITY_C="LOCAL_ACTIVITY_C";
 const LOCAL_WD_PASS="LOCAL_WD_PASS";
 const LOCAL_WD_PASS_SET_TIME="LOCAL_WD_PASS_SET_TIME";
-export {LOCAL_VISTOR_ID,LOCAL_USER_INFO,LOCAL_IS_LOGIN,LOCAL_SIGN,LOCAL_GAME_URL,LOCAL_CUSTOM_LOCK,LOCAL_WHEEL_RETAIN,LOCAL_WHEEL_INVITE_CODE,LOCAL_WD_PASS,LOCAL_WD_PASS_SET_TIME};
+export {LOCAL_VISTOR_ID,LOCAL_USER_INFO,LOCAL_IS_LOGIN,LOCAL_SIGN,LOCAL_GAME_URL,LOCAL_CUSTOM_LOCK,LOCAL_WHEEL_RETAIN,LOCAL_WHEEL_INVITE_CODE,LOCAL_WD_PASS,LOCAL_WD_PASS_SET_TIME,LOCAL_ACTIVITY_C};

+ 5 - 2
src/constants/routes.js

@@ -1,9 +1,10 @@
-// 0嵌入,1桌面弹窗 手机二级全屏,2弹窗,3全屏 4 外部链接
+// 0嵌入,1桌面弹窗 手机二级全屏,2弹窗,3全屏 4 外部链接 5 自定义
 const ROUTE_TYPE_IN=0;
 const ROUTE_TYPE_POP_OR_FULL=1;
 const ROUTE_TYPE_POP=2;
 const ROUTE_TYPE_FULL=3;
 const ROUTE_TYPE_OUTLINK=4;
+const ROUTE_TYPE_CUSTOM=5;
 
 const SIDE_TYPE_NONE=0;
 const SIDE_TYPE_NOMAL=1;
@@ -29,7 +30,8 @@ const ROUTE_PATH={
     MESSAGE_DETAIL:"#/messageDetail",
     RECHARGE_HISTORY:"#/rechargeHistory",
     WITHDRAW_REACORD:"#/withdrawRecord",
-    SECURITY:"#/security"
+    SECURITY:"#/security",
+    MONEY_RAIN:"#/moneyrain"
 }
 
 export {
@@ -38,6 +40,7 @@ export {
     ROUTE_TYPE_POP,
     ROUTE_TYPE_FULL,
     ROUTE_TYPE_OUTLINK,
+    ROUTE_TYPE_CUSTOM,
     SIDE_TYPE_NONE,
     SIDE_TYPE_NOMAL,
     SIDE_TYPE_SPECIAL,

+ 15 - 3
src/contexts/themeContext.js

@@ -23,9 +23,16 @@ export const ThemeProvider = ({children}) => {
     const isMobile=()=>{
         return width<768;
     }
+    const getMFontScale=()=>{
+        let base=0.88;
+        let baseWidth=390;
+        let ratio=width/390;
+        let scale=Number((base*ratio).toFixed(2));
+        return scale;
+    }
     const [theme, setTheme] = useState(persisted && persisted.theme ?  persisted.theme : (APP_THEME.DARK));
     // const [fontScale, setFontScale] = useState(persisted.fontScale || 1);
-    const [fontScale, setFontScale] = useState(isMobile()?0.88:1);
+    const [fontScale, setFontScale] = useState(isMobile()?getMFontScale():1);
     const [direction, setDirection] = useState(persisted.direction || (isRtl ? 'rtl' : 'ltr'));
 
     const [installOpen,setInstallOpen]=useState(persisted&&(persisted.installOpen!=null)?persisted.installOpen:true);
@@ -59,8 +66,9 @@ export const ThemeProvider = ({children}) => {
         else global.device="pc";
         global.width=width;
         global.height=height;
+        changeFontScale(isMobile()?getMFontScale():1);
     }
-    initWindowSize();
+    // initWindowSize();
     const stopTransition = () => {
         page.classList.add('no-transition');
         setTimeout(() => page.classList.remove('no-transition'), 100);
@@ -82,6 +90,7 @@ export const ThemeProvider = ({children}) => {
 
     const changeFontScale = (scale) => {
         setFontScale(scale);
+        page.style.setProperty('--font-scale', scale);
         stopTransition();
     }
 
@@ -132,7 +141,7 @@ export const ThemeProvider = ({children}) => {
 
     useEffect(() => {
 
-        page.style.setProperty('--font-scale', fontScale);
+        // page.style.setProperty('--font-scale', fontScale);
         // page.style.setProperty('--widget-scale', fontScale === 1 ? '0px' : `${fontScale * 3}px`);
         page.setAttribute('dir', direction);
         savePreferences();
@@ -146,6 +155,9 @@ export const ThemeProvider = ({children}) => {
         //     })
         // eslint-disable-next-line react-hooks/exhaustive-deps
     }, [theme, fontScale, direction,installOpen]);
+    useEffect(()=>{
+        initWindowSize();
+    },[width]);
 
     return (
         <ThemeContext.Provider

+ 13 - 0
src/db/routes.js

@@ -334,4 +334,17 @@ export const routes=[
         lpath:"#/signin",//登录path
         subs:[]
     },
+    {
+        path: "#/moneyrain",
+        type: 5,
+        side: 0,
+        block:1,//块排序
+        title: "",
+        icon:"",
+        fill:";;",//icon 颜色 默认 选中 本身颜色
+        component:"moneyrain",
+        login:0,//0,1 检不检查登录
+        lpath:"#/signin",//登录path
+        subs:[]
+    },
 ]

+ 5 - 1
src/features/api.js

@@ -27,7 +27,7 @@ import {updateGameList} from "@features/pageSlice";
 import {APP_CHANNEL} from "@constants/app";
 import {updateInsurePass, updateUserInfo, updateUserScore} from "@features/mainSlice";
 import {formatCash, localStorageGet, sleep} from "@utils/helpers";
-import {LOCAL_CUSTOM_LOCK, LOCAL_WHEEL_INVITE_CODE} from "@constants/localkey";
+import {LOCAL_ACTIVITY_C, LOCAL_CUSTOM_LOCK, LOCAL_WHEEL_INVITE_CODE} from "@constants/localkey";
 import {toast} from "react-toastify";
 import {preDelMail} from "@features/mailSlice";
 const i18n=global.i18n;
@@ -122,6 +122,10 @@ export const reqRegister=createAsyncThunk(
         if (act!=null&&act!==""){
             data["act"]=act;
         }
+        let c=localStorageGet(LOCAL_ACTIVITY_C);
+        if (c!=null&&c!==""){
+            data["c"]=c;
+        }
         let params={
             url:APP_REGISTER,
             data:data

+ 2 - 0
src/features/mainSlice.js

@@ -1,6 +1,7 @@
 import {createAsyncThunk, createSlice} from "@reduxjs/toolkit";
 import {routes} from "@db/routes";
 import {
+    ROUTE_TYPE_CUSTOM,
     ROUTE_TYPE_FULL,
     ROUTE_TYPE_IN,
     ROUTE_TYPE_OUTLINK,
@@ -69,6 +70,7 @@ const generateRoutes=(routes,asyncRoutes=[])=>{
                     if (type===ROUTE_TYPE_IN||type===ROUTE_TYPE_FULL)inRoutes.push(route);
                     else if (type===ROUTE_TYPE_POP_OR_FULL)popRoutes.push(route);
                     else if (type===ROUTE_TYPE_POP)popRoutes.push(route);
+                    else if (type===ROUTE_TYPE_CUSTOM)popRoutes.push(route);
                 }
                 let subs=route.subs;
                 if (subs!=null)_generate(subs,route.lv,route.path);

+ 10 - 2
src/features/paySlice.js

@@ -22,7 +22,11 @@ const reducerRechargeConfig=(state,action,arg)=>{
     let payload=action.payload;
     if (payload!=null&&payload.code===200){
         let data=payload.data;
-        state.config=data;
+        if (data.list){
+            state.config=data.list;
+            state.showBonus=data.bonus_show;
+            // state.showBonus=true;
+        }
     }
 }
 const rechargeConfigStatus=(state,status,arg)=>{
@@ -241,7 +245,8 @@ export const Pay=createSlice({
         withdrawInfo:null,
         payOrderList:null,
         withdrawRecord:null,
-        changePayPassType:0
+        changePayPassType:0,
+        showBonus:false
     },
     reducers: {
         updatePayFinish:((state, action) => {
@@ -360,6 +365,9 @@ export const getChangePayPassType=(state)=>{
 export const getWDPayoutStatus=(state)=>{
     return state.pay.status.WithdrawPayout;
 }
+export const getShowBonus=(state)=>{
+    return state.pay.showBonus;
+}
 export default Pay.reducer;
 
 export const reqPayConfig=(dispatch,userInfo)=>{

+ 5 - 1
src/layout/Navbar/index.jsx

@@ -481,7 +481,11 @@ const PageHeader = () => {
 
     useEffect(()=>{
         let len=chain.length;
-        setShowHeader(len<=1);
+        let isShowH=len<=1;
+        if (LINKS===null||LINKS.length<=1){
+            isShowH=false;
+        }
+        setShowHeader(isShowH);
     },[pathname]);
     useEffect(()=>{
         checkInstallOpen();

+ 11 - 1
src/layout/Routes/RouteContainer.jsx

@@ -1,4 +1,4 @@
-import {ROUTE_TYPE_FULL, ROUTE_TYPE_IN, ROUTE_TYPE_POP, ROUTE_TYPE_POP_OR_FULL} from "@constants/routes";
+import {ROUTE_TYPE_FULL, ROUTE_TYPE_IN, ROUTE_TYPE_POP, ROUTE_TYPE_POP_OR_FULL,ROUTE_TYPE_CUSTOM} from "@constants/routes";
 import React from "react";
 import Popup from "@components/Popup";
 import SubScreen from "@components/SubScreen";
@@ -39,6 +39,13 @@ const RouteContainer=(props)=>{
             </>
         )
     }
+    const renderCustom=()=>{
+        return (
+            <>
+                {children}
+            </>
+        );
+    }
     const renderComp=()=>{
         let comp=(<></>);
         if (route.type===ROUTE_TYPE_FULL||route.type===ROUTE_TYPE_IN){
@@ -50,6 +57,9 @@ const RouteContainer=(props)=>{
         else if (route.type===ROUTE_TYPE_POP){
             comp=renderPop();
         }
+        else if (route.type===ROUTE_TYPE_CUSTOM){
+            comp=renderCustom();
+        }
         return comp;
     }
     return (

+ 20 - 1
src/layout/Routes/RouteWrapper.jsx

@@ -1,7 +1,14 @@
 import React, {useMemo, useState, useEffect, useRef} from 'react';
 import Popup from "@components/Popup";
 import { useNavigate } from 'react-router-dom';
-import {ROUTE_PATH, ROUTE_TYPE_FULL, ROUTE_TYPE_IN, ROUTE_TYPE_POP, ROUTE_TYPE_POP_OR_FULL} from "@constants/routes";
+import {
+    ROUTE_PATH,
+    ROUTE_TYPE_CUSTOM,
+    ROUTE_TYPE_FULL,
+    ROUTE_TYPE_IN,
+    ROUTE_TYPE_POP,
+    ROUTE_TYPE_POP_OR_FULL
+} from "@constants/routes";
 import {useThemeProvider} from "@contexts/themeContext";
 import SubScreen from "@components/SubScreen";
 import useScrollLock from "@hooks/useScrollLock";
@@ -86,6 +93,15 @@ const RouteWrapper = (props) => {
             </>
         )
     }
+    const renderCustom=()=>{
+        let comp=(<></>);
+        if (Comp!=null)comp=<Comp close={handleClose} pageID={route.id} {...props} />;
+        return (
+            <>
+                {comp}
+            </>
+        )
+    }
     const renderComp=()=>{
         let comp=(<></>);
         if (route.type===ROUTE_TYPE_FULL||route.type===ROUTE_TYPE_IN){
@@ -97,6 +113,9 @@ const RouteWrapper = (props) => {
         else if (route.type===ROUTE_TYPE_POP){
             comp=renderPop();
         }
+        else if (route.type===ROUTE_TYPE_CUSTOM){
+            comp=renderCustom();
+        }
         return comp;
     }
     return (

+ 16 - 0
src/locales/languages/en_US.json

@@ -432,5 +432,21 @@
   "lackMoney": {
     "lackMoney_Label": "I'm sorry! Your balance is insufficient, please top up.",
     "sure_label": "Deposit Now"
+  },
+  "moneyRain": {
+    "rule": {
+      "title": "Money like rain",
+      "reward_tip_1": "at a time",
+      "reward_tip_2": "Max drop"
+    },
+    "time": {
+      "title": "{0}X a day"
+    },
+    "des": {
+      "tips_0": "Each Money Rain session is given away with {0} free of charge",
+      "tips_1": "Maximum Cash Drop Value: Each Cash Rain session is given away for free with",
+      "tips_2": "Recharged members can claim for free",
+      "tips_3": "The money received can be used to play or withdrawn directly."
+    }
   }
 }

+ 10 - 0
src/pages/MoneyRain.jsx

@@ -0,0 +1,10 @@
+import WMoneyRain from "@widgets/WMoneyRain";
+
+const MoneyRain = ({...props}) => {
+    return (
+        <>
+            <WMoneyRain {...props}/>
+        </>
+    )
+}
+export default MoneyRain;

+ 3 - 1
src/pages/index.jsx

@@ -22,6 +22,7 @@ const MailDetail=lazy(()=>import("@pages/MailDetail"));
 const RechargeHistory=lazy(()=>import("@pages/RechargeHistory"));
 const WithdrawRecord=lazy(()=>import("@pages/WithdrawRecord"));
 const Security=lazy(()=>import("@pages/Security"));
+const MoneyRain=lazy(()=>import("@pages/MoneyRain"));
 export default {
     ModulePage:ModulePage,
     Home:Home,
@@ -42,7 +43,8 @@ export default {
     mailDetail:MailDetail,
     rechargeHistory:RechargeHistory,
     withdrawRecord:WithdrawRecord,
-    security:Security
+    security:Security,
+    moneyrain:MoneyRain
 }
 export const Header={
     deposit: DepositHeader,

+ 36 - 0
src/utils/helpers.js

@@ -351,3 +351,39 @@ export const decrypt=(str, pwd)=>{
     }
     return decodeURIComponent(encStr);
 }
+export const format2LongChips=(num,isRetainDot=false)=>{
+    num=Number(num);
+    num=num/global.CASH_BASE;
+    return formatLongChips(num,isRetainDot);
+}
+export const formatLongChips=(value,isfixed=false)=>{
+    if(value==null)return "";
+    let str = "";
+    value=Number(value);
+    let dotvalue=value-Math.floor(value);
+    value=Math.floor(value);
+    let fvalue=isfixed?".00":"";
+    let dotstr=dotvalue==0?fvalue:dotvalue.toFixed(2).substring(1);
+    let addsign = "";
+    let result = "";
+    str=value+"";
+    let tmp=str.substring(0,1);
+    if(tmp=="-"){
+        addsign = "-";
+        str=str.substring(1);
+    }
+    else if(tmp=="+"){
+        addsign = "+";
+        str=str.substring(1);
+    }
+    let arr=str.split("");
+    let j=1;
+    for (let i = arr.length-1; i >= 0; i--) {
+        result=arr[i]+result;
+        if(j%3==0&&j!=arr.length){
+            result=","+result;
+        }
+        j=j+1;
+    }
+    return addsign+result+dotstr;
+}

+ 1 - 0
src/widgets/WCashWheel/WShare/styles.module.scss

@@ -60,6 +60,7 @@
       white-space: nowrap;
       overflow-x: auto;
       user-select: text;
+      text-align: left;
     }
   }
   & .share_random_con{

+ 3 - 1
src/widgets/WDeposit/BR/BRDeposit.jsx

@@ -1,7 +1,7 @@
 import styles from './styles.module.scss';
 import {useDispatch, useSelector} from "react-redux";
 import {getUserInfo, isLogined} from "@features/mainSlice";
-import {getConfig, getFirstPay, getPaymentOrderStatus} from "@features/paySlice";
+import {getConfig, getFirstPay, getPaymentOrderStatus, getShowBonus} from "@features/paySlice";
 import fpayimg from "@assets/pay/fpayimg.png";
 import img_sc from "@assets/pay/img_sc_66.png";
 import React, {useState} from "react";
@@ -30,6 +30,7 @@ const BRDeposit=()=>{
     const [selectedID,setSelectedID]=useState("0");
     const isLogin=useSelector(isLogined);
     const [selectedPromotion,setSelectedPromotion]=useState(false);
+    const showBonus=useSelector(getShowBonus);
     const getSelectedConfig=()=>{
         let selected=null;
         if (config){
@@ -215,6 +216,7 @@ const BRDeposit=()=>{
         )
     }
     const renderPromotions=()=>{
+        if (!showBonus)return (<></>);
         let payItem=getSelectedConfig();
         let percent=0;
         let bonus=0;

+ 123 - 0
src/widgets/WMoneyRain/index.jsx

@@ -0,0 +1,123 @@
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import styles from "./styles.module.scss"
+import {ClickAwayListener} from "@mui/base/ClickAwayListener";
+import Grow from "@mui/material/Grow";
+import styled from 'styled-components/macro';
+import rain_bg3 from "@assets/moneyrain/rain_bg3.png";
+import close_bai from "@assets/moneyrain/Close_bai.png";
+import rain_card from "@assets/moneyrain/rain_card.png";
+import red_box from "@assets/moneyrain/huodongrukou5_jianbian.png";
+import time_icon from "@assets/moneyrain/shijian_bai.png";
+import star_icon from "@assets/moneyrain/bofang_bai.png";
+import {format2LongChips, stringFormat} from "@utils/helpers";
+const i18n=global.i18n;
+const StyledRules=styled.div`
+    background: url(${rain_bg3});
+`
+const StyledRewardCon=styled.div`
+    background: url(${rain_card});
+`
+const WMoneyRain = ({close}) => {
+    const getRuleTxt=(totalStr)=>{
+        let txt=[];
+        for (let i = 0; i < 4; i++) {
+            let str=i18n.t("moneyRain.des.tips_"+i);
+            if (i===0)str=stringFormat(str,[global.DOLLAR+" "+totalStr]);
+            txt.push(str);
+        }
+        return txt;
+    }
+    const renderRules=()=>{
+        let toatlNum=10000000;
+        let maxNum=777700;
+        let totalStr=format2LongChips(toatlNum);
+        let maxStr=format2LongChips(maxNum);
+        let timeData=[
+            "12:00-12:59",
+            "14:00-14:59",
+            "18:00-18:59",
+            "20:00-20:59"
+        ];
+        let timeLen=timeData.length;
+        let rules=getRuleTxt(totalStr);
+        return (
+            <Grow in={true} timeout={500}>
+                <StyledRules className={styles.rule_container}>
+                    <button className={styles.close} onClick={close}>
+                        <img src={close_bai}/>
+                    </button>
+                    <div className={styles.title}>
+                        {i18n.t("moneyRain.rule.title")}
+                    </div>
+                    <StyledRewardCon className={styles.reward_con}>
+                        <div className={styles.reward_item}>
+                            <img src={red_box}/>
+                            <div className={styles.text_con}>
+                                <div>{global.DOLLAR}</div>
+                                <div className={styles.reward}>{totalStr}</div>
+                                <div>{i18n.t("moneyRain.rule.reward_tip_1")}</div>
+                            </div>
+                        </div>
+                        <div className={styles.reward_item}>
+                            <img src={red_box}/>
+                            <div className={styles.text_con}>
+                                <div>{i18n.t("moneyRain.rule.reward_tip_2")}</div>
+                                <div>{global.DOLLAR}</div>
+                                <div className={styles.reward}>{maxStr}</div>
+                            </div>
+                        </div>
+                    </StyledRewardCon>
+                    <div className={styles.time_con}>
+                        <div className={styles.time_title}>
+                            {stringFormat(i18n.t("moneyRain.time.title"),[timeLen])}
+                        </div>
+                        <div className={styles.time_content}>
+                            {
+                                timeData.map((item,index)=>{
+                                    return (
+                                        <div key={index} className={styles.time_item}>
+                                            <img src={time_icon}/>
+                                            {item}
+                                        </div>
+                                    )
+                                })
+                            }
+                        </div>
+                    </div>
+                    <div className={styles.rule_content}>
+                        {
+                            rules.map((item,index)=>{
+                                return (
+                                    <div key={index} className={styles.rule_item}>
+                                        <img src={star_icon}/>
+                                        <div>{item}</div>
+                                    </div>
+                                )
+                            })
+                        }
+                    </div>
+                </StyledRules>
+            </Grow>
+        )
+    }
+    const renderMain = () => {
+        return (
+            <>
+                {renderRules()}
+            </>
+        )
+    }
+    return (
+        <Modal open={true} onClose={close} closeAfterTransition>
+            <Fade in={true} timeout={500}>
+                <div className={styles.container}>
+                    <div className={styles.content}>
+                        {renderMain()}
+                    </div>
+                </div>
+            </Fade>
+        </Modal>
+    )
+}
+export default WMoneyRain;

+ 132 - 0
src/widgets/WMoneyRain/styles.module.scss

@@ -0,0 +1,132 @@
+.container{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+  pointer-events: none;
+}
+.content{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 1.5rem;
+  width: 100%;
+  height: 100%;
+  max-width: 414px;
+}
+.close{
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: absolute;
+  width: 3.5rem;
+  height: 3rem;
+  top: 0;
+  right: 0;
+  img{
+    width: 1.7rem;
+    height: 1.7rem;
+    opacity: 0.65;
+  }
+}
+.rule_container{
+  width: 100%;
+  aspect-ratio: 960/1506;
+  background-size: 100% 100%;
+  display: flex;
+  flex-direction: column;
+  position: relative;
+  padding: 1rem 1rem;
+  pointer-events: auto;
+  gap: 1rem;
+  font-size: 0.9rem;
+  & .title{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    color: rgb(252, 215, 161);
+    font-size: 1.3rem;
+    font-weight: bold;
+  }
+  & .reward_con{
+    margin-top: 0.5rem;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    gap: 1.5rem;
+    padding: 1rem 0rem 1rem 3rem;
+    width: 100%;
+    aspect-ratio: 864/288;
+    background-size: 100% 100%;
+    color: rgb(120, 52, 15);
+    & .reward_item{
+      display: flex;
+      align-items: center;
+      gap: 0.5rem;
+      font-size: 1.2rem;
+      img{
+        width: 1.3rem;
+        height: auto;
+      }
+      & .text_con{
+        display: flex;
+        gap: 0.25rem;
+        & .reward{
+          font-size: 1.8rem;
+          font-weight: bold;
+        }
+      }
+    }
+  }
+  & .time_con{
+    display: flex;
+    flex-direction: column;
+    padding: 1rem;
+    border-radius: var(--border-radius);
+    background: rgba(0, 0, 0, 0.15);
+    color: rgb(252, 215, 161);
+    gap: 1rem;
+    & .time_title{
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      font-size: 1.4rem;
+      width: 100%;
+    }
+    & .time_content{
+      display: flex;
+      flex-wrap: wrap;
+      gap: 0.5rem;
+      & .time_item{
+        display: flex;
+        gap: 0.1rem;
+        align-items: center;
+        img{
+          width: 0.9rem;
+          height: 0.9rem;
+          opacity: 0.65;
+        }
+      }
+    }
+  }
+  & .rule_content{
+    display: flex;
+    flex-direction: column;
+    margin-top: 0.75rem;
+    gap: 0.25rem;
+    img{
+      width: 0.8rem;
+      height: 0.8rem;
+      opacity: 0.65;
+      margin-top: 0.3rem;
+    }
+    & .rule_item{
+      display: flex;
+      gap: 0.5rem;
+      color: rgba(255, 255, 255, 0.85);
+    }
+  }
+}

+ 13 - 2
src/widgets/WPromotion/index.jsx

@@ -3,14 +3,18 @@ import Spring from "@components/Spring";
 import React from "react";
 import icon_1 from "@assets/promotion/icon_1.svg";
 import banner_1 from "@assets/promotion/banner_1.png";
+import icon_2 from "@assets/promotion/icon_2.svg";
+import banner_2 from "@assets/promotion/banner_2.png";
 import {useNavigate} from "react-router-dom";
 const icons=[
     null,
-    icon_1
+    icon_1,
+    icon_2
 ]
 const banners=[
     null,
-    banner_1
+    banner_1,
+    banner_2
 ]
 const WPromotion=({close})=>{
     const navigate=useNavigate();
@@ -21,6 +25,13 @@ const WPromotion=({close})=>{
             icon:"",
             banner:"",
             link:"#/cashwheel",
+        },
+        {
+            id:2,
+            title:"Collection",
+            icon:"",
+            banner:"",
+            link:"#/moneyrain",
         }
     ]
     const renderList=()=>{

部分文件因为文件数量过多而无法显示