Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 58 additions & 46 deletions src/modules/pointsVault/components/PointsVaultApprovedList.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
import { Box } from 'blocks';
import { Box, Pagination } from 'blocks';
import { useQueryClient } from '@tanstack/react-query';
import InfiniteScroll from 'react-infinite-scroller';
import LoaderSpinner, { LOADER_TYPE } from 'components/reusables/loaders/LoaderSpinner';
import { PointsVaultListColumns } from './PointsVaultListColumns';
import { PointsVaultListItem } from './PointsVaultListItem';
import {
PointsVaultActivitiesResponse,
pointsVaultRejectedUsers,
useGetPointsVaultApprovedUsers,
useGetPointsVaultApprovedUsersPaginated,
usePointsVaultToken,
} from 'queries';
import { LeaderBoardNullState } from 'modules/rewards/components/LeaderboardNullState';
import { useEffect, useState } from 'react';

type PointsVaultApprovedListProps = {
query: {
Expand All @@ -21,26 +20,28 @@ type PointsVaultApprovedListProps = {

const PointsVaultApprovedList = ({ query }: PointsVaultApprovedListProps) => {
const token = usePointsVaultToken();

const queryClient = useQueryClient();
const [currentPage, setCurrentPage] = useState(1);
const pageSize = 10;

const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, isError, refetch } =
useGetPointsVaultApprovedUsers({
status: 'COMPLETED',
token,
pageSize: 20,
twitter: query.twitter,
wallet: query.wallet,
activityTypeId: 'follow_push_on_twitter',
});
const { data, isLoading, isError, refetch, isFetching } = useGetPointsVaultApprovedUsersPaginated({
status: 'COMPLETED',
token,
pageSize,
page: currentPage,
twitter: query.twitter,
wallet: query.wallet,
activityTypeId: 'follow_push_on_twitter',
});

const hasMoreData = !isFetchingNextPage && hasNextPage;
useEffect(() => {
setCurrentPage(1);
}, [query.twitter, query.wallet]);

const pointsVaultList = isLoading
? Array(5).fill(0)
: data?.pages.flatMap((page: PointsVaultActivitiesResponse) => page.activities) || [];
const pointsVaultList = isLoading ? Array(5).fill(0) : data?.activities || [];
const totalItems = data?.total || 0;

if (!pointsVaultList.length) {
if (!pointsVaultList.length && !isLoading) {
return (
<LeaderBoardNullState
refetchLeaderboard={isError ? refetch : undefined}
Expand All @@ -56,45 +57,56 @@ const PointsVaultApprovedList = ({ query }: PointsVaultApprovedListProps) => {
queryClient.invalidateQueries({ queryKey: [pointsVaultRejectedUsers] });
};

const handlePageChange = (page: number) => {
setCurrentPage(page);
};

return (
<Box
gap="spacing-sm"
display="flex"
flexDirection="column"
>
<Box
height="calc(100vh - 356px)"
height="calc(100vh - 420px)"
overflow="auto"
>
<PointsVaultListColumns />
<InfiniteScroll
pageStart={0}
loadMore={() => fetchNextPage()}
hasMore={hasMoreData}
loader={
<Box
margin="spacing-xs"
key="loader-spinner"
>
<LoaderSpinner
spinnerSize={24}
type={LOADER_TYPE.SEAMLESS}
/>
</Box>
}
useWindow={false}
threshold={150}
>
{pointsVaultList.map((item, index) => (
<PointsVaultListItem
key={item?.activityId || index}
item={item}
isLoading={isLoading}
refetch={handleRefetch}
{pointsVaultList.map((item, index) => (
<PointsVaultListItem
key={item?.activityId || index}
item={item}
isLoading={isLoading}
refetch={handleRefetch}
/>
))}
{isFetching && !isLoading && (
<Box
margin="spacing-xs"
display="flex"
justifyContent="center"
>
<LoaderSpinner
spinnerSize={24}
type={LOADER_TYPE.SEAMLESS}
/>
))}
</InfiniteScroll>
</Box>
)}
</Box>
{totalItems > 0 && (
<Box
display="flex"
justifyContent="center"
padding="spacing-sm spacing-none"
>
<Pagination
current={currentPage}
pageSize={pageSize}
total={totalItems}
onChange={handlePageChange}
/>
</Box>
)}
</Box>
);
};
Expand Down
21 changes: 17 additions & 4 deletions src/modules/pointsVault/components/PointsVaultListColumns.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const PointsVaultListColumns: FC = () => {
display="flex"
justifyContent="space-between"
>
<Box width="345px">
<Box width="300px">
<Text
variant="c-bold"
color="text-tertiary"
Expand All @@ -16,7 +16,7 @@ const PointsVaultListColumns: FC = () => {
</Text>
</Box>

<Box width="345px">
<Box width="200px">
<Text
variant="c-bold"
color="text-tertiary"
Expand All @@ -26,15 +26,28 @@ const PointsVaultListColumns: FC = () => {
</Box>

<Box
width="42px"
width="190px"
justifyContent="center"
display="flex"
>
<Text
variant="c-bold"
color="text-tertiary"
>
FOLLOWERS
DISCORD USERNAME
</Text>
</Box>

<Box
width="150px"
justifyContent="center"
display="flex"
>
<Text
variant="c-bold"
color="text-tertiary"
>
EMAIL
</Text>
</Box>

Expand Down
63 changes: 58 additions & 5 deletions src/modules/pointsVault/components/PointsVaultListContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { PointsVaultRejectedList } from './PointsVaultRejectedList';
import { useDebounce } from 'react-use';
import { useCallback, useState } from 'react';
import { ethers } from 'ethers';
import { useGetUserRewardsStats } from 'queries';

const PointsVaultListContainer = () => {
const [query, setQuery] = useState('');
Expand All @@ -22,18 +23,70 @@ const PointsVaultListContainer = () => {

useDebounce(() => setDebouncedQuery(getFormattedQuery(query)), 500, [query]);

const { data: userStats } = useGetUserRewardsStats();

return (
<Box
backgroundColor="surface-primary"
padding="spacing-md"
borderRadius="radius-md"
>
<Text
variant="h4-bold"
color="text-primary"
<Box
display="flex"
justifyContent="space-between"
alignItems="center"
margin="spacing-none spacing-none spacing-sm spacing-none"
>
Points Vault
</Text>
<Text
variant="h4-bold"
color="text-primary"
>
Points Vault
</Text>
{userStats && (
<Box
display="flex"
gap="spacing-md"
>
<Box
display="flex"
flexDirection="column"
alignItems="flex-end"
>
<Text
variant="bs-semibold"
color="text-primary"
>
{userStats.totalUsers.toLocaleString()}
</Text>
<Text
variant="bes-regular"
color="text-tertiary"
>
Total Users
</Text>
</Box>
<Box
display="flex"
flexDirection="column"
alignItems="flex-end"
>
<Text
variant="bs-semibold"
color="text-primary"
>
{userStats.totalUsersWithEmail.toLocaleString()}
</Text>
<Text
variant="bes-regular"
color="text-tertiary"
>
With Email
</Text>
</Box>
</Box>
)}
</Box>
<Box
display="flex"
justifyContent="space-between"
Expand Down
36 changes: 28 additions & 8 deletions src/modules/pointsVault/components/PointsVaultListItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ export type PointsVaultListItemProps = {
refetch: (actions?: PointsVaultStatus) => void;
};

const truncateMiddle = (str: string, startChars: number = 14, endChars: number = 14) => {
if (!str) return '';
if (str.length <= startChars + endChars) return str;
return `${str.slice(0, startChars)}...${str.slice(-endChars)}`;
};

const PointsVaultListItem = ({ isLoading, item, refetch }: PointsVaultListItemProps) => {
const token = usePointsVaultToken();
const { data } = useGetUserTwitterDetails(item.data?.twitter, token);
Expand All @@ -28,14 +34,14 @@ const PointsVaultListItem = ({ isLoading, item, refetch }: PointsVaultListItemPr
<Box
display="flex"
alignItems="center"
width="345px"
width="300px"
height="22px"
>
<Text
variant="bs-semibold"
color="text-secondary"
>
{caip10ToWallet(item.userWallet)}
{truncateMiddle(item.userWallet)}
</Text>
</Box>
</Skeleton>
Expand All @@ -44,18 +50,18 @@ const PointsVaultListItem = ({ isLoading, item, refetch }: PointsVaultListItemPr
<Box
display="flex"
alignItems="center"
width="345px"
width="200px"
>
<Link
to={`https://x.com/${item.data?.twitter}`}
to={`https://x.com/${item.twitterUserName || item.data?.twitter}`}
target="_blank"
rel="noopener noreferrer"
>
<Text
color="text-brand-medium"
variant="bs-semibold"
>
https://x.com/{item.data?.twitter}
https://x.com/{item.twitterUserName || item.data?.twitter}
</Text>
</Link>
</Box>
Expand All @@ -66,13 +72,27 @@ const PointsVaultListItem = ({ isLoading, item, refetch }: PointsVaultListItemPr
display="flex"
alignItems="center"
justifyContent="center"
width="42px"
width="190px"
>
<Text
variant="bs-semibold"
>
{item?.primaryDiscordUserName ?? '-'}
</Text>
</Box>
</Skeleton>

<Skeleton isLoading={isLoading}>
<Box
display="flex"
alignItems="center"
justifyContent="center"
width="150px"
>
<Text
variant="bs-semibold"
color={data?.followersCount && data.followersCount < 50 ? 'text-state-danger-bold' : 'text-primary'}
>
{data?.followersCount ?? '-'}
{item?.discordEmail ?? '-'}
</Text>
</Box>
</Skeleton>
Expand Down
Loading
Loading