BRPayOrder.jsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import styles from "./styles.module.scss";
  2. import Spring from "@components/Spring";
  3. import React, {useEffect, useState} from "react";
  4. import {useNavigate} from "react-router-dom";
  5. import {useSelector} from "react-redux";
  6. import {getUserInfo} from "@features/mainSlice";
  7. import {getCurrPayOrder} from "@features/paySlice";
  8. import {ReactComponent as PixLogo} from '@assets/singlesvg/pix.svg';
  9. import {formatDate, formatTime, stringFormat} from "@utils/helpers";
  10. import SvgIcon from "@components/SvgIcon";
  11. import {CopyToClipboard} from "react-copy-to-clipboard";
  12. import {toast} from "react-toastify";
  13. import QRCode from 'qrcode.react';
  14. import {ReactComponent as SuccessIcon} from "@assets/singlesvg/succss.svg";
  15. import WOrderSuccess from "@widgets/WPaymentOrder/WOrderSuccess";
  16. const i18n=global.i18n;
  17. const BRPayOrder=({close})=>{
  18. const navigate=useNavigate();
  19. const user=useSelector(getUserInfo);
  20. const orderInfo=useSelector(getCurrPayOrder);
  21. const [leftTime,setLeftTime]=useState(0);
  22. const getLeftTime=()=>{
  23. if (orderInfo==null)return 0;
  24. let deadline=Number(orderInfo.deadline);
  25. let createAt=Number(orderInfo.createAt);
  26. let expireAt=createAt+deadline*1000;
  27. let now=Date.now();
  28. let left=expireAt-now;
  29. if (left<0)left=0;
  30. return left;
  31. }
  32. const updateLeftTime=(timer)=>{
  33. let left=getLeftTime();
  34. setLeftTime(left);
  35. if (left<=0){
  36. clearInterval(timer);
  37. timer=null;
  38. if (close)close();
  39. }
  40. return timer;
  41. }
  42. useEffect(()=>{
  43. let timer=null;
  44. if (orderInfo){
  45. setLeftTime(getLeftTime());
  46. timer=setInterval(()=>{
  47. timer=updateLeftTime(timer);
  48. },1000)
  49. }
  50. return () => {
  51. if (timer!=null){
  52. clearInterval(timer);
  53. timer=null;
  54. }
  55. };
  56. },[orderInfo])
  57. const renderTitle=()=>{
  58. return (
  59. <div className={styles.title}>
  60. <PixLogo className={styles.logo}/>
  61. {i18n.t("deposit.order_info.pay_type_pix")}
  62. </div>
  63. )
  64. }
  65. const renderBasic=()=>{
  66. let deadline=Number(orderInfo.deadline);
  67. let createAt=Number(orderInfo.createAt);
  68. let expireAt=createAt+deadline*1000;
  69. return (
  70. <>
  71. <div className={styles.tips}>
  72. {stringFormat(i18n.t("deposit.order_info.tips"),[formatDate(expireAt)])}
  73. </div>
  74. <div className={styles.base_info}>
  75. <div className={styles.info_row}>
  76. <div className={styles.label}>
  77. {i18n.t("deposit.order_info.create_date")}
  78. </div>
  79. {formatDate(createAt)}
  80. </div>
  81. {/*<div className={styles.line}></div>*/}
  82. <div className={styles.info_row}>
  83. <div className={styles.label}>
  84. {i18n.t("deposit.order_info.time")}
  85. </div>
  86. {formatTime(leftTime,true)}
  87. </div>
  88. {/*<div className={styles.line}></div>*/}
  89. <CopyToClipboard text={orderInfo.prdOrdNo} onCopy={()=>{
  90. toast.success(i18n.t("copy_success"));
  91. }}>
  92. <div className={styles.info_row}>
  93. <div className={styles.label}>
  94. {i18n.t("deposit.order_info.order")}
  95. </div>
  96. <div className={styles.order}>
  97. {orderInfo.prdOrdNo}
  98. <SvgIcon className={styles.logo} herf={"icon_Copy"}/>
  99. </div>
  100. </div>
  101. </CopyToClipboard>
  102. <div className={styles.info_row}>
  103. <div className={styles.label}>
  104. {i18n.t("deposit.order_info.value")}
  105. </div>
  106. <div className={styles.money}>
  107. {global.DOLLAR+orderInfo.money}
  108. </div>
  109. </div>
  110. </div>
  111. </>
  112. )
  113. }
  114. const renderPayInfo=()=>{
  115. return (
  116. <div className={styles.pay_info}>
  117. <div className={styles.pay_label}>{i18n.t("deposit.order_info.content")}</div>
  118. <div className={styles.pay_content}>{orderInfo.content}</div>
  119. <QRCode className={styles.pay_qr} value={orderInfo.content} />
  120. <div className={styles.pay_btn}>
  121. <CopyToClipboard text={orderInfo.content} onCopy={()=>{
  122. toast.success(i18n.t("deposit.order_info.tips1"));
  123. }}>
  124. <button className={"button-green"}>
  125. {i18n.t("deposit.order_info.copyButton")}
  126. </button>
  127. </CopyToClipboard>
  128. {/*<button className={styles.btn_already}>*/}
  129. {/* {i18n.t("deposit.order_info.lookButton")}*/}
  130. {/*</button>*/}
  131. </div>
  132. </div>
  133. )
  134. }
  135. const renderOrderInfo=()=>{
  136. return (
  137. <div className={styles.order_info}>
  138. {renderBasic()}
  139. {renderPayInfo()}
  140. </div>
  141. )
  142. }
  143. const renderSuccess=()=>{
  144. return (
  145. <div className={styles.success}>
  146. <SuccessIcon className={styles.logo}/>
  147. <div className={styles.tips}>{i18n.t("deposit.order_info.tips2")}</div>
  148. <div className={styles.btns_con}>
  149. <button className={"button-green"} onClick={()=>{
  150. close();
  151. }}>{i18n.t("deposit.order_info.okey")}</button>
  152. </div>
  153. </div>
  154. )
  155. }
  156. const renderView=()=>{
  157. let view=(<></>);
  158. if (orderInfo==null)return view;
  159. if (orderInfo.status==="success"){
  160. view=(
  161. // <Spring type="slideUp" className={styles.container}>
  162. // {renderSuccess()}
  163. // </Spring>
  164. <WOrderSuccess close={close}/>
  165. )
  166. }
  167. else
  168. {
  169. view=(
  170. <Spring type="slideUp" className={styles.container}>
  171. {renderTitle()}
  172. {renderOrderInfo()}
  173. </Spring>
  174. )
  175. }
  176. return view;
  177. }
  178. return (
  179. <>
  180. {renderView()}
  181. </>
  182. )
  183. }
  184. export default BRPayOrder;