index.jsx 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. import React, {useEffect, useRef, useState} from "react";
  2. import styles from "./styles.module.scss";
  3. import Modal from "@mui/material/Modal";
  4. import Fade from "@mui/material/Fade";
  5. import Grow from "@mui/material/Grow";
  6. import { gsap } from 'gsap';
  7. import {useDispatch, useSelector} from "react-redux";
  8. import {
  9. getCPFFirst,
  10. getFirstPayMulti,
  11. getGetSecondStatus,
  12. getOFirstPay,
  13. getPaymentOrderStatus
  14. } from "@features/paySlice";
  15. import {ROUTE_PATH} from "@constants/routes";
  16. import {REQ_STATUS} from "@api/config";
  17. import {reqGetSecond, reqPaymentOrder} from "@features/api";
  18. import {useNavigate} from "react-router-dom";
  19. import {getUserInfo, isLogined} from "@features/mainSlice";
  20. import SmallLoading from "@components/SmallLoading";
  21. import {useThemeProvider} from "@contexts/themeContext";
  22. import {APP_COUNTRY_CODE, APP_WELFARE} from "@constants/app";
  23. import BRCPFSave from "@widgets/WDeposit/BR/BRCPFSave/BRCPFSave";
  24. import RUPaytypeSelect from "@widgets/WDeposit/RU/RUPaytypeSelect";
  25. import {formatTime, localStorageGet, localStorageSet, stringFormat} from "@utils/helpers";
  26. import {LOCAL_MULTI_FIRST_GUIDE} from "@constants/localkey";
  27. const i18n=global.i18n;
  28. const objInfo={
  29. guideTimer:null,
  30. tl:null
  31. };
  32. const WFirstPay=()=>{
  33. const [isShow, setIsShow] = useState(false);
  34. const firstPayConf=useSelector(getOFirstPay);
  35. const dispatch = useDispatch();
  36. const navigate=useNavigate();
  37. const user=useSelector(getUserInfo);
  38. const orderStatus=useSelector(getPaymentOrderStatus);
  39. const {setWelfTabState}=useThemeProvider();
  40. const isLogin=useSelector(isLogined);
  41. const cpfFirst=useSelector(getCPFFirst);
  42. const areaItem=global.getLocalAreaItem();
  43. const firstPayMulti=useSelector(getFirstPayMulti);
  44. const [selectIndex,setSelectIndex]=useState(0);
  45. const getSecondStatus=useSelector(getGetSecondStatus);
  46. const handRef=useRef(null);
  47. const [showGuide,setShowGuide]=useState(false);
  48. const show=()=>{
  49. setIsShow(true);
  50. setWelfTabState(APP_WELFARE.FIRST_PAY);
  51. }
  52. const hide=()=>{
  53. setIsShow(false);
  54. setWelfTabState(-1);
  55. }
  56. useEffect(()=>{
  57. const firstPay={
  58. show,
  59. hide
  60. };
  61. global.firstPay=firstPay;
  62. return ()=>{
  63. }
  64. },[])
  65. useEffect(()=>{
  66. if (firstPayMulti){
  67. setSelectIndex(firstPayMulti.default)
  68. }
  69. },[firstPayMulti])
  70. useEffect(() => {
  71. clearGuideTimer();
  72. if (isShow){
  73. checkShowGuide();
  74. }
  75. }, [isShow]);
  76. const clearGuideTimer=()=>{
  77. if (objInfo.guideTimer){
  78. clearTimeout(objInfo.guideTimer);
  79. objInfo.guideTimer=null;
  80. }
  81. if (objInfo.tl){
  82. objInfo.tl.kill();
  83. objInfo.tl=null;
  84. }
  85. }
  86. const checkShowGuide=()=>{
  87. let items=firstPayMulti.items;
  88. let isguide=items!=null&&items.length>1;
  89. let lflag=localStorageGet(LOCAL_MULTI_FIRST_GUIDE,"0");
  90. if (isguide)isguide=lflag==="0";
  91. setShowGuide(isguide);
  92. clearGuideTimer();
  93. if (isguide){
  94. objInfo.guideTimer=setTimeout(()=>{
  95. let target=handRef.current;
  96. if (target){
  97. let tl=gsap.timeline();
  98. objInfo.tl=tl;
  99. tl.fromTo(target,{x:180,y:420,opacity:0},{x:130,y:330,opacity:1}).call(()=>{setSelectIndex(0)});
  100. tl.to(target,{x:265,y:330},"+=1").call(()=>{setSelectIndex(1)});
  101. tl.to(target,{x:130,y:330},"+=1").call(()=>{setSelectIndex(0)});
  102. tl.to(target,{x:265,y:330},"+=1").call(()=>{setSelectIndex(1)});
  103. tl.to(target,{x:180,y:420,opacity:0},"+=1").call(()=>{setShowGuide(false)})
  104. }
  105. },500)
  106. localStorageSet(LOCAL_MULTI_FIRST_GUIDE,"1");
  107. }
  108. }
  109. const getPayItem=()=>{
  110. if (firstPayMulti){
  111. let items=firstPayMulti.items;
  112. if (items)return items[selectIndex];
  113. else return firstPayMulti.leftitem;
  114. }
  115. return null;
  116. }
  117. const onGetPaymentCallback=()=>{
  118. hide();
  119. navigate(ROUTE_PATH.PAY_ORDER);
  120. }
  121. const onGetPaymentOder=(data)=>{
  122. if (!isLogin){
  123. hide();
  124. navigate(ROUTE_PATH.SIGN_IN);
  125. return;
  126. }
  127. if (orderStatus===REQ_STATUS.LOADING)return;
  128. let reqOrder=()=>{
  129. data.user=user;
  130. data.callback=onGetPaymentCallback;
  131. data.callbackError=callbackErr;
  132. dispatch(reqPaymentOrder(data));
  133. }
  134. let callbackErr=(payload)=>{
  135. if (payload&&payload.code===301){
  136. if (areaItem.code===APP_COUNTRY_CODE.EU){
  137. if (global.wdepositInfo!=null){
  138. global.wdepositInfo.show(()=>{
  139. reqOrder();
  140. });
  141. }
  142. }
  143. }
  144. }
  145. if (areaItem.code===APP_COUNTRY_CODE.RU){
  146. if (global.ruPaytypeSelect!=null){
  147. global.ruPaytypeSelect.show((eventType)=>{
  148. data.eventType=eventType;
  149. reqOrder();
  150. });
  151. }
  152. }
  153. else if (areaItem.code===APP_COUNTRY_CODE.BR){
  154. if (cpfFirst){
  155. if (global.brCPFSave!=null){
  156. global.brCPFSave.show(()=>{
  157. data.cpf_first=1;
  158. reqOrder();
  159. })
  160. }
  161. }
  162. else
  163. {
  164. reqOrder();
  165. }
  166. }
  167. else{
  168. reqOrder();
  169. }
  170. }
  171. const getSecondCallback=(payload)=>{
  172. if (payload&&payload.code===200){
  173. hide();
  174. }
  175. }
  176. const onGetSecond=()=>{
  177. if (getSecondStatus===REQ_STATUS.LOADING)return;
  178. let data={};
  179. data.callback=getSecondCallback;
  180. dispatch(reqGetSecond(data))
  181. }
  182. const renderMain=()=>{
  183. let payItem=getPayItem();
  184. if (payItem==null)return (<></>);
  185. let first_pay=payItem;
  186. let give=0;
  187. let money=0;
  188. let total=0;
  189. let second_give=0;
  190. let precent="";
  191. if (first_pay!=null){
  192. give=Number(first_pay.give);
  193. money=Number(first_pay.money);
  194. second_give=Number(first_pay.second_give);
  195. total=give+money;
  196. precent=''+Math.floor((give+second_give)*100/money)+'%';
  197. }
  198. let isdone=first_pay.timeleft!=null;
  199. if (second_give>0){
  200. return (
  201. <div className={styles.f_main}>
  202. <img className={styles.bglight} src={require('@assets/firstPay/bglight.png')}/>
  203. <div className={styles.pack_con}>
  204. <img className={styles.pack_bg} src={require('@assets/firstPay/pack.png')}/>
  205. <div className={`${styles.bonus_con} ${styles.p_left}`}>
  206. <img className={styles.l_bg} src={require('@assets/firstPay/l_bg.png')}/>
  207. <span data-title={global.DOLLAR + total}
  208. className={styles.p_text}>{global.DOLLAR + total}</span>
  209. <span className={styles.p_label}>{i18n.t("firstPay.today")}</span>
  210. </div>
  211. <div className={`${styles.bonus_con} ${styles.p_right}`}>
  212. <img className={styles.r_bg} src={require('@assets/firstPay/r_bg.png')}/>
  213. <span data-title={global.DOLLAR + second_give}
  214. className={styles.p_text}>{global.DOLLAR + second_give}</span>
  215. <span className={styles.p_label}>{i18n.t("firstPay.day_2")}</span>
  216. </div>
  217. {/*<div className={styles.percent_con}>*/}
  218. {/*<div data-title={precent} className={styles.text}>{precent}</div>*/}
  219. {/*</div>*/}
  220. <div className={styles.percent_con}>
  221. <div data-title={precent + " " + i18n.t("firstPay.up")}
  222. className={styles.p_text}>{precent + " " + i18n.t("firstPay.up")}</div>
  223. </div>
  224. {
  225. isdone ? (
  226. <div className={styles.already_con}>
  227. <img className={styles.mask} src={require('@assets/firstPay/mask.png')}/>
  228. <div className={styles.flag_con}>
  229. <img className={styles.flag_bg} src={require('@assets/firstPay/flag.png')}/>
  230. <div className={styles.flag_label}>{i18n.t("firstPay.already_got")}</div>
  231. </div>
  232. </div>
  233. ) : (<></>)
  234. }
  235. </div>
  236. </div>
  237. )
  238. }
  239. else
  240. {
  241. return (
  242. <div className={styles.f_main}>
  243. <img className={styles.bglight} src={require('@assets/firstPay/bglight.png')}/>
  244. <div className={styles.pack_con}>
  245. <img className={styles.pack_bg} src={require('@assets/firstPay/pack.png')}/>
  246. <div className={styles.percent_con_old}>
  247. <div data-title={'+'+precent} className={styles.text}>{'+'+precent}</div>
  248. </div>
  249. <div className={styles.percent_con}>
  250. <div data-title={global.DOLLAR+total}
  251. className={styles.p_text}>{global.DOLLAR+total}</div>
  252. </div>
  253. </div>
  254. </div>
  255. )
  256. }
  257. }
  258. const renderPayBtn = () => {
  259. let payItem = getPayItem();
  260. if (payItem == null) return (<></>);
  261. let first_pay = payItem;
  262. let money = 0;
  263. let payType = 0;
  264. if (first_pay != null) {
  265. money = Number(first_pay.money);
  266. payType = first_pay.id;
  267. let gear = first_pay.gear;
  268. if (gear != null) {
  269. gear = JSON.parse(gear);
  270. if (gear)gear=gear[0];
  271. payType=gear.id;
  272. }
  273. }
  274. let status=-1;
  275. let timeleft=0;
  276. if (first_pay.timeleft!=null){
  277. timeleft=Number(first_pay.timeleft);
  278. status=timeleft<=0?1:0;
  279. }
  280. let label=(<></>);
  281. if (status===-1){
  282. label=orderStatus===REQ_STATUS.LOADING?(<SmallLoading fill={"#fff"}/>):(
  283. <>
  284. <span data-title={i18n.t("firstPay.only_need")}
  285. className={styles.label}>{i18n.t("firstPay.only_need")}</span>
  286. <span data-title={global.DOLLAR + money}
  287. className={styles.pay_num}>{global.DOLLAR + money}</span>
  288. </>
  289. )
  290. }
  291. else if (status===0){
  292. let left_str=stringFormat(i18n.t("firstPay.time_left"),[formatTime(timeleft)])
  293. label=(
  294. <>
  295. <span data-title={left_str}
  296. className={styles.label_time}>{left_str}</span>
  297. </>
  298. )
  299. }
  300. else if (status===1){
  301. label=getSecondStatus===REQ_STATUS.LOADING?(<SmallLoading fill={"#fff"}/>):(
  302. <>
  303. <span data-title={i18n.t("firstPay.label_claim")}
  304. className={styles.label}>{i18n.t("firstPay.label_claim")}</span>
  305. </>
  306. )
  307. }
  308. return (
  309. <button className={styles.f_btnpay} onClick={() => {
  310. if (status === -1) {
  311. onGetPaymentOder({
  312. price:money,
  313. goodsName:"firstpay",
  314. payType:payType,
  315. GiftsID:first_pay.gift_id
  316. })
  317. }
  318. else if (status===1)
  319. {
  320. onGetSecond();
  321. }
  322. }}>
  323. {/*{*/}
  324. {/* orderStatus===REQ_STATUS.LOADING?(<SmallLoading fill={"#fff"}/>):(*/}
  325. {/* <>*/}
  326. {/* <span data-title={i18n.t("firstPay.only_need")}*/}
  327. {/* className={styles.label}>{i18n.t("firstPay.only_need")}</span>*/}
  328. {/* <span data-title={global.DOLLAR + money}*/}
  329. {/* className={styles.pay_num}>{global.DOLLAR + money}</span>*/}
  330. {/* </>*/}
  331. {/* )*/}
  332. {/*}*/}
  333. {label}
  334. </button>
  335. )
  336. }
  337. const renderPayTabs=()=>{
  338. let items=[];
  339. if (firstPayMulti){
  340. items=firstPayMulti.items;
  341. }
  342. if (items==null||items.length<=1)return (<div></div>);
  343. return (
  344. <div className={styles.f_ptabs_con}>
  345. {
  346. items.map((item,index)=>{
  347. let t_img=index===selectIndex?1:0;
  348. return (
  349. <button className={styles.tab_con} key={index} onClick={()=>{
  350. setSelectIndex(index);
  351. }}>
  352. <img className={styles.t_bg} src={require(`@assets/firstPay/tab_${t_img}.png`)}/>
  353. <div className={styles.t_label_con}>
  354. <span data-title={global.DOLLAR + item.money} className={styles.t_text}>{global.DOLLAR+item.money}</span>
  355. </div>
  356. </button>
  357. )
  358. })
  359. }
  360. </div>
  361. )
  362. }
  363. const renderTabsGuide=()=>{
  364. if (!showGuide)return (<></>);
  365. return (
  366. <div className={styles.f_tab_guide}>
  367. <img ref={handRef} className={styles.f_hand} src={require('@assets/firstPay/guide.png')}/>
  368. </div>
  369. )
  370. }
  371. const renderPaytypeSelect=()=>{
  372. if (areaItem.code===APP_COUNTRY_CODE.RU){
  373. return (<RUPaytypeSelect/>)
  374. }
  375. else
  376. {
  377. return (<></>);
  378. }
  379. }
  380. const renderCPFSave=()=>{
  381. if (areaItem.code===APP_COUNTRY_CODE.BR){
  382. return (<BRCPFSave/>)
  383. }
  384. else
  385. {
  386. return (<></>)
  387. }
  388. }
  389. return (
  390. <>
  391. <Modal open={isShow} onClose={hide} closeAfterTransition>
  392. <Fade in={isShow} timeout={500}>
  393. <div className={styles.container}>
  394. <Grow in={isShow} timeout={500}>
  395. <div className={styles.f_con}>
  396. <img className={styles.title} src={require(`@assets/firstPay/${i18n.language}.png`)}/>
  397. {renderMain()}
  398. {renderPayTabs()}
  399. {renderPayBtn()}
  400. {renderTabsGuide()}
  401. </div>
  402. </Grow>
  403. </div>
  404. </Fade>
  405. </Modal>
  406. {renderPaytypeSelect()}
  407. {renderCPFSave()}
  408. </>
  409. )
  410. }
  411. export default WFirstPay;