index.jsx 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import Modal from "@mui/material/Modal";
  2. import Fade from "@mui/material/Fade";
  3. import styles from "./styles.module.scss";
  4. import {useEffect, useState} from "react";
  5. import Grow from "@mui/material/Grow";
  6. import closeImg from '@assets/checkIn/com_tanc_X.png';
  7. import {useDispatch, useSelector} from "react-redux";
  8. import {getCheckInData, getCheckInStatus, getNextGetTime} from "@features/checkInSlice";
  9. import {useNavigate} from "react-router-dom";
  10. import {ROUTE_PATH} from "@constants/routes";
  11. import {reqCheckinCheck, reqCheckinGet, reqRedpackCheck} from "@features/api";
  12. import {REQ_STATUS} from "@api/config";
  13. import SmallLoading from "@components/SmallLoading";
  14. import {formatTime} from "@utils/helpers";
  15. const i18n=global.i18n;
  16. const imgList={
  17. 1:{
  18. src:require("@assets/checkIn/1.png"),
  19. height:"3.2rem"
  20. },
  21. 2:{
  22. src:require("@assets/checkIn/1.png"),
  23. height:"3.2rem"
  24. },
  25. 3:{
  26. src:require("@assets/checkIn/2.png"),
  27. height:"3.6rem"
  28. },
  29. 4:{
  30. src:require("@assets/checkIn/3.png"),
  31. height:"3.9rem"
  32. },
  33. 5:{
  34. src:require("@assets/checkIn/3.png"),
  35. height:"3.9rem"
  36. },
  37. 6:{
  38. src:require("@assets/checkIn/4.png"),
  39. height:"4.3rem"
  40. },
  41. 7:{
  42. src:require("@assets/checkIn/5.png"),
  43. height:"3.7rem"
  44. }
  45. }
  46. const objInfo={
  47. timer:null
  48. }
  49. const WCheckIn = ({close}) => {
  50. const [open,setOpen]=useState(true);
  51. const checkInData=useSelector(getCheckInData);
  52. const status=useSelector(getCheckInStatus);
  53. const navigate=useNavigate();
  54. const dispatch=useDispatch();
  55. const NextGetTime=useSelector(getNextGetTime);
  56. const [leftTime,setLeftTime]=useState(0);
  57. const resetTimer=()=>{
  58. if (objInfo.timer!=null){
  59. clearInterval(objInfo.timer);
  60. objInfo.timer=null;
  61. }
  62. }
  63. useEffect(()=>{
  64. // dispatch(reqCheckinCheck());
  65. if (checkInData.RewardDay==null||checkInData.RewardDay.length===0){
  66. dispatch(reqCheckinCheck());
  67. }
  68. return ()=>{
  69. resetTimer();
  70. }
  71. },[]);
  72. useEffect(()=>{
  73. resetTimer();
  74. let now=Date.now();
  75. let left=NextGetTime-now;
  76. if (left>0){
  77. setLeftTime(left);
  78. objInfo.timer=setInterval(()=>{
  79. now=Date.now();
  80. left=NextGetTime-now;
  81. if (left<=0){
  82. left=0;
  83. dispatch(reqCheckinCheck());
  84. resetTimer();
  85. }
  86. setLeftTime(left);
  87. },1000);
  88. }
  89. },[NextGetTime])
  90. const onClose=()=>{
  91. setOpen(false);
  92. if(close)close();
  93. }
  94. const onOpenPay=()=>{
  95. navigate("/"+ROUTE_PATH.PAY,{replace:true})
  96. }
  97. const onCheckInCB=(payload)=>{
  98. if (payload&&payload.code===200){
  99. global.showDropCoins();
  100. close();
  101. }
  102. // else if (payload&&payload.code===301)
  103. // {
  104. // let data={
  105. // content:i18n.t("CheckIn.must_recharge"),
  106. // sureLabel:i18n.t("CheckIn.btn_to_recharge"),
  107. // sureCB:onOpenPay,
  108. // }
  109. // global.msgBoxShow(data)
  110. // }
  111. }
  112. const onCheckIn=(cashNum)=>{
  113. if (status.CheckInGet===REQ_STATUS.LOADING)return;
  114. if (leftTime>0)return;
  115. dispatch(reqCheckinGet({
  116. cashNum:cashNum,
  117. callback:onCheckInCB
  118. }));
  119. }
  120. const renderBonusList=()=>{
  121. let RewardDay=checkInData.RewardDay;
  122. if(RewardDay==null)RewardDay=[];
  123. let rowData=[
  124. RewardDay.slice(0,4),
  125. RewardDay.slice(4,7),
  126. ]
  127. let nDayNumber=checkInData.NextDayNumber;
  128. nDayNumber=nDayNumber-1;
  129. if (nDayNumber>7)nDayNumber=7;
  130. let cbRecord=checkInData.cbRecord;
  131. let itemIndex=0;
  132. return (
  133. <div className={styles.list_con}>
  134. {
  135. rowData.map((rowList,rindex)=>{
  136. return (
  137. <div key={rindex} className={styles.item_con}>
  138. {
  139. rowList.map((item,index)=>{
  140. let isDone=cbRecord[itemIndex];
  141. itemIndex++;
  142. return (
  143. <div key={index} className={`${styles.item} ${styles['item_'+item]}`}>
  144. <button className={`${styles.item_bg} ${nDayNumber===item?styles.item_bg_today:''} ${isDone===1?styles.item_bg_recived:''}`}>
  145. <span className={styles.title}>{i18n.t("CheckIn.day"+item)}</span>
  146. <div className={styles.img_con}>
  147. <img src={imgList[item].src} style={{height:imgList[item].height,width:"auto"}}/>
  148. </div>
  149. </button>
  150. {
  151. isDone===1? (
  152. <div className={styles.item_checked}>
  153. <img src={require("@assets/checkIn/img_sure.png")}/>
  154. </div>
  155. ):(<></>)
  156. }
  157. </div>
  158. )
  159. })
  160. }
  161. </div>
  162. )
  163. })
  164. }
  165. </div>
  166. )
  167. }
  168. const renderButtons=()=>{
  169. let nDayNumber=checkInData.NextDayNumber;
  170. if (nDayNumber>7)nDayNumber=7;
  171. let RewardScore=checkInData.RewardScore;
  172. let cashNum=RewardScore[nDayNumber-1];
  173. return (
  174. <div className={styles.buttons_con}>
  175. <button className={`${styles.btn_base} ${styles.btn_blue}`} onClick={onOpenPay}>
  176. <span className={styles.text_con}>
  177. {i18n.t("CheckIn.getMore")}
  178. </span>
  179. </button>
  180. <button className={`${styles.btn_base} ${styles.btn_yellow}`} onClick={()=>{
  181. onCheckIn(cashNum);
  182. }}>
  183. <img src={require("@assets/checkIn/img_jinbi.png")} className={styles.img_coin}/>
  184. {
  185. status.CheckInGet===REQ_STATUS.LOADING?(<SmallLoading fill={"#FFF"}></SmallLoading>): (
  186. <>
  187. {
  188. leftTime<=0? (
  189. <div className={styles.text_take}>
  190. {i18n.t("CheckIn.take")}
  191. <span>{global.DOLLAR + cashNum}</span>
  192. </div>
  193. ):(
  194. <div className={styles.text_left}>
  195. <span className={styles.left_title}>{i18n.t("CheckIn.last_get")}</span>
  196. <span className={styles.left_timer}>{formatTime(leftTime,true)}</span>
  197. </div>
  198. )
  199. }
  200. </>
  201. )
  202. }
  203. </button>
  204. </div>
  205. )
  206. }
  207. const renderMain = () => {
  208. let RewardDay = checkInData.RewardDay;
  209. let isLoading=!(RewardDay!=null&&RewardDay.length>0);
  210. return (
  211. <Grow in={open} timeout={500}>
  212. <div className={styles.check_con}>
  213. <div className={styles.title_con}>
  214. {i18n.t("CheckIn.title")}
  215. <button className={styles.close} onClick={onClose}>
  216. <img src={closeImg} alt="close"/>
  217. </button>
  218. </div>
  219. <div className={styles.content_con}>
  220. {
  221. isLoading?(<SmallLoading fill={"#fff"}></SmallLoading>):(
  222. <>
  223. {renderBonusList()}
  224. {renderButtons()}
  225. </>
  226. )
  227. }
  228. </div>
  229. </div>
  230. </Grow>
  231. )
  232. }
  233. return (
  234. <>
  235. <Modal open={open} onClose={onClose} closeAfterTransition>
  236. <Fade in={open} timeout={500}>
  237. <div className={styles.container}>
  238. <div className={styles.content}>
  239. {renderMain()}
  240. </div>
  241. </div>
  242. </Fade>
  243. </Modal>
  244. </>
  245. )
  246. }
  247. export default WCheckIn;