Skip to content

Commit c44139f

Browse files
[Dashboard] perf: Optimize chain and contract data processing
1 parent 1d8695e commit c44139f

File tree

2 files changed

+52
-70
lines changed

2 files changed

+52
-70
lines changed

apps/dashboard/src/app/team/[team_slug]/(team)/_components/TransactionsCard.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ export async function TransactionsChartCardUI({
2323
title?: string;
2424
description?: string;
2525
}) {
26+
const uniqueChainIds = [
27+
...new Set(data.map((item) => item.chainId).filter(Boolean)),
28+
];
2629
const chains = await Promise.all(
27-
data.map(
28-
(item) =>
29-
// eslint-disable-next-line no-restricted-syntax
30-
item.chainId && getChainMetadata(defineChain(Number(item.chainId))),
30+
uniqueChainIds.map((chainId) =>
31+
// eslint-disable-next-line no-restricted-syntax
32+
getChainMetadata(defineChain(Number(chainId))),
3133
),
3234
).then((chains) => chains.filter((c) => c) as ChainMetadata[]);
3335

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

Lines changed: 46 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import {
3131
defineChain,
3232
getChainMetadata,
3333
} from "thirdweb/chains";
34-
import { shortenAddress } from "thirdweb/utils";
3534
import { type WalletId, getWalletInfo } from "thirdweb/wallets";
3635
import { TransactionsChartCardUI } from "../(team)/_components/TransactionsCard";
3736
import { getThirdwebClient } from "../../../../@/constants/thirdweb.server";
@@ -383,29 +382,25 @@ function AuthMethodDistributionCard({ data }: { data: InAppWalletStats[] }) {
383382
}
384383

385384
async function ChainDistributionCard({ data }: { data: TransactionStats[] }) {
386-
const formattedData = await Promise.all(
387-
data.map(async (w) => {
385+
const reducedData = await Promise.all(
386+
Object.entries(
387+
data.reduce(
388+
(acc, curr) => {
389+
acc[curr.chainId] = (acc[curr.chainId] || 0) + curr.count;
390+
return acc;
391+
},
392+
{} as Record<string, number>,
393+
),
394+
).map(async ([key, value]) => {
388395
// eslint-disable-next-line no-restricted-syntax
389-
const chain = await getChainMetadata(defineChain(Number(w.chainId)));
396+
const chain = defineChain(Number(key));
397+
const chainMeta = await getChainMetadata(chain);
390398
return {
391-
chainId: w.chainId,
392-
count: w.count,
393-
chainName: chain?.slug,
399+
label: chainMeta?.slug || chain.id.toString(),
400+
value,
394401
};
395402
}),
396403
);
397-
const reducedData = Object.entries(
398-
formattedData.reduce(
399-
(acc, curr) => {
400-
acc[curr.chainName] = (acc[curr.chainName] || 0) + curr.count;
401-
return acc;
402-
},
403-
{} as Record<string, number>,
404-
),
405-
).map(([key, value]) => ({
406-
label: key,
407-
value,
408-
}));
409404

410405
const aggregateFn = () => reducedData.length;
411406

@@ -417,53 +412,38 @@ async function ChainDistributionCard({ data }: { data: TransactionStats[] }) {
417412
async function ContractDistributionCard({
418413
data,
419414
}: { data: TransactionStats[] }) {
420-
const formattedData = (
421-
await Promise.all(
422-
data.map(async (w) => {
423-
// eslint-disable-next-line no-restricted-syntax
424-
const chain = defineChain(Number(w.chainId));
425-
const chainMeta = await getChainMetadata(chain);
426-
if (!w.contractAddress) {
427-
return null;
428-
}
429-
const contractData = await fetchDashboardContractMetadata(
430-
getContract({
431-
chain,
432-
address: w.contractAddress,
433-
client: getThirdwebClient(),
434-
}),
435-
).catch(() => undefined);
436-
return {
437-
chainId: w.chainId,
438-
count: w.count,
439-
chainName: chainMeta?.slug || w.chainId.toString(),
440-
contractAddress: w.contractAddress,
441-
contractLabel:
442-
contractData?.name || shortenAddress(w.contractAddress),
443-
};
444-
}),
445-
)
446-
).filter((d) => d !== null);
447-
448-
const reducedData = Object.entries(
449-
formattedData.reduce(
450-
(acc, curr) => {
451-
acc[`${curr.chainName}:${curr.contractAddress}:${curr.contractLabel}`] =
452-
(acc[
453-
`${curr.chainName}:${curr.contractAddress}:${curr.contractLabel}`
454-
] || 0) + curr.count;
455-
return acc;
456-
},
457-
{} as Record<string, number>,
458-
),
459-
).map(([key, value]) => {
460-
const [chainName, contractAddress, contractLabel] = key.split(":");
461-
return {
462-
label: `${contractLabel} (${chainName})`,
463-
link: `/${chainName}/${contractAddress}`,
464-
value,
465-
};
466-
});
415+
const reducedData = await Promise.all(
416+
Object.entries(
417+
data
418+
.filter((d) => d.contractAddress)
419+
.reduce(
420+
(acc, curr) => {
421+
acc[`${curr.chainId}:${curr.contractAddress}`] =
422+
(acc[`${curr.chainId}:${curr.contractAddress}`] || 0) +
423+
curr.count;
424+
return acc;
425+
},
426+
{} as Record<string, number>,
427+
),
428+
).map(async ([key, value]) => {
429+
const [chainId, contractAddress] = key.split(":");
430+
// eslint-disable-next-line no-restricted-syntax
431+
const chain = defineChain(Number(chainId));
432+
const chainMeta = await getChainMetadata(chain);
433+
const contractData = await fetchDashboardContractMetadata(
434+
getContract({
435+
chain,
436+
address: contractAddress as string, // we filter above
437+
client: getThirdwebClient(),
438+
}),
439+
).catch(() => undefined);
440+
return {
441+
label: `${contractData?.name} (${chainMeta?.slug})`,
442+
link: `/${chainId}/${contractAddress}`,
443+
value,
444+
};
445+
}),
446+
);
467447

468448
const aggregateFn = () => reducedData.length;
469449

0 commit comments

Comments
 (0)