Skip to content

Commit 17efc96

Browse files
committed
feat: adds AA summary to overview page
1 parent 20073d9 commit 17efc96

File tree

7 files changed

+91
-24
lines changed

7 files changed

+91
-24
lines changed

apps/dashboard/src/app/(dashboard)/dashboard/connect/analytics/[clientId]/page.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ export default async function Page(props: {
5151

5252
<div className="h-4 lg:h-8" />
5353

54-
<ConnectAnalyticsDashboard clientId={apiKey.key} />
54+
<ConnectAnalyticsDashboard
55+
clientId={apiKey.key}
56+
connectLayoutSlug="/dashboard/connect"
57+
/>
5558

5659
<div className="h-4 lg:h-8" />
5760
<ConnectSDKCard description="Add the Connect SDK to your app to start collecting analytics." />

apps/dashboard/src/app/team/[team_slug]/[project_slug]/connect/analytics/ConnectAnalyticsDashboard.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"use client";
22
import {
3+
useUserOpUsageAggregate,
34
useWalletUsageAggregate,
45
useWalletUsagePeriod,
56
} from "@3rdweb-sdk/react/hooks/useApi";
@@ -15,6 +16,7 @@ import { ConnectAnalyticsDashboardUI } from "./ConnectAnalyticsDashboardUI";
1516

1617
export function ConnectAnalyticsDashboard(props: {
1718
clientId: string;
19+
connectLayoutSlug: string;
1820
}) {
1921
const [range, setRange] = useState<Range>(() =>
2022
getLastNDaysRange("last-120"),
@@ -39,6 +41,10 @@ export function ConnectAnalyticsDashboard(props: {
3941
to: range.to,
4042
});
4143

44+
const userOpAggregateQuery = useUserOpUsageAggregate({
45+
clientId: props.clientId,
46+
});
47+
4248
return (
4349
<div>
4450
<div className="flex gap-3">
@@ -59,6 +65,8 @@ export function ConnectAnalyticsDashboard(props: {
5965
<ConnectAnalyticsDashboardUI
6066
walletUsage={walletUsageQuery.data || []}
6167
aggregateWalletUsage={walletUsageAggregateQuery.data || []}
68+
aggregateUserOpUsageQuery={userOpAggregateQuery.data}
69+
connectLayoutSlug={props.connectLayoutSlug}
6270
isPending={
6371
walletUsageQuery.isPending || walletUsageAggregateQuery.isPending
6472
}

apps/dashboard/src/app/team/[team_slug]/[project_slug]/connect/analytics/ConnectAnalyticsDashboardUI.tsx

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1-
import type { WalletStats } from "@3rdweb-sdk/react/hooks/useApi";
2-
import { Stat } from "components/analytics/stat";
1+
import type { UserOpStats, WalletStats } from "@3rdweb-sdk/react/hooks/useApi";
32
import { CableIcon, WalletCardsIcon } from "lucide-react";
3+
import type React from "react";
44
import { useMemo } from "react";
55
import { DailyConnectionsChartCard } from "./_components/DailyConnectionsChartCard";
66
import { WalletConnectorsChartCard } from "./_components/WalletConnectorsChartCard";
77
import { WalletDistributionChartCard } from "./_components/WalletDistributionChartCard";
8+
import { Stat } from "components/analytics/stat";
9+
import { AccountAbstractionSummary } from "components/smart-wallets/AccountAbstractionAnalytics/AccountAbstractionSummary";
10+
import { Button } from "@/components/ui/button";
11+
import Link from "next/link";
812

913
export function ConnectAnalyticsDashboardUI(props: {
1014
walletUsage: WalletStats[];
1115
aggregateWalletUsage: WalletStats[];
16+
aggregateUserOpUsageQuery?: UserOpStats;
17+
connectLayoutSlug: string;
1218
isPending: boolean;
1319
}) {
1420
const { totalWallets, uniqueWallets } = useMemo(() => {
@@ -34,6 +40,38 @@ export function ConnectAnalyticsDashboardUI(props: {
3440
/>
3541
</div>
3642

43+
<div className="h-4">
44+
<div className="w-full border-b border-muted" />
45+
</div>
46+
47+
<div>
48+
<div className="flex flex-col mb-4 gap-4 lg:flex-row lg:items-center lg:justify-between">
49+
<div>
50+
<h1 className="font-medium text-xl tracking-tight">
51+
Account Abstraction
52+
</h1>
53+
<p className="text-muted-foreground">
54+
Sponsor and batch transactions for your users.
55+
</p>
56+
</div>
57+
58+
<div>
59+
<Button asChild variant="primary" size="sm" className="w-full">
60+
<Link href={`${props.connectLayoutSlug}/account-abstraction`}>
61+
View All
62+
</Link>
63+
</Button>
64+
</div>
65+
</div>
66+
<AccountAbstractionSummary
67+
aggregateUserOpUsageQuery={props.aggregateUserOpUsageQuery}
68+
/>
69+
</div>
70+
71+
<div className="h-4">
72+
<div className="w-full border-b border-muted" />
73+
</div>
74+
3775
<DailyConnectionsChartCard
3876
walletStats={props.walletUsage}
3977
isPending={props.isPending}

apps/dashboard/src/app/team/[team_slug]/[project_slug]/connect/analytics/_components/ConnectAnalyticsDashboard.stories.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react";
22
import { mobileViewport } from "../../../../../../../stories/utils";
33
import { ConnectAnalyticsDashboardUI } from "../ConnectAnalyticsDashboardUI";
44
import { createWalletStatsStub } from "./storyUtils";
5+
import { createUserOpStatsStub } from "components/smart-wallets/AccountAbstractionAnalytics/storyUtils";
56

67
const meta = {
78
title: "Charts/Connect/Analytics Dashboard",
@@ -31,6 +32,8 @@ function Component() {
3132
<ConnectAnalyticsDashboardUI
3233
walletUsage={createWalletStatsStub(30)}
3334
aggregateWalletUsage={createWalletStatsStub(30)}
35+
aggregateUserOpUsageQuery={createUserOpStatsStub(1)[0]!}
36+
connectLayoutSlug="connectLayoutSlug"
3437
isPending={false}
3538
/>
3639
</div>

apps/dashboard/src/app/team/[team_slug]/[project_slug]/connect/analytics/page.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ export default async function Page(props: {
3030
</div>
3131

3232
<div className="h-6 lg:h-8" />
33-
<ConnectAnalyticsDashboard clientId={project.publishableKey} />
33+
<ConnectAnalyticsDashboard
34+
clientId={project.publishableKey}
35+
connectLayoutSlug={`/team/${props.params.team_slug}/${props.params.project_slug}/connect`}
36+
/>
3437
<div className="h-4 lg:h-8" />
3538
<ConnectSDKCard description="Add the Connect SDK to your app to get started collecting analytics." />
3639
</div>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { UserOpStats } from "@3rdweb-sdk/react/hooks/useApi";
2+
import { Stat } from "components/analytics/stat";
3+
import { ActivityIcon, CoinsIcon } from "lucide-react";
4+
5+
export function AccountAbstractionSummary(props: {
6+
aggregateUserOpUsageQuery?: UserOpStats;
7+
}) {
8+
return (
9+
<div className="grid grid-cols-2 gap-4 lg:gap-6">
10+
<Stat
11+
label="Sponsored Transactions"
12+
value={props.aggregateUserOpUsageQuery?.successful || 0}
13+
icon={ActivityIcon}
14+
/>
15+
<Stat
16+
label="Total Sponsored"
17+
value={props.aggregateUserOpUsageQuery?.sponsoredUsd || 0}
18+
formatter={(value: number) =>
19+
new Intl.NumberFormat("en-US", {
20+
style: "currency",
21+
currency: "USD",
22+
}).format(value)
23+
}
24+
icon={CoinsIcon}
25+
/>
26+
</div>
27+
);
28+
}

apps/dashboard/src/components/smart-wallets/index.tsx

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import {
55
type ApiKeyService,
66
useUserOpUsageAggregate,
77
} from "@3rdweb-sdk/react/hooks/useApi";
8-
import { Stat } from "components/analytics/stat";
9-
import { ActivityIcon, CoinsIcon } from "lucide-react";
108
import { AccountAbstractionAnalytics } from "./AccountAbstractionAnalytics";
119
import { AccountFactories } from "./AccountFactories";
1210
import { AccountAbstractionSettingsPage } from "./SponsorshipPolicies";
11+
import { AccountAbstractionSummary } from "./AccountAbstractionAnalytics/AccountAbstractionSummary";
1312

1413
interface SmartWalletsProps {
1514
apiKeyServices: ApiKeyService[];
@@ -32,24 +31,9 @@ export const SmartWallets: React.FC<SmartWalletsProps> = ({
3231

3332
return (
3433
<div>
35-
<div className="grid grid-cols-2 gap-4 lg:gap-6">
36-
<Stat
37-
label="Sponsored Transactions"
38-
value={aggregateUserOpUsageQuery.data?.successful || 0}
39-
icon={ActivityIcon}
40-
/>
41-
<Stat
42-
label="Total Sponsored"
43-
value={aggregateUserOpUsageQuery.data?.sponsoredUsd || 0}
44-
formatter={(value) =>
45-
new Intl.NumberFormat("en-US", {
46-
style: "currency",
47-
currency: "USD",
48-
}).format(value)
49-
}
50-
icon={CoinsIcon}
51-
/>
52-
</div>
34+
<AccountAbstractionSummary
35+
aggregateUserOpUsageQuery={aggregateUserOpUsageQuery.data}
36+
/>
5337

5438
<div className="h-12" />
5539

0 commit comments

Comments
 (0)