zhejiushizhuce vor 2 Jahren
Ursprung
Commit
1e49e3f84a

+ 2 - 2
src/App.js

@@ -57,7 +57,7 @@ import LoadingScreen from "@components/LoadingScreen";
 import DropCoins from "@components/DropCoins";
 import {reqPayConfig} from "@features/paySlice";
 import {connectHall, disconnectHall} from "@features/actions/hallClient";
-import * as toast from "react-toastify";
+import {toast} from "react-toastify";
 import {useBlocker} from "react-router";
 import FontFaceObserver from 'fontfaceobserver';
 import {getTurnplate} from "@features/turnplateSlice";
@@ -152,7 +152,7 @@ const App = () => {
             localStorageSet(LOCAL_WHEEL_INVITE_CODE,"");
             localStorageSet(LOCAL_ACTIVITY_C,"");
             //Mail红点屏蔽
-            // dispatch(reqMailCheck());
+            dispatch(reqMailCheck());
         }
         else
         {

+ 4 - 1
src/api/config.js

@@ -85,4 +85,7 @@ export const APP_AGENT_CHECK=BASE_PREFIX+"agent/check";
 export const APP_AGENT_GET=BASE_PREFIX+"agent/get";
 export const APP_AGENT_HISTORY=BASE_PREFIX+"agent/history";
 //activity
-export const APP_GAME_ACTIVITY=BASE_PREFIX+"actList";
+export const APP_GAME_ACTIVITY=BASE_PREFIX+"actList";
+//checkin
+export const APP_CHECKIN_CHECK=BASE_PREFIX+"checkin/check";
+export const APP_CHECKIN_GET=BASE_PREFIX+"checkin/get";

+ 2 - 0
src/api/request.js

@@ -111,6 +111,8 @@ service.interceptors.response.use(
                 console.log(error);
             }
         }
+        let host=window.location.host;
+        if (host.startsWith("localhost"))console.log(response.data);
         checkResponse(response.data);
         return response.data;
     },

+ 2 - 0
src/app/store.js

@@ -10,6 +10,7 @@ import MailReducer from '@features/mailSlice';
 import RedPackReducer from '@features/redpackSlice';
 import AgentReducer from '@features/agentSlice';
 import ActivityReducer from '@features/activitySlice';
