From 81e6683d3319b2b679be6f86bf6793ec96204c79 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 22 Jul 2025 00:00:04 +0000 Subject: [PATCH 1/3] Add external wallet search and display in user management Co-authored-by: joaquim.verges --- .../users/components/AdvancedSearchInput.tsx | 1 + .../users/components/SearchResults.tsx | 26 +++++++++++++ .../wallets/users/components/index.tsx | 38 +++++++++++++++++++ .../wallets/users/components/searchUsers.ts | 3 ++ .../wallets/users/components/types.ts | 2 +- 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/AdvancedSearchInput.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/AdvancedSearchInput.tsx index 16d3a84c71f..f6c35dff1f1 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/AdvancedSearchInput.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/AdvancedSearchInput.tsx @@ -55,6 +55,7 @@ export function AdvancedSearchInput(props: { Phone ID Address + External Wallet diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/SearchResults.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/SearchResults.tsx index d24ad8b489a..ad6a0610876 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/SearchResults.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/SearchResults.tsx @@ -51,6 +51,11 @@ export function SearchResults(props: { const mainDetail = user.linkedAccounts?.[0]?.details; const email = mainDetail?.email as string | undefined; const phone = mainDetail?.phone as string | undefined; + + // Get external wallet addresses from linkedAccounts where type is 'siwe' + const externalWalletAccounts = user.linkedAccounts?.filter( + (account) => account.type === "siwe" + ) || []; return ( @@ -96,6 +101,27 @@ export function SearchResults(props: { )} + {externalWalletAccounts.length > 0 && ( +
+

+ External Wallets +

+
+ {externalWalletAccounts.map((account, index) => { + const address = account.details?.address as string | undefined; + return address ? ( +
+ +
+ ) : null; + })} +
+
+ )} + {createdAt && (

diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/index.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/index.tsx index da1e0cfdff1..586245fbe6f 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/index.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/index.tsx @@ -36,6 +36,10 @@ const getUserIdentifier = (accounts: WalletUser["linkedAccounts"]) => { ); }; +const getExternalWallets = (accounts: WalletUser["linkedAccounts"]) => { + return accounts?.filter((account) => account.type === "siwe") || []; +}; + const columnHelper = createColumnHelper(); export function InAppWalletUsersPageContent( @@ -69,6 +73,33 @@ export function InAppWalletUsersPageContent( header: "Address", id: "address", }), + columnHelper.accessor("linkedAccounts", { + cell: (cell) => { + const externalWallets = getExternalWallets(cell.getValue()); + if (externalWallets.length === 0) { + return None; + } + return ( +

+ {externalWallets.slice(0, 2).map((account, index) => { + const address = account.details?.address as string | undefined; + return address ? ( +
+ +
+ ) : null; + })} + {externalWallets.length > 2 && ( + + +{externalWallets.length - 2} more + + )} +
+ ); + }, + header: "External Wallets", + id: "external_wallets", + }), columnHelper.accessor("wallets", { cell: (cell) => { const value = cell.getValue()[0]?.createdAt; @@ -172,11 +203,18 @@ export function InAppWalletUsersPageContent( }); const csv = Papa.unparse( usersWallets.map((row) => { + const externalWallets = getExternalWallets(row.linkedAccounts); + const externalWalletAddresses = externalWallets + .map((account) => account.details?.address) + .filter(Boolean) + .join(", "); + return { address: row.wallets[0]?.address || "Uninitialized", created: row.wallets[0]?.createdAt ? format(new Date(row.wallets[0].createdAt), "MMM dd, yyyy") : "Wallet not created yet", + external_wallets: externalWalletAddresses || "None", login_methods: row.linkedAccounts.map((acc) => acc.type).join(", "), user_identifier: getUserIdentifier(row.linkedAccounts), }; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/searchUsers.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/searchUsers.ts index 3f60e0ae105..b772bab0c57 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/searchUsers.ts +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/searchUsers.ts @@ -33,6 +33,9 @@ export async function searchUsers( case "address": url.searchParams.append("address", query); break; + case "externalWallet": + url.searchParams.append("externalWalletAddress", query); + break; } const response = await fetch(url.toString(), { diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/types.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/types.ts index 207189d8897..1a0285888a9 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/types.ts +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/types.ts @@ -1 +1 @@ -export type SearchType = "email" | "phone" | "id" | "address"; +export type SearchType = "email" | "phone" | "id" | "address" | "externalWallet"; From 283df5f5c9aa22bf2cbbfd7638ef87f43781b9ae Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Tue, 22 Jul 2025 15:31:17 +1200 Subject: [PATCH 2/3] lint --- .../wallets/users/components/SearchResults.tsx | 12 +++++++----- .../(sidebar)/wallets/users/components/index.tsx | 2 +- .../(sidebar)/wallets/users/components/types.ts | 7 ++++++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/SearchResults.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/SearchResults.tsx index ad6a0610876..701d0e71161 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/SearchResults.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/SearchResults.tsx @@ -51,11 +51,11 @@ export function SearchResults(props: { const mainDetail = user.linkedAccounts?.[0]?.details; const email = mainDetail?.email as string | undefined; const phone = mainDetail?.phone as string | undefined; - + // Get external wallet addresses from linkedAccounts where type is 'siwe' - const externalWalletAccounts = user.linkedAccounts?.filter( - (account) => account.type === "siwe" - ) || []; + const externalWalletAccounts = + user.linkedAccounts?.filter((account) => account.type === "siwe") || + []; return ( @@ -108,7 +108,9 @@ export function SearchResults(props: {

{externalWalletAccounts.map((account, index) => { - const address = account.details?.address as string | undefined; + const address = account.details?.address as + | string + | undefined; return address ? (
account.details?.address) .filter(Boolean) .join(", "); - + return { address: row.wallets[0]?.address || "Uninitialized", created: row.wallets[0]?.createdAt diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/types.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/types.ts index 1a0285888a9..fa825d6a8d1 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/types.ts +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/types.ts @@ -1 +1,6 @@ -export type SearchType = "email" | "phone" | "id" | "address" | "externalWallet"; +export type SearchType = + | "email" + | "phone" + | "id" + | "address" + | "externalWallet"; From fce5dea76b2f82fa5aa93da0f28a2458a6c43b9c Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Tue, 22 Jul 2025 15:34:32 +1200 Subject: [PATCH 3/3] lint --- .../(sidebar)/wallets/users/components/index.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/index.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/index.tsx index 7b124aa81e2..bec59030051 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/index.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/wallets/users/components/index.tsx @@ -81,10 +81,13 @@ export function InAppWalletUsersPageContent( } return (
- {externalWallets.slice(0, 2).map((account, index) => { + {externalWallets.slice(0, 2).map((account) => { const address = account.details?.address as string | undefined; return address ? ( -
+
) : null;