BRWithdraw.jsx 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. import Spring from "@components/Spring";
  2. import styles from "./styles.module.scss";
  3. import React, {useState, useEffect} from "react";
  4. import {useDispatch, useSelector} from "react-redux";
  5. import {getUserInfo} from "@features/mainSlice";
  6. import {formatCash, formatCurrency, numFormatter, stringFormat} from "@utils/helpers";
  7. import {getWDPayoutStatus, getWithdrawBaseInfo, getWithdrawInfo} from "@features/paySlice";
  8. import symbol from "@assets/symbol-defs.svg";
  9. import {ReactComponent as Edit} from '@assets/singlesvg/edit.svg';
  10. import {useNavigate} from "react-router-dom";
  11. import {ROUTE_PATH} from "@constants/routes";
  12. import WDPassBox from "@widgets/WWithdraw/PassBox/WDPassBox";
  13. import SmallLoading from "@components/SmallLoading";
  14. import {reqWithdrawBaseInfo, reqWithdrawInfo, reqWithdrawPayout} from "@features/api";
  15. import {REQ_STATUS} from "@api/config";
  16. import {toast} from "react-toastify";
  17. import {APP_COUNTRY_CODE} from "@constants/app";
  18. const i18n=global.i18n;
  19. const BRWithdraw=()=>{
  20. const user=useSelector(getUserInfo);
  21. const info=useSelector(getWithdrawBaseInfo);
  22. const navigate=useNavigate();
  23. // let addBtnParam = [200, 500, 1000, 2000, 5000, -1];
  24. const [addBtnParam, setAddBtnParam] = useState([200, 500, 1000, 2000, 5000, -1]);
  25. const [addIndex,setAddIndex]=useState(-1);
  26. const [wdValue,setWdValue]=useState("");
  27. const [wdPass,setWdPass]=useState("");
  28. const [openPassBox,setOpenPassBox]=useState(false);
  29. const dispatch = useDispatch();
  30. const status=useSelector(getWDPayoutStatus);
  31. const accountInfo=useSelector(getWithdrawInfo);
  32. const areaItem=global.getLocalAreaItem();
  33. useEffect(()=>{
  34. // if (info==null){
  35. // dispatch(reqWithdrawBaseInfo())
  36. // }
  37. dispatch(reqWithdrawBaseInfo());
  38. if (areaItem.code===APP_COUNTRY_CODE.MX){
  39. if (accountInfo==null){
  40. dispatch(reqWithdrawInfo({UserID:user.UserID}));
  41. }
  42. }
  43. else if (areaItem.code===APP_COUNTRY_CODE.RU){
  44. if (accountInfo==null){
  45. dispatch(reqWithdrawInfo({UserID:user.UserID}));
  46. }
  47. }
  48. },[])
  49. useEffect(()=>{
  50. let addValues=[200, 500, 1000, 2000, 5000, -1];
  51. if (info!=null){
  52. let srate=Number(info.srate);
  53. for (let i = 0; i < addValues.length; i++) {
  54. if (addValues[i]!==-1)addValues[i]=addValues[i]*srate;
  55. }
  56. setAddBtnParam(addValues);
  57. }
  58. },[info])
  59. const checkBank=()=>{
  60. if (info!=null){
  61. // data.BankUserName, data.AccountsBank, data.cbPixType
  62. let name=info.BankUserName;
  63. let tname=info.AccountsBank;
  64. let type=info.type;
  65. return ((name != "") || (tname != "")) && (type != 0);
  66. }
  67. return false;
  68. }
  69. const onClickPayout=()=>{
  70. if (status===REQ_STATUS.LOADING)return;
  71. if (wdValue===""){
  72. toast.error(i18n.t("withdraw.main.score_null"))
  73. return;
  74. }
  75. if (!checkBank()){
  76. toast.error(i18n.t("withdraw.main.unbound_account"))
  77. return;
  78. }
  79. let inputNum = Number(wdValue)*global.CASH_BASE;
  80. let lnum = info.OrderLimit - info.OrderCount;
  81. // data.WithDrawMin, data.WithDrawMax
  82. let min=info.MinExchange;
  83. let max=info.MaxExchange;
  84. let maxEx=Number(info.SumCanExchange);
  85. if (inputNum<min){
  86. toast.error(stringFormat(i18n.t("withdraw.tip.under_can_score"),[formatCash(min,0)]))
  87. return;
  88. }
  89. if (inputNum>max){
  90. toast.error(stringFormat(i18n.t("withdraw.tip.over_can_score"),[formatCash(max,0)]))
  91. return;
  92. }
  93. if (inputNum>maxEx){
  94. toast.error(i18n.t("withdraw.tip.total_not_enough"))
  95. return;
  96. }
  97. if (lnum<=0){
  98. return;
  99. }
  100. let num=Number(wdValue);
  101. if (num>0){
  102. dispatch(reqWithdrawPayout({
  103. score:num
  104. }))
  105. }
  106. }
  107. const getShowCash=(value)=>{
  108. value=Number(value);
  109. return value/global.CASH_BASE;
  110. }
  111. const formatInput=(text)=>{
  112. let Score=user.Score*global.CASH_BASE;
  113. let inputNum = Number(text)*global.CASH_BASE;
  114. inputNum = Math.min(inputNum, info.SumCanExchange);
  115. inputNum = Math.min(inputNum, Score);
  116. return (inputNum > 0) ? (getShowCash(inputNum)) : "";
  117. }
  118. const getAddIndexFromValue=(value)=>{
  119. value=Number(value);
  120. let index=addBtnParam.indexOf(value);
  121. if (index===-1){
  122. if (value===info.CanWithDraw){
  123. index=addBtnParam.length-1;
  124. }
  125. }
  126. return index;
  127. }
  128. const getAccountInfo=()=>{
  129. let via="";
  130. let accout="";
  131. if (areaItem.code===APP_COUNTRY_CODE.MX){
  132. let AccountsBank=info.AccountsBank;
  133. let BranchBank=info.BranchBank;
  134. if (AccountsBank!=null&&AccountsBank!=="")accout=AccountsBank;
  135. if (BranchBank!=null&&BranchBank!==""){
  136. if (accountInfo!=null){
  137. let bank_list=accountInfo.bank_list;
  138. if (bank_list!=null){
  139. via=bank_list[BranchBank];
  140. }
  141. }
  142. else via=BranchBank;
  143. }
  144. }
  145. else if (areaItem.code===APP_COUNTRY_CODE.RU){
  146. let AccountsBank=info.AccountsBank;
  147. let PhoneNumber=info.PhoneNumber;
  148. let PixType=info.PixType;
  149. let BranchBank=info.BranchBank;
  150. if (PixType==="1"){
  151. if(AccountsBank!=null&&AccountsBank!=="")accout=AccountsBank;
  152. }
  153. else
  154. {
  155. if(PhoneNumber!=null&&PhoneNumber!=="")accout=PhoneNumber;
  156. }
  157. if (BranchBank!=null&&BranchBank!==""){
  158. if (accountInfo!=null){
  159. let bank_list=accountInfo.bank_list;
  160. if (bank_list!=null){
  161. via=bank_list[BranchBank];
  162. }
  163. }
  164. else via=BranchBank;
  165. }
  166. }
  167. else
  168. {
  169. if (info!=null){
  170. let BankUserName=info.BankUserName;
  171. let AccountsBank=info.AccountsBank;
  172. let cbPixType=Number(info.PixType);
  173. if (BankUserName!==""||AccountsBank!==""){
  174. via=cbPixType >= 10 ? "TED" : "PIX";
  175. accout=cbPixType >= 10 ? AccountsBank : BankUserName
  176. }
  177. }
  178. }
  179. return {via,accout};
  180. }
  181. const renderUser=()=>{
  182. return (
  183. <div className={styles.content}>
  184. <div className={styles.user_con}>
  185. <div className={styles.money_con}>
  186. <div className={styles.title}>{i18n.t("withdraw.main.total_balance")}</div>
  187. <div className={styles.money}>{global.DOLLAR+" "+numFormatter(user.Score)}</div>
  188. </div>
  189. <div className={styles.money_con}>
  190. <div className={styles.title}>{i18n.t("withdraw.main.withdrawable")}</div>
  191. <div className={styles.money}>{global.DOLLAR+" "+numFormatter(getShowCash(info.SumCanExchange))}</div>
  192. </div>
  193. </div>
  194. <div className={styles.line}/>
  195. </div>
  196. )
  197. }
  198. const renderWithdrawValue=()=>{
  199. // let locales=global.getLocalAreaAlCode();
  200. let locales=i18n.getCurrLangKey();
  201. return (
  202. <div className={styles.content}>
  203. <div className={styles.title}>{i18n.t("withdraw.main.editBox")}</div>
  204. <div className={styles.select_con}>
  205. {
  206. addBtnParam.map((item,index)=>{
  207. let label=item===-1?i18n.t("withdraw.main.btn_all"):global.DOLLAR+" "+formatCurrency(item,locales);
  208. return (
  209. <button key={index}
  210. className={`${styles.grid_btn} ${addIndex===index?styles.active:''}`}
  211. onClick={()=>{
  212. let value=item===-1?getShowCash(info.SumCanExchange)+"":item+"";
  213. let fvalue=formatInput(value);
  214. let addIndx=Number(value)===fvalue?index:-1;
  215. if (addIndx!==-1)setWdValue(fvalue);
  216. setAddIndex(addIndx);
  217. }}
  218. >
  219. {label}
  220. </button>
  221. )
  222. })
  223. }
  224. </div>
  225. <div className={`input-control ${styles.input_con}`}>
  226. <div className={styles.money}>{global.DOLLAR}</div>
  227. <input
  228. value={wdValue}
  229. type={"number"}
  230. placeholder={i18n.t("withdraw.main.editPlaceholder")}
  231. onChange={(e)=>{
  232. // let value=formatInput(e.target.value);
  233. // setWdValue(value);
  234. // setAddIndex(getAddIndexFromValue(value));
  235. setWdValue(e.target.value);
  236. }}
  237. />
  238. {
  239. wdValue===""?(<></>):(
  240. <button className={styles.clear_btn} onClick={()=>{
  241. setWdValue("");
  242. }}>
  243. <svg className={styles.icon}>
  244. <use xlinkHref={`${symbol}#icon_Close`} />
  245. </svg>
  246. </button>
  247. )
  248. }
  249. </div>
  250. <div className={styles.line}/>
  251. </div>
  252. )
  253. }
  254. const renderAccount=()=>{
  255. // let BankUserName=info.BankUserName;
  256. // let AccountsBank=info.AccountsBank;
  257. // let cbPixType=Number(info.PixType);
  258. // let via="";
  259. // let accout="";
  260. // if (BankUserName!==""||AccountsBank!==""){
  261. // via=cbPixType >= 10 ? "TED" : "PIX";
  262. // accout=cbPixType >= 10 ? AccountsBank : BankUserName
  263. // }
  264. const {via,accout}=getAccountInfo();
  265. return (
  266. <div className={`${styles.content} ${styles.account_info}`}>
  267. <div className={styles.title_con}>
  268. <div className={styles.title}>{i18n.t("withdraw.account.title")}</div>
  269. <button onClick={()=>{
  270. navigate(ROUTE_PATH.ACCOUNT_INFO);
  271. }}>
  272. <Edit className={styles.icon}/>
  273. </button>
  274. </div>
  275. <div className={styles.line}></div>
  276. <div className={styles.info_item}>
  277. <div className={styles.title}>{i18n.t("withdraw.main.via")}</div>
  278. {
  279. via===""?(<div>{i18n.t("withdraw.main.bank_info_isNull")}</div>):(
  280. <div className={styles.active}>{via}</div>
  281. )
  282. }
  283. {/*<div className={styles.line}></div>*/}
  284. </div>
  285. <div className={styles.info_item}>
  286. <div className={styles.title}>{i18n.t("withdraw.main.account")}</div>
  287. {
  288. accout===""?(<div>{i18n.t("withdraw.main.bank_No_isNull")}</div>):(
  289. <div className={styles.active}>{accout}</div>
  290. )
  291. }
  292. {/*<div className={styles.line}></div>*/}
  293. </div>
  294. </div>
  295. )
  296. }
  297. const renderSubmit=()=>{
  298. let num = info.OrderLimit - info.OrderCount;
  299. // data.WithDrawMin, data.WithDrawMax
  300. let min=getShowCash(info.MinExchange);
  301. let max=getShowCash(info.MaxExchange);
  302. return (
  303. <div className={styles.content}>
  304. <button className="button-green" onClick={onClickPayout}>
  305. {status===REQ_STATUS.LOADING?(<SmallLoading fill={"#fff"}></SmallLoading>):i18n.t("withdraw.main.btn_withdraw")+" ("+num+")"}
  306. {/*{i18n.t("withdraw.main.btn_withdraw")+" ("+num+")"}*/}
  307. </button>
  308. <div className={styles.tips}>
  309. {stringFormat(i18n.t("withdraw.main.tip"),[min,max])}
  310. </div>
  311. </div>
  312. )
  313. }
  314. const renderPassBox=()=>{
  315. return (
  316. <WDPassBox
  317. open={openPassBox}
  318. title={i18n.t("withdraw.pass.pass_box_title")}
  319. confirmLabel={i18n.t("withdraw.pass.btn_confirm")}
  320. onClose={()=>{
  321. setOpenPassBox(false);
  322. }}
  323. onConfirm={(data)=>{
  324. if (data!=null){
  325. setWdPass(data);
  326. }
  327. }}
  328. >
  329. </WDPassBox>
  330. )
  331. }
  332. return (
  333. <>
  334. {
  335. info==null?(<div className={"w-100vw h-100vh"}><SmallLoading /></div>):(
  336. <Spring type="slideUp" className={styles.container}>
  337. {renderUser()}
  338. {renderWithdrawValue()}
  339. {renderAccount()}
  340. {renderSubmit()}
  341. {renderPassBox()}
  342. </Spring>
  343. )
  344. }
  345. </>
  346. )
  347. }
  348. export default BRWithdraw;