From 004f3776cfa5cee448597b66eb0b56919c28fca5 Mon Sep 17 00:00:00 2001 From: MananTank Date: Thu, 1 May 2025 20:59:33 +0000 Subject: [PATCH] [TOOL-4336] Dashboard: Fix contracts on custom chains not shown in contracts table (#6916) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ## PR-Codex overview This PR focuses on refactoring the chain fetching functionality within the application. It renames and updates the `getChains` function to `getChainsForNebula`, introduces a new utility `fetchChainWithLocalOverrides`, and modifies various components to utilize these changes. ### Detailed summary - Renamed `getChains` to `getChainsForNebula` in `getChainIds.ts`. - Updated references to `getChains` in `page.tsx` and `login/page.tsx` to use `getChainsForNebula`. - Introduced `fetchChainWithLocalOverrides` in `fetchChainWithLocalOverrides.ts`. - Replaced `fetchChain` with `fetchChainWithLocalOverrides` in `getSortedDeployedContracts.tsx` and `getContractFromParams.ts`. - Removed redundant local chain fetching logic from `getContractFromParams.ts`. > ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}` --- .../_utils/getContractFromParams.ts | 28 ++-------------- .../getSortedDeployedContracts.tsx | 6 ++-- .../src/app/nebula-app/(app)/page.tsx | 4 +-- .../app/nebula-app/(app)/utils/getChainIds.ts | 4 +-- .../src/app/nebula-app/login/page.tsx | 4 +-- .../src/utils/fetchChainWithLocalOverrides.ts | 33 +++++++++++++++++++ 6 files changed, 45 insertions(+), 34 deletions(-) create mode 100644 apps/dashboard/src/utils/fetchChainWithLocalOverrides.ts diff --git a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_utils/getContractFromParams.ts b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_utils/getContractFromParams.ts index 611e065c077..5eabe005d5d 100644 --- a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_utils/getContractFromParams.ts +++ b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_utils/getContractFromParams.ts @@ -1,11 +1,9 @@ import { getThirdwebClient } from "@/constants/thirdweb.server"; import { mapV4ChainToV5Chain } from "contexts/map-chains"; import { cookies } from "next/headers"; -import { TW_LOCAL_CHAIN_STORE } from "stores/storageKeys"; import { getAddress, getContract, isAddress } from "thirdweb"; -import type { ChainMetadata } from "thirdweb/chains"; -import { fetchChain } from "utils/fetchChain"; import { LAST_USED_TEAM_ID } from "../../../../../../../constants/cookies"; +import { fetchChainWithLocalOverrides } from "../../../../../../../utils/fetchChainWithLocalOverrides"; import { getAuthToken } from "../../../../../api/lib/getAuthToken"; export async function getContractPageParamsInfo(params: { @@ -14,29 +12,7 @@ export async function getContractPageParamsInfo(params: { }) { const contractAddress = getCheckSummedAddress(params.contractAddress); const chainSlugOrId = params.chain_id; - let chainMetadata = await fetchChain(chainSlugOrId).catch(() => null); - - const cookieStore = await cookies(); - const localChainStoreValue = cookieStore.get(TW_LOCAL_CHAIN_STORE)?.value; - - if (localChainStoreValue) { - try { - const chains = JSON.parse(decodeURIComponent(localChainStoreValue)); - if (typeof chains === "object" && Array.isArray(chains)) { - const chainOverrides = chains as ChainMetadata[]; - const chain = chainOverrides.find( - (c) => - c.slug === chainSlugOrId || - c.chainId === Number.parseInt(chainSlugOrId), - ); - if (chain) { - chainMetadata = chain; - } - } - } catch { - // noop - } - } + const chainMetadata = await fetchChainWithLocalOverrides(chainSlugOrId); if (!chainMetadata) { return undefined; diff --git a/apps/dashboard/src/app/(app)/account/contracts/_components/getSortedDeployedContracts.tsx b/apps/dashboard/src/app/(app)/account/contracts/_components/getSortedDeployedContracts.tsx index f9e213580c4..14e00e2cc75 100644 --- a/apps/dashboard/src/app/(app)/account/contracts/_components/getSortedDeployedContracts.tsx +++ b/apps/dashboard/src/app/(app)/account/contracts/_components/getSortedDeployedContracts.tsx @@ -1,4 +1,4 @@ -import { fetchChain } from "utils/fetchChain"; +import { fetchChainWithLocalOverrides } from "../../../../../utils/fetchChainWithLocalOverrides"; import { type ProjectContract, getProjectContracts, @@ -19,7 +19,9 @@ export async function getSortedDeployedContracts(params: { const chainIds = Array.from(new Set(contracts.map((c) => c.chainId))); const chains = ( await Promise.allSettled( - chainIds.map((chainId) => fetchChain(chainId.toString())), + chainIds.map((chainId) => + fetchChainWithLocalOverrides(chainId.toString()), + ), ) ) .filter((c) => c.status === "fulfilled") diff --git a/apps/dashboard/src/app/nebula-app/(app)/page.tsx b/apps/dashboard/src/app/nebula-app/(app)/page.tsx index 1e2bfae7891..fff3b9c62b7 100644 --- a/apps/dashboard/src/app/nebula-app/(app)/page.tsx +++ b/apps/dashboard/src/app/nebula-app/(app)/page.tsx @@ -4,7 +4,7 @@ import { getNebulaAuthTokenWalletAddress, } from "../_utils/authToken"; import { ChatPageContent } from "./components/ChatPageContent"; -import { getChains } from "./utils/getChainIds"; +import { getChainsForNebula } from "./utils/getChainIds"; export default async function Page(props: { searchParams: Promise<{ @@ -15,7 +15,7 @@ export default async function Page(props: { const searchParams = await props.searchParams; const [chains, authToken, accountAddress] = await Promise.all([ - getChains(searchParams.chain), + getChainsForNebula(searchParams.chain), getNebulaAuthToken(), getNebulaAuthTokenWalletAddress(), ]); diff --git a/apps/dashboard/src/app/nebula-app/(app)/utils/getChainIds.ts b/apps/dashboard/src/app/nebula-app/(app)/utils/getChainIds.ts index 677a3da97fa..eee67924e13 100644 --- a/apps/dashboard/src/app/nebula-app/(app)/utils/getChainIds.ts +++ b/apps/dashboard/src/app/nebula-app/(app)/utils/getChainIds.ts @@ -2,7 +2,7 @@ import { unstable_cache } from "next/cache"; import type { ChainMetadata } from "thirdweb/chains"; import { fetchChain } from "utils/fetchChain"; -export const getChains = unstable_cache( +export const getChainsForNebula = unstable_cache( async (chainNamesOrIds: string[] | string | undefined) => { if (!chainNamesOrIds) { return []; @@ -25,7 +25,7 @@ export const getChains = unstable_cache( return chains; }, - ["nebula_getChains"], + ["getChainsForNebula"], { revalidate: 60 * 60 * 24, // 24 hours }, diff --git a/apps/dashboard/src/app/nebula-app/login/page.tsx b/apps/dashboard/src/app/nebula-app/login/page.tsx index 1cfb15b4173..61dbd1f013b 100644 --- a/apps/dashboard/src/app/nebula-app/login/page.tsx +++ b/apps/dashboard/src/app/nebula-app/login/page.tsx @@ -1,4 +1,4 @@ -import { getChains } from "../(app)/utils/getChainIds"; +import { getChainsForNebula } from "../(app)/utils/getChainIds"; import { getNebulaAuthToken } from "../_utils/authToken"; import { NebulaLoggedOutStatePage } from "./NebulaLoginPage"; @@ -10,7 +10,7 @@ export default async function NebulaLogin(props: { }) { const searchParams = await props.searchParams; const authToken = await getNebulaAuthToken(); - const chains = await getChains(searchParams.chain); + const chains = await getChainsForNebula(searchParams.chain); return ( { + const cookieStore = await cookies(); + const localChainStoreValue = cookieStore.get(TW_LOCAL_CHAIN_STORE)?.value; + + if (localChainStoreValue) { + try { + const chains = JSON.parse(decodeURIComponent(localChainStoreValue)); + if (typeof chains === "object" && Array.isArray(chains)) { + const chainOverrides = chains as ChainMetadata[]; + const savedChain = chainOverrides.find( + (c) => + c.slug === chainIdOrSlug || c.chainId.toString() === chainIdOrSlug, + ); + if (savedChain) { + return savedChain; + } + } + } catch { + // noop + } + } + + return fetchChain(chainIdOrSlug); +}