Skip to content

Commit 8b10674

Browse files
committed
Port gas sponsorship analytics to Team usage tab (#8445)
Updated AccountAbstractionAnalytics to support both team and project variants, allowing for flexible rendering based on context. Refactored usage and summary components to accept optional projectId, and updated the team usage page to use the new analytics and summary components. Adjusted SponsoredTransactionsTable usage to match the new props structure. Closes BLD-500 <!-- start pr-codex --> --- ## PR-Codex overview This PR focuses on enhancing the `AccountAbstractionAnalytics` and `AccountAbstractionSummary` components to support additional parameters for date ranges and project identification, improving data handling for user operation statistics. ### Detailed summary - Added `from` and `to` props to `AccountAbstractionSummary` and `AccountAbstractionAnalytics`. - Made `projectId` optional in `AsyncAccountAbstractionSummary` and `AccountAbstractionSummary`. - Updated `AccountAbstractionAnalytics` to handle different variants (`project` and `team`). - Introduced date range handling in the main page logic to fetch user operation statistics based on selected ranges. > ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}` <!-- end pr-codex --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Account abstraction views now support team- and project-level variants and explicit date-range (from/to) filtering. * Analytics components expose flexible props to render project or team analytics based on resolved ranges. * **Improvements** * Data loading sequence refined to fetch authentication, team lookup, and usage metrics before render. * UI updated to show a summary section followed by analytics with improved spacing and conditional rendering. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent a3c76d5 commit 8b10674

File tree

4 files changed

+97
-22
lines changed

4 files changed

+97
-22
lines changed

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/account-abstraction/page.tsx

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,38 @@
11
import { redirect } from "next/navigation";
2+
import type { SearchParams } from "nuqs/server";
3+
import { getUserOpUsage } from "@/api/analytics";
24
import { getAuthToken } from "@/api/auth-token";
35
import { getProjects } from "@/api/project/projects";
46
import { getTeamBySlug } from "@/api/team/get-team";
57
import { getTeamSubscriptions } from "@/api/team/team-subscription";
6-
import { SponsoredTransactionsTable } from "@/components/sponsored-transactions-table/SponsoredTransactionsTable";
8+
import {
9+
getLastNDaysRange,
10+
type Range,
11+
} from "@/components/analytics/date-range-selector";
712
import { getClientThirdwebClient } from "@/constants/thirdweb-client.client";
813
import { loginRedirect } from "@/utils/redirects";
14+
import { AccountAbstractionSummary } from "../../../../[project_slug]/(sidebar)/account-abstraction/AccountAbstractionAnalytics/AccountAbstractionSummary";
15+
import { AccountAbstractionAnalytics } from "../../../../[project_slug]/(sidebar)/account-abstraction/aa-analytics";
16+
import { searchParamLoader } from "../../../../[project_slug]/(sidebar)/account-abstraction/search-params";
917

1018
export default async function Page(props: {
1119
params: Promise<{
1220
team_slug: string;
1321
}>;
22+
searchParams: Promise<SearchParams>;
1423
}) {
15-
const params = await props.params;
16-
const [team, authToken] = await Promise.all([
17-
getTeamBySlug(params.team_slug),
24+
const [params, parsedSearchParams, authToken] = await Promise.all([
25+
props.params,
26+
searchParamLoader(props.searchParams),
1827
getAuthToken(),
1928
]);
2029

2130
if (!authToken) {
2231
loginRedirect(`/team/${params.team_slug}/~/usage/account-abstraction`);
2332
}
2433

34+
const team = await getTeamBySlug(params.team_slug);
35+
2536
if (!team) {
2637
redirect("/team");
2738
}
@@ -44,20 +55,51 @@ export default async function Page(props: {
4455
);
4556
}
4657

58+
const interval = parsedSearchParams.interval ?? "week";
59+
const rangeType = parsedSearchParams.range || "last-120";
60+
61+
const range: Range = {
62+
from:
63+
rangeType === "custom"
64+
? parsedSearchParams.from
65+
: getLastNDaysRange(rangeType).from,
66+
to:
67+
rangeType === "custom"
68+
? parsedSearchParams.to
69+
: getLastNDaysRange(rangeType).to,
70+
type: rangeType,
71+
};
72+
73+
const userOpStats = await getUserOpUsage(
74+
{
75+
from: range.from,
76+
period: interval,
77+
teamId: team.id,
78+
to: range.to,
79+
},
80+
authToken,
81+
);
82+
4783
const client = getClientThirdwebClient({
4884
jwt: authToken,
4985
teamId: team.id,
5086
});
5187

5288
return (
53-
<div className="flex flex-col gap-14">
54-
<SponsoredTransactionsTable
89+
<div className="flex flex-col gap-10">
90+
<AccountAbstractionSummary
91+
authToken={authToken}
92+
teamId={team.id}
93+
from={range.from}
94+
to={range.to}
95+
/>
96+
97+
<AccountAbstractionAnalytics
5598
client={client}
56-
from={usageSubscription.currentPeriodStart}
5799
projects={projects}
58100
teamId={team.id}
59101
teamSlug={team.slug}
60-
to={usageSubscription.currentPeriodEnd}
102+
userOpStats={userOpStats}
61103
variant="team"
62104
/>
63105
</div>

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/AccountAbstractionAnalytics/AccountAbstractionSummary.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@ function AccountAbstractionSummaryInner(props: {
3434

3535
async function AsyncAccountAbstractionSummary(props: {
3636
teamId: string;
37-
projectId: string;
37+
projectId?: string;
3838
authToken: string;
39+
from?: Date;
40+
to?: Date;
3941
}) {
4042
const aggregateUserOpStats = await getAggregateUserOpUsage(
4143
{
4244
projectId: props.projectId,
4345
teamId: props.teamId,
46+
from: props.from,
47+
to: props.to,
4448
},
4549
props.authToken,
4650
);
@@ -55,8 +59,10 @@ async function AsyncAccountAbstractionSummary(props: {
5559

5660
export function AccountAbstractionSummary(props: {
5761
teamId: string;
58-
projectId: string;
62+
projectId?: string;
5963
authToken: string;
64+
from?: Date;
65+
to?: Date;
6066
}) {
6167
return (
6268
<Suspense
@@ -71,6 +77,8 @@ export function AccountAbstractionSummary(props: {
7177
projectId={props.projectId}
7278
teamId={props.teamId}
7379
authToken={props.authToken}
80+
from={props.from}
81+
to={props.to}
7482
/>
7583
</Suspense>
7684
);

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/aa-analytics.tsx

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,30 @@ import { GasMetricsChartCard } from "./AccountAbstractionAnalytics/GasMetricsCha
1515
import { TotalSponsoredChartCard } from "./AccountAbstractionAnalytics/TotalSponsoredChartCard";
1616
import { searchParams } from "./search-params";
1717

18-
export function AccountAbstractionAnalytics(props: {
18+
type AccountAbstractionAnalyticsProps = {
1919
userOpStats: UserOpStats[];
2020
teamId: string;
2121
teamSlug: string;
2222
client: ThirdwebClient;
23-
projectId: string;
24-
}) {
23+
} & (
24+
| {
25+
variant: "project";
26+
projectId: string;
27+
}
28+
| {
29+
variant: "team";
30+
projects: {
31+
id: string;
32+
name: string;
33+
image: string | null;
34+
slug: string;
35+
}[];
36+
}
37+
);
38+
39+
export function AccountAbstractionAnalytics(
40+
props: AccountAbstractionAnalyticsProps,
41+
) {
2542
const [isLoading, startTransition] = useTransition();
2643

2744
const [rangeType, setRangeType] = useQueryState(
@@ -62,6 +79,8 @@ export function AccountAbstractionAnalytics(props: {
6279
to: rangeType === "custom" ? to : getLastNDaysRange(rangeType).to,
6380
type: rangeType,
6481
};
82+
const resolvedFrom = range.from;
83+
const resolvedTo = range.to;
6584

6685
return (
6786
<div>
@@ -105,15 +124,18 @@ export function AccountAbstractionAnalytics(props: {
105124
userOpStats={props.userOpStats}
106125
/>
107126

108-
<SponsoredTransactionsTable
109-
client={props.client}
110-
from={from.toISOString()}
111-
projectId={props.projectId}
112-
teamId={props.teamId}
113-
teamSlug={props.teamSlug}
114-
to={to.toISOString()}
115-
variant="project"
116-
/>
127+
{resolvedFrom && resolvedTo && (
128+
<SponsoredTransactionsTable
129+
client={props.client}
130+
from={resolvedFrom.toISOString()}
131+
teamId={props.teamId}
132+
teamSlug={props.teamSlug}
133+
to={resolvedTo.toISOString()}
134+
{...(props.variant === "project"
135+
? { projectId: props.projectId, variant: "project" as const }
136+
: { projects: props.projects, variant: "team" as const })}
137+
/>
138+
)}
117139
</div>
118140
</div>
119141
);

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/sponsored-gas/page.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,13 @@ export default async function Page(props: {
9999
projectId={project.id}
100100
teamId={project.teamId}
101101
authToken={authToken}
102+
from={range.from}
103+
to={range.to}
102104
/>
103105

104106
<AccountAbstractionAnalytics
105107
client={client}
108+
variant="project"
106109
projectId={project.id}
107110
teamId={project.teamId}
108111
teamSlug={params.team_slug}

0 commit comments

Comments
 (0)