Sfoglia il codice sorgente

Ru 提现账号设置

zhejiushizhuce 2 anni fa
parent
commit
01545b7317

+ 8 - 0
src/Global.js

@@ -151,6 +151,14 @@ global.getLocalAreaItem=()=>{
     }
     return null;
 }
+global.getLocalAreaAlCode=()=>{
+    let code='en-US';
+    let item=global.getLocalAreaItem();
+    if (item){
+        code=item.alcode;
+    }
+    return code;
+}
 global.showSaveAccount=(info)=>{
     if (global.saveAccount)global.saveAccount.show(info);
 }

+ 8 - 4
src/db/area.js

@@ -7,25 +7,29 @@ const area=[
         id:1,
         name:"Brasil",
         icon:img1,
-        code:"br"
+        code:"br",
+        alcode:"pt-BR"
     },
     {
         id:2,
         name:"México",
         icon:img2,
-        code:"mx"
+        code:"mx",
+        alcode:"es-MX"
     },
     {
         id:4,
         name:"Europe",
         icon:img4,
-        code:"eu"
+        code:"eu",
+        alcode: 'en-EU'
     },
     {
         id:3,
         name:"Россия",
         icon:img3,
-        code:"ru"
+        code:"ru",
+        alcode:"ru-RU"
     }
 ]
 export default area;

+ 3 - 0
src/locales/index.js

@@ -81,6 +81,9 @@ i18n.getCurrLangName=()=>{
     if (res)return res.name;
     return "";
 }