+import CheckInReducer from '@features/checkInSlice';
 export default configureStore({
     reducer: {
         // todos: TodosReducer,
@@ -23,6 +24,7 @@ export default configureStore({
         redpack:RedPackReducer,
         agent:AgentReducer,
         activity:ActivityReducer,
+        checkIn:CheckInReducer,
     },
     middleware:(getDefaultMiddleware => {
         let middlewares=getDefaultMiddleware();

BIN
src/assets/checkIn/1.png


BIN
src/assets/checkIn/2.png


BIN
src/assets/checkIn/3.png


BIN
src/assets/checkIn/4.png


BIN
src/assets/checkIn/5.png


BIN
src/assets/checkIn/bg_item_small.png


BIN
src/assets/checkIn/com_tanc_X.png


BIN
src/assets/checkIn/com_tc_sm_di.jpg


BIN
src/assets/checkIn/img_item_mask_small.png


BIN
src/assets/checkIn/img_jinbi.png


BIN
src/assets/checkIn/img_sure.png


BIN
src/assets/checkIn/img_sz_tc_di.png


Datei-Diff unterdrückt, da er zu groß ist
+ 10 - 0
src/assets/singlesvg/chekin.svg


+ 2 - 1
src/constants/routes.js

@@ -37,7 +37,8 @@ const ROUTE_PATH={
     AGENT_HISTORY:"#/agentHistory",
     PRIVACY:"#/privacy",
     SERVICES:"#/services",
-    KYC:"#/kyc"
+    KYC:"#/kyc",
+    CHECK_IN:"#/checkIn"
 }
 
 export {

+ 13 - 0
src/db/routes.js

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

+ 34 - 1
src/features/api.js

@@ -5,7 +5,7 @@ import {
     APP_CHANGE_INFO,
     APP_CHANGE_PASS,
     APP_CHANGE_PAY_PASS,
-    APP_CHANGE_PHONE, APP_CUSTOMER_LEAVEMSG,
+    APP_CHANGE_PHONE, APP_CHECKIN_CHECK, APP_CHECKIN_GET, APP_CUSTOMER_LEAVEMSG,
     APP_CUSTOMER_SERVICE,
     APP_FIRSTPAY_CONFIG, APP_GAME_ACTIVITY,
     APP_GAME_INFO,
@@ -661,4 +661,37 @@ export const reqGameActivity=createAsyncThunk(
         return response;
     }
 )
+//checkin
+export const reqCheckinCheck=createAsyncThunk(
+    APP_CHECKIN_CHECK,
+    async (arg,thunkAPI)=>{
+        let params={
+            url:APP_CHECKIN_CHECK
+        }
+        const response=await Http.get(params);
+        return response;
+    }
+)
+export const reqCheckinGet=createAsyncThunk(
+    APP_CHECKIN_GET,
+    async (arg,thunkAPI)=>{
+        let params={
+            url:APP_CHECKIN_GET
+        }
+        const response=await Http.get(params);
+        if (response&&response.code===200){
+            thunkAPI.dispatch(reqCheckinCheck());
+            let data=response.data;
+            if (data){
+                let RewardScore=data.RewardScore;
+                if (RewardScore!=null){
+                    let addCash=Number(RewardScore);
+                    addCash=Number(formatCash(RewardScore));
+                    thunkAPI.dispatch(updateAddScore(addCash))
+                }
+            }
+        }
+        return response;
+    }
+)
 //api

+ 109 - 0
src/features/checkInSlice.js

@@ -0,0 +1,109 @@
+import {createSlice} from "@reduxjs/toolkit";
+import {buildReqReducer, reqAgentCheck, reqCheckinCheck, reqCheckinGet} from "@features/api";
+import {REQ_STATUS} from "@api/config";
+import {formatCash, getHttpMsg} from "@utils/helpers";
+import {toast} from "react-toastify";
+const i18n=global.i18n;
+const reducerCheckinCheck=(state,action,arg)=>{
+    let payload=action.payload;
+    if (payload!=null&&payload.code===200){
+        let data=payload.data;
+        if (data){
+            let config=data.config;
+            let RewardDay=[];
+            let RewardScore=[];
+            let nDayNumber=-1;
+            let cbRecord=[];
+            if (config){
+                for (let i = 0; i < config.length; i++) {
+                    let item=config[i];
+                    let DayNumber=parseInt(item.DayNumber);
+                    let RecordDay=parseInt(item.RecordDay.substring(i,i+1))>0?1:0;
+                    let RewScore=parseInt(formatCash(item.RewardScore,true));
+                    let SignInDay=parseInt(item.SignInDay);
+                    RewardDay.push(DayNumber);
+                    RewardScore.push(RewScore);
+                    cbRecord.push(RecordDay);
+                    nDayNumber=SignInDay;
+                }
+            }
+            // nDayNumber=Number(data.NextDayNumber)
+            let LastDate=0;
+            let NextGetTime=0;
+            if (data.LastDate!=null){
+                LastDate=data.LastDate;
+                LastDate=Date.parse(LastDate+" GMT-3");
+                NextGetTime=LastDate+86400000;
+            }
+            let NextDayNumber=Number(data.NextDayNumber);
+            if (NextDayNumber>7)NextDayNumber=7
+            state.checkInData={
+                RewardDay,
+                RewardScore,
+                cbRecord,
+                nDayNumber,
+                LastDate,
+                NextDayNumber
+            }
+            state.NextGetTime=NextGetTime;
+        }
+    }
+}
+const checkinCheckStatus=(state,status,arg)=>{
+    state.status.CheckInCheck=status;
+}
+const reducerCheckinGet=(state,action,arg)=>{
+    let payload=action.payload;
+    let msg=getHttpMsg(payload);
+    if (payload!=null&&payload.code===200){
+        let data=payload.data;
+        // global.showDropCoins();
+        msg=i18n.t("CheckIn.get_success");
+        if(msg&&msg!=="")toast.success(msg);
+    }
+    else {
+        if(msg&&msg!=="")toast.error(msg);
+    }
+    if (arg.callback)arg.callback(payload);
+}
+const checkinGetStatus=(state,status,arg)=>{
+    state.status.CheckInGet=status;
+}
+export const CheckInSlice = createSlice({
+    name: 'checkIn',
+    initialState: {
+        checkInData:{
+            // nDayNumber:2,
+            // cbRecord:[1],
+            // RewardDay:[1,2,3,4,5,6,7],
+            // RewardScore:[1,1,1,2,2,2,2]
+            nDayNumber:-1,
+            cbRecord:[],
+            RewardDay:[],
+            RewardScore:[],
+            LastDate:0,
+        },
+        NextGetTime:0,
+        status:{
+            CheckInCheck:REQ_STATUS.NONE,
+            CheckInGet:REQ_STATUS.NONE,
+        }
+    },
+    reducers: {
+    },
+    extraReducers: (builder) => {
+        buildReqReducer(builder,reqCheckinCheck,reducerCheckinCheck,checkinCheckStatus);
+        buildReqReducer(builder,reqCheckinGet,reducerCheckinGet,checkinGetStatus);
+    },
+})
+export const {} = CheckInSlice.actions;
+export const getCheckInData=(state)=>{
+    return state.checkIn.checkInData;
+}
+export const getCheckInStatus=(state)=>{
+    return state.checkIn.status;
+}
+export const getNextGetTime=(state)=>{
+    return state.checkIn.NextGetTime;
+}
+export default CheckInSlice.reducer;

+ 1 - 0
src/features/mainSlice.js

@@ -152,6 +152,7 @@ const reducerRoutes=(state,action)=>{
         let hallServerUrl='';
         if (conf){
             if (conf.hall)hallServerUrl=conf.hall;
+            if (conf.DOLLAR!=null)global.DOLLAR=conf.DOLLAR;
         }
         Object.assign(state, {routes:state.routes,asyncRoutes:data,styles:styles,blocks:blocks,...generData,isLogin:isLogin,userInfo:userInfo,hallServerUrl:hallServerUrl});
     }

+ 1 - 0
src/layout/Layout.jsx

@@ -27,6 +27,7 @@ import LoadingIn from "@components/Loading/LoadingIn";
 import WDPassBox from "@widgets/WWithdraw/PassBox/WDPassBox";
 import {ROUTE_PATH} from "@constants/routes";
 import DropCoins from "@components/DropCoins";
+import {toast} from "react-toastify";
 const PageNotFound = lazy(() => import('@pages/PageNotFound'));
 
 const Layout=()=>{

+ 13 - 11
src/layout/Sidebar/index.jsx

@@ -32,6 +32,7 @@ import MuiDrawer from '@mui/material/Drawer';
 // import styled from 'styled-components/macro';
 import { styled, useTheme } from '@mui/material/styles';
 import SidebarTrigger from "@ui/SidebarTrigger";
+import {ReactComponent as CheckInIcon} from "@assets/singlesvg/chekin.svg";
 
 // import {useThemeProvider} from '@contexts/themeContext';
 import symbol from '@assets/symbol-defs.svg';
@@ -350,23 +351,24 @@ const Sidebar = () => {
             <StyledBlock open={open}>
                 <StyledBonus className="d-flex flex-column g-6" open={open}>
                     {
-                        // open?(
-                        //     <SingleLink olstyle={styles}>
-                        //         <NavLink className={`${pathname === herf ? 'active' : ''} h4`} to={herf}>
-                        //             <SvgIcon className={"icon"} herf={"icon_Gift"}/>
-                        //             {i18n.t("links.bonus")}
-                        //         </NavLink>
-                        //     </SingleLink>
-                        // ):renderIconLink(link,styles)
+                        open?(
+                            <SingleLink olstyle={styles}>
+                                <NavLink className={`${pathname === herf ? 'active' : ''} h4`} to={herf}>
+                                    <SvgIcon className={"icon"} herf={"icon_Gift"}/>
+                                    {i18n.t("links.bonus")}
+                                </NavLink>
+                            </SingleLink>
+                        ):renderIconLink(link,styles)
                     }
                     <StyledAct open={open} enter={isActHovered} onMouseEnter={handleActEnter} onMouseLeave={handleActLeave}>
                         <div className="bonus-item li-quests">
                             <button className="bonus-item-btn" onClick={()=>{
-                                navigate(herf);
+                                navigate(ROUTE_PATH.CHECK_IN);
                             }}>
                                 {/*<img className="img-bg" src={questsimg} alt={"quests"}/>*/}
-                                <SvgIcon className={"icon-bonus"} herf={"icon_Gift"}/>
-                                {open?i18n.t("links.bonus"):""}
+                                {/*<SvgIcon className={"icon-bonus"} herf={"icon_Gift"}/>*/}
+                                <CheckInIcon className={"icon-bonus iconshake"}></CheckInIcon>
+                                {open?i18n.t("links.check_in"):""}
                             </button>
                         </div>
                         <div className="bonus-item li-spin">

+ 1 - 1
src/layout/Sidebar/styles.js

@@ -535,7 +535,7 @@ const StyledAct=styled.div`
         margin-right: 0.5rem;
         width: 1.8rem;
         height: 1.8rem;
-        fill:#b891ff;
+        fill:#f6e4f4;
       }
       & .img-bg{
         width: auto;

+ 27 - 3
src/locales/languages/en_US.json

@@ -20,7 +20,8 @@
       "payorder": "Payment order",
       "msg": "Message",
       "agent_policy": "Agent Policy",
-      "cashwheel": "Receive R$100 for free"
+      "cashwheel": "Receive R$100 for free",
+      "check_in": "All Bonus Days"
     },
     "casino": "Casino",
     "slots": "Slots",
@@ -30,11 +31,12 @@
     "live_events": "Live Events",
     "basketball": "Basketball",
     "fifa": "FIFA",
-    "bonus": "BONUS",
+    "bonus": "Bonus",
     "live_support": "Live Support",
     "quest": "QUEST",
     "spin": "SPIN",
-    "log_out": "Log out"
+    "log_out": "Log out",
+    "check_in": "CHECK IN"
   },
   "tab": {
     "withdraw": "Withdraw",
@@ -539,6 +541,28 @@
       "status_1": "Received"
     }
   },
+  "CheckIn": {
+    "only_btn":"only need $",
+    "take":"Take",
+    "getMore":"Get More Chips",
+    "nota":"You are not a",
+    "title": "All Bonus Days",
+    "day1": "DAY 1",
+    "day2": "DAY 2",
+    "day3": "DAY 3",
+    "day4": "DAY 4",
+    "day5": "DAY 5",
+    "day6": "DAY 6",
+    "day7": "DAY 7",
+    "req_info_error": "Failed to obtain service information",
+    "isChecked": "You have already claimed your bonus today",
+    "isEnd": "Activity has ended",
+    "req_data_error": "Failed to read data",
+    "must_recharge": "You must recharge before they can continue to receive bonuses",
+    "btn_to_recharge": "To recharge",
+    "last_get": "Next Bonus in:",
+    "get_success": "Successfully received"
+  },
   "web": {
     "activity": {
       "redpack_not_available": "There is no RedPack",

+ 51 - 27
src/locales/languages/es_MX.json

@@ -18,7 +18,8 @@
       "payorder": "Orden de Pago",
       "msg": "Mensaje",
       "agent_policy": "Política de Agente",
-      "cashwheel": "Recibe R$100 gratis"
+      "cashwheel": "Recibe R$100 gratis",
+      "check_in": "Bono todos los días"
     },
     "casino": "Casino",
     "slots": "Tragamonedas",
@@ -32,7 +33,8 @@
     "live_support": "Soporte en Vivo",
     "quest": "MISION",
     "spin": "GIRAR",
-    "log_out": "Cerrar sesión"
+    "log_out": "Cerrar sesión",
+    "check_in": "REGISTRARSE"
   },
   "tab": {
     "withdraw": "Retirar",
@@ -492,43 +494,65 @@
     }
   },
   "agent": {
-    "no_data": "No records yet",
-    "get_success": "Successfully received",
-    "get_error": "Failed to collect",
+    "no_data": "Todavía no hay registros",
+    "get_success": "Recibido exitosamente",
+    "get_error": "Error al recolectar",
     "base": {
-      "title_link": "Reference Link",
-      "btn_copy": "Copy",
-      "value": "Value",
-      "title_policy": "Agent Policy",
-      "details": "See details"
+      "title_link": "Enlace de Referencia",
+      "btn_copy": "Copiar",
+      "value": "Valor",
+      "title_policy": "Política del Agente",
+      "details": "Ver detalles"
     },
     "today": {
-      "label_level": "Level",
-      "label_team_size": "Team Size",
-      "label_direct_agent": "Direct Agent",
-      "label_revenue": "Today's Revenue",
-      "label_commission": "Today's Commission"
+      "label_level": "Nivel",
+      "label_team_size": "Tamaño del Equipo",
+      "label_direct_agent": "Agente Directo",
+      "label_revenue": "Ingresos de Hoy",
+      "label_commission": "Comisión de Hoy"
     },
     "subs": {
-      "title": "Today's Direct Agent Performance",
-      "label_name": "Agent Name",
-      "label_revenue": "Revenue",
-      "label_commision": "Commission"
+      "title": "Rendimiento de Agentes Directos de Hoy",
+      "label_name": "Nombre del Agente",
+      "label_revenue": "Ingresos",
+      "label_commision": "Comisión"
     },
     "bonus": {
-      "title_bonus": "Commission available",
-      "btn_claim": "Claim",
-      "history": "History",
-      "label_date": "Date",
-      "label_commision": "Commission",
-      "label_claim": "Claim"
+      "title_bonus": "Comisión disponible",
+      "btn_claim": "Reclamar",
+      "history": "Historial",
+      "label_date": "Fecha",
+      "label_commision": "Comisión",
+      "label_claim": "Reclamar"
     },
     "history": {
-      "label_status": "Status",
+      "label_status": "Estado",
       "status_0": "",
-      "status_1": "Received"
+      "status_1": "Recibido"
     }
   },
+  "CheckIn": {
+    "only_btn": "solo necesita $",
+    "take": "Tomar",
+    "getMore": "Obtener Más Fichas",
+    "nota": "No eres",
+    "title": "Todos los Días de Bono",
+    "day1": "DÍA 1",
+    "day2": "DÍA 2",
+    "day3": "DÍA 3",
+    "day4": "DÍA 4",
+    "day5": "DÍA 5",
+    "day6": "DÍA 6",
+    "day7": "DÍA 7",
+    "req_info_error": "Error al obtener información del servicio",
+    "isChecked": "Ya has reclamado tu bono hoy",
+    "isEnd": "La actividad ha finalizado",
+    "req_data_error": "Error al leer datos",
+    "must_recharge": "Debes recargar antes de poder seguir recibiendo bonos",
+    "btn_to_recharge": "Para recargar",
+    "last_get": "Próximo bono a las:",
+    "get_success": "Recibido exitosamente"
+  },
   "web": {
     "activity": {
       "redpack_not_available": "No hay RedPack",

+ 50 - 26
src/locales/languages/pt_BR.json

@@ -18,7 +18,8 @@
       "payorder": "Ordem de Pagamento",
       "msg": "Mensagem",
       "agent_policy": "Política de Agente",
-      "cashwheel": "Receba R$100 grátis"
+      "cashwheel": "Receba R$100 grátis",
+      "check_in": "Todos Os Dias Bônus"
     },
 
     "casino": "Cassino",
@@ -33,7 +34,8 @@
     "live_support": "Suporte ao Vivo",
     "quest": "MISSÃO",
     "spin": "GIRAR",
-    "log_out": "Sair"
+    "log_out": "Sair",
+    "check_in": "CHECK-IN"
   },
   "tab": {
     "withdraw": "Saque",
@@ -493,43 +495,65 @@
     }
   },
   "agent": {
-    "no_data": "No records yet",
-    "get_success": "Successfully received",
-    "get_error": "Failed to collect",
+    "no_data": "Ainda não há registros",
+    "get_success": "Recebido com sucesso",
+    "get_error": "Falha ao coletar",
     "base": {
-      "title_link": "Reference Link",
-      "btn_copy": "Copy",
-      "value": "Value",
-      "title_policy": "Agent Policy",
-      "details": "See details"
+      "title_link": "Link de Referência",
+      "btn_copy": "Copiar",
+      "value": "Valor",
+      "title_policy": "Política do Agente",
+      "details": "Ver detalhes"
     },
     "today": {
-      "label_level": "Level",
-      "label_team_size": "Team Size",
-      "label_direct_agent": "Direct Agent",
-      "label_revenue": "Today's Revenue",
-      "label_commission": "Today's Commission"
+      "label_level": "Nível",
+      "label_team_size": "Tamanho da Equipe",
+      "label_direct_agent": "Agente Direto",
+      "label_revenue": "Receita de Hoje",
+      "label_commission": "Comissão de Hoje"
     },
     "subs": {
-      "title": "Today's Direct Agent Performance",
-      "label_name": "Agent Name",
-      "label_revenue": "Revenue",
-      "label_commision": "Commission"
+      "title": "Desempenho do Agente Direto de Hoje",
+      "label_name": "Nome do Agente",
+      "label_revenue": "Receita",
+      "label_commision": "Comissão"
     },
     "bonus": {
-      "title_bonus": "Commission available",
-      "btn_claim": "Claim",
-      "history": "History",
-      "label_date": "Date",
-      "label_commision": "Commission",
-      "label_claim": "Claim"
+      "title_bonus": "Comissão disponível",
+      "btn_claim": "Reivindicar",
+      "history": "Histórico",
+      "label_date": "Data",
+      "label_commision": "Comissão",
+      "label_claim": "Reivindicar"
     },
     "history": {
       "label_status": "Status",
       "status_0": "",
-      "status_1": "Received"
+      "status_1": "Recebido"
     }
   },
+  "CheckIn": {
+    "only_btn": "só precisa $",
+    "take": "Pegar",
+    "getMore": "Obter Mais Fichas",
+    "nota": "Você não é um",
+    "title": "Todos os Dias de Bônus",
+    "day1": "DIA 1",
+    "day2": "DIA 2",
+    "day3": "DIA 3",
+    "day4": "DIA 4",
+    "day5": "DIA 5",
+    "day6": "DIA 6",
+    "day7": "DIA 7",
+    "req_info_error": "Falha ao obter informações do serviço",
+    "isChecked": "Você já reivindicou seu bônus hoje",
+    "isEnd": "A atividade terminou",
+    "req_data_error": "Falha ao ler dados",
+    "must_recharge": "Você deve recarregar antes de poder continuar a receber bônus",
+    "btn_to_recharge": "Para recarregar",
+    "last_get": "Próximo Bônus em:",
+    "get_success": "Recebido com sucesso"
+  },
   "web": {
     "activity": {
       "redpack_not_available": "Não há RedPack",

+ 51 - 27
src/locales/languages/ru_RU.json

@@ -18,7 +18,8 @@
       "payorder": "Платежное поручение",
       "msg": "Сообщение",
       "agent_policy": "Агентская политика",
-      "cashwheel": "Получите 100 R$ бесплатно"
+      "cashwheel": "Получите 100 R$ бесплатно",
+      "check_in": "Все бонусные дни"
     },
     "casino": "Казино",
     "slots": "Слоты",
@@ -32,7 +33,8 @@
     "live_support": "Поддержка в реальном времени",
     "quest": "КВЕСТ",
     "spin": "СПИН",
-    "log_out": "Выйти"
+    "log_out": "Выйти",
+    "check_in": "РЕГИСТРИРОВАТЬСЯ"
   },
   "tab": {
     "withdraw": "Вывод",
@@ -492,43 +494,65 @@
     }
   },
   "agent": {
-    "no_data": "No records yet",
-    "get_success": "Successfully received",
-    "get_error": "Failed to collect",
+    "no_data": "Пока нет записей",
+    "get_success": "Успешно получено",
+    "get_error": "Не удалось собрать",
     "base": {
-      "title_link": "Reference Link",
-      "btn_copy": "Copy",
-      "value": "Value",
-      "title_policy": "Agent Policy",
-      "details": "See details"
+      "title_link": "Ссылка на справочник",
+      "btn_copy": "Копировать",
+      "value": "Значение",
+      "title_policy": "Политика агента",
+      "details": "Подробности"
     },
     "today": {
-      "label_level": "Level",
-      "label_team_size": "Team Size",
-      "label_direct_agent": "Direct Agent",
-      "label_revenue": "Today's Revenue",
-      "label_commission": "Today's Commission"
+      "label_level": "Уровень",
+      "label_team_size": "Размер команды",
+      "label_direct_agent": "Прямой агент",
+      "label_revenue": "Доход за сегодня",
+      "label_commission": "Комиссия за сегодня"
     },
     "subs": {
-      "title": "Today's Direct Agent Performance",
-      "label_name": "Agent Name",
-      "label_revenue": "Revenue",
-      "label_commision": "Commission"
+      "title": "Производительность прямого агента сегодня",
+      "label_name": "Имя агента",
+      "label_revenue": "Доход",
+      "label_commision": "Комиссия"
     },
     "bonus": {
-      "title_bonus": "Commission available",
-      "btn_claim": "Claim",
-      "history": "History",
-      "label_date": "Date",
-      "label_commision": "Commission",
-      "label_claim": "Claim"
+      "title_bonus": "Доступная комиссия",
+      "btn_claim": "Претензия",
+      "history": "История",
+      "label_date": "Дата",
+      "label_commision": "Комиссия",
+      "label_claim": "Претензия"
     },
     "history": {
-      "label_status": "Status",
+      "label_status": "Статус",
       "status_0": "",
-      "status_1": "Received"
+      "status_1": "Получено"
     }
   },
+  "CheckIn": {
+    "only_btn": "только нужен $",
+    "take": "Взять",
+    "getMore": "Получить больше фишек",
+    "nota": "Вы не",
+    "title": "Все бонусные дни",
+    "day1": "ДЕНЬ 1",
+    "day2": "ДЕНЬ 2",
+    "day3": "ДЕНЬ 3",
+    "day4": "ДЕНЬ 4",
+    "day5": "ДЕНЬ 5",
+    "day6": "ДЕНЬ 6",
+    "day7": "ДЕНЬ 7",
+    "req_info_error": "Не удалось получить информацию о сервисе",
+    "isChecked": "Вы уже запросили свой бонус сегодня",
+    "isEnd": "Активность завершена",
+    "req_data_error": "Ошибка чтения данных",
+    "must_recharge": "Вы должны пополнить счет, прежде чем продолжить получение бонусов",
+    "btn_to_recharge": "Для пополнения",
+    "last_get": "Следующий бонус в:",
+    "get_success": "Получено успешно"
+  },
   "web": {
     "activity": {
       "redpack_not_available": "Нет RedPack",

+ 51 - 27
src/locales/languages/zh_TW.json

@@ -18,7 +18,8 @@
       "payorder": "支付訂單",
       "msg": "消息",
       "agent_policy": "代理政策",
-      "cashwheel": "免費獲得R$100"
+      "cashwheel": "免費獲得R$100",
+      "check_in": "所有獎勵日"
     },
     "casino": "賭場",
     "slots": "老虎機",
@@ -32,7 +33,8 @@
     "live_support": "現場支持",
     "quest": "任務",
     "spin": "旋轉",
-    "log_out": "登出"
+    "log_out": "登出",
+    "check_in": "報到"
   },
   "tab": {
     "withdraw": "提現",
@@ -492,43 +494,65 @@
     }
   },
   "agent": {
-    "no_data": "No records yet",
-    "get_success": "Successfully received",
-    "get_error": "Failed to collect",
+    "no_data": "目前尚無記錄",
+    "get_success": "成功收到",
+    "get_error": "無法收集",
     "base": {
-      "title_link": "Reference Link",
-      "btn_copy": "Copy",
-      "value": "Value",
-      "title_policy": "Agent Policy",
-      "details": "See details"
+      "title_link": "參考連結",
+      "btn_copy": "複製",
+      "value": "值",
+      "title_policy": "代理政策",
+      "details": "查看詳情"
     },
     "today": {
-      "label_level": "Level",
-      "label_team_size": "Team Size",
-      "label_direct_agent": "Direct Agent",
-      "label_revenue": "Today's Revenue",
-      "label_commission": "Today's Commission"
+      "label_level": "等級",
+      "label_team_size": "團隊大小",
+      "label_direct_agent": "直接代理",
+      "label_revenue": "今日收入",
+      "label_commission": "今日佣金"
     },
     "subs": {
-      "title": "Today's Direct Agent Performance",
-      "label_name": "Agent Name",
-      "label_revenue": "Revenue",
-      "label_commision": "Commission"
+      "title": "今日直接代理表現",
+      "label_name": "代理名稱",
+      "label_revenue": "收入",
+      "label_commision": "佣金"
     },
     "bonus": {
-      "title_bonus": "Commission available",
-      "btn_claim": "Claim",
-      "history": "History",
-      "label_date": "Date",
-      "label_commision": "Commission",
-      "label_claim": "Claim"
+      "title_bonus": "可用佣金",
+      "btn_claim": "聲明",
+      "history": "歷史",
+      "label_date": "日期",
+      "label_commision": "佣金",
+      "label_claim": "聲明"
     },
     "history": {
-      "label_status": "Status",
+      "label_status": "狀態",
       "status_0": "",
-      "status_1": "Received"
+      "status_1": "已收到"
     }
   },
+  "CheckIn": {
+    "only_btn": "只需要 $",
+    "take": "領取",
+    "getMore": "獲得更多籌碼",
+    "nota": "您不是",
+    "title": "所有獎金天數",
+    "day1": "第1天",
+    "day2": "第2天",
+    "day3": "第3天",
+    "day4": "第4天",
+    "day5": "第5天",
+    "day6": "第6天",
+    "day7": "第7天",
+    "req_info_error": "無法獲取服務信息",
+    "isChecked": "您今天已經領取過您的獎金",
+    "isEnd": "活動已結束",
+    "req_data_error": "讀取數據失敗",
+    "must_recharge": "您必須在繼續收取獎金之前進行充值",
+    "btn_to_recharge": "去充值",
+    "last_get": "下一個獎金時間:",
+    "get_success": "領取成功"
+  },
   "web": {
     "activity": {
       "redpack_not_available": "沒有紅包",

+ 10 - 0
src/pages/CheckIn.jsx

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

+ 2 - 0
src/pages/index.jsx

@@ -29,6 +29,7 @@ const AgentHistory=lazy(()=>import("@pages/AgentHistory"));
 const Privacy=lazy(()=>import("@pages/Privacy"));
 const Services=lazy(()=>import("@pages/Services"));
 const KycPolicy=lazy(()=>import("@pages/KycPolicy"));
+const CheckIn=lazy(()=>import("@pages/CheckIn"));
 export default {
     ModulePage:ModulePage,
     Home:Home,
@@ -57,6 +58,7 @@ export default {
     privacy:Privacy,
     services:Services,
     kycPolicy:KycPolicy,
+    checkIn:CheckIn
 }
 export const Header={
     deposit: DepositHeader,

+ 247 - 0
src/widgets/WCheckIn/index.jsx

@@ -0,0 +1,247 @@
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import styles from "./styles.module.scss";
+import {useEffect, useState} from "react";
+import Grow from "@mui/material/Grow";
+import closeImg from '@assets/checkIn/com_tanc_X.png';
+import {useDispatch, useSelector} from "react-redux";
+import {getCheckInData, getCheckInStatus, getNextGetTime} from "@features/checkInSlice";
+import {useNavigate} from "react-router-dom";
+import {ROUTE_PATH} from "@constants/routes";
+import {reqCheckinCheck, reqCheckinGet, reqRedpackCheck} from "@features/api";
+import {REQ_STATUS} from "@api/config";
+import SmallLoading from "@components/SmallLoading";
+import {formatTime} from "@utils/helpers";
+const i18n=global.i18n;
+const imgList={
+    1:{
+        src:require("@assets/checkIn/1.png"),
+        height:"3.2rem"
+    },
+    2:{
+        src:require("@assets/checkIn/1.png"),
+        height:"3.2rem"
+    },
+    3:{
+        src:require("@assets/checkIn/2.png"),
+        height:"3.6rem"
+    },
+    4:{
+        src:require("@assets/checkIn/3.png"),
+        height:"3.9rem"
+    },
+    5:{
+        src:require("@assets/checkIn/3.png"),
+        height:"3.9rem"
+    },
+    6:{
+        src:require("@assets/checkIn/4.png"),
+        height:"4.3rem"
+    },
+    7:{
+        src:require("@assets/checkIn/5.png"),
+        height:"3.7rem"
+    }
+}
+const objInfo={
+    timer:null
+}
+const WCheckIn = ({close}) => {
+    const [open,setOpen]=useState(true);
+    const checkInData=useSelector(getCheckInData);
+    const status=useSelector(getCheckInStatus);
+    const navigate=useNavigate();
+    const dispatch=useDispatch();
+    const NextGetTime=useSelector(getNextGetTime);
+    const [leftTime,setLeftTime]=useState(0);
+    const resetTimer=()=>{
+        if (objInfo.timer!=null){
+            clearInterval(objInfo.timer);
+            objInfo.timer=null;
+        }
+    }
+    useEffect(()=>{
+        // dispatch(reqCheckinCheck());
+        if (checkInData.RewardDay==null||checkInData.RewardDay.length===0){
+            dispatch(reqCheckinCheck());
+        }
+        return ()=>{
+            resetTimer();
+        }
+    },[]);
+    useEffect(()=>{
+        resetTimer();
+        let now=Date.now();
+        let left=NextGetTime-now;
+        if (left>0){
+            setLeftTime(left);
+            objInfo.timer=setInterval(()=>{
+                now=Date.now();
+                left=NextGetTime-now;
+                if (left<=0){
+                    left=0;
+                    dispatch(reqCheckinCheck());
+                    resetTimer();
+                }
+                setLeftTime(left);
+            },1000);
+        }
+    },[NextGetTime])
+    const onClose=()=>{
+        setOpen(false);
+        if(close)close();
+    }
+    const onOpenPay=()=>{
+        navigate("/"+ROUTE_PATH.PAY,{replace:true})
+    }
+    const onCheckInCB=(payload)=>{
+        if (payload&&payload.code===200){
+            global.showDropCoins();
+            close();
+        }
+        // else if (payload&&payload.code===301)
+        // {
+        //     let data={
+        //         content:i18n.t("CheckIn.must_recharge"),
+        //         sureLabel:i18n.t("CheckIn.btn_to_recharge"),
+        //         sureCB:onOpenPay,
+        //     }
+        //     global.msgBoxShow(data)
+        // }
+    }
+    const onCheckIn=(cashNum)=>{
+        if (status.CheckInGet===REQ_STATUS.LOADING)return;
+        if (leftTime>0)return;
+        dispatch(reqCheckinGet({
+            cashNum:cashNum,
+            callback:onCheckInCB
+        }));
+    }
+    const renderBonusList=()=>{
+        let RewardDay=checkInData.RewardDay;
+        if(RewardDay==null)RewardDay=[];
+        let rowData=[
+            RewardDay.slice(0,4),
+            RewardDay.slice(4,7),
+        ]
+        let nDayNumber=checkInData.nDayNumber;
+        if (nDayNumber>7)nDayNumber=7;
+        let cbRecord=checkInData.cbRecord;
+        let itemIndex=0;
+        return (
+            <div className={styles.list_con}>
+                {
+                    rowData.map((rowList,rindex)=>{
+                        return (
+                            <div key={rindex} className={styles.item_con}>
+                                {
+                                    rowList.map((item,index)=>{
+                                        let isDone=cbRecord[itemIndex];
+                                        itemIndex++;
+                                        return (
+                                            <div key={index} className={`${styles.item} ${styles['item_'+item]}`}>
+                                                <button className={`${styles.item_bg} ${nDayNumber===item?styles.item_bg_today:''} ${isDone===1?styles.item_bg_recived:''}`}>
+                                                    <span className={styles.title}>{i18n.t("CheckIn.day"+item)}</span>
+                                                    <div className={styles.img_con}>
+                                                        <img src={imgList[item].src} style={{height:imgList[item].height,width:"auto"}}/>
+                                                    </div>
+                                                </button>
+                                                {
+                                                    isDone===1? (
+                                                        <div className={styles.item_checked}>
+                                                            <img src={require("@assets/checkIn/img_sure.png")}/>
+                                                        </div>
+                                                    ):(<></>)
+                                                }
+                                            </div>
+                                        )
+                                    })
+                                }
+                            </div>
+                        )
+                    })
+                }
+            </div>
+        )
+    }
+    const renderButtons=()=>{
+        let nDayNumber=checkInData.NextDayNumber;
+        if (nDayNumber>7)nDayNumber=7;
+        let RewardScore=checkInData.RewardScore;
+        let cashNum=RewardScore[nDayNumber-1];
+        return (
+            <div className={styles.buttons_con}>
+                <button className={`${styles.btn_base} ${styles.btn_blue}`} onClick={onOpenPay}>
+                    <span className={styles.text_con}>
+                        {i18n.t("CheckIn.getMore")}
+                    </span>
+                </button>
+                <button className={`${styles.btn_base} ${styles.btn_yellow}`} onClick={()=>{
+                    onCheckIn(cashNum);
+                }}>
+                    <img src={require("@assets/checkIn/img_jinbi.png")} className={styles.img_coin}/>
+                    {
+                        status.CheckInGet===REQ_STATUS.LOADING?(<SmallLoading fill={"#FFF"}></SmallLoading>): (
+                            <>
+                                {
+                                    leftTime<=0? (
+                                        <div className={styles.text_take}>
+                                            {i18n.t("CheckIn.take")}
+                                            <span>{global.DOLLAR + cashNum}</span>
+                                        </div>
+                                    ):(
+                                        <div className={styles.text_left}>
+                                            <span className={styles.left_title}>{i18n.t("CheckIn.last_get")}</span>
+                                            <span className={styles.left_timer}>{formatTime(leftTime,true)}</span>
+                                        </div>
+                                    )
+                                }
+                            </>
+                        )
+                    }
+                </button>
+            </div>
+        )
+    }
+    const renderMain = () => {
+        let RewardDay = checkInData.RewardDay;
+        let isLoading=!(RewardDay!=null&&RewardDay.length>0);
+        return (
+            <Grow in={open} timeout={500}>
+            <div className={styles.check_con}>
+                    <div className={styles.title_con}>
+                        {i18n.t("CheckIn.title")}
+                        <button className={styles.close} onClick={onClose}>
+                            <img src={closeImg} alt="close"/>
+                        </button>
+                    </div>
+                    <div className={styles.content_con}>
+                        {
+                            isLoading?(<SmallLoading fill={"#fff"}></SmallLoading>):(
+                                <>
+                                    {renderBonusList()}
+                                    {renderButtons()}
+                                </>
+                            )
+                        }
+
+                    </div>
+                </div>
+            </Grow>
+        )
+    }
+    return (
+        <>
+            <Modal open={open} onClose={onClose} closeAfterTransition>
+                <Fade in={open} timeout={500}>
+                    <div className={styles.container}>
+                        <div className={styles.content}>
+                            {renderMain()}
+                        </div>
+                    </div>
+                </Fade>
+            </Modal>
+        </>
+    )
+}
+export default WCheckIn;

+ 220 - 0
src/widgets/WCheckIn/styles.module.scss

@@ -0,0 +1,220 @@
+//$bg:"./../../assets/checkIn/com_tc_sm_di.jpg";
+$top_bg:"./../../assets/checkIn/img_sz_tc_di.png";
+$item_bg:"./../../assets/checkIn/bg_item_small.png";
+$item_bg_focus:"./../../assets/checkIn/img_item_mask_small.png";
+.container{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+  pointer-events: none;
+  position: relative;
+}
+.content{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 1rem;
+  width: 100%;
+  height: 100%;
+  max-width: 414px;
+  z-index: 1;
+}
+.check_con{
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  aspect-ratio: 689/654;
+  //background: url($bg);
+  //border-radius: var(--border-radius);
+  //background: var(--widget);
+  background-image: linear-gradient(to bottom, #034039, #148943);
+  background-size: 100% 100%;
+  pointer-events: auto;
+  overflow-x: hidden;
+  overflow-y: auto;
+  & .title_con{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    position: relative;
+    width: 100%;
+    aspect-ratio: 689/89;
+    background: url($top_bg) no-repeat;
+    background-size: 89% 100%;
+    color:#FFFF5B;
+    font-size: 1.5rem;
+    font-weight: 600;
+    & .close{
+      display:flex;
+      align-items: center;
+      justify-content: center;
+      position: absolute;
+      z-index: 1;
+      height: 100%;
+      aspect-ratio: 1;
+      top: 0;
+      right: 0;
+      img{
+        width: auto;
+        height: 44%;
+      }
+    }
+  }
+  & .content_con{
+    display: flex;
+    flex-direction: column;
+    padding: 1.2rem;
+    gap: 0.5rem;
+    width: 100%;
+    height: 100%;
+  }
+}
+.list_con{
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  gap: 0.3rem;
+  & .item_con{
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 100%;
+    aspect-ratio: 732/216;
+    & .item{
+      position: relative;
+      height: 100%;
+      & .item_bg{
+        display: flex;
+        flex-direction: column;
+        background: url($item_bg);
+        background-size: 100% 100%;
+        width: 100%;
+        height: 100%;
+        &_today{
+          background: url($item_bg_focus);
+          background-size: 100% 100%;
+        }
+        &_recived{
+          filter: brightness(50%);
+        }
+        & .title{
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          width: 100%;
+          height: 2.4rem;
+          font-size: 0.9rem;
+          font-weight: 600;
+          color: #fff;
+        }
+        & .img_con{
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          width: 100%;
+          height: 100%;
+        }
+      }
+      & .item_checked{
+        position: absolute;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        width: 100%;
+        height: 100%;
+        inset: 0px;
+        z-index: 1;
+        img{
+          width: 2.57rem;
+          height: auto;
+        }
+      }
+    }
+    & .item_1{
+      aspect-ratio: 130/178;
+    }
+    & .item_2{
+      aspect-ratio: 130/178;
+    }
+    & .item_3{
+      aspect-ratio: 150/178;
+    }
+    & .item_4{
+      aspect-ratio: 165/178;
+    }
+    & .item_5{
+      aspect-ratio: 182/178;
+    }
+    & .item_6{
+      aspect-ratio: 200/178;
+    }
+    & .item_7{
+      aspect-ratio: 205/178;
+    }
+  }
+}
+.buttons_con{
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  width: 100%;
+  height: 100%;
+  & .btn_base{
+    display: flex;
+    align-items: center;
+    width: 48%;
+    height: 3rem;
+    border-radius: 3rem;
+    font-size: 1rem;
+    font-weight: 600;
+    color: #fff;
+    gap: 0.5rem;
+    & .text_con{
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+    }
+  }
+  & .btn_blue{
+    background-color: #4b9bf2;
+    text-shadow: -1px -1px 0 #3A72BC, 1px -1px 0 #3A72BC, -1px 1px 0 #3A72BC, ;
+  }
+  & .btn_yellow{
+    background-color: #ffb142;
+    text-shadow: -1px -1px 0 #C66A30, 1px -1px 0 #C66A30, -1px 1px 0 #C66A30, ;
+  }
+  & .img_coin{
+    margin-left: 0.5rem;
+    width: 2rem;
+    height: auto;
+  }
+  & .text_take{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+    margin-right: 2rem;
+    gap: 0.5rem;
+  }
+  & .text_left{
+    display: flex;
+    flex-direction: column;
+    width: 100%;
+    align-items: center;
+    justify-content: center;
+    & .left_title{
+      font-size: 0.8rem;
+    }
+    & .left_timer{
+      font-size: 1.2rem;
+      font-weight: 600;
+    }
+  }
+}

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.