Skip to content

Commit cf482bf

Browse files
authored
[GSW-2407] improve UserPositions pagination (#791)
* fix: [GSW-2407] Pagination UI Flickering * feat: [GSW-2407] add positionIds to queryKey to prevent cache collision * refactor: [GSW-2407] useMakePoolPositions
1 parent 0bbdcbb commit cf482bf

File tree

9 files changed

+30
-35
lines changed

9 files changed

+30
-35
lines changed

packages/web/src/components/common/my-position-card-list/MyPositionCardList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ const MyPositionCardList: React.FC<MyPositionCardListProps> = ({
6666
const shouldShowPositions = !isLoading && hasPositions;
6767
const shouldShowLoadMoreButton = !mobile && !isLoading && showLoadMore && !!onClickLoadMore;
6868
const shouldShowPositionIndicator = showPositionIndicator && isFetched && hasPositions && !isLoading;
69-
const shouldShowPagination = Boolean(totalPage && totalPage > 1 && !loadMore);
69+
const shouldShowPagination = Boolean(totalPage && totalPage > 1 && (mobile || !loadMore));
7070
const targetCount = shouldShowPagination && limit ? limit : maxDisplayCount;
7171
const shouldShowBlankCards = isFetched && !isLoading && hasPositions && positions.length < maxDisplayCount;
7272

packages/web/src/hooks/common/use-loading.tsx

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,9 @@ import { useInitLoading } from "@query/common";
44
import { useGetDashboardVolume } from "@query/dashboard";
55
import { useGetPoolList } from "@query/pools";
66
import { useGetChainInfo } from "@query/token";
7-
import { useGetPositionsByAddress } from "@query/positions";
8-
import { useAddress } from "@hooks/common/use-address";
97
import { useGetLaunchpadActiveProjects } from "@query/launchpad/use-get-launchpad-active-projects";
108

119
export const useLoading = () => {
12-
const { address } = useAddress();
1310
const { data: initialized } = useInitLoading();
1411
const { isFetched: isFetchedChainData } = useGetChainInfo();
1512
const { isFetched: isFetchedTokenData, isFetchedTokenPrices } = useTokenData();
@@ -19,15 +16,6 @@ export const useLoading = () => {
1916
enabled: false,
2017
});
2118

22-
const { isFetched: isFetchedPosition } = useGetPositionsByAddress(
23-
{
24-
address: address || "",
25-
},
26-
{
27-
enabled: false,
28-
},
29-
);
30-
3119
const { isFetched: isFetchedLaunchpadProjectList } = useGetLaunchpadActiveProjects({ enabled: false });
3220

3321
const isLoading = useMemo(() => {
@@ -80,16 +68,6 @@ export const useLoading = () => {
8068
return !isFetchedDashboardVolume;
8169
}, [initialized, isFetchedDashboardVolume]);
8270

83-
const isLoadingPositions = useMemo(() => {
84-
if (!initialized) {
85-
return true;
86-
}
87-
if (!address) {
88-
return false;
89-
}
90-
return !isFetchedPosition;
91-
}, [address, initialized, isFetchedPosition]);
92-
9371
const isLoadingLaunchpadProjectList = useMemo(() => {
9472
if (!initialized) {
9573
return true;
@@ -105,7 +83,6 @@ export const useLoading = () => {
10583
isLoadingHighestAPRPools,
10684
isLoadingChainData,
10785
isLoadingDashboardStats,
108-
isLoadingPositions,
10986
isLoadingLaunchpadProjectList,
11087
};
11188
};

packages/web/src/hooks/pool/data/use-position-data.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ export const usePositionData = (options?: UsePositionDataOption) => {
3030
isError,
3131
isFetched: isFetchedPosition,
3232
isLoading: isLoadingPosition,
33-
isFetching: isFetchingPosition,
34-
isPreviousData,
3533
} = useGetPositionsByAddress({
3634
address: fetchedAddress as string,
3735
isClosed: options?.isClosed,
@@ -102,6 +100,5 @@ export const usePositionData = (options?: UsePositionDataOption) => {
102100
isFetchedPosition: isFetchedPosition && isFetchedPoolPositions,
103101
loading,
104102
isLoadingPool,
105-
isPageChanging: isFetchingPosition && isPreviousData,
106103
};
107104
};

packages/web/src/layouts/earn/components/earn-my-positions/EarnMyPositions.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface EarnMyPositionsProps {
1818
connected: boolean;
1919
fetched: boolean;
2020
loading: boolean;
21+
loadingPositionCardList: boolean;
2122
isError: boolean;
2223
positions: PoolPositionModel[];
2324
isSwitchNetwork: boolean;
@@ -60,6 +61,7 @@ const EarnMyPositions: React.FC<EarnMyPositionsProps> = ({
6061
connect,
6162
fetched,
6263
loading,
64+
loadingPositionCardList,
6365
isError,
6466
positions,
6567
moveEarnAdd,
@@ -112,6 +114,7 @@ const EarnMyPositions: React.FC<EarnMyPositionsProps> = ({
112114
connect={connect}
113115
fetched={fetched}
114116
loading={loading}
117+
loadingPositionCardList={loadingPositionCardList}
115118
isError={isError}
116119
positions={positions}
117120
movePoolDetail={movePoolDetail}

packages/web/src/layouts/earn/components/earn-my-positions/earn-my-positions-content/EarnMyPositionsContent.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface EarnMyPositionContentProps {
1515
connected: boolean;
1616
fetched: boolean;
1717
loading: boolean;
18+
loadingPositionCardList: boolean;
1819
isError: boolean;
1920
positions: PoolPositionModel[];
2021
connect: () => void;
@@ -46,6 +47,7 @@ const EarnMyPositionsContent: React.FC<EarnMyPositionContentProps> = ({
4647
connected,
4748
fetched,
4849
loading,
50+
loadingPositionCardList,
4951
positions,
5052
connect,
5153
movePoolDetail,
@@ -85,7 +87,7 @@ const EarnMyPositionsContent: React.FC<EarnMyPositionContentProps> = ({
8587
address={address}
8688
positions={positions}
8789
isFetched={fetched}
88-
isLoading={loading}
90+
isLoading={loadingPositionCardList}
8991
currentIndex={currentIndex}
9092
maxDisplayCount={maxDisplayCount}
9193
movePoolDetail={movePoolDetail}

packages/web/src/layouts/earn/containers/earn-my-position-container/EarnMyPositionContainer.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ const EarnMyPositionContainer: React.FC<EarnMyPositionContainerProps> = ({
136136

137137
const showedPosition = useMemo(() => {
138138
return [...openPosition, ...(isClosed ? closedPosition : [])];
139-
}, [closedPosition, isClosed, openPosition]);
139+
}, [closedPosition, isClosed, openPosition, limit]);
140140

141141
const handleScroll = useCallback(() => {
142142
if (divRef.current) {
@@ -275,7 +275,7 @@ const EarnMyPositionContainer: React.FC<EarnMyPositionContainerProps> = ({
275275

276276
setMappedData(convertedMappedData);
277277
setIsDataMappingLoading(false);
278-
}, [isViewMorePositions, width, showedPosition]);
278+
}, [isViewMorePositions, width, showedPosition, limit]);
279279

280280
useEffect(() => {
281281
updateDataMapping();
@@ -315,6 +315,10 @@ const EarnMyPositionContainer: React.FC<EarnMyPositionContainerProps> = ({
315315
setPage(1);
316316
}, [isClosed]);
317317

318+
const loadingPositionCardList = useMemo(() => {
319+
return isLoadingPool || isLoadingPosition || isDataMappingLoading;
320+
}, [isLoadingPool, isLoadingPosition, isDataMappingLoading]);
321+
318322
return (
319323
<EarnMyPositions
320324
address={address}
@@ -326,6 +330,7 @@ const EarnMyPositionContainer: React.FC<EarnMyPositionContainerProps> = ({
326330
availableStake={availableStake}
327331
connect={connect}
328332
loading={isLoadingPool || (connected ? isLoadingPosition || !isFetchedPosition : false) || isDataMappingLoading}
333+
loadingPositionCardList={loadingPositionCardList}
329334
fetched={isFetchedPools && isFetchedPosition}
330335
isError={isError}
331336
positions={mappedData}

packages/web/src/layouts/earn/containers/incentivized-pool-card-list-container/IncentivizedPoolCardListContainer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const IncentivizedPoolCardListContainer: React.FC = () => {
3838
const themeKey = useAtomValue(ThemeState.themeKey);
3939
const divRef = useRef<HTMLDivElement | null>(null);
4040
const { width } = useWindowSize();
41-
const { loading: isLoadingPosition, checkStakedPool } = usePositionData();
41+
const { checkStakedPool } = usePositionData();
4242

4343
const incentivizePoolList: IncentivizePoolCardInfoWithPriceGrade[] = React.useMemo(() => {
4444
return incentivizePools.map(pool => {
@@ -191,7 +191,7 @@ const IncentivizedPoolCardListContainer: React.FC = () => {
191191
onScroll={handleScroll}
192192
showPagination={showPagination}
193193
width={width}
194-
isLoading={isLoadingIncentivizedPool || isLoadingPosition}
194+
isLoading={isLoadingIncentivizedPool}
195195
checkStakedPool={checkStakedPool}
196196
/>
197197
);

packages/web/src/layouts/portfolio/containers/wallet-position-card-list-container/WalletPositionCardListContainer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ const WalletPositionCardListContainer: React.FC<{ isClosed: boolean }> = ({ isCl
127127

128128
const showedPosition = useMemo(() => {
129129
return [...openPosition, ...(isClosed ? closedPosition : [])];
130-
}, [closedPosition, isClosed, openPosition]);
130+
}, [closedPosition, isClosed, openPosition, limit]);
131131

132132
const handleScroll = useCallback(() => {
133133
if (divRef.current) {
@@ -233,7 +233,7 @@ const WalletPositionCardListContainer: React.FC<{ isClosed: boolean }> = ({ isCl
233233

234234
setMappedData(convertedMappedData);
235235
setIsDataMappingLoading(false);
236-
}, [isViewMorePositions, width, showedPosition]);
236+
}, [isViewMorePositions, width, showedPosition, limit]);
237237

238238
useEffect(() => {
239239
updateDataMapping();

packages/web/src/react-query/positions/use-make-pool-positions.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useMemo } from "react";
12
import { UseQueryOptions, useQuery } from "@tanstack/react-query";
23

34
import { GNOT_TOKEN } from "@common/values/token-constant";
@@ -15,8 +16,18 @@ export const useMakePoolPositions = (
1516
isFetchedPosition: boolean,
1617
options?: UseQueryOptions<PoolPositionModel[], Error>,
1718
) => {
19+
const positionIdArray = useMemo(() => {
20+
if (!positions || positions.length === 0) return [];
21+
return positions.map(position => position.id);
22+
}, [positions]);
23+
24+
const positionIds = useMemo(() => {
25+
if (positionIdArray.length === 0) return "";
26+
return [...positionIdArray].sort((a, b) => a - b).join(",");
27+
}, [positionIdArray]);
28+
1829
const query = useQuery<PoolPositionModel[], Error>({
19-
queryKey: [QUERY_KEY.poolPositions],
30+
queryKey: [QUERY_KEY.poolPositions, positionIds],
2031
queryFn: async () => {
2132
return new Promise(resolve => {
2233
const poolPositions: PoolPositionModel[] = [];

0 commit comments

Comments
 (0)