@@ -25,23 +25,28 @@ import { EmptyState } from "../../components/Analytics/EmptyState";
25
25
import { PieChartCard } from "../../components/Analytics/PieChartCard" ;
26
26
27
27
import { getTeamBySlug } from "@/api/team" ;
28
+ import { GenericLoadingPage } from "@/components/blocks/skeletons/GenericLoadingPage" ;
29
+ import type { Account } from "@3rdweb-sdk/react/hooks/useApi" ;
28
30
import { getAccount } from "app/account/settings/getAccount" ;
29
31
import { EmptyStateCard } from "app/team/components/Analytics/EmptyStateCard" ;
30
32
import { Changelog , type ChangelogItem } from "components/dashboard/Changelog" ;
33
+ import { Suspense } from "react" ;
31
34
import { TotalSponsoredChartCardUI } from "./_components/TotalSponsoredCard" ;
32
35
33
36
// revalidate every 5 minutes
34
37
export const revalidate = 300 ;
35
38
39
+ type SearchParams = {
40
+ usersChart ?: string ;
41
+ from ?: string ;
42
+ to ?: string ;
43
+ type ?: string ;
44
+ interval ?: string ;
45
+ } ;
46
+
36
47
export default async function TeamOverviewPage ( props : {
37
- params : { team_slug : string } ;
38
- searchParams : {
39
- usersChart ?: string ;
40
- from ?: string ;
41
- to ?: string ;
42
- type ?: string ;
43
- interval ?: string ;
44
- } ;
48
+ params : Promise < { team_slug : string } > ;
49
+ searchParams : Promise < SearchParams > ;
45
50
} ) {
46
51
const changelog = await getChangelog ( ) ;
47
52
const [ params , searchParams ] = await Promise . all ( [
@@ -67,6 +72,43 @@ export default async function TeamOverviewPage(props: {
67
72
redirect ( "/login" ) ;
68
73
}
69
74
75
+ return (
76
+ < div className = "flex grow flex-col" >
77
+ < div className = "border-b" >
78
+ < AnalyticsHeader
79
+ title = "Team Overview"
80
+ interval = { interval }
81
+ range = { range }
82
+ />
83
+ </ div >
84
+ < div className = "flex grow flex-col justify-between gap-10 md:container md:pt-8 md:pb-16 xl:flex-row" >
85
+ < Suspense fallback = { < GenericLoadingPage /> } >
86
+ < OverviewPageContent
87
+ account = { account }
88
+ range = { range }
89
+ interval = { interval }
90
+ searchParams = { searchParams }
91
+ />
92
+ </ Suspense >
93
+ < div className = "shrink-0 max-md:container max-xl:hidden lg:w-[320px]" >
94
+ < h2 className = "mb-4 font-semibold text-lg tracking-tight" >
95
+ Latest changes
96
+ </ h2 >
97
+ < Changelog changelog = { changelog } />
98
+ </ div >
99
+ </ div >
100
+ </ div >
101
+ ) ;
102
+ }
103
+
104
+ async function OverviewPageContent ( props : {
105
+ account : Account ;
106
+ range : Range ;
107
+ interval : "day" | "week" ;
108
+ searchParams : SearchParams ;
109
+ } ) {
110
+ const { account, range, interval, searchParams } = props ;
111
+
70
112
const [
71
113
walletConnections ,
72
114
walletUserStatsTimeSeries ,
@@ -116,77 +158,56 @@ export default async function TeamOverviewPage(props: {
116
158
inAppWalletUsage . length === 0 &&
117
159
userOpUsage . length === 0 ;
118
160
161
+ if ( isEmpty ) {
162
+ return < EmptyState /> ;
163
+ }
164
+
119
165
return (
120
- < div >
121
- < div className = "w-full border-border-800 border-b px-6 dark:bg-muted/50" >
122
- < AnalyticsHeader
123
- title = "Team Overview"
124
- interval = { interval }
125
- range = { range }
126
- />
127
- </ div >
128
- < div className = "flex flex-col justify-between gap-16 md:container md:pt-8 md:pb-16 xl:flex-row" >
129
- < div className = "grow" >
130
- { isEmpty ? (
131
- < div className = "container p-6" >
132
- < EmptyState />
133
- </ div >
134
- ) : (
135
- < div className = "space-y-6" >
136
- { walletUserStatsTimeSeries . some ( ( w ) => w . totalUsers !== 0 ) ? (
137
- < div className = "" >
138
- < UsersChartCard
139
- userStats = { walletUserStatsTimeSeries }
140
- searchParams = { searchParams }
141
- />
142
- </ div >
143
- ) : (
144
- < EmptyStateCard
145
- metric = "Connect"
146
- link = "https://portal.thirdweb.com/connect/quickstart"
147
- />
148
- ) }
149
- < div className = "grid gap-6 max-md:px-6 md:grid-cols-2" >
150
- { walletConnections . length > 0 ? (
151
- < WalletDistributionCard data = { walletConnections } />
152
- ) : (
153
- < EmptyStateCard
154
- metric = "Connect"
155
- link = "https://portal.thirdweb.com/connect/quickstart"
156
- />
157
- ) }
158
- { inAppWalletUsage . length > 0 ? (
159
- < AuthMethodDistributionCard data = { inAppWalletUsage } />
160
- ) : (
161
- < EmptyStateCard
162
- metric = "In-App Wallets"
163
- link = "https://portal.thirdweb.com/typescript/v5/inAppWallet"
164
- />
165
- ) }
166
- </ div >
167
- { userOpUsage . length > 0 ? (
168
- < TotalSponsoredChartCardUI
169
- searchParams = { searchParams }
170
- data = { userOpUsageTimeSeries }
171
- aggregatedData = { userOpUsage }
172
- className = "max-md:rounded-none max-md:border-r-0 max-md:border-l-0"
173
- />
174
- ) : (
175
- < EmptyStateCard
176
- metric = "Sponsored Transactions"
177
- link = "https://portal.thirdweb.com/typescript/v5/account-abstraction/get-started"
178
- />
179
- ) }
180
- </ div >
181
- ) }
182
- </ div >
183
- < div className = "shrink-0 max-md:container max-xl:hidden lg:w-[320px]" >
184
- < h2 className = "mb-4 font-semibold text-lg tracking-tight" >
185
- Latest changes
186
- </ h2 >
187
- < Changelog changelog = { changelog } />
166
+ < div className = "flex grow flex-col gap-6" >
167
+ { walletUserStatsTimeSeries . some ( ( w ) => w . totalUsers !== 0 ) ? (
168
+ < div className = "" >
169
+ < UsersChartCard
170
+ userStats = { walletUserStatsTimeSeries }
171
+ searchParams = { searchParams }
172
+ />
188
173
</ div >
174
+ ) : (
175
+ < EmptyStateCard
176
+ metric = "Connect"
177
+ link = "https://portal.thirdweb.com/connect/quickstart"
178
+ />
179
+ ) }
180
+ < div className = "grid gap-6 max-md:px-6 md:grid-cols-2" >
181
+ { walletConnections . length > 0 ? (
182
+ < WalletDistributionCard data = { walletConnections } />
183
+ ) : (
184
+ < EmptyStateCard
185
+ metric = "Connect"
186
+ link = "https://portal.thirdweb.com/connect/quickstart"
187
+ />
188
+ ) }
189
+ { inAppWalletUsage . length > 0 ? (
190
+ < AuthMethodDistributionCard data = { inAppWalletUsage } />
191
+ ) : (
192
+ < EmptyStateCard
193
+ metric = "In-App Wallets"
194
+ link = "https://portal.thirdweb.com/typescript/v5/inAppWallet"
195
+ />
196
+ ) }
189
197
</ div >
198
+ { userOpUsage . length > 0 ? (
199
+ < TotalSponsoredChartCardUI
200
+ searchParams = { searchParams }
201
+ data = { userOpUsageTimeSeries }
202
+ aggregatedData = { userOpUsage }
203
+ className = "max-md:rounded-none max-md:border-r-0 max-md:border-l-0"
204
+ />
205
+ ) : (
206
+ < EmptyStateCard
207
+ metric = "Sponsored Transactions"
208
+ link = "https://portal.thirdweb.com/typescript/v5/account-abstraction/get-started"
209
+ />
210
+ ) }
190
211
</ div >
191
212
) ;
192
213
}
0 commit comments