BRWithdraw.jsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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, numFormatter, stringFormat} from "@utils/helpers";
  7. import {getWDPayoutStatus, getWithdrawBaseInfo} 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, reqWithdrawPayout} from "@features/api";
  15. import {REQ_STATUS} from "@api/config";
  16. import {toast} from "react-toastify";
  17. const i18n=global.i18n;
  18. const BRWithdraw=()=>{
  19. const user=useSelector(getUserInfo);
  20. const info=useSelector(getWithdrawBaseInfo);
  21. const navigate=useNavigate();
  22. const addBtnParam = [200, 500, 1000, 2000, 5000, -1];
  23. const [addIndex,setAddIndex]=useState(-1);
  24. const [wdValue,setWdValue]=useState("");
  25. const [wdPass,setWdPass]=useState("");
  26. const [openPassBox,setOpenPassBox]=useState(false);
  27. const dispatch = useDispatch();
  28. const status=useSelector(getWDPayoutStatus);
  29. useEffect(()=>{
  30. if (info==null){
  31. dispatch(reqWithdrawBaseInfo())
  32. }
  33. },[])
  34. const checkBank=()=>{
  35. if (info!=null){
  36. // data.BankUserName, data.AccountsBank, data.cbPixType
  37. let name=info.BankUserName;
  38. let tname=info.AccountsBank;
  39. let type=info.type;
  40. return ((name != "") || (tname != "")) && (type != 0);
  41. }
  42. return false;
  43. }
  44. const onClickPayout=()=>{
  45. if (status===REQ_STATUS.LOADING)return;
  46. if (wdValue===""){
  47. toast.error(i18n.t("withdraw.main.score_null"))
  48. return;
  49. }
  50. if (!checkBank()){
  51. toast.error(i18n.t("withdraw.main.unbound_account"))
  52. return;
  53. }
  54. let inputNum = Number(wdValue)*global.CASH_BASE;
  55. let lnum = info.OrderLimit - info.OrderCount;
  56. // data.WithDrawMin, data.WithDrawMax
  57. let min=info.MinExchange;
  58. let max=info.MaxExchange;
  59. let maxEx=Number(info.SumCanExchange);
  60. if (inputNum<min){
  61. toast.error(stringFormat(i18n.t("withdraw.tip.under_can_score"),[formatCash(min,0)]))
  62. return;
  63. }
  64. if (inputNum>max){
  65. toast.error(stringFormat(i18n.t("withdraw.tip.over_can_score"),[formatCash(max,0)]))
  66. return;
  67. }
  68. if (inputNum>maxEx){
  69. toast.error(i18n.t("withdraw.tip.total_not_enough"))
  70. return;
  71. }
  72. if (lnum<=0){
  73. return;
  74. }
  75. let num=Number(wdValue);
  76. if (num>0){
  77. dispatch(reqWithdrawPayout({
  78. score:num
  79. }))
  80. }
  81. }
  82. const getShowCash=(value)=>{
  83. value=Number(value);
  84. return value/global.CASH_BASE;
  85. }
  86. const formatInput=(text)=>{
  87. let Score=user.Score*global.CASH_BASE;
  88. let inputNum = Number(text)*global.CASH_BASE;
  89. inputNum = Math.min(inputNum, info.SumCanExchange);
  90. inputNum = Math.min(inputNum, Score);
  91. return (inputNum > 0) ? (getShowCash(inputNum)) : "";
  92. }
  93. const getAddIndexFromValue=(value)=>{
  94. value=Number(value);
  95. let index=addBtnParam.indexOf(value);
  96. if (index===-1){
  97. if (value===info.CanWithDraw){
  98. index=addBtnParam.length-1;
  99. }
  100. }
  101. return index;
  102. }
  103. const renderUser=()=>{
  104. return (
  105. <div className={styles.content}>
  106. <div className={styles.user_con}>
  107. <div className={styles.money_con}>
  108. <div className={styles.title}>{i18n.t("withdraw.main.total_balance")}</div>
  109. <div className={styles.money}>{global.DOLLAR+" "+numFormatter(user.Score)}</div>
  110. </div>
  111. <div className={styles.money_con}>
  112. <div className={styles.title}>{i18n.t("withdraw.main.withdrawable")}</div>
  113. <div className={styles.money}>{global.DOLLAR+" "+numFormatter(getShowCash(info.SumCanExchange))}</div>
  114. </div>
  115. </div>
  116. <div className={styles.line}/>
  117. </div>
  118. )
  119. }
  120. const renderWithdrawValue=()=>{
  121. return (
  122. <div className={styles.content}>
  123. <div className={styles.title}>{i18n.t("withdraw.main.editBox")}</div>
  124. <div className={styles.select_con}>
  125. {
  126. addBtnParam.map((item,index)=>{
  127. let label=item===-1?i18n.t("withdraw.main.btn_all"):global.DOLLAR+" "+item;
  128. return (
  129. <button key={index}
  130. className={`${styles.grid_btn} ${addIndex===index?styles.active:''}`}
  131. onClick={()=>{
  132. let value=item===-1?getShowCash(info.SumCanExchange)+"":item+"";
  133. let fvalue=formatInput(value);
  134. let addIndx=Number(value)===fvalue?index:-1;
  135. if (addIndx!==-1)setWdValue(fvalue);
  136. setAddIndex(addIndx);
  137. }}
  138. >
  139. {label}
  140. </button>
  141. )
  142. })
  143. }
  144. </div>
  145. <div className={`input-control ${styles.input_con}`}>
  146. <div className={styles.money}>{global.DOLLAR}</div>
  147. <input
  148. value={wdValue}
  149. type={"number"}
  150. placeholder={i18n.t("withdraw.main.editPlaceholder")}
  151. onChange={(e)=>{
  152. // let value=formatInput(e.target.value);
  153. // setWdValue(value);
  154. // setAddIndex(getAddIndexFromValue(value));
  155. setWdValue(e.target.value);
  156. }}
  157. />
  158. {
  159. wdValue===""?(<></>):(
  160. <button className={styles.clear_btn} onClick={()=>{
  161. setWdValue("");
  162. }}>
  163. <svg className={styles.icon}>
  164. <use xlinkHref={`${symbol}#icon_Close`} />
  165. </svg>
  166. </button>
  167. )
  168. }
  169. </div>
  170. <div className={styles.line}/>
  171. </div>
  172. )
  173. }
  174. const renderAccount=()=>{
  175. let BankUserName=info.BankUserName;
  176. let AccountsBank=info.AccountsBank;
  177. let cbPixType=Number(info.PixType);
  178. let via="";
  179. let accout="";
  180. if (BankUserName!==""||AccountsBank!==""){
  181. via=cbPixType >= 10 ? "TED" : "PIX";
  182. accout=cbPixType >= 10 ? AccountsBank : BankUserName
  183. }
  184. return (
  185. <div className={`${styles.content} ${styles.account_info}`}>
  186. <div className={styles.title_con}>
  187. <div className={styles.title}>{i18n.t("withdraw.account.title")}</div>
  188. <button onClick={()=>{
  189. navigate(ROUTE_PATH.ACCOUNT_INFO);
  190. }}>
  191. <Edit className={styles.icon}/>
  192. </button>
  193. </div>
  194. <div className={styles.line}></div>
  195. <div className={styles.info_item}>
  196. <div className={styles.title}>{i18n.t("withdraw.main.via")}</div>
  197. {
  198. via===""?(<div>{i18n.t("withdraw.main.bank_info_isNull")}</div>):(
  199. <div className={styles.active}>{via}</div>
  200. )
  201. }
  202. {/*<div className={styles.line}></div>*/}
  203. </div>
  204. <div className={styles.info_item}>
  205. <div className={styles.title}>{i18n.t("withdraw.main.account")}</div>
  206. {
  207. accout===""?(<div>{i18n.t("withdraw.main.bank_No_isNull")}</div>):(
  208. <div className={styles.active}>{accout}</div>
  209. )
  210. }
  211. {/*<div className={styles.line}></div>*/}
  212. </div>
  213. </div>
  214. )
  215. }
  216. const renderSubmit=()=>{
  217. let num = info.OrderLimit - info.OrderCount;
  218. // data.WithDrawMin, data.WithDrawMax
  219. let min=getShowCash(info.MinExchange);
  220. let max=getShowCash(info.MaxExchange);
  221. return (
  222. <div className={styles.content}>
  223. <button className="button-green" onClick={onClickPayout}>
  224. {status===REQ_STATUS.LOADING?(<SmallLoading fill={"#fff"}></SmallLoading>):i18n.t("withdraw.main.btn_withdraw")+" ("+num+")"}
  225. {/*{i18n.t("withdraw.main.btn_withdraw")+" ("+num+")"}*/}
  226. </button>
  227. <div className={styles.tips}>
  228. {stringFormat(i18n.t("withdraw.main.tip"),[min,max])}
  229. </div>
  230. </div>
  231. )
  232. }
  233. const renderPassBox=()=>{
  234. return (
  235. <WDPassBox
  236. open={openPassBox}
  237. title={i18n.t("withdraw.pass.pass_box_title")}
  238. confirmLabel={i18n.t("withdraw.pass.btn_confirm")}
  239. onClose={()=>{
  240. setOpenPassBox(false);
  241. }}
  242. onConfirm={(data)=>{
  243. if (data!=null){
  244. setWdPass(data);
  245. }
  246. }}
  247. >
  248. </WDPassBox>
  249. )
  250. }
  251. return (
  252. <>
  253. {
  254. info==null?(<div className={"w-100vw h-100vh"}><SmallLoading /></div>):(
  255. <Spring type="slideUp" className={styles.container}>
  256. {renderUser()}
  257. {renderWithdrawValue()}
  258. {renderAccount()}
  259. {renderSubmit()}
  260. {renderPassBox()}
  261. </Spring>
  262. )
  263. }
  264. </>
  265. )
  266. }
  267. export default BRWithdraw;