1
1
import { useMemo } from "react" ;
2
2
3
3
import { Project , Round } from "../../api/types" ;
4
-
5
- import { BasicCard } from "../../common/styles" ;
6
-
7
4
import { Application , useDataLayer } from "data-layer" ;
8
5
import { useRoundApprovedApplications } from "../../projects/hooks/useRoundApplications" ;
6
+ import { useRoundStakingSummary } from "../../projects/hooks/useRoundStakingSummary" ;
7
+ import {
8
+ SortOption ,
9
+ useSortApplications ,
10
+ } from "../../projects/hooks/useSortApplications" ;
9
11
import { ProjectCard } from "./ProjectCard" ;
12
+ import { useSearchParams } from "react-router-dom" ;
13
+ import { useIsStakable } from "../ViewProjectDetails/components/StakingBannerAndModal/hooks/useIsStakable" ;
10
14
11
15
export const ProjectList = ( props : {
12
16
projects ?: Project [ ] ;
@@ -20,39 +24,109 @@ export const ProjectList = (props: {
20
24
setCurrentProjectAddedToCart : React . Dispatch < React . SetStateAction < Project > > ;
21
25
setShowCartNotification : React . Dispatch < React . SetStateAction < boolean > > ;
22
26
} ) : JSX . Element => {
23
- const { projects, roundRoutePath, chainId, roundId } = props ;
27
+ const { projects : _projects , roundRoutePath, chainId, roundId } = props ;
24
28
const dataLayer = useDataLayer ( ) ;
29
+ const [ searchParams ] = useSearchParams ( ) ;
30
+ const sortOption = searchParams . get ( "orderBy" ) ;
31
+ const isStakableRound = useIsStakable ( {
32
+ chainId,
33
+ roundId,
34
+ } ) ;
25
35
26
- const { data : applications } = useRoundApprovedApplications (
27
- {
28
- chainId,
29
- roundId,
30
- } ,
36
+ enum SortOptionEnum {
37
+ TOTAL_STAKED_DESC = "totalStakedDesc" ,
38
+ TOTAL_DONATIONS_DESC = "totalDonationsDesc" ,
39
+ TOTAL_CONTRIBUTORS_DESC = "totalContributorsDesc" ,
40
+ TOTAL_STAKED_ASC = "totalStakedAsc" ,
41
+ TOTAL_CONTRIBUTORS_ASC = "totalContributorsAsc" ,
42
+ TOTAL_DONATIONS_ASC = "totalDonationsAsc" ,
43
+ }
44
+ const params = isStakableRound
45
+ ? { }
46
+ : {
47
+ chainId,
48
+ roundId,
49
+ } ;
50
+
51
+ const { data : _applications } = useRoundApprovedApplications (
52
+ params ,
31
53
dataLayer
32
54
) ;
33
55
56
+ const { data : poolSummary , isLoading } = useRoundStakingSummary (
57
+ roundId ,
58
+ chainId . toString ( ) ,
59
+ isStakableRound
60
+ ) ;
61
+
62
+ const _stakedApplications = useSortApplications (
63
+ poolSummary ,
64
+ chainId . toString ( ) ,
65
+ roundId ,
66
+ SortOptionEnum [ sortOption as keyof typeof SortOptionEnum ] as SortOption
67
+ ) ;
68
+
69
+ const applications = useMemo ( ( ) => {
70
+ return _applications ?. length ? _applications : ( _stakedApplications ?? [ ] ) ;
71
+ } , [ _stakedApplications , _applications ] ) ;
72
+
73
+ const isDonationPeriodStarted = props . showProjectCardFooter ;
74
+
75
+ const LeaderboardTitle = useMemo ( ( ) => {
76
+ return sortOption === "TOTAL_STAKED_DESC"
77
+ ? "Leaderboard - Most GTC Staked"
78
+ : sortOption === "TOTAL_DONATIONS_DESC"
79
+ ? "Leaderboard - Most Donations"
80
+ : sortOption === "TOTAL_CONTRIBUTORS_DESC"
81
+ ? "Leaderboard - Most Contributors"
82
+ : sortOption === "TOTAL_STAKED_ASC"
83
+ ? "Leaderboard - Least GTC Staked"
84
+ : sortOption === "TOTAL_CONTRIBUTORS_ASC"
85
+ ? "Leaderboard - Least Contributors"
86
+ : sortOption === "TOTAL_DONATIONS_ASC"
87
+ ? "Leaderboard - Least Donations"
88
+ : isStakableRound && isDonationPeriodStarted
89
+ ? "Leaderboard - Most GTC Staked"
90
+ : "" ;
91
+ } , [ sortOption , isStakableRound , isDonationPeriodStarted ] ) ;
92
+
93
+ const projects = useMemo ( ( ) => {
94
+ return ( applications . map ( ( application ) => {
95
+ return _projects ?. find (
96
+ ( project ) =>
97
+ project . anchorAddress ?. toLowerCase ( ) ===
98
+ application . anchorAddress ?. toLowerCase ( )
99
+ ) ;
100
+ } ) ?? [ ] ) as Project [ ] ;
101
+ } , [ applications , _projects ] ) ;
102
+
34
103
const applicationsMapByGrantApplicationId :
35
- | Map < string , Application >
104
+ | Map < string , Application & { totalStaked ?: number } >
36
105
| undefined = useMemo ( ( ) => {
37
106
if ( ! applications ) return ;
38
- const map : Map < string , Application > = new Map ( ) ;
107
+ const map : Map < string , Application & { totalStaked ?: number } > = new Map ( ) ;
39
108
applications . forEach ( ( application ) =>
40
109
map . set ( application . projectId , application )
41
110
) ;
42
111
return map ;
43
112
} , [ applications ] ) ;
44
113
45
114
return (
46
- < >
115
+ < div className = "flex flex-col gap-y-8" >
116
+ { LeaderboardTitle && ! props . isProjectsLoading && ! isLoading && (
117
+ < span className = "text-[32px]/[39px] font-modern-era-medium" >
118
+ { LeaderboardTitle }
119
+ </ span >
120
+ ) }
47
121
< div className = "grid gap-x-6 gap-y-12 gap-5 justify-around md:justify-start sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 w-full" >
48
- { props . isProjectsLoading ? (
122
+ { props . isProjectsLoading || isLoading ? (
49
123
< >
50
124
{ Array ( 6 )
51
125
. fill ( "" )
52
126
. map ( ( item , index ) => (
53
- < BasicCard
127
+ < div
54
128
key = { index }
55
- className = "relative animate-pulse bg-grey-100"
129
+ className = "relative animate-pulse bg-grey-100 w-[326px] rounded-3xl h-[370px] "
56
130
/>
57
131
) ) }
58
132
</ >
@@ -61,7 +135,7 @@ export const ProjectList = (props: {
61
135
{ projects . map ( ( project ) => {
62
136
return (
63
137
< ProjectCard
64
- key = { project . projectRegistryId }
138
+ key = { project ? .projectRegistryId }
65
139
project = { project }
66
140
roundRoutePath = { roundRoutePath }
67
141
showProjectCardFooter = { props . showProjectCardFooter }
@@ -75,14 +149,19 @@ export const ProjectList = (props: {
75
149
setShowCartNotification = { props . setShowCartNotification }
76
150
crowdfundedUSD = {
77
151
applicationsMapByGrantApplicationId ?. get (
78
- project . projectRegistryId
152
+ project ? .projectRegistryId ?? ""
79
153
) ?. totalAmountDonatedInUsd ?? 0
80
154
}
81
155
uniqueContributorsCount = {
82
156
applicationsMapByGrantApplicationId ?. get (
83
- project . projectRegistryId
157
+ project ? .projectRegistryId ?? ""
84
158
) ?. uniqueDonorsCount ?? 0
85
159
}
160
+ totalStaked = {
161
+ applicationsMapByGrantApplicationId ?. get (
162
+ project ?. projectRegistryId ?? ""
163
+ ) ?. totalStaked ?? 0
164
+ }
86
165
/>
87
166
) ;
88
167
} ) }
@@ -91,6 +170,6 @@ export const ProjectList = (props: {
91
170
< p > No projects</ p >
92
171
) }
93
172
</ div >
94
- </ >
173
+ </ div >
95
174
) ;
96
175
} ;
0 commit comments