+i18n.getCurrLangKey=()=>{
+    return i18n.getCurrLang().replace("_","-");
+}
 i18n.getAllLangs=()=>{
     let langs=[];
     for (const lkey in resources) {

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

@@ -406,6 +406,21 @@
       "clabe_help_3": "11 digits: bank account number",
       "clabe_help_4": "1 digit: validation of CLABE number"
     },
+    "account_ru": {
+      "userName": "Name",
+      "name_holder": "Enter Name",
+      "email": "Email",
+      "email_holder": "Input Email-ID",
+      "phone": "Telephone[+7]",
+      "phone_holder": "Enter 11 digits",
+      "tedCon": "Bank accounts",
+      "tedCon_holder": "Enter 16 digits",
+      "tedBan": "Bank Code",
+      "tedBan_holder": "exemple:123456",
+      "withdraw_via": "Withdraw Via",
+      "pix_type_1": "CARD",
+      "pix_type_2": "SBP"
+    },
     "pass": {
       "prompt": "For the security of your funds, please set up a fund password first",
       "btn_confirm": "Confirm",

+ 15 - 0
src/locales/languages/es_MX.json

@@ -401,6 +401,21 @@
       "clabe_help_3": "11 dígitos: número de cuenta bancaria",
       "clabe_help_4": "1 dígito: validación del número CLABE"
     },
+    "account_ru": {
+      "userName": "Nombre",
+      "name_holder": "Introduce el nombre",
+      "email": "Correo",
+      "email_holder": "Introduce el correo electrónico",
+      "phone": "Teléfono[+7]",
+      "phone_holder": "Introduzca 11 dígitos",
+      "tedCon": "Cuenta bancaria",
+      "tedCon_holder": "Introduzca 16 dígitos",
+      "tedBan": "Código del banco",
+      "tedBan_holder": "ejemplo:123456",
+      "withdraw_via": "Retirar vía",
+      "pix_type_1": "TARJETA",
+      "pix_type_2": "SBP"
+    },
     "pass": {
       "prompt": "Para la seguridad de tus fondos, por favor configura una contraseña de fondos primero",
       "btn_confirm": "Confirmar",

+ 15 - 0
src/locales/languages/pt_BR.json

@@ -401,6 +401,21 @@
       "clabe_help_3": "11 dígitos: número da conta bancária",
       "clabe_help_4": "1 dígito: validação do número CLABE"
     },
+    "account_ru": {
+      "userName": "Nome",
+      "name_holder": "Nome de entrada",
+      "email": "E-mail",
+      "email_holder": "insira o e-mail",
+      "phone": "telefone[+7]",
+      "phone_holder": "Insira 11 dígitos",
+      "tedCon": "Contas Bancárias",
+      "tedCon_holder": "Insira 16 dígitos",
+      "tedBan": "Banco Código",
+      "tedBan_holder": "exemplo: 123456",
+      "withdraw_via": "Saque através de",
+      "pix_type_1": "CARTÃO",
+      "pix_type_2": "SBP"
+    },
     "pass": {
       "prompt": "Para a segurança dos seus fundos, por favor configure uma senha de fundos primeiro",
       "btn_confirm": "Confirmar",

+ 15 - 0
src/locales/languages/ru_RU.json

@@ -401,6 +401,21 @@
       "clabe_help_3": "11 цифр: номер банковского счета",
       "clabe_help_4": "1 цифра: проверка номера CLABE"
     },
+    "account_ru": {
+      "userName": "Имя",
+      "name_holder": "Введите имя",
+      "email": "Электронная почта",
+      "email_holder": "Введите идентификатор электронной почты",
+      "phone": "Телефон[+7]",
+      "phone_holder": "Введите 11 цифр",
+      "tedCon": "Банковские счета",
+      "tedCon_holder": "Введите 16 цифр",
+      "tedBan": "Код банка",
+      "tedBan_holder": "пример:123456",
+      "withdraw_via": "Вывод через",
+      "pix_type_1": "КАРТА",
+      "pix_type_2": "СБП"
+    },
     "pass": {
       "prompt": "Пожалуйста, сначала установите пароль для безопасности ваших средств",
       "btn_confirm": "Подтвердить",

+ 15 - 0
src/locales/languages/zh_TW.json

@@ -401,6 +401,21 @@
       "clabe_help_3": "11位數字:銀行帳號",
       "clabe_help_4": "1 位數字:CLABE 編號驗證"
     },
+    "account_ru": {
+      "userName": "姓名",
+      "name_holder": "輸入姓名",
+      "email": "電子郵件",
+      "email_holder": "輸入電子郵件 ID",
+      "phone": "電話[+7]",
+      "phone_holder": "輸入11位數字",
+      "tedCon": "銀行帳戶",
+      "tedCon_holder": "輸入16位數字",
+      "tedBan": "銀行代碼",
+      "tedBan_holder": "例子:123456",
+      "withdraw_via": "提現方式",
+      "pix_type_1": "卡片",
+      "pix_type_2": "SBP"
+    },
     "pass": {
       "prompt": "為了資金安全,請先設置資金密碼",
       "btn_confirm": "確認",

+ 7 - 0
src/utils/helpers.js

@@ -512,4 +512,11 @@ export const validateCPF=(cpf)=>{
 
     return true;
 
+}
+export const formatCurrency=(value,locales="en-US")=>{
+    if (locales==="ru-RU")locales="en-US";
+    return new Intl.NumberFormat(locales, {  // 这里的'pt-BR' 是巴西的语言区域
+        minimumFractionDigits: 0,
+        maximumFractionDigits: 2,
+    }).format(value);
 }

+ 8 - 6
src/widgets/WDeposit/BR/BRDeposit.jsx

@@ -14,7 +14,7 @@ import {ROUTE_PATH} from "@constants/routes";
 import RadioBtn from "@components/RadioBtn";
 import img_bonus from "@assets/pay/topup_bonus.png";
 import styled from 'styled-components/macro';
-import {stringFormat} from "@utils/helpers";
+import {formatCurrency, stringFormat} from "@utils/helpers";
 import {APP_COUNTRY_CODE} from "@constants/app";
 import RUPaytypeSelect from "@widgets/WDeposit/RU/RUPaytypeSelect";
 import BRCPFSave from "@widgets/WDeposit/BR/BRCPFSave/BRCPFSave";
@@ -193,21 +193,23 @@ const BRDeposit=()=>{
                         }
                         let extra="+"+Math.floor(give*100/price)+'%';
                         return (
-                            <button key={index} className={`${styles.list_btn} ${selectedID===item.id?styles.active:''}`}
-                                    onClick={()=>{
+                            <button key={index}
+                                    className={`${styles.list_btn} ${selectedID === item.id ? styles.active : ''}`}
+                                    onClick={() => {
                                         setSelectedID(item.id);
                                     }}
                             >
                                 <div>{global.DOLLAR}</div>
-                                <div>{item.money}</div>
+                                {/*<div>{item.money}</div>*/}
+                                <div>{formatCurrency(item.money,i18n.getCurrLangKey())}</div>
                                 {
-                                    give>0?(
+                                    give > 0 ? (
                                         <div className={styles.flag}>
                                             <div className={styles.text}>
                                                 {extra}
                                             </div>
                                         </div>
-                                    ):(<></>)
+                                    ) : (<></>)
                                 }
 
                             </button>

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

@@ -3,7 +3,7 @@ import styles from "./styles.module.scss";
 import React, {useState, useEffect} from "react";
 import {useDispatch, useSelector} from "react-redux";
 import {getUserInfo} from "@features/mainSlice";
-import {formatCash, numFormatter, stringFormat} from "@utils/helpers";
+import {formatCash, formatCurrency, numFormatter, stringFormat} from "@utils/helpers";
 import {getWDPayoutStatus, getWithdrawBaseInfo, getWithdrawInfo} from "@features/paySlice";
 import symbol from "@assets/symbol-defs.svg";
 import {ReactComponent as Edit} from '@assets/singlesvg/edit.svg';
@@ -20,7 +20,8 @@ const BRWithdraw=()=>{
     const user=useSelector(getUserInfo);
     const info=useSelector(getWithdrawBaseInfo);
     const navigate=useNavigate();
-    const addBtnParam = [200, 500, 1000, 2000, 5000, -1];
+    // let addBtnParam = [200, 500, 1000, 2000, 5000, -1];
+    const [addBtnParam, setAddBtnParam] = useState([200, 500, 1000, 2000, 5000, -1]);
     const [addIndex,setAddIndex]=useState(-1);
     const [wdValue,setWdValue]=useState("");
     const [wdPass,setWdPass]=useState("");
@@ -39,7 +40,22 @@ const BRWithdraw=()=>{
                 dispatch(reqWithdrawInfo({UserID:user.UserID}));
             }
         }
+        else if (areaItem.code===APP_COUNTRY_CODE.RU){
+            if (accountInfo==null){
+                dispatch(reqWithdrawInfo({UserID:user.UserID}));
+            }
+        }
     },[])
+    useEffect(()=>{
+        let addValues=[200, 500, 1000, 2000, 5000, -1];
+        if (info!=null){
+            let srate=Number(info.srate);
+            for (let i = 0; i < addValues.length; i++) {
+                if (addValues[i]!==-1)addValues[i]=addValues[i]*srate;
+            }
+            setAddBtnParam(addValues);
+        }
+    },[info])
     const checkBank=()=>{
         if (info!=null){
             // data.BankUserName, data.AccountsBank, data.cbPixType
@@ -126,6 +142,28 @@ const BRWithdraw=()=>{
                 else via=BranchBank;
             }
         }
+        else if (areaItem.code===APP_COUNTRY_CODE.RU){
+            let AccountsBank=info.AccountsBank;
+            let PhoneNumber=info.PhoneNumber;
+            let PixType=info.PixType;
+            let BranchBank=info.BranchBank;
+            if (PixType==="1"){
+               if(AccountsBank!=null&&AccountsBank!=="")accout=AccountsBank;
+            }
+            else
+            {
+                if(PhoneNumber!=null&&PhoneNumber!=="")accout=PhoneNumber;
+            }
+            if (BranchBank!=null&&BranchBank!==""){
+                if (accountInfo!=null){
+                    let bank_list=accountInfo.bank_list;
+                    if (bank_list!=null){
+                        via=bank_list[BranchBank];
+                    }
+                }
+                else via=BranchBank;
+            }
+        }
         else
         {
             if (info!=null){
@@ -158,13 +196,15 @@ const BRWithdraw=()=>{
         )
     }
     const renderWithdrawValue=()=>{
+        // let locales=global.getLocalAreaAlCode();
+        let locales=i18n.getCurrLangKey();
         return (
             <div className={styles.content}>
                 <div className={styles.title}>{i18n.t("withdraw.main.editBox")}</div>
                 <div className={styles.select_con}>
                     {
                         addBtnParam.map((item,index)=>{
-                            let label=item===-1?i18n.t("withdraw.main.btn_all"):global.DOLLAR+" "+item;
+                            let label=item===-1?i18n.t("withdraw.main.btn_all"):global.DOLLAR+" "+formatCurrency(item,locales);
                             return (
                                 <button key={index}
                                         className={`${styles.grid_btn} ${addIndex===index?styles.active:''}`}

+ 388 - 0
src/widgets/WWithdraw/RU/RUAccountEdit.jsx

@@ -1,6 +1,394 @@
+import React, {useEffect, useRef, useState} from "react";
+import {reqMexWithdrawSetInfo, reqWithdrawInfo, reqWithdrawSetInfo} from "@features/api";
+import {useDispatch, useSelector} from "react-redux";
+import {getUserInfo} from "@features/mainSlice";
+import {getWDBaseInfoStatus, getWDInfoStatus, getWDSetInfoStatus, getWithdrawInfo} from "@features/paySlice";
+import {useThemeProvider} from "@contexts/themeContext";
+import {Controller, useForm} from "react-hook-form";
+import {REQ_STATUS} from "@api/config";
+import styles from "./styles.module.scss";
+import SmallLoading from "@components/SmallLoading";
+import Spring from "@components/Spring";
+import {validateEmail} from "@utils/helpers";
+import SvgIcon from "@components/SvgIcon";
+import RadioBtn from "@components/RadioBtn";
+import MuiDrawer from "@mui/material/Drawer";
+import {Popover} from "@mui/material";
+
+const i18n=global.i18n;
 const RUAccountEdit=({close})=>{
+    const user=useSelector(getUserInfo);
+    const baseStatus=useSelector(getWDBaseInfoStatus);
+    const setStatus=useSelector(getWDSetInfoStatus);
+    const infoStatus=useSelector(getWDInfoStatus);
+    let info=useSelector(getWithdrawInfo);
+    let dinfo=info==null?{}:info;
+    const dispatch=useDispatch();
+    const {isMobile} = useThemeProvider();
+    const [showBankSelect, setShowBankSelect] = useState(false);
+    const [searchValue, setSearchValue] = useState("");
+    const {register, handleSubmit, formState: {errors}, control} = useForm({
+        values: {
+            account: dinfo.AccountsBank||"",
+            userName: dinfo.BankUserName||"",
+            bank: dinfo.BranchBank||"",
+            branceBank: dinfo.BranchBank||"",
+            phone: dinfo.PhoneNumber||"",
+            PAN: dinfo.PANNumber||"",
+            IFSC:dinfo.IFSCNumber||"",
+            email: dinfo.EmailAddress||"",
+            PixNum: dinfo.PixNum||"",
+            adhaar: dinfo.AdhaarNumber||"",
+            PixType: dinfo.PixType||"1",
+            bankName:""
+        }
+    });
+    const [showPixType, setShowPixType] = useState(dinfo.PixType||"1");
+    const [bankNo, setBankNo] = useState(dinfo.BranchBank||"");
+    const selectRef = useRef(null);
+    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 validateMail=(value)=>{
+        return validateEmail(value);
+    }
+    const validateBankCode=()=>{
+        let num=Number(bankNo);
+        return num>0;
+    }
+    const getBankNameFromCode=()=>{
+        let bankName="";
+        if (info!=null){
+            let bank_list=info.bank_list;
+            if (bank_list!=null){
+                let name=bank_list[bankNo];
+                if (name!=null)bankName=name;
+            }
+        }
+        return bankName;
+    }
+    const showCSelect=()=>{
+        setSearchValue("");
+        setShowBankSelect(true);
+    }
+    const hideCSelect=()=>{
+        setShowBankSelect(false);
+    }
+    const getBankCodeList=()=>{
+        let list=[];
+        if (info!=null){
+            let tempS=searchValue.toUpperCase();
+            let bank_list=info.bank_list;
+            if (bank_list!=null){
+                for (const key in bank_list) {
+                    let value=bank_list[key];
+                    if (tempS!==""){
+                        let temp=value.replaceAll(" ","");
+                        temp=temp.toUpperCase();
+                        if (temp.indexOf(tempS)!==-1)list.push({code:key,value:value});
+                    }
+                    else list.push({code:key,value:value});
+                }
+            }
+        }
+        list.sort((a, b) => {
+            const valueA = a.value;
+            const valueB = b.value;
+
+            if (valueA < valueB) {
+                return -1;
+            }
+            if (valueA > valueB) {
+                return 1;
+            }
+            return 0;
+        });
+        return list;
+    }
+    const callback=(data)=>{
+        if (data&&data.code===200){
+            // dispatch(reqWithdrawBaseInfo(callbackBase));
+            close();
+        }
+    }
+    const handleChange=(data)=>{
+        if (checkLockStatus())return;
+        data.bank=bankNo;
+        data.callback=callback;
+        dispatch(reqWithdrawSetInfo(data));
+    }
+    const renderAccoutForm=()=>{
+        return (
+            <form autoComplete="off" className={styles.accout_form} onSubmit={handleSubmit((data) => {
+                handleChange(data);
+            })}>
+                {
+                    showPixType==="1"?(
+                        <Controller control={control}
+                                    name="userName"
+                                    rules={{required: true}}
+                                    render={({field: {ref, onChange, value}, fieldState: {error}}) => (
+                                        <div className={styles.form_item}>
+                                            <div className={styles.title}>{i18n.t("withdraw.account_ru.userName")}</div>
+                                            <div className={`input-control ${error ? 'input-control--error' : ''}`}>
+                                                <input
+                                                    value={value}
+                                                    onChange={e => onChange(e.target.value)}
+                                                    placeholder={i18n.t('withdraw.account_ru.name_holder')}
+                                                    ref={ref}
+                                                />
+                                            </div>
+                                        </div>
+                                    )}
+                        />
+                    ):(<></>)
+                }
+                {
+                    showPixType==="1"?(<></>):(
+                        <Controller control={control}
+                                    name="phone"
+                                    rules={{required: true}}
+                                    render={({field: {ref, onChange, value}, fieldState: {error}}) => (
+                                        <div className={styles.form_item}>
+                                            <div className={styles.title}>{i18n.t("withdraw.account_ru.phone")}</div>
+                                            <div className={`input-control ${error ? 'input-control--error' : ''}`}>
+                                                <input
+                                                    value={value}
+                                                    type={"tel"}
+                                                    onChange={e => onChange(e.target.value)}
+                                                    placeholder={i18n.t('withdraw.account_ru.phone_holder')}
+                                                    ref={ref}
+                                                />
+                                            </div>
+                                        </div>
+                                    )}
+                        />
+                    )
+                }
+                <Controller control={control}
+                            name="email"
+                            rules={{required: true, validate: validateMail}}
+                            render={({field: {ref, onChange, value}, fieldState: {error}}) => (
+                                <div className={styles.form_item}>
+                                    <div className={styles.title}>{i18n.t("withdraw.account_ru.email")}</div>
+                                    <div className={`input-control ${error ? 'input-control--error' : ''}`}>
+                                        <input
+                                            value={value}
+                                            onChange={e => onChange(e.target.value)}
+                                            placeholder={i18n.t('withdraw.account_ru.email_holder')}
+                                            ref={ref}
+                                        />
+                                    </div>
+                                </div>
+                            )}
+                />
+                {
+                    showPixType==="1"?(
+                        <Controller control={control}
+                                    name="account"
+                                    rules={{required: true,maxLength:16,minLength:16}}
+                                    render={({field: {ref, onChange, value}, fieldState: {error}}) => (
+                                        <div className={styles.form_item}>
+                                            <div className={styles.title}>{i18n.t("withdraw.account_ru.tedCon")}</div>
+                                            <div className={`input-control ${error ? 'input-control--error' : ''}`}>
+                                                <input
+                                                    value={value}
+                                                    onChange={e => onChange(e.target.value)}
+                                                    placeholder={i18n.t('withdraw.account_ru.tedCon_holder')}
+                                                    ref={ref}
+                                                />
+                                            </div>
+                                        </div>
+                                    )}
+                        />
+                    ):(<></>)
+                }
+                {
+                    // showPixType==="1"?(<></>):(
+                    (
+                        <Controller control={control}
+                                    name="bankName"
+                                    rules={{validate: validateBankCode}}
+                                    render={({field: {ref, onChange, value}, fieldState: {error}}) => {
+                                        let bname = getBankNameFromCode();
+                                        return (
+                                            <div className={styles.form_item}>
+                                                <div className={styles.title}>{i18n.t("withdraw.account_ru.tedBan")}</div>
+                                                <button ref={selectRef} type={"button"}
+                                                        className={`input-control ${styles.btn_bank} ${error ? 'input-control--error' : ''}`}
+                                                        onClick={() => {
+                                                            showCSelect();
+                                                        }}
+                                                >
+                                                    <input
+                                                        disabled
+                                                        value={bname}
+                                                        onChange={e => onChange(e.target.value)}
+                                                        placeholder={i18n.t('withdraw.account_ru.tedBan_holder')}
+                                                        ref={ref}
+                                                    />
+                                                    <div className={styles.icon_btn}>
+                                                        <SvgIcon className={styles.arrow} herf={"icon_Arrow"}></SvgIcon>
+                                                    </div>
+                                                </button>
+                                            </div>
+                                        )
+                                    }}
+                        />
+                    )
+                }
+                <Controller control={control}
+                            name="PixType"
+                            rules={{required: true}}
+                            render={({field: {ref, onChange, value}, fieldState: {error}}) => (
+                                <div className={styles.form_item}>
+                                    <div className={styles.title}>{i18n.t("withdraw.account_ru.withdraw_via")}</div>
+                                    <div className={styles.pix_con}>
+                                        <RadioBtn className={styles.radio_type} selected={(value + "") === "1"}
+                                                  value={"1"} onChange={(value) => {
+                                            setShowPixType(value)
+                                            onChange(value);
+                                        }}>
+                                            <span>{i18n.t("withdraw.account_ru.pix_type_1")}</span>
+                                        </RadioBtn>
+                                        <RadioBtn className={styles.radio_type} selected={(value + "") === "2"}
+                                                  value={"2"} onChange={(value) => {
+                                            setShowPixType(value)
+                                            onChange(value);
+                                        }}>
+                                            <span>{i18n.t("withdraw.account_ru.pix_type_2")}</span>
+                                        </RadioBtn>
+                                    </div>
+                                </div>
+                            )}
+                />
+                <button className={`button-green ${styles.btn_save}`}>
+                    {checkLockStatus() ? (
+                        <SmallLoading fill={"#FFF"}></SmallLoading>) : i18n.t("withdraw.account.btn_save")}
+                </button>
+            </form>
+        )
+    }
+    const renderSearch = () => {
+        return (
+            <div className={`input-control ${styles.select_search}`}>
+                <SvgIcon className={styles.icon} herf={"icon_Search"}></SvgIcon>
+                <input onChange={e => setSearchValue(e.target.value)}/>
+            </div>
+        )
+    }
+    const renderHeader=()=>{
+        return (
+            <div className={styles.header}>
+                {i18n.t("withdraw.account_mx.s_title")}
+            </div>
+        )
+    }
+    const renderBankCodeList=()=>{
+        let list=getBankCodeList();
+        return (
+            <div className={styles.select_list_con}>
+                {
+                    list.map((item,index)=>{
+                        return (
+                            <button key={index} className={`${styles.item} ${(bankNo+"")===item.code?styles.active:''}`} onClick={()=>{
+                                setBankNo(item.code);
+                                hideCSelect();
+                            }}>
+                                <div className={styles.left}>
+                                    <span className={styles.name}>{item.value}</span>
+                                </div>
+                                <RadioBtn selected={(bankNo+"")===item.code} value={item.value} onChange={(value)=>{
+                                    setBankNo(item.code);
+                                    hideCSelect();
+                                }} />
+                            </button>
+                        )
+                    })
+                }
+            </div>
+        )
+    }
+    const renderMobileBankSelect=()=>{
+        return (
+            <MuiDrawer open={showBankSelect}
+                       anchor={"bottom"}
+                       sx={{
+                           zIndex:1300,
+                           "& .MuiDrawer-paper": {
+                               height: "50%",
+                               boxSizing: "border-box",
+                               overflow: 'visible !important',
+                               backgroundColor: 'var(--widget);',
+                               boxShadow: 'var(--widget-shadow);',
+                               borderTopLeftRadius: '1rem',
+                               borderTopRightRadius: '1rem',
+                           },
+                       }}
+                       variant="temporary"
+                       onClose={() => {
+                           setShowBankSelect(false);
+                       }}>
+                <div className={`${styles.select_bank_con} ${styles.select_bank_con_m}`}>
+                    {renderHeader()}
+                    {renderSearch()}
+                    {renderBankCodeList()}
+                </div>
+            </MuiDrawer>
+        )
+    }
+    const renderDeskBankSelect=()=>{
+        return (
+            <Popover
+                open={showBankSelect}
+                anchorEl={selectRef.current}
+                onClose={()=>{
+                    hideCSelect();
+                }}
+                anchorOrigin={{
+                    vertical: 45,
+                    horizontal: 0,
+                }}
+                sx={{
+                    "& .MuiPopover-paper": {
+                        backgroundColor:'var(--widget);',
+                        borderRadius:'var(--border-radius);',
+                        width:'22rem;',
+                        height:'20rem;',
+                        boxShadow:'var(--widget-shadow);'
+                    }
+                }}
+            >
+                <div className={styles.select_bank_con}>
+                    {renderSearch()}
+                    {renderBankCodeList()}
+                </div>
+            </Popover>
+        )
+    }
+    const renderBankSelect=()=>{
+        if (isMobile())return renderMobileBankSelect();
+        else return renderDeskBankSelect();
+    }
     return (
         <>
+            {
+                infoStatus === REQ_STATUS.LOADING ? (
+                    <div className={styles.loading}>
+                        <SmallLoading/>
+                    </div>
+                ) : (
+                    <Spring type="slideUp" className={styles.container}>
+                        {renderAccoutForm()}
+                        {renderBankSelect()}
+                    </Spring>
+                )
+            }
         </>
     )
 }

+ 164 - 0
src/widgets/WWithdraw/RU/styles.module.scss

@@ -0,0 +1,164 @@
+.container{
+  display: flex;
+  flex-direction: column;
+  position: relative;
+  padding: 1rem;
+  width: 100%;
+  gap: 1rem;
+}
+.loading{
+  display: flex;
+  height: 100vh;
+}
+.accout_form{
+  display: flex;
+  flex-direction: column;
+  gap: 1rem;
+  .btn_save{
+    margin-top: 0.5rem;
+  }
+}
+.form_item{
+  display: flex;
+  flex-direction: column;
+  gap: 0.6rem;
+  color: var(--header);
+  & .title{
+    font-size: 0.9rem;
+    color: var(--header);
+  }
+  & .icon_btn{
+    display: flex;
+    justify-content: flex-end;
+    align-items: center;
+    width: 5rem;
+    height: 2rem;
+  }
+  & .arrow{
+    width: 1.2rem;
+    height: 1.2rem;
+    fill: var(--text);
+    transform: rotate(90deg);
+  }
+  & .help{
+    width: 1.4rem;
+    height: 1.4rem;
+    fill: var(--text);
+  }
+  & .btn_bank{
+    input{
+      pointer-events: none;
+    }
+  }
+}
+.notice{
+  color: var(--coin-yellow);
+  line-height: 1rem;
+  //opacity: 0.9;
+  white-space: pre-wrap;
+}
+.notice_con{
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  padding: 1rem;
+  gap: 0.5rem;
+  border: 1px dashed rgba(237, 195, 73, 0.7);
+  border-radius: var(--border-radius);
+  & .n_icon{
+    width: 3.5rem;
+    height: 3.5rem;
+    fill: var(--coin-yellow);
+  }
+}
+.select_bank_con{
+  display: flex;
+  flex-direction: column;
+  position: relative;
+  width: 100%;
+  height: 100%;
+  padding: 0.5rem;
+  gap: 0.75rem;
+  &_m{
+    padding: 1rem;
+  }
+  & .header{
+    display: flex;
+    width: 100%;
+    align-items: center;
+    justify-content: center;
+    font-weight: bold;
+    font-size: 1rem;
+    color: var(--header);
+    gap: 0.5rem;
+  }
+}
+.select_search{
+  border: 1px solid var(--input-border);
+  background-color: transparent;
+  gap: 0.5rem;
+  & .icon{
+    width: 1.4em;
+    height: 1.4em;
+    fill: var(--text);
+  }
+}
+.select_list_con{
+  display: flex;
+  flex-direction: column;
+  gap: .5rem;
+  width: 100%;
+  height: 100%;
+  overflow-y: auto;
+  overscroll-behavior: contain;
+  touch-action: pan-y;
+  & .item{
+    display: flex;
+    flex: none;
+    align-items: center;
+    justify-content: space-between;
+    position: relative;
+    width: 100%;
+    height: 2.5rem;
+    padding: 0 0.75rem;
+    border-radius: var(--border-radius);
+    color: var(--header);
+    &.active{
+      background: var(--nav-item-hover);
+      font-weight: 600;
+    }
+    & .left{
+      display: flex;
+      align-items: center;
+      gap: 0.25rem;
+      width: 80%;
+      & .icon{
+        width: 1.5rem;
+        height: auto;
+        border-radius: 0.1rem;
+      }
+      & .code{
+        text-align: left;
+        width: 3rem;
+      }
+      & .name{
+        //max-width: 5rem;
+        max-width: 60%;
+        text-align: left;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+      }
+    }
+  }
+}
+.pix_con{
+  display: flex;
+  align-items: center;
+  gap: 4rem;
+  min-height: 1.875rem;
+  & .radio_type{
+    gap: 0.75rem;
+    font-weight: 600;
+  }
+}