From 082c5483c5c0a6789ca75bc102df9ac930f52746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=94=E5=8A=9B=E5=8F=89=E7=83=A7=E5=8C=85?= Date: Thu, 5 Jun 2025 23:32:04 +0800 Subject: [PATCH] feat: invite capa page --- src/components/partner-invite-list/index.tsx | 48 ++++++++++++++++---- src/http/api.ts | 2 +- src/utils/partner.ts | 8 +++- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/components/partner-invite-list/index.tsx b/src/components/partner-invite-list/index.tsx index f882032..79c5384 100644 --- a/src/components/partner-invite-list/index.tsx +++ b/src/components/partner-invite-list/index.tsx @@ -12,6 +12,8 @@ import './index.less'; const PREFIX = 'partner-invite-list'; const log = logWithPrefix(PREFIX); +const FIRST_PAGE = 0; + function PartnerList(props: { refreshDisabled?: boolean; visible?: boolean; @@ -20,10 +22,12 @@ function PartnerList(props: { onListEmpty?: () => void; }) { const { className, listHeight, refreshDisabled, visible = true, onListEmpty } = props; + const [hasMore, setHasMore] = useState(true); const [refreshing, setRefreshing] = useState(false); const [loadingMore, setLoadingMore] = useState(false); const [loadMoreError, setLoadMoreError] = useState(false); const [dataList, setDataList] = useState([]); + const currentPage = useRef(FIRST_PAGE); const onListEmptyRef = useRef(onListEmpty); const handleRefresh = useCallback(async () => { @@ -31,19 +35,44 @@ function PartnerList(props: { try { setRefreshing(true); setLoadMoreError(false); - const list = await requestData(); - setDataList(list); - !list.length && onListEmptyRef.current?.(); + const { content, totalPages } = await requestData({ page: 1 }); + setDataList(content); + currentPage.current = 1; + setHasMore(currentPage.current < totalPages); + !content.length && onListEmptyRef.current?.(); log('pull refresh success'); } catch (e) { setDataList([]); + setHasMore(false); setLoadMoreError(true); + currentPage.current = FIRST_PAGE; log('pull refresh failed'); } finally { setRefreshing(false); } }, []); + const handleLoadMore = useCallback(async () => { + log('start load more', hasMore); + if (!hasMore) { + return; + } + setLoadMoreError(false); + setLoadingMore(true); + try { + const { totalPages, content } = await requestData({ page: currentPage.current + 1 }); + setDataList([...dataList, ...content]); + currentPage.current = currentPage.current + 1; + setHasMore(currentPage.current < totalPages); + log('load more success'); + } catch (e) { + setLoadMoreError(true); + log('load more failed'); + } finally { + setLoadingMore(false); + } + }, [dataList, hasMore]); + useEffect(() => { onListEmptyRef.current = onListEmpty; }, [onListEmpty]); @@ -62,11 +91,14 @@ function PartnerList(props: { setDataList([]); setLoadingMore(true); setLoadMoreError(false); - const list = await requestData(); - setDataList(list); - !list.length && onListEmptyRef.current?.(); + const { totalPages, content } = await requestData({ page: 1 }); + setDataList(content); + currentPage.current = 1; + setHasMore(currentPage.current < totalPages); + !content.length && onListEmptyRef.current?.(); } catch (e) { setDataList([]); + setHasMore(false); setLoadMoreError(true); } finally { log('visible changed, refresh list data end'); @@ -90,8 +122,8 @@ function PartnerList(props: { disabled={refreshDisabled} > {}} + hasMore={hasMore} + onLoad={handleLoadMore} loading={loadingMore || refreshing} disabled={loadMoreError} fixedHeight={typeof listHeight !== 'undefined'} diff --git a/src/http/api.ts b/src/http/api.ts index 09469c2..676e0ac 100644 --- a/src/http/api.ts +++ b/src/http/api.ts @@ -78,7 +78,7 @@ export enum API { // partner PARTNER_QRCODE = '/user/getInviteQrCode', GET_INVITE_CODE = '/user/getUserInviteCode', - GET_INVITE_LIST = '/user/inviteUsers', + GET_INVITE_LIST = '/user/inviteUsers/list', BECOME_PARTNER = '/user/becomePartner', GET_PROFIT_LIST = '/user/profit/list', GET_PROFIT_STAT = '/user/profits', diff --git a/src/utils/partner.ts b/src/utils/partner.ts index ac85582..d48ee2a 100644 --- a/src/utils/partner.ts +++ b/src/utils/partner.ts @@ -5,6 +5,7 @@ import http from '@/http'; import { API } from '@/http/api'; import store from '@/store'; import { setInviteCode } from '@/store/actions/partner'; +import { IPaginationRequest } from '@/types/common'; import { GetProfitRequest, InviteUserInfo, @@ -51,8 +52,11 @@ export const getPartnerQrcode = async () => { export const getPartnerProfitStat = async () => { return await http.post(API.GET_PROFIT_STAT); }; -export const getPartnerInviteList = async () => { - return await http.post(API.GET_INVITE_LIST); +export const getPartnerInviteList = async (data: IPaginationRequest) => { + return await http.post<{ content: InviteUserInfo[]; totalPages: number }>(API.GET_INVITE_LIST, { + data, + contentType: 'application/x-www-form-urlencoded', + }); }; export const dispatchUpdateInviteCode = (code: string) => store.dispatch(setInviteCode(code)); export const getInviteCode = async () => {