瀏覽代碼

no message

zhejiushizhuce 2 年之前
父節點
當前提交
aa932be89c

+ 1 - 1
src/App.js

@@ -141,7 +141,7 @@ const App = () => {
         if (userID!=0){
             dispatch(connectHall());
             //withdraw
-            dispatch(reqWithdrawBaseInfo());
+            // dispatch(reqWithdrawBaseInfo());
             //turnplate
             // dispatch(reqTurnplateIndex());
             //rest code

+ 32 - 0
src/Global.js

@@ -1,4 +1,6 @@
 import i18n from './locales/index';
+import {LOCAL_WD_PASS, LOCAL_WD_PASS_SET_TIME} from "@constants/localkey";
+import {decrypt, encrypt, localStorageGet, localStorageSet} from "@utils/helpers";
 // import symbol from "@assets/symbol-defs.svg";
 // import symbol_m from "@assets/symbol-mobile.svg";
 global.i18n=i18n;
@@ -21,3 +23,33 @@ global.height=100;
 global.isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
 //游客id 指纹
 global.BFP=null;
+//wd pass
+global.getWDPass=()=>{
+    let pass=localStorageGet(LOCAL_WD_PASS,"");
+    if (pass!=null&&pass!==""){
+        pass=decrypt(pass);
+        let lsettime=localStorageGet(LOCAL_WD_PASS_SET_TIME,"");
+        if (lsettime!=null){
+            lsettime=Number(lsettime);
+            let now=Date.now();
+            let during=now-lsettime;
+            //10m
+            let deadline=10*60*1000;
+            if (during<deadline)return pass;
+            else {
+                localStorageSet(LOCAL_WD_PASS,"");
+                localStorageSet(LOCAL_WD_PASS_SET_TIME,"");
+            }
+        }
+    }
+    return "";
+}
+global.setWDPass=(value)=>{
+    if (value==null)return;
+    if (value!==""){
+        value=encrypt(value);
+    }
+    localStorageSet(LOCAL_WD_PASS,value);
+    localStorageSet(LOCAL_WD_PASS_SET_TIME,Date.now());
+}
+//wd pass

+ 3 - 1
src/api/config.js

@@ -40,9 +40,11 @@ export const APP_PAY_ORDER_LIST=BASE_PREFIX+"pay/orderList";
 //pay
 //withdraw
 export const APP_WITHDRAW_TAX="api/api/withDrawTax";
-export const APP_WITHDRAW_BASE_INFO=BASE_PREFIX+"withdraw/baseInfo";
+export const APP_WITHDRAW_BASE_INFO=BASE_PREFIX+"withDraw/baseInfo";
 export const APP_WITHDRAW_INFO=BASE_PREFIX+"withDraw/getWithDrawInfo";
 export const APP_CHANGE_PAY_PASS=BASE_PREFIX+"changePayPass";
+export const APP_WITHDRAW_RECORD=BASE_PREFIX+"withDraw/record";
+export const APP_WITHDRAW_SET_INFO=BASE_PREFIX+"withDraw/withDrawInfo";
 //withdraw
 //userinfo
 export const APP_GAME_INFO=BASE_PREFIX+"info";

+ 13 - 0
src/assets/singlesvg/mobile-password.svg

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg fill="#3BC117" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" 
+	 width="800px" height="800px" viewBox="0 0 210 256" enable-background="new 0 0 210 256" xml:space="preserve">
+<path d="M174.55,144.5L174.55,144.5c-1.4-4-5-6.5-9.2-6.5H159V23c0-11.708-9.292-21-21-21H25C12.57,2,2,12.57,2,25v183
+	c0,11.9,10.95,22,22.75,22l114.213,0c1.207,0,2.27,0.984,2.18,2.188c-0.095,1.266-1.153,1.812-2.393,1.812h-45.5L128,254h80
+	L174.55,144.5z M82.05,220.2c-3.199,0-5.599-2.399-5.6-5.598c-0.001-3.045,2.557-5.602,5.602-5.602
+	c3.199,0.001,5.598,2.401,5.598,5.6C87.55,217.8,85.25,220.2,82.05,220.2z M144,138h-19.65c-5.3,0-9.8,4.7-9.8,10l0,0
+	c0,5.3,4.5,10,9.8,10h19.8v42H18V31h126V138z M53.68,148.49l-1.447-13.313l11.757,3.003l-1.519-13.096l11.395,2.93l-1.519-13.24
+	l14.868,3.003l9.08-9.08c8.791,1.917,18.377-0.506,25.25-7.38c10.708-10.708,10.744-28.036,0-38.78s-28-10.636-38.672,0.036
+	c-6.801,6.801-9.297,16.315-7.452,25.033L32.59,130.438l0.506,19.535L53.68,148.49z M108.232,75.922
+	c-2.351-2.351-2.388-6.222,0-8.61s6.222-2.388,8.61,0s2.388,6.222,0,8.61C114.418,78.345,110.584,78.273,108.232,75.922z"/>
+</svg>

+ 36 - 0
src/assets/singlesvg/store-pass.svg

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg version="1.1" id="Uploaded to svgrepo.com" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" 
+	 width="800px" height="800px" viewBox="0 0 32 32" xml:space="preserve">
+<style type="text/css">
+	.stone_een{fill:#3BC117;}
+</style>
+<path class="stone_een" d="M9.184,4C9.597,2.837,10.696,2,12,2h8c1.304,0,2.403,0.837,2.816,2H9.184z M27.651,8.314l-1.495,14.198
+	c-0.099,0.937-0.632,1.774-1.44,2.258l-7.173,4.304c-0.475,0.285-1.009,0.427-1.544,0.427s-1.068-0.142-1.543-0.427L7.283,24.77
+	c-0.808-0.485-1.341-1.321-1.44-2.258L4.349,8.314C4.162,6.543,5.551,5,7.332,5h17.335C26.449,5,27.838,6.543,27.651,8.314z
+	 M6.939,9.547c0.017,0,0.035-0.001,0.053-0.003c0.274-0.029,0.474-0.275,0.445-0.549L7.332,8C7.303,7.726,7.049,7.522,6.783,7.555
+	C6.508,7.584,6.309,7.83,6.338,8.104l0.104,0.995C6.469,9.356,6.686,9.547,6.939,9.547z M7.348,13.426
+	c0.018,0,0.035-0.001,0.053-0.003c0.275-0.029,0.474-0.275,0.445-0.549l-0.204-1.935c-0.029-0.275-0.284-0.479-0.549-0.445
+	c-0.275,0.029-0.474,0.275-0.445,0.549l0.204,1.935C6.878,13.235,7.095,13.426,7.348,13.426z M7.755,17.295
+	c0.018,0,0.035-0.001,0.053-0.003c0.275-0.029,0.474-0.275,0.445-0.549l-0.204-1.935C8.02,14.533,7.771,14.331,7.5,14.363
+	c-0.275,0.029-0.474,0.275-0.445,0.549l0.204,1.935C7.285,17.104,7.502,17.295,7.755,17.295z M8.162,21.164
+	c0.018,0,0.035-0.001,0.053-0.003c0.275-0.029,0.474-0.275,0.445-0.549l-0.204-1.935c-0.029-0.274-0.28-0.477-0.549-0.445
+	c-0.275,0.029-0.474,0.275-0.445,0.549l0.204,1.935C7.692,20.973,7.909,21.164,8.162,21.164z M10.402,23.135l-1.668-1
+	c-0.237-0.142-0.544-0.065-0.686,0.171c-0.142,0.237-0.065,0.544,0.171,0.686l1.668,1c0.081,0.048,0.169,0.071,0.257,0.071
+	c0.17,0,0.335-0.086,0.429-0.243C10.716,23.584,10.639,23.277,10.402,23.135z M13.734,25.142l-1.668-1
+	c-0.237-0.142-0.544-0.065-0.686,0.171c-0.142,0.237-0.065,0.544,0.171,0.686l1.668,1c0.081,0.048,0.169,0.071,0.257,0.071
+	c0.17,0,0.335-0.086,0.429-0.243C14.048,25.591,13.971,25.284,13.734,25.142z M17.292,26.309c-0.142-0.237-0.448-0.313-0.686-0.171
+	L16,26.501l-0.598-0.359c-0.237-0.143-0.544-0.065-0.686,0.171S14.651,26.858,14.888,27l0.598,0.358
+	c0.155,0.094,0.333,0.143,0.515,0.143c0.181,0,0.359-0.049,0.515-0.143l0.606-0.364C17.358,26.853,17.435,26.546,17.292,26.309z
+	 M20.628,24.308c-0.142-0.237-0.449-0.313-0.686-0.171l-1.668,1c-0.237,0.142-0.313,0.449-0.171,0.686
+	c0.094,0.156,0.259,0.243,0.429,0.243c0.087,0,0.176-0.023,0.257-0.071l1.668-1C20.694,24.852,20.771,24.544,20.628,24.308z
+	 M23.96,22.306c-0.142-0.237-0.449-0.313-0.686-0.171l-1.668,1c-0.237,0.142-0.313,0.449-0.171,0.686
+	c0.094,0.156,0.259,0.243,0.429,0.243c0.087,0,0.176-0.023,0.257-0.071l1.668-1C24.025,22.85,24.102,22.543,23.96,22.306z
+	 M24.539,18.771c0.029-0.274-0.17-0.521-0.445-0.549c-0.272-0.029-0.521,0.17-0.549,0.445l-0.204,1.935
+	c-0.029,0.274,0.17,0.521,0.445,0.549c0.018,0.002,0.035,0.003,0.053,0.003c0.253,0,0.47-0.191,0.497-0.448L24.539,18.771z
+	 M24.946,14.903c0.029-0.274-0.17-0.521-0.445-0.549c-0.274-0.03-0.521,0.17-0.549,0.445l-0.204,1.934
+	c-0.029,0.274,0.17,0.521,0.445,0.549c0.018,0.002,0.035,0.003,0.053,0.003c0.253,0,0.47-0.191,0.497-0.448L24.946,14.903z
+	 M25.354,11.034c0.029-0.274-0.17-0.521-0.445-0.549c-0.268-0.03-0.521,0.17-0.549,0.445l-0.204,1.935
+	c-0.029,0.274,0.17,0.521,0.445,0.549c0.018,0.002,0.035,0.003,0.053,0.003c0.253,0,0.47-0.191,0.497-0.448L25.354,11.034z
+	 M25.662,8.105c0.029-0.274-0.17-0.521-0.445-0.549C24.949,7.523,24.696,7.726,24.668,8l-0.104,0.995
+	c-0.029,0.274,0.17,0.521,0.445,0.549c0.018,0.002,0.035,0.003,0.053,0.003c0.253,0,0.47-0.191,0.497-0.448L25.662,8.105z"/>
+</svg>

+ 3 - 1
src/constants/localkey.js

@@ -8,4 +8,6 @@ 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";
-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};
+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};

+ 1 - 0
src/constants/routes.js

@@ -29,6 +29,7 @@ const ROUTE_PATH={
     MESSAGE_DETAIL:"#/messageDetail",
     RECHARGE_HISTORY:"#/rechargeHistory",
     WITHDRAW_REACORD:"#/withdrawRecord",
+    SECURITY:"#/security"
 }
 
 export {

+ 14 - 1
src/contexts/themeContext.js

@@ -49,6 +49,9 @@ export const ThemeProvider = ({children}) => {
 
     //show wheel
     const [isShowWheel,setIsShowWheel]=useState(false);
+
+    //show wd pass box
+    const [isShowWDPassBox,setIsShowWDPassBox]=useState(false);
     const isLogin=useSelector(isLogined);
     const user=useSelector(getUserInfo);
     const initWindowSize=()=>{
@@ -104,6 +107,14 @@ export const ThemeProvider = ({children}) => {
                     setIsShowPassPrompt(true);
                     return false;
                 }
+                else
+                {
+                    let pass=global.getWDPass();
+                    if (pass===""){
+                        setIsShowWDPassBox(true);
+                        return false;
+                    }
+                }
             }
         }
         return true;
@@ -165,7 +176,9 @@ export const ThemeProvider = ({children}) => {
                 isShowWheel,
                 setIsShowWheel,
                 installOpen,
-                toggleInstallOpen
+                toggleInstallOpen,
+                isShowWDPassBox,
+                setIsShowWDPassBox
             }}>
             {children}
         </ThemeContext.Provider>

+ 13 - 0
src/db/routes.js

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

+ 60 - 6
src/features/api.js

@@ -18,7 +18,7 @@ import {
     APP_REGISTER,
     APP_ROUTES, APP_TURNPLATE_BONUS, APP_TURNPLATE_HELP, APP_TURNPLATE_INDEX, APP_TURNPLATE_KAN,
     APP_WITHDRAW_BASE_INFO,
-    APP_WITHDRAW_INFO,
+    APP_WITHDRAW_INFO, APP_WITHDRAW_RECORD, APP_WITHDRAW_SET_INFO,
     APP_WITHDRAW_TAX,
     REQ_STATUS
 } from "@api/config";
@@ -292,10 +292,14 @@ export const reqWithdrawTax=createAsyncThunk(
 export const reqWithdrawBaseInfo=createAsyncThunk(
     APP_WITHDRAW_BASE_INFO,
     async (arg, thunkAPI) => {
+        let pass=global.getWDPass();
         let params={
-            url:APP_WITHDRAW_BASE_INFO
+            url:APP_WITHDRAW_BASE_INFO,
+            data:{
+                paypass:pass
+            }
         }
-        const response=await Http.get(params);
+        const response=await Http.post(params);
         return response;
     }
 )
@@ -303,13 +307,15 @@ export const reqWithdrawInfo=createAsyncThunk(
     APP_WITHDRAW_INFO,
     async (arg, thunkAPI) => {
         let {UserID}=arg;
+        let pass=global.getWDPass();
         let params={
             url:APP_WITHDRAW_INFO,
-            params:{
+            data:{
                 // UserID:UserID
+                paypass:pass
             }
         }
-        const response=await Http.get(params);
+        const response=await Http.post(params);
         return response;
     }
 )
@@ -318,13 +324,61 @@ export const reqChangePayPass=createAsyncThunk(
     async (arg, thunkAPI) => {
         let params={
             url:APP_CHANGE_PAY_PASS,
-            data:arg
+            data:{
+                newpassword:arg.newpassword,
+                renewpassword:arg.renewpassword,
+            }
+        }
+        if (arg.oldpassword!=null){
+            params.data.oldpassword=arg.oldpassword;
         }
         const response=await Http.post(params);
         thunkAPI.dispatch(updateUserInfo(response));
         return response;
     }
 )
+export const reqWithdrawRecord=createAsyncThunk(
+    APP_WITHDRAW_RECORD,
+    async (arg,thunkAPI) => {
+        let pass=global.getWDPass();
+        let params={
+            url:APP_WITHDRAW_RECORD,
+            data:{
+                paypass:pass
+            }
+        }
+        const response=await Http.post(params);
+        return response;
+    }
+)
+export const reqWithdrawSetInfo=createAsyncThunk(
+    APP_WITHDRAW_SET_INFO,
+    async (arg,thunkAPI) => {
+        let pass=global.getWDPass();
+        let params={
+            url:APP_WITHDRAW_SET_INFO,
+            data:{
+                paypass:pass,
+                cbPixType:arg.PixType,
+                bank:arg.bank,
+                account:arg.account,
+                userName:arg.userName,
+                phone:arg.phone,
+                PAN:arg.PAN,
+                email:arg.email,
+                IFSC:arg.IFSC,
+                adhaar:arg.adhaar,
+                branceBank:arg.branceBank,
+                PixNum:arg.PixNum
+            }
+        }
+        const response=await Http.post(params);
+        if (response&&response.code===200){
+            thunkAPI.dispatch(reqWithdrawBaseInfo());
+        }
+        return response;
+    }
+)
 //withdraw
 //用户信息
 export const reqGameInfo=createAsyncThunk(

+ 1 - 0
src/features/mainSlice.js

@@ -140,6 +140,7 @@ const reducerRoutes=(state,action)=>{
         if (user){
             if (typeof user=="object"){
                 isLogin=1;
+                // user.InsurePass=0;
                 userInfo=user;
                 //请求pay
                 // global.dispatch(reqPayConfig(user));

+ 77 - 30
src/features/paySlice.js

@@ -5,7 +5,7 @@ import {
     reqFirstPayConfig,
     reqGetAccountsPayInfo,
     reqPaymentOrder, reqPayOrderList,
-    reqRechargeConfig, reqWithdrawBaseInfo, reqWithdrawInfo, reqWithdrawTax
+    reqRechargeConfig, reqWithdrawBaseInfo, reqWithdrawInfo, reqWithdrawRecord, reqWithdrawSetInfo, reqWithdrawTax
 } from "@features/api";
 import {getHttpMsg} from "@utils/helpers";
 import {toast} from "react-toastify";
@@ -115,16 +115,26 @@ const reducerWithdrawBaseInfo=(state,action,arg)=>{
             state.withdrawBaseInfo=data;
         }
     }
+    let callback=arg;
+    if (callback!=null){
+        callback(payload);
+    }
+}
+const withdrawBaseInfoStatus=(state,status,arg)=>{
+    state.status.WithdrawBaseInfo=status;
 }
 const reducerWithdrawInfo=(state,action,arg)=>{
     let payload=action.payload;
     if (payload&&payload.code===200){
         let data=payload.data;
         if (data){
-            state.withdrawInfo=data;
+            if (data.info)state.withdrawInfo=data.info;
         }
     }
 }
+const withdrawInfoStatus=(state,status,arg)=>{
+    state.status.WithdrawInfo=status;
+}
 const reducerChangePayPass=(state,action,arg)=>{
     let payload=action.payload;
     let msg=getHttpMsg(payload);
@@ -133,15 +143,53 @@ const reducerChangePayPass=(state,action,arg)=>{
         if (data){
             // state.withdrawInfo=data;
         }
+        if (arg){
+            if (arg.newpassword!=null){
+                global.setWDPass(arg.newpassword);
+            }
+        }
         toast.success(msg);
     }
     else{
         toast.error(msg);
     }
+    if (arg&&arg.callback!=null){
+        arg.callback(payload);
+    }
 }
 const changePayPassStatus=(state,status,arg)=>{
     state.status.ChangePayPass=status;
 }
+const reducerWithdrawRecord=(state,action,arg)=>{
+    let payload=action.payload;
+    if (payload&&payload.code===200){
+        let data=payload.data;
+        if (data&&data.data){
+            state.withdrawRecord=data.data;
+        }
+    }
+}
+const withdrawRecordStatus=(state,status,arg)=>{
+    state.status.WithdrawRecoard=status;
+}
+const reducerWithdrawSetInfo=(state,action,arg)=>{
+    let payload=action.payload;
+    let msg=payload.msg;
+    if (msg==null)msg="";
+    if (payload&&payload.code===200){
+        let data=payload.data;
+        toast.success(msg);
+    }
+    else {
+        toast.error(msg);
+    }
+    if (arg&&arg.callback!=null){
+        arg.callback(payload);
+    }
+}
+const withdrawSetInfoStatus=(state,status,arg)=>{
+    state.status.WithdrawSetInfo=status;
+}
 export const Pay=createSlice({
     name: 'pay',
     initialState: {
@@ -152,7 +200,10 @@ export const Pay=createSlice({
             PaymentOrder:REQ_STATUS.NONE,
             ChangePayPass:REQ_STATUS.NONE,
             PayOrderList:REQ_STATUS.NONE,
-            WithdrawRecoard:REQ_STATUS.NONE
+            WithdrawRecoard:REQ_STATUS.NONE,
+            WithdrawBaseInfo:REQ_STATUS.NONE,
+            WithdrawInfo:REQ_STATUS.NONE,
+            WithdrawSetInfo:REQ_STATUS.NONE,
         },
         config:[],
         payconfig:null,
@@ -163,29 +214,8 @@ export const Pay=createSlice({
         withdrawBaseInfo:null,
         withdrawInfo:null,
         payOrderList:null,
-        withdrawRecord:[
-            {
-                CreateDate:1716706224,
-                OrderID:"BR12345678901",
-                State:2,
-                ExchangeScore:10000,
-                Fee:1000
-            },
-            {
-                CreateDate:1716706224,
-                OrderID:"BR12345678901",
-                State:2,
-                ExchangeScore:10000,
-                Fee:1000
-            },
-            {
-                CreateDate:1716706224,
-                OrderID:"BR12345678901",
-                State:3,
-                ExchangeScore:10000,
-                Fee:1000
-            }
-        ]
+        withdrawRecord:null,
+        changePayPassType:0
     },
     reducers: {
         updatePayFinish:((state, action) => {
@@ -194,7 +224,10 @@ export const Pay=createSlice({
             }
             //充值完成 message={Golds:12.xx,PayNum:10}
             toast.success(i18n.t("deposit.order_info.success"));
-        })
+        }),
+        setChangePayPassType:((state, action) => {
+            state.changePayPassType=action.payload;
+        }),
     },
     extraReducers: (builder) => {
         buildReqReducer(builder,reqRechargeConfig,reducerRechargeConfig,rechargeConfigStatus);
@@ -202,13 +235,15 @@ export const Pay=createSlice({
         buildReqReducer(builder,reqGetAccountsPayInfo,reducerGetAccountsPayInfo,getAccountsPayInfoStatus);
         buildReqReducer(builder,reqPaymentOrder,reducerPaymentOrder,paymentOrderStatus);
         buildReqReducer(builder,reqWithdrawTax,reducerWithdrawTax,null);
-        buildReqReducer(builder,reqWithdrawBaseInfo,reducerWithdrawBaseInfo,null);
-        buildReqReducer(builder,reqWithdrawInfo,reducerWithdrawInfo,null);
+        buildReqReducer(builder,reqWithdrawBaseInfo,reducerWithdrawBaseInfo,withdrawBaseInfoStatus);
+        buildReqReducer(builder,reqWithdrawInfo,reducerWithdrawInfo,withdrawInfoStatus);
         buildReqReducer(builder,reqChangePayPass,reducerChangePayPass,changePayPassStatus);
         buildReqReducer(builder,reqPayOrderList,reducerPayOrderList,payOrderListStatus);
+        buildReqReducer(builder,reqWithdrawRecord,reducerWithdrawRecord,withdrawRecordStatus);
+        buildReqReducer(builder,reqWithdrawSetInfo,reducerWithdrawSetInfo,withdrawSetInfoStatus);
     },
 })
-export const {updatePayFinish} = Pay.actions;
+export const {updatePayFinish,setChangePayPassType} = Pay.actions;
 export const getConfig=(state)=>{
     return state.pay.config;
 }
@@ -283,6 +318,18 @@ export const getWithdrawRecord=(state)=>{
 export const getWithdrawTax=(state)=>{
     return state.pay.WithDrawTax;
 }
+export const getWDBaseInfoStatus=(state)=>{
+    return state.pay.status.WithdrawBaseInfo;
+}
+export const getWDSetInfoStatus=(state)=>{
+    return state.pay.status.WithdrawSetInfo;
+}
+export const getWDInfoStatus=(state)=>{
+    return state.pay.status.WithdrawInfo;
+}
+export const getChangePayPassType=(state)=>{
+    return state.pay.changePayPassType;
+}
 export default Pay.reducer;
 
 export const reqPayConfig=(dispatch,userInfo)=>{

+ 7 - 13
src/layout/Layout.jsx

@@ -24,17 +24,20 @@ import WDPassPrompt from "@widgets/WWithdraw/PassPrompt/WDPassPrompt";
 import useAuthLockRoute from "@hooks/useAuthLockRoute";
 import WHallWheel from "@widgets/WCashWheel/WHallWheel/WHallWheel";
 import LoadingIn from "@components/Loading/LoadingIn";
+import WDPassBox from "@widgets/WWithdraw/PassBox/WDPassBox";
+import {ROUTE_PATH} from "@constants/routes";
 const PageNotFound = lazy(() => import('@pages/PageNotFound'));
 
 const Layout=()=>{
     const appRef = useRef(null);
     const msgBoxRef=useRef(null);
-    const {isMobile,isShowWheel, setIsShowWheel} = useThemeProvider();
+    const {isMobile,isShowWheel, setIsShowWheel,isShowWDPassBox,setIsShowWDPassBox} = useThemeProvider();
     const {pathname, search, hash} = useLocation();
     const isFull = useSelector(isFullRoute(pathname));
     const inRoutes=useSelector(routesIn);
     const popRoutes=useSelector(routesPop);
     const isLogin=useSelector(isLogined);
+    const navigate=useNavigate();
     // const {setLockPath}=useAuthLockRoute();
     useEffect(() => {
         // scroll to top on route change
@@ -76,18 +79,6 @@ const Layout=()=>{
         )
     }
     const renderHash=()=>{
-        // return (
-        //     <div className="app-hash">
-        //         {/*<Suspense>*/}
-        //         {/*    */}
-        //         {/*</Suspense>*/}
-        //         <CHashRouter routes={popRoutes} hlocation={{
-        //             pathname: pathname,
-        //             search: search,
-        //             hash: hash
-        //         }} basePath={pathname}/>
-        //     </div>
-        // )
         return (
             <CHashRouter isLogin={isLogin} routes={popRoutes} hlocation={{
                 pathname: pathname,
@@ -102,6 +93,9 @@ const Layout=()=>{
                 <WLangSelect/>
                 <MsgBox ref={msgBoxRef}/>
                 <WDPassPrompt/>
+                <WDPassBox open={isShowWDPassBox} onClose={()=>{
+                    setIsShowWDPassBox(false);
+                }}/>
                 <WHallWheel open={isShowWheel} onClose={()=>{
                     setIsShowWheel(false);
                 }}></WHallWheel>

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

@@ -275,6 +275,7 @@
       "prompt": "For the security of your funds, please set up a fund password first",
       "btn_confirm": "Confirm",
       "edit_title": "Configure Withdraw Password",
+      "old_pass": "Old Withdraw Password",
       "new_pass": "New Withdraw Password",
       "re_pass": "Confirm New Password",
       "btn_submit": "Withdraw Now",
@@ -411,5 +412,12 @@
     "tips":"Ops,There are no new emails at the moment!!",
     "TopTip_qxlqyxjl": "Please receive the mail reward first",
     "TopTip_jscsyydyj": "All emails that have been read and have received attachment rewards will be deleted"
+  },
+  "security": {
+    "title": "Security Setup",
+    "login_pass_title": "Change Login Password",
+    "login_pass_des": "Change your login password regularly to keep it unique and secure.",
+    "withdraw_pass_title": "Change Withdraw Password",
+    "withdraw_pass_des": "Change your withdraw password regularly to keep it unique and secure."
   }
 }

+ 10 - 0
src/pages/Security.jsx

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

+ 4 - 2
src/pages/index.jsx

@@ -20,7 +20,8 @@ const CashWheel=lazy(()=>import("@pages/CashWheel"));
 const Mail=lazy(()=>import("@pages/Mail"));
 const MailDetail=lazy(()=>import("@pages/MailDetail"));
 const RechargeHistory=lazy(()=>import("@pages/RechargeHistory"));
-const WithdrawRecord=lazy(()=>import("@pages/WithdrawRecord"))
+const WithdrawRecord=lazy(()=>import("@pages/WithdrawRecord"));
+const Security=lazy(()=>import("@pages/Security"));
 export default {
     ModulePage:ModulePage,
     Home:Home,
@@ -40,7 +41,8 @@ export default {
     mail:Mail,
     mailDetail:MailDetail,
     rechargeHistory:RechargeHistory,
-    withdrawRecord:WithdrawRecord
+    withdrawRecord:WithdrawRecord,
+    security:Security
 }
 export const Header={
     deposit: DepositHeader,

+ 8 - 0
src/styles/theme.js

@@ -107,6 +107,14 @@ export default createGlobalStyle`
         light: '#FFFFFF',
         dark: '#2f3036',
     })};
+      --card-bg-2: ${theme('theme', {
+          light: 'rgba(130,130,130,0.3)',
+          dark: '#31343c',
+      })};
+      --card-bg-3: ${theme('theme', {
+          light: 'rgba(55,58,63,0.3)',
+          dark: '#373a3f',
+      })};
     --card-line: ${theme('theme', {
         light: 'rgba(0,0,0,.05)',
         dark: 'rgba(255,255,255,.05)',

+ 107 - 5
src/utils/helpers.js

@@ -244,8 +244,110 @@ export const getUrlParam=(name)=>{
 
     return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(url) || [, ""])[1].replace(/\+/g, '%20')) || null;
 }
-// export const preventTouchMove=()=>{
-//     document.addEventListener('touchmove',(event)=>{
-//         event.preventDefault();
-//     }, { passive: false });
-// }
+//简单加密
+export const encrypt=(str, pwd)=>{
+    if(str == '') {
+        return '';
+    }
+    str = encodeURIComponent(str);
+    if(!pwd || pwd == '') {
+        pwd = 'xbd4jl';
+    }
+    pwd = encodeURIComponent(pwd);
+    if(pwd == '' || pwd.length <= 0) {
+        return '';
+    }
+    var prand= '';
+    for(var i = 0, len = pwd.length; i < len; i += 1) {
+        prand += pwd.charCodeAt(i).toString();
+    }
+    var sPos = Math.floor(prand.length / 5);
+    var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) +
+        prand.charAt(sPos * 4) + prand.charAt(sPos * 5));
+    var incr = Math.ceil(pwd.length / 2);
+    var modu = Math.pow(2, 31) - 1;
+    if(mult < 2) {
+        return '';
+    }
+    var salt = Math.round(Math.random() * 1000000000) % 100000000;
+    prand += salt;
+    while(prand.length > 10) {
+        let left=prand;
+        let num=0;
+        while(left.length>0){
+            let temp=parseInt(left.substring(0, 10));
+            num=num+temp;
+            left=left.substring(10,left.length);
+        }
+        prand=num.toString();
+    }
+    prand = (mult * prand + incr) % modu;
+    var encChr= '';
+    var encStr = '';
+    for(var i = 0, len = str.length; i < len; i += 1) {
+        encChr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255));
+        if(encChr < 16) {
+            encStr += '0' + encChr.toString(16);
+        }else{
+            encStr += encChr.toString(16);
+        }
+        prand = (mult * prand + incr) % modu;
+    }
+    salt = salt.toString(16);
+    while(salt.length < 8) {
+        salt = "0" + salt;
+    }
+    encStr += salt;
+    return encStr;
+}
+//简单解密
+export const decrypt=(str, pwd)=>{
+    if(str == ''){
+        return '';
+    }
+    if(!pwd || pwd == ''){
+        pwd = 'xbd4jl';
+    }
+    pwd = encodeURIComponent(pwd);
+    if(str == undefined || str.length < 8) {
+        return '';
+    }
+    if(pwd == undefined || pwd.length <= 0) {
+        return '';
+    }
+    var prand = '';
+    for(var i = 0, len = pwd.length; i < len; i += 1) {
+        prand += pwd.charCodeAt(i).toString();
+    }
+    var sPos = Math.floor(prand.length / 5);
+    // console.log(prand.length+"sPos____"+sPos+"prand"+prand);
+    var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) +
+        prand.charAt(sPos * 4) + prand.charAt(sPos * 5));
+    var incr = Math.round(pwd.length / 2);
+    var modu = Math.pow(2, 31) - 1;
+    var salt = parseInt(str.substring(str.length - 8, str.length), 16);
+    str = str.substring(0, str.length - 8);
+    // console.log("prand"+prand);
+    prand += salt;
+    // console.log("prand"+prand);
+    while(prand.length > 10) {
+        let left=prand;
+        let num=0;
+        while(left.length>0){
+            let temp=parseInt(left.substring(0, 10));
+            num=num+temp;
+            left=left.substring(10,left.length);
+        }
+        prand=num.toString();
+    }
+    // console.log("prand"+prand);
+    prand = (mult * prand + incr) % modu;
+    var encChr= '';
+    var encStr= '';
+    for(var i = 0, len = str.length; i < len; i += 2) {
+        encChr = parseInt(parseInt(str.substring(i, i + 2), 16) ^ Math.floor((prand / modu) * 255));
+        encStr += String.fromCharCode(encChr);
+        prand = (mult * prand + incr) % modu;
+    }
+    return decodeURIComponent(encStr);
+}

+ 2 - 1
src/widgets/UserSettings/index.jsx

@@ -170,7 +170,8 @@ const UserSettings=()=>{
                 {
                     isLogin?(
                         <button className={styles.action_item} onClick={()=>{
-                            navigate(ROUTE_PATH.EDIT_PWD);
+                            // navigate(ROUTE_PATH.EDIT_PWD);
+                            navigate(ROUTE_PATH.SECURITY);
                         }}>
                             <div className={styles.action_left}>
                                 <SvgIcon className={styles.icon} herf={"icon_Locked"}></SvgIcon>

+ 52 - 0
src/widgets/WSecurity/index.jsx

@@ -0,0 +1,52 @@
+import styles from './styles.module.scss';
+import Spring from "@components/Spring";
+import {ReactComponent as PhonePassIcon} from "@assets/singlesvg/mobile-password.svg";
+import {ReactComponent as WithdrawPassIcon} from "@assets/singlesvg/store-pass.svg";
+
+import React from "react";
+import {useNavigate} from "react-router-dom";
+import {ROUTE_PATH} from "@constants/routes";
+import {useDispatch, useSelector} from "react-redux";
+import {getUserInfo} from "@features/mainSlice";
+import {setChangePayPassType} from "@features/paySlice";
+
+const i18n=global.i18n;
+const WSecurity = ({ close }) => {
+    const navigate = useNavigate();
+    const user=useSelector(getUserInfo);
+    const dispatch = useDispatch();
+    return (
+        <div className={styles.container}>
+            <Spring className={styles.content} type={"slideUp"}>
+                <div className={`${styles.title_con} ${styles.title}`}>
+                    {i18n.t("security.title")}
+                </div>
+                <div className={styles.line}></div>
+                <div className={styles.item}>
+                    <div className={styles.item_title_con}>
+                        <PhonePassIcon className={styles.icon}></PhonePassIcon>
+                        <div className={styles.title}>{i18n.t("security.login_pass_title")}</div>
+                    </div>
+                    <div>{i18n.t("security.login_pass_des")}</div>
+                    <button className={`button-green ${styles.button}`} onClick={()=>{
+                        navigate(ROUTE_PATH.EDIT_PWD)
+                    }}>{i18n.t("security.login_pass_title")}</button>
+                </div>
+                <div className={styles.item}>
+                    <div className={styles.item_title_con}>
+                        <WithdrawPassIcon className={styles.icon}></WithdrawPassIcon>
+                        <div className={styles.title}>{i18n.t("security.withdraw_pass_title")}</div>
+                    </div>
+                    <div>{i18n.t("security.withdraw_pass_des")}</div>
+                    <button className={`button-green ${styles.button}`} onClick={()=>{
+                        let InsurePass=Number(user.InsurePass);
+                        let type=InsurePass;
+                        dispatch(setChangePayPassType(InsurePass));
+                        navigate(ROUTE_PATH.CHANGE_PAY_PASS)
+                    }}>{i18n.t("security.withdraw_pass_title")}</button>
+                </div>
+            </Spring>
+        </div>
+    )
+}
+export default WSecurity;

+ 52 - 0
src/widgets/WSecurity/styles.module.scss

@@ -0,0 +1,52 @@
+.container{
+  width: 100%;
+  min-height: 100%;
+  background-color: var(--widget-bg);
+  padding: 1rem;
+}
+.content{
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  gap: 1rem;
+  border-radius:var(--border-radius);
+  background-color: var(--card-bg-2);
+  padding: 1rem;
+  border: 1px solid #98a7b514;
+  & .title{
+    color: var(--header);
+    font-size: 1rem;
+    font-weight: 600;
+  }
+  & .title_con{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: space-between;
+  }
+  & .line{
+    border-top: 1px solid var(--card-line);
+  }
+  & .item{
+    display: flex;
+    flex-direction: column;
+    padding: 1rem;
+    gap: 1rem;
+    background-color: var(--card-bg-3);
+    border-radius:var(--border-radius);
+    color: var(--text);
+    & .item_title_con{
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      gap: 0.5rem;
+    }
+    & .icon{
+      width: 1.8rem;
+      height: 1.8rem;
+    }
+    & .button{
+      height: 2.25rem;
+    }
+  }
+}

+ 39 - 13
src/widgets/WWithdraw/BR/BRAccountEdit.jsx

@@ -3,23 +3,33 @@ import Spring from "@components/Spring";
 import React, {useEffect} from "react";
 import {ReactComponent as PixLogo} from "@assets/singlesvg/pix.svg";
 import {useDispatch, useSelector} from "react-redux";
-import {getWithdrawBaseInfo, getWithdrawInfo} from "@features/paySlice";
+import {
+    getWDBaseInfoStatus,
+    getWDInfoStatus,
+    getWDSetInfoStatus,
+    getWithdrawBaseInfo,
+    getWithdrawInfo
+} from "@features/paySlice";
 import SmallLoading from "@components/SmallLoading";
-import {reqWithdrawInfo} from "@features/api";
+import {reqWithdrawBaseInfo, reqWithdrawInfo, reqWithdrawSetInfo} from "@features/api";
 import {Controller, useForm} from "react-hook-form";
 import PasswordInput from "@components/UInput/PasswordInput";
 import classNames from "classnames";
 import {APP_GENDER} from "@constants/app";
 import {getUserInfo} from "@features/mainSlice";
+import {REQ_STATUS} from "@api/config";
 const i18n=global.i18n;
-const BRAccountEdit=()=>{
+const BRAccountEdit=({close})=>{
     const user=useSelector(getUserInfo);
+    const baseStatus=useSelector(getWDBaseInfoStatus);
+    const setStatus=useSelector(getWDSetInfoStatus);
+    const infoStatus=useSelector(getWDInfoStatus);
     let info=useSelector(getWithdrawInfo);
     // if (info==null)info={};
     let dinfo=info==null?{}:info;
     const dispatch=useDispatch();
     const {register, handleSubmit, formState: {errors}, control} = useForm({
-        defaultValues: {
+        values: {
             account: dinfo.AccountsBank||"",
             userName: dinfo.BankUserName||"",
             bank: dinfo.BankNO||"",
@@ -36,8 +46,23 @@ const BRAccountEdit=()=>{
     useEffect(()=>{
         dispatch(reqWithdrawInfo({UserID:user.UserID}));
     },[])
+    const checkLockStatus=()=>{
+        if (baseStatus===REQ_STATUS.LOADING)return true;
+        if (setStatus===REQ_STATUS.LOADING)return true;
+        return false;
+    }
+    // const callbackBase=(data)=>{
+    //     if (close)close();
+    // }
+    const callback=(data)=>{
+        if (data&&data.code===200){
+            // dispatch(reqWithdrawBaseInfo(callbackBase));
+        }
+    }
     const handleChange=(data)=>{
-
+        if (checkLockStatus())return;
+        data.callback=callback;
+        dispatch(reqWithdrawSetInfo(data));
     }
     const renderPixLogo=()=>{
         return (
@@ -127,24 +152,24 @@ const BRAccountEdit=()=>{
                                 <div className={styles.form_item}>
                                     <div className={styles.title}>{i18n.t("withdraw.account.cpf_dict")}</div>
                                     <div className={styles.pix_con}>
-                                        <button type={"button"} className={`${styles.radio_btn} ${value==="0"?styles.active:''}`} onClick={()=>{
-                                            onChange("0");
+                                        <button type={"button"} className={`${styles.radio_btn} ${value==="1"?styles.active:''}`} onClick={()=>{
+                                            onChange("1");
                                         }}>
                                             <div className={styles.circle}>
                                                 <div className={styles.dot}/>
                                             </div>
                                             <div>{i18n.t("withdraw.account.cpf")}</div>
                                         </button>
-                                        <button type={"button"} className={`${styles.radio_btn} ${value==="1"?styles.active:''}`} onClick={()=>{
-                                            onChange("1");
+                                        <button type={"button"} className={`${styles.radio_btn} ${value==="2"?styles.active:''}`} onClick={()=>{
+                                            onChange("2");
                                         }}>
                                             <div className={styles.circle}>
                                                 <div className={styles.dot}/>
                                             </div>
                                             <div>{i18n.t("withdraw.account.e_mail")}</div>
                                         </button>
-                                        <button type={"button"} className={`${styles.radio_btn} ${value==="2"?styles.active:''}`} onClick={()=>{
-                                            onChange("2");
+                                        <button type={"button"} className={`${styles.radio_btn} ${value==="3"?styles.active:''}`} onClick={()=>{
+                                            onChange("3");
                                         }}>
                                             <div className={styles.circle}>
                                                 <div className={styles.dot}/>
@@ -156,7 +181,8 @@ const BRAccountEdit=()=>{
                             )}
                 />
                 <button className={"button-green"}>
-                    {i18n.t("withdraw.account.btn_save")}
+                    {checkLockStatus()?(<SmallLoading fill={"#FFF"}></SmallLoading>):i18n.t("withdraw.account.btn_save")}
+                    {/*{i18n.t("withdraw.account.btn_save")}*/}
                 </button>
                 <div className={styles.tips}>{i18n.t("withdraw.account.help")}</div>
             </form>
@@ -165,7 +191,7 @@ const BRAccountEdit=()=>{
     return (
         <>
             {
-                info==null?(
+                infoStatus===REQ_STATUS.LOADING?(
                     <div className={styles.loading}>
                         <SmallLoading/>
                     </div>

+ 11 - 3
src/widgets/WWithdraw/BR/BRWithdraw.jsx

@@ -1,7 +1,7 @@
 import Spring from "@components/Spring";
 import styles from "./styles.module.scss";
-import React, {useState} from "react";
-import {useSelector} from "react-redux";
+import React, {useState,useEffect} from "react";
+import {useDispatch, useSelector} from "react-redux";
 import {getUserInfo} from "@features/mainSlice";
 import {numFormatter, stringFormat} from "@utils/helpers";
 import {getWithdrawBaseInfo} from "@features/paySlice";
@@ -10,6 +10,8 @@ import {ReactComponent as Edit} from '@assets/singlesvg/edit.svg';
 import {useNavigate} from "react-router-dom";
 import {ROUTE_PATH} from "@constants/routes";
 import WDPassBox from "@widgets/WWithdraw/PassBox/WDPassBox";
+import SmallLoading from "@components/SmallLoading";
+import {reqWithdrawBaseInfo} from "@features/api";
 const i18n=global.i18n;
 const BRWithdraw=()=>{
     const user=useSelector(getUserInfo);
@@ -20,6 +22,12 @@ const BRWithdraw=()=>{
     const [wdValue,setWdValue]=useState("");
     const [wdPass,setWdPass]=useState("");
     const [openPassBox,setOpenPassBox]=useState(false);
+    const dispatch = useDispatch();
+    useEffect(()=>{
+       if (info==null){
+           dispatch(reqWithdrawBaseInfo())
+       }
+    },[])
     const getShowCash=(value)=>{
         value=Number(value);
         return value/global.CASH_BASE;
@@ -191,7 +199,7 @@ const BRWithdraw=()=>{
     return (
         <>
             {
-                info==null?(<></>):(
+                info==null?(<div className={"w-100vw h-100vh"}><SmallLoading /></div>):(
                     <Spring type="slideUp" className={styles.container}>
                         {renderUser()}
                         {renderWithdrawValue()}

+ 41 - 5
src/widgets/WWithdraw/PassBox/WDPassBox.jsx

@@ -6,15 +6,49 @@ import Modal from "@mui/material/Modal";
 import MultiNumPassInput from "@components/UInput/MultiNumPassInput";
 import classNames from "classnames";
 import React, {useState} from "react";
+import {useDispatch, useSelector} from "react-redux";
+import {getWDBaseInfoStatus} from "@features/paySlice";
+import {REQ_STATUS} from "@api/config";
+import SmallLoading from "@components/SmallLoading";
+import {reqWithdrawBaseInfo} from "@features/api";
+import {getHttpMsg} from "@utils/helpers";
+import {toast} from "react-toastify";
+import {useNavigate} from "react-router-dom";
+import {ROUTE_PATH} from "@constants/routes";
+const i18n=global.i18n;
 
-const WDPassBox=({...props})=>{
-    const {open,onClose,title,confirmLabel,onConfirm}=props;
+const WDPassBox=({open,onClose,title,confirmLabel,onConfirm})=>{
+    // let {open,onClose,title,confirmLabel,onConfirm}=props;
     const [pass,setPass]=useState("");
+    if (title==null)title=i18n.t("withdraw.pass.pass_box_title");
+    if (confirmLabel==null)confirmLabel=i18n.t("withdraw.pass.btn_confirm");
     const passLen=6;
+    const status=useSelector(getWDBaseInfoStatus);
+    const dispatch=useDispatch();
+    const navigate=useNavigate();
+    const callback=(data)=>{
+        if (data==null)return;
+        if (data.code==200){
+            if (onClose)onClose();
+            navigate(ROUTE_PATH.SAQUE);
+        }
+        else
+        {
+            global.setWDPass("");
+            let msg=getHttpMsg(data);
+            toast.error(msg);
+        }
+    }
+    const checkPass=(pass)=>{
+        global.setWDPass(pass);
+        dispatch(reqWithdrawBaseInfo(callback));
+    }
     const onSubmit=(pass)=>{
         if (pass.length<passLen)return;
-        if (onConfirm!=null)onConfirm(pass);
-        if (onClose)onClose();
+        if (status===REQ_STATUS.LOADING)return;
+        // if (onConfirm!=null)onConfirm(pass);
+        // if (onClose)onClose();
+        checkPass(pass)
     }
     return (
         <Modal open={open} onClose={onClose} closeAfterTransition>
@@ -40,7 +74,9 @@ const WDPassBox=({...props})=>{
                                     <button className={"button-green"} onClick={()=>{
                                         onSubmit(pass);
                                     }}>
-                                        {confirmLabel}
+                                        {
+                                            status===REQ_STATUS.LOADING?(<SmallLoading fill={"#fff"} />):confirmLabel
+                                        }
                                     </button>
                                 </div>
                             </div>

+ 55 - 7
src/widgets/WWithdraw/PassEdit/WDPassEdit.jsx

@@ -11,7 +11,7 @@ import {useDispatch, useSelector} from "react-redux";
 import {getUserInfo} from "@features/mainSlice";
 import {toast} from "react-toastify";
 import {reqChangePayPass} from "@features/api";
-import {getChangePayPassStatus} from "@features/paySlice";
+import {getChangePayPassStatus, getChangePayPassType} from "@features/paySlice";
 import {REQ_STATUS} from "@api/config";
 import SmallLoading from "@components/SmallLoading";
 const i18n=global.i18n;
@@ -20,21 +20,37 @@ const WDPassEdit=({close})=>{
     const dispatch=useDispatch();
     const user=useSelector(getUserInfo);
     const status=useSelector(getChangePayPassStatus);
+    const editType=useSelector(getChangePayPassType);
+    const [showType,setShowType]=useState(0)
     const passLen=6;
     const {register, handleSubmit, formState: {errors}, control} = useForm({
         defaultValues: {
+            oldpassword:"",
             password: "",
             repassword:""
         }
     });
-    const [focusIndex,setFocusIndex]=useState(0);
+    const [focusIndex,setFocusIndex]=useState(editType===0?0:-1);
+    const callback=(data)=>{
+        if (data&&data.code===200){
+            setShowType(1);
+        }
+    }
     const onSubmitPass=(data)=>{
         if (status===REQ_STATUS.LOADING)return;
         if (data.password!==data.repassword){
             toast.error(i18n.t("withdraw.pass.tips.err_not_same"));
             return;
         }
-        dispatch(reqChangePayPass(data));
+        let pdata={
+            newpassword:data.password,
+            renewpassword:data.repassword
+        }
+        if (editType===1){
+            pdata.oldpassword=data.oldpassword;
+        }
+        pdata.callback=callback;
+        dispatch(reqChangePayPass(pdata));
     }
     const renderTitle=()=>{
         return (
@@ -97,6 +113,33 @@ const WDPassEdit=({close})=>{
             />
         )
     }
+    const renderOldPass=()=>{
+        return (
+            <Controller control={control}
+                        name="oldpassword"
+                        rules={{required: true}}
+                        render={({field: {ref, onChange, value}, fieldState: {error}}) => (
+                            <div className={styles.password}>
+                                <div>{i18n.t("withdraw.pass.old_pass")}</div>
+                                <MultiNumPassInput
+                                    focus={focusIndex===-1}
+                                    length={passLen}
+                                    className={classNames({'input-control--error': error})}
+                                    value={value}
+                                    onChange={(num,index)=>{
+                                    }}
+                                    onFinish={(numArr)=>{
+                                        let value=numArr.join("");
+                                        onChange(value);
+                                        setFocusIndex(focusIndex+1);
+                                    }}
+                                    innerRef={ref}
+                                />
+                            </div>
+                        )}
+            />
+        )
+    }
     const renderSubmit=()=>{
         return (
             <div className={styles.btn_con}>
@@ -112,6 +155,7 @@ const WDPassEdit=({close})=>{
                 onSubmitPass(data);
             })}>
                 {renderTitle()}
+                {editType===1?renderOldPass():(<></>)}
                 {renderPass()}
                 {renderRePass()}
                 {renderSubmit()}
@@ -126,7 +170,8 @@ const WDPassEdit=({close})=>{
                 <div>{i18n.t("withdraw.pass.tips.des")}</div>
                 <div className={styles.btns_con}>
                     <button className={"button-gray"} onClick={()=>{
-                        if (close)close()
+                        // if (close)close()
+                        navigate("",{replace:true})
                     }}>
                         {i18n.t("withdraw.pass.tips.btn_back")}
                     </button>
@@ -140,9 +185,12 @@ const WDPassEdit=({close})=>{
         )
     }
     const renderContent=()=>{
-        let InsurePass=Number(user.InsurePass);
-        if (InsurePass===1)return renderSuccess();
-        else return renderForm();
+        // let InsurePass=Number(user.InsurePass);
+        // if (InsurePass===1)return renderSuccess();
+        // else return renderForm();
+
+        if (showType===0)return renderForm();
+        else return renderSuccess();
     }
     return (
         <>

+ 4 - 0
src/widgets/WWithdraw/PassPrompt/WDPassPrompt.jsx

@@ -8,15 +8,19 @@ import {ReactComponent as Imgbg} from '@assets/wdpop/copy-url-bg.svg';
 import bannerImg from '@assets/wdpop/popup_icon001.png';
 import {useNavigate} from "react-router";
 import {ROUTE_PATH} from "@constants/routes";
+import {useDispatch} from "react-redux";
+import {setChangePayPassType} from "@features/paySlice";
 const i18n=global.i18n;
 const WDPassPrompt=()=>{
     const {isMobile,isShowPassPrompt,setIsShowPassPrompt} = useThemeProvider();
     const navigate=useNavigate();
+    const dispatch = useDispatch();
     const onClose=()=>{
         setIsShowPassPrompt(false);
     }
     const onConfirm=()=>{
         setIsShowPassPrompt(false);
+        dispatch(setChangePayPassType(0));
         navigate(ROUTE_PATH.CHANGE_PAY_PASS);
     }
     return (

+ 23 - 11
src/widgets/WWithdraw/WWithdrawRecord/WWithdrawRecord.jsx

@@ -1,5 +1,5 @@
 import styles from './styles.module.scss';
-import {useSelector} from "react-redux";
+import {useDispatch, useSelector} from "react-redux";
 import {getWithdrawRecord, getWithdrawRecordStatus} from "@features/paySlice";
 import React, {useEffect, useState} from "react";
 import {REQ_STATUS} from "@api/config";
@@ -13,6 +13,8 @@ import Popup from "@components/Popup";
 import {ReactComponent as SuccssLogo} from '@assets/singlesvg/succss.svg';
 import {ReactComponent as PendingLogo} from '@assets/singlesvg/pending.svg';
 import {ReactComponent as FailedLogo} from '@assets/singlesvg/failed.svg';
+import {ReactComponent as PixLogo} from '@assets/singlesvg/pix.svg';
+import {reqWithdrawRecord} from "@features/api";
 const i18n=global.i18n;
 const stateType = {
     ERROR: -1,                  // 订单错误
@@ -28,10 +30,12 @@ const WWithdrawRecord=({close})=>{
     const recordList=useSelector(getWithdrawRecord);
     const [showDetails,setShowDetails]=useState(false);
     const [detailInfo,setDetailInfo]=useState(null);
+    const dispatch =useDispatch();
     useEffect(()=>{
-
+        dispatch(reqWithdrawRecord())
     },[])
     const getStateTxt=(state)=>{
+        state=parseInt(state);
         switch(state) {
             case stateType.CHECKING: {
                 return i18n.t("withdraw.record.wait");
@@ -52,6 +56,7 @@ const WWithdrawRecord=({close})=>{
         }
     }
     const getStateCls=(state)=>{
+        state=parseInt(state);
         switch(state) {
             case stateType.PROCESSING:
             case stateType.CHECKING: {
@@ -69,6 +74,7 @@ const WWithdrawRecord=({close})=>{
         }
     }
     const getStateLogo=(state)=>{
+        state=parseInt(state);
         switch(state) {
             case stateType.PROCESSING:
             case stateType.CHECKING: {
@@ -92,9 +98,10 @@ const WWithdrawRecord=({close})=>{
             <Spring type="slideUp" className={styles.content}>
                 {
                     recordList.map((item,index)=>{
-                        let amount=Number(item.ExchangeScore)+Number(item.Fee);
+                        let amount=Number(item.WithDraw)+Number(item.ServiceFee);
                         let amount_str=global.DOLLAR+formatCash(amount);
-                        let time_str=formatDate(item.CreateDate*1000);
+                        // let time_str=formatDate(item.CreateDate*1000);
+                        let time_str=item.CreateDate.split(".")[0];
                         let statusTxt=getStateTxt(item.State);
                         let status_cls=getStateCls(item.State);
                         return (
@@ -103,6 +110,10 @@ const WWithdrawRecord=({close})=>{
                                 setShowDetails(true);
                             }}>
                                 <div className={styles.item}>
+                                    <div className={`${styles.pay_type_con} ${styles.title}`}>
+                                        <PixLogo className={styles.logo}></PixLogo>
+                                        PIX
+                                    </div>
                                     <div className={styles.title}>
                                         {amount_str}
                                     </div>
@@ -111,13 +122,13 @@ const WWithdrawRecord=({close})=>{
                                     <div>{time_str}</div>
                                 </div>
                                 <div className={styles.item}>
-                                    <CopyToClipboard text={item.OrderID} onCopy={() => {
+                                <CopyToClipboard text={item.OrderId} onCopy={() => {
                                         toast.success(i18n.t("copy_success"));
                                     }}>
                                         <div className={styles.payment_sn_con} onClick={(event) => {
                                             event.stopPropagation();
                                         }}>
-                                            {item.OrderID}
+                                            {item.OrderId}
                                             <SvgIcon className={styles.logo} herf={"icon_Copy"}/>
                                         </div>
                                     </CopyToClipboard>
@@ -135,14 +146,15 @@ const WWithdrawRecord=({close})=>{
     const renderDetails=()=>{
         let item=detailInfo;
         if (item==null)return (<></>);
-        let ExchangeScore=Number(item.ExchangeScore);
-        let Fee=Number(item.Fee);
+        let ExchangeScore=Number(item.WithDraw);
+        let Fee=Number(item.ServiceFee);
         let amount=ExchangeScore+Fee;
         let amount_str=global.DOLLAR+formatCash(amount);
         let status=parseInt(item.State);
         let statusTxt=getStateTxt(status);
         let status_cls=getStateCls(status);
         let Logo=getStateLogo(status);
+        let time_str=item.CreateDate.split(".")[0];
         return (
             <Popup onClose={()=>{
                 setShowDetails(false)
@@ -173,16 +185,16 @@ const WWithdrawRecord=({close})=>{
                         <div className={styles.item}>
                             <div
                                 className={styles.label}>{i18n.t("withdraw.record.time")}</div>
-                            <div>{formatDate(item.CreateDate*1000)}</div>
+                            <div>{time_str}</div>
                         </div>
                         <div className={styles.item}>
                             <div
                                 className={styles.label}>{i18n.t("withdraw.record.orderId")}</div>
-                            <CopyToClipboard text={item.OrderID} onCopy={() => {
+                            <CopyToClipboard text={item.OrderId} onCopy={() => {
                                 toast.success(i18n.t("copy_success"));
                             }}>
                                 <div className={styles.number}>
-                                    {item.OrderID}
+                                    {item.OrderId}
                                     <SvgIcon className={styles.logo} herf={"icon_Copy"}/>
                                 </div>
                             </CopyToClipboard>