|
@@ -3,6 +3,7 @@ import { getRankDetail, Rank, RankDetail, RankRequestParams, RankReward } from "
|
|
|
import Empty from "@/components/Empty";
|
|
|
import TipsModal from "@/components/TipsModal";
|
|
|
import Vip from "@/components/Vip";
|
|
|
+import { InfiniteScroll } from "antd-mobile";
|
|
|
import clsx from "clsx";
|
|
|
import React from "react";
|
|
|
import styles from "./page.module.scss";
|
|
@@ -14,13 +15,16 @@ export type ModalProps = {
|
|
|
|
|
|
interface Props {
|
|
|
areaId: number;
|
|
|
+ type: 0 | -1;
|
|
|
}
|
|
|
|
|
|
-const History = React.forwardRef<ModalProps, Props>(({ areaId }, ref) => {
|
|
|
+const History = React.forwardRef<ModalProps, Props>(({ areaId, type }, ref) => {
|
|
|
const [rankList, setRankList] = React.useState<Rank[]>([]);
|
|
|
+ const [noMore, setNoMore] = React.useState<boolean>(false);
|
|
|
const [data, setData] = React.useState<RankDetail>({} as RankDetail);
|
|
|
+ const [visible, setVisible] = React.useState<boolean>(false);
|
|
|
const pageInfo = React.useRef({
|
|
|
- page: 1,
|
|
|
+ page: 0,
|
|
|
});
|
|
|
|
|
|
const getNumber = (num: number) => {
|
|
@@ -32,24 +36,37 @@ const History = React.forwardRef<ModalProps, Props>(({ areaId }, ref) => {
|
|
|
|
|
|
React.useImperativeHandle(ref, () => {
|
|
|
return {
|
|
|
- onClose: () => tipModals.current?.onClose(),
|
|
|
- onOpen: () => tipModals.current?.onOpen(),
|
|
|
+ // onClose: () => tipModals.current?.onClose(),
|
|
|
+ // onOpen: () => tipModals.current?.onOpen(),
|
|
|
+ onClose: () => setVisible(false),
|
|
|
+ onOpen: () => setVisible(true),
|
|
|
};
|
|
|
});
|
|
|
|
|
|
React.useEffect(() => {
|
|
|
- getData();
|
|
|
- }, [areaId]);
|
|
|
+ pageInfo.current.page = 0;
|
|
|
+ setNoMore(false);
|
|
|
+ setRankList([]);
|
|
|
+ // getData();
|
|
|
+ // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
+ }, [visible]);
|
|
|
|
|
|
const getData = async () => {
|
|
|
+ if (noMore) return;
|
|
|
const params: RankRequestParams = {
|
|
|
area_id: areaId,
|
|
|
- type: -1,
|
|
|
+ type: type,
|
|
|
page: pageInfo.current?.page || 1,
|
|
|
};
|
|
|
const res = await getRankDetail(params);
|
|
|
if (res?.code === 200) {
|
|
|
- setRankList(res?.data?.list || []);
|
|
|
+ if (res?.data?.list && res?.data?.list?.length < 10) {
|
|
|
+ setNoMore(true);
|
|
|
+ }
|
|
|
+ setData(res.data);
|
|
|
+ setRankList((value) => {
|
|
|
+ return [...(value || []), ...(res?.data?.list || [])];
|
|
|
+ });
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -60,57 +77,70 @@ const History = React.forwardRef<ModalProps, Props>(({ areaId }, ref) => {
|
|
|
position="bottom"
|
|
|
className={styles.tipModal}
|
|
|
ref={tipModals}
|
|
|
+ visible={visible}
|
|
|
+ onChange={(visible) => setVisible(visible)}
|
|
|
title={
|
|
|
<div className="p-[.1rem] text-left">
|
|
|
<span className="text-[#fff]">Conjunto de prémios:</span>
|
|
|
- <span className={styles.moneyText}>R${data.total}</span>
|
|
|
+ <span className={styles.moneyText}>R${data.total || 0}</span>
|
|
|
</div>
|
|
|
}
|
|
|
>
|
|
|
- <div className="bg-[#1f2830] p-[.1rem]">
|
|
|
- {!!data?.list?.length &&
|
|
|
- data.list.map((item) => {
|
|
|
- let curReward: RankReward = {} as RankReward;
|
|
|
- if (item?.reward?.length) {
|
|
|
- curReward = item?.reward[0];
|
|
|
- }
|
|
|
- return (
|
|
|
- <div className={clsx(styles.normalItem)} key={item.rank}>
|
|
|
- <div className="mr-[.1rem] w-[.5rem] text-center text-[.2rem] font-bold text-[#11de68]">
|
|
|
- {getNumber(1)}
|
|
|
- </div>
|
|
|
- <div className={clsx(styles.normalHeader, "mr-[.2rem]")}>
|
|
|
- <img
|
|
|
- src="https://img1.baidu.com/it/u=1699323843,2372946297&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=983"
|
|
|
- alt=""
|
|
|
- className={styles.headerImage}
|
|
|
- />
|
|
|
- <Vip
|
|
|
- style={{
|
|
|
- position: "absolute",
|
|
|
- bottom: "-0.1rem",
|
|
|
- }}
|
|
|
- level={item?.vipLevel}
|
|
|
- vipIconClassName="relative z-[3]"
|
|
|
- vipIconStyle={{ width: ".3rem" }}
|
|
|
- ></Vip>
|
|
|
- </div>
|
|
|
- <div className="flex-1">
|
|
|
- <div>{item?.nickName}</div>
|
|
|
- <div className={styles.usedPoint}>{item?.score}</div>
|
|
|
- </div>
|
|
|
- <div className="flex flex-col items-end">
|
|
|
- <div className={styles.moneyText}>
|
|
|
- R${curReward?.amount || 0}
|
|
|
+ <div className="h-[60vh] overflow-auto bg-[#1f2830] p-[.1rem]">
|
|
|
+ {!!rankList?.length && (
|
|
|
+ <>
|
|
|
+ {rankList.map((item) => {
|
|
|
+ let curReward: RankReward = {} as RankReward;
|
|
|
+ if (item?.reward?.length) {
|
|
|
+ curReward = item?.reward[0];
|
|
|
+ }
|
|
|
+ return (
|
|
|
+ <div className={clsx(styles.normalItem)} key={item.rank}>
|
|
|
+ <div className="mr-[.1rem] w-[.5rem] text-center text-[.2rem] font-bold text-[#11de68]">
|
|
|
+ {getNumber(item.rank)}
|
|
|
</div>
|
|
|
- <div className={styles.percentBox}>
|
|
|
- {curReward?.ratio || 0}%
|
|
|
+ <div className={clsx(styles.normalHeader, "mr-[.2rem]")}>
|
|
|
+ <img
|
|
|
+ src="https://img1.baidu.com/it/u=1699323843,2372946297&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=983"
|
|
|
+ alt=""
|
|
|
+ className={styles.headerImage}
|
|
|
+ />
|
|
|
+ <Vip
|
|
|
+ style={{
|
|
|
+ position: "absolute",
|
|
|
+ bottom: "-0.1rem",
|
|
|
+ }}
|
|
|
+ level={item?.vipLevel}
|
|
|
+ vipIconClassName="relative z-[3]"
|
|
|
+ vipIconStyle={{ width: ".3rem" }}
|
|
|
+ ></Vip>
|
|
|
+ </div>
|
|
|
+ <div className="flex-1">
|
|
|
+ <div className="text-[.12rem]">{item?.nickName}</div>
|
|
|
+ <div className={styles.usedPoint}>{item?.score}</div>
|
|
|
+ </div>
|
|
|
+ <div className="flex flex-col items-end">
|
|
|
+ <div className={styles.moneyText}>
|
|
|
+ R${curReward?.amount || 0}
|
|
|
+ </div>
|
|
|
+ <div className={styles.percentBox}>
|
|
|
+ {curReward?.ratio || 0}%
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- );
|
|
|
- })}
|
|
|
- {!data?.list?.length && (
|
|
|
+ );
|
|
|
+ })}
|
|
|
+ </>
|
|
|
+ )}
|
|
|
+ <InfiniteScroll
|
|
|
+ loadMore={async () => {
|
|
|
+ pageInfo.current.page++;
|
|
|
+ await getData();
|
|
|
+ }}
|
|
|
+ hasMore={!noMore}
|
|
|
+ ></InfiniteScroll>
|
|
|
+
|
|
|
+ {!rankList.length && (
|
|
|
<div className="flex h-[100%] items-center justify-center">
|
|
|
<Empty></Empty>
|
|
|
</div>
|