diff --git a/apps/dashboard/redirects.js b/apps/dashboard/redirects.js index 837fa6a5c5c..bfe7f58ddce 100644 --- a/apps/dashboard/redirects.js +++ b/apps/dashboard/redirects.js @@ -62,6 +62,51 @@ const legacyDashboardToTeamRedirects = [ }, ]; +const projectRoute = "/team/:team_slug/:project_slug"; + +const projectPageRedirects = [ + { + source: `${projectRoute}/connect/pay/:path*`, + destination: `${projectRoute}/universal-bridge/:path*`, + permanent: false, + }, + { + source: `${projectRoute}/connect/universal-bridge/:path*`, + destination: `${projectRoute}/universal-bridge/:path*`, + permanent: false, + }, + { + source: `${projectRoute}/connect/account-abstraction/:path*`, + destination: `${projectRoute}/account-abstraction/:path*`, + permanent: false, + }, + { + source: `${projectRoute}/connect/in-app-wallets/:path*`, + destination: `${projectRoute}/wallets/:path*`, + permanent: false, + }, + { + source: `${projectRoute}/engine/cloud/vault/:path*`, + destination: `${projectRoute}/vault/:path*`, + permanent: false, + }, + { + source: `${projectRoute}/engine/cloud/:path*`, + destination: `${projectRoute}/transactions/:path*`, + permanent: false, + }, + { + source: `${projectRoute}/assets/:path*`, + destination: `${projectRoute}/tokens/:path*`, + permanent: false, + }, + { + source: `${projectRoute}/nebula/:path*`, + destination: projectRoute, + permanent: false, + }, +]; + /** @type {import('next').NextConfig['redirects']} */ async function redirects() { return [ @@ -326,14 +371,6 @@ async function redirects() { destination: "/", permanent: false, }, - // pay > universal-bridge redirect - { - source: "/team/:team_slug/:project_slug/connect/pay/:path*", - destination: - "/team/:team_slug/:project_slug/connect/universal-bridge/:path*", - permanent: false, - }, - // all /learn/tutorials (and sub-routes) -> /learn/guides { source: "/learn/tutorials/:path*", @@ -382,8 +419,8 @@ async function redirects() { destination: "/transactions", permanent: false, }, - ...legacyDashboardToTeamRedirects, + ...projectPageRedirects, ]; } diff --git a/apps/dashboard/src/@/components/blocks/Sidebar.tsx b/apps/dashboard/src/@/components/blocks/Sidebar.tsx index 181abba4fc8..4b8ef9e5c83 100644 --- a/apps/dashboard/src/@/components/blocks/Sidebar.tsx +++ b/apps/dashboard/src/@/components/blocks/Sidebar.tsx @@ -9,6 +9,7 @@ export type SidebarBaseLink = { label: React.ReactNode; exactMatch?: boolean; icon?: React.FC<{ className?: string }>; + isActive?: (pathname: string) => boolean; }; export type SidebarLink = diff --git a/apps/dashboard/src/@/components/blocks/SidebarLayout.tsx b/apps/dashboard/src/@/components/blocks/SidebarLayout.tsx index 87403d09605..a2ab0beca42 100644 --- a/apps/dashboard/src/@/components/blocks/SidebarLayout.tsx +++ b/apps/dashboard/src/@/components/blocks/SidebarLayout.tsx @@ -123,6 +123,7 @@ function RenderSidebarGroup(props: { className="flex items-center gap-2 text-muted-foreground text-sm hover:bg-accent" activeClassName="text-foreground bg-accent" exactMatch={link.exactMatch} + isActive={link.isActive} onClick={() => { sidebar.setOpenMobile(false); }} diff --git a/apps/dashboard/src/@/components/ui/NavLink.tsx b/apps/dashboard/src/@/components/ui/NavLink.tsx index 11bfb2948f4..195d979f977 100644 --- a/apps/dashboard/src/@/components/ui/NavLink.tsx +++ b/apps/dashboard/src/@/components/ui/NavLink.tsx @@ -11,15 +11,18 @@ export type NavButtonProps = { href: string; exactMatch?: boolean; onClick?: () => void; + isActive?: (pathname: string) => boolean; }; export function NavLink(props: React.PropsWithChildren) { const pathname = usePathname(); - const isActive = pathname - ? props.exactMatch - ? pathname === props.href - : pathname.startsWith(props.href) - : false; + const isActive = props.isActive + ? props.isActive(pathname) + : pathname + ? props.exactMatch + ? pathname === props.href + : pathname.startsWith(props.href) + : false; return ( +
-
+

Contracts

+

+ Deploy and manage contracts for your project +

-
@@ -109,3 +118,32 @@ export default async function ProjectLayout(props: { ); } + +async function getEngineLinkType(params: { + authToken: string; + project: Project; +}) { + const projectEngineCloudService = params.project.services.find( + (service) => service.name === "engineCloud", + ); + + const engineCloudToken = projectEngineCloudService?.managementAccessToken; + + // if we have a management access token, link to engine cloud page + let engineLinkType: "cloud" | "dedicated" = "cloud"; + + // if we don't have a engine cloud management access token, check if there are any legacy engine instances + if (!engineCloudToken) { + const engineInstances = await getEngineInstances({ + authToken: params.authToken, + teamIdOrSlug: params.project.teamId, + }); + + // if we have any legacy engine instances, link to the legacy engine page + if (engineInstances.data && engineInstances.data.length > 0) { + engineLinkType = "dedicated"; + } + } + + return engineLinkType; +} diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/analytics-page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/analytics-page.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/analytics-page.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/analytics-page.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/filter.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/filter.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/filter.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/filter.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/ftux.client.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/ftux.client.tsx similarity index 95% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/ftux.client.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/ftux.client.tsx index 79cd708767e..e9d83ed943d 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/ftux.client.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/ftux.client.tsx @@ -5,7 +5,7 @@ import { type Step, StepsCard } from "components/dashboard/StepsCard"; import Link from "next/link"; import { useMemo, useState } from "react"; import type { ThirdwebClient } from "thirdweb"; -import { CreateVaultAccountButton } from "../../../vault/components/create-vault-account.client"; +import { CreateVaultAccountButton } from "../../vault/components/create-vault-account.client"; import CreateServerWallet from "../server-wallets/components/create-server-wallet.client"; import type { Wallet } from "../server-wallets/wallet-table/types"; import { SendTestTransaction } from "./send-test-tx.client"; @@ -107,7 +107,11 @@ export const EngineChecklist: React.FC = (props) => { return null; } return ( - + ); }; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/send-test-tx.client.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/send-test-tx.client.tsx similarity index 99% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/send-test-tx.client.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/send-test-tx.client.tsx index b45ae04d337..5b0f62b753b 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/send-test-tx.client.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/send-test-tx.client.tsx @@ -263,7 +263,7 @@ export function SendTestTransaction(props: { onClick={() => { if (props.walletId) { router.replace( - `/team/${props.teamSlug}/${props.project.slug}/engine/cloud`, + `/team/${props.teamSlug}/${props.project.slug}/transactions`, ); } else { router.refresh(); diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/summary.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/summary.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/summary.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/summary.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-chart/tx-chart-ui.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-chart/tx-chart-ui.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-chart/tx-chart-ui.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-chart/tx-chart-ui.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-chart/tx-chart.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-chart/tx-chart.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-chart/tx-chart.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-chart/tx-chart.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-table/tx-table-ui.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-table/tx-table-ui.tsx similarity index 99% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-table/tx-table-ui.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-table/tx-table-ui.tsx index ad5333d358c..877fbcf50a0 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-table/tx-table-ui.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-table/tx-table-ui.tsx @@ -138,7 +138,7 @@ export function TransactionsTableUI(props: { className="cursor-pointer hover:bg-accent/50" onClick={() => { router.push( - `/team/${props.teamSlug}/${props.project.slug}/engine/cloud/tx/${tx.id}`, + `/team/${props.teamSlug}/${props.project.slug}/transactions/tx/${tx.id}`, ); }} > diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-table/tx-table.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-table/tx-table.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-table/tx-table.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-table/tx-table.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-table/types.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-table/types.ts similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/tx-table/types.ts rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/tx-table/types.ts diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/utils.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/utils.ts similarity index 88% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/utils.ts rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/utils.ts index 69ca753fd9d..a66a7e79469 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/analytics/utils.ts +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/analytics/utils.ts @@ -6,6 +6,9 @@ export function storeUserAccessToken(projectId: string, accessToken: string) { } export function getUserAccessToken(projectId: string) { + if (typeof localStorage === "undefined") { + return null; + } return localStorage.getItem( `thirdweb:engine-cloud-user-access-token-${projectId}`, ); diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/explorer/components/scalar.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/explorer/components/scalar.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/explorer/components/scalar.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/explorer/components/scalar.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/explorer/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/explorer/page.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/explorer/page.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/explorer/page.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/layout.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/layout.tsx similarity index 78% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/layout.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/layout.tsx index 13be81a2cd5..d1158fbe6fb 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/layout.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/layout.tsx @@ -3,7 +3,6 @@ import { Button } from "@/components/ui/button"; import { TabPathLinks } from "@/components/ui/tabs"; import { NEXT_PUBLIC_ENGINE_CLOUD_URL } from "@/constants/public-envs"; import Link from "next/link"; -import { EngineIcon } from "../../../../../../(dashboard)/(chain)/components/server/icons/EngineIcon"; export default async function Page(props: { params: Promise<{ team_slug: string; project_slug: string }>; @@ -23,8 +22,8 @@ function TransactionsLayout(props: { teamSlug: string; children: React.ReactNode; }) { - const engineBaseSlug = `/team/${props.teamSlug}/${props.projectSlug}/engine`; - const engineLayoutSlug = `${engineBaseSlug}/cloud`; + const projectLayoutPath = `/team/${props.teamSlug}/${props.projectSlug}`; + const layoutPath = `${projectLayoutPath}/transactions`; return (
@@ -36,12 +35,6 @@ function TransactionsLayout(props: {

Transactions{" "} - - Engine Cloud -

- +
@@ -74,16 +67,16 @@ function TransactionsLayout(props: { links={[ { name: "Transactions", - path: `${engineLayoutSlug}`, + path: `${layoutPath}`, exactMatch: true, }, { name: "API Explorer", - path: `${engineLayoutSlug}/explorer`, + path: `${layoutPath}/explorer`, }, { name: "Server Wallets", - path: `${engineLayoutSlug}/server-wallets`, + path: `${layoutPath}/server-wallets`, }, ]} /> diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/lib/analytics.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/analytics.ts similarity index 96% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/lib/analytics.ts rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/analytics.ts index 4bd8057bf2e..05cc58dfc37 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/lib/analytics.ts +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/analytics.ts @@ -1,6 +1,6 @@ import { NEXT_PUBLIC_ENGINE_CLOUD_URL } from "@/constants/public-envs"; -import type { TransactionStats } from "../../../../../../../../../types/analytics"; -import { getAuthToken } from "../../../../../../../api/lib/getAuthToken"; +import { getAuthToken } from "@app/api/lib/getAuthToken"; +import type { TransactionStats } from "types/analytics"; import type { Transaction, TransactionsResponse, diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/lib/utils.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/utils.ts similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/lib/utils.ts rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/utils.ts diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/lib/vault.client.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/vault.client.ts similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/lib/vault.client.ts rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/lib/vault.client.ts diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/page.tsx similarity index 98% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/page.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/page.tsx index 8e6575b3807..cf8625bbf69 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/page.tsx @@ -1,9 +1,9 @@ import { getProject } from "@/api/projects"; import { NEXT_PUBLIC_THIRDWEB_VAULT_URL } from "@/constants/public-envs"; import { getClientThirdwebClient } from "@/constants/thirdweb-client.client"; +import { getAuthToken } from "@app/api/lib/getAuthToken"; import { createVaultClient, listEoas } from "@thirdweb-dev/vault-sdk"; import { notFound, redirect } from "next/navigation"; -import { getAuthToken } from "../../../../../../api/lib/getAuthToken"; import { TransactionsAnalyticsPageContent } from "./analytics/analytics-page"; import { EngineChecklist } from "./analytics/ftux.client"; import { TransactionAnalyticsSummary } from "./analytics/summary"; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/components/create-server-wallet.client.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/create-server-wallet.client.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/components/create-server-wallet.client.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/create-server-wallet.client.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/components/try-it-out.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/try-it-out.tsx similarity index 92% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/components/try-it-out.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/try-it-out.tsx index 7c45fca4cbd..50b7885938d 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/components/try-it-out.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/components/try-it-out.tsx @@ -11,7 +11,7 @@ export function TryItOut() { const [activeTab, setActiveTab] = useState("sdk"); return ( -
+
@@ -25,8 +25,10 @@ export function TryItOut() {
+
-
+
{activeTab === "sdk" && ( -
+
Using the thirdweb SDK on the backend @@ -114,22 +116,26 @@ export function TryItOut() {

-

- Installation -

- -

- Usage example: Minting a ERC1155 NFT to a user -

- +
+

+ Installation +

+ +
+
+

+ Usage example: Minting a ERC1155 NFT to a user +

+ +
)} {activeTab === "curl" && ( @@ -140,7 +146,7 @@ export function TryItOut() { /> )} {activeTab === "js" && ( -
+

A lightweight, type safe wrapper package of the Engine HTTP API is available on{" "} diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/page.tsx similarity index 97% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/page.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/page.tsx index 592794fc9f5..dd78d3b70ac 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/page.tsx @@ -1,9 +1,9 @@ import { getProject } from "@/api/projects"; import { NEXT_PUBLIC_THIRDWEB_VAULT_URL } from "@/constants/public-envs"; import { getClientThirdwebClient } from "@/constants/thirdweb-client.client"; +import { getAuthToken } from "@app/api/lib/getAuthToken"; import { createVaultClient, listEoas } from "@thirdweb-dev/vault-sdk"; import { notFound } from "next/navigation"; -import { getAuthToken } from "../../../../../../../api/lib/getAuthToken"; import type { Wallet } from "./wallet-table/types"; import { ServerWalletsTable } from "./wallet-table/wallet-table"; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/wallet-table/types.ts b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/wallet-table/types.ts similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/wallet-table/types.ts rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/wallet-table/types.ts diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/wallet-table/wallet-table-ui.client.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/wallet-table/wallet-table-ui.client.tsx similarity index 73% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/wallet-table/wallet-table-ui.client.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/wallet-table/wallet-table-ui.client.tsx index ad2b0320436..8dc84d8b319 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/wallet-table/wallet-table-ui.client.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/wallet-table/wallet-table-ui.client.tsx @@ -89,7 +89,7 @@ export function ServerWalletsTableUI({ />

- + @@ -137,60 +137,63 @@ export function ServerWalletsTableUI({
-
-
- Found {totalRecords} server wallets + + {totalPages > 1 && ( +
+
+ Found {totalRecords} server wallets +
+ + + + 1 ? currentPage - 1 : 1 + }`} + passHref + legacyBehavior + > + + + + {Array.from({ length: totalPages }, (_, i) => i + 1).map( + (pageNumber) => ( + + + + {pageNumber} + + + + ), + )} + + + = totalPages + ? "pointer-events-none opacity-50" + : "" + } + /> + + + +
- - - - 1 ? currentPage - 1 : 1 - }`} - passHref - legacyBehavior - > - - - - {Array.from({ length: totalPages }, (_, i) => i + 1).map( - (pageNumber) => ( - - - - {pageNumber} - - - - ), - )} - - - = totalPages - ? "pointer-events-none opacity-50" - : "" - } - /> - - - - -
+ )}
); } @@ -260,7 +263,7 @@ function SendTestTransaction(props: { size="sm" onClick={() => { router.push( - `/team/${props.teamSlug}/${props.project.slug}/engine/cloud?testTxWithWallet=${props.wallet.id}`, + `/team/${props.teamSlug}/${props.project.slug}/transactions?testTxWithWallet=${props.wallet.id}`, ); }} > diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/wallet-table/wallet-table.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/wallet-table/wallet-table.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/server-wallets/wallet-table/wallet-table.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/server-wallets/wallet-table/wallet-table.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/tx/[id]/layout.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/layout.tsx similarity index 97% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/tx/[id]/layout.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/layout.tsx index 849b1af7bb7..b9be32f43ed 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/tx/[id]/layout.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/layout.tsx @@ -12,7 +12,7 @@ export default function TransactionLayout({
diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/tx/[id]/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/page.tsx similarity index 83% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/tx/[id]/page.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/page.tsx index 85d5001fd0c..bf16789ca24 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/tx/[id]/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/page.tsx @@ -1,8 +1,8 @@ import { getProject } from "@/api/projects"; import { getClientThirdwebClient } from "@/constants/thirdweb-client.client"; +import { getAuthToken } from "@app/api/lib/getAuthToken"; +import { loginRedirect } from "@app/login/loginRedirect"; import { notFound, redirect } from "next/navigation"; -import { getAuthToken } from "../../../../../../../../api/lib/getAuthToken"; -import { loginRedirect } from "../../../../../../../../login/loginRedirect"; import { getSingleTransaction } from "../../lib/analytics"; import { TransactionDetailsUI } from "./transaction-details-ui"; @@ -19,7 +19,7 @@ export default async function TransactionPage({ ]); if (!authToken) { - loginRedirect(`/team/${team_slug}/${project_slug}/engine/cloud/tx/${id}`); + loginRedirect(`/team/${team_slug}/${project_slug}/transactions/tx/${id}`); } if (!project) { diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/tx/[id]/transaction-details-ui.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/transaction-details-ui.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/tx/[id]/transaction-details-ui.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/transactions/tx/[id]/transaction-details-ui.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/create-vault-account.client.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/create-vault-account.client.tsx index 5dcc541c7cc..7adf7b79855 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/create-vault-account.client.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/create-vault-account.client.tsx @@ -23,13 +23,13 @@ import { } from "lucide-react"; import { useState } from "react"; import { toast } from "sonner"; -import { storeUserAccessToken } from "../../engine/cloud/analytics/utils"; +import { storeUserAccessToken } from "../../transactions/analytics/utils"; import { createManagementAccessToken, createWalletAccessToken, initVaultClient, maskSecret, -} from "../../engine/cloud/lib/vault.client"; +} from "../../transactions/lib/vault.client"; export function CreateVaultAccountButton(props: { project: Project; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/list-access-tokens.client.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/list-access-tokens.client.tsx index 175fd32010f..a350c090373 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/list-access-tokens.client.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/list-access-tokens.client.tsx @@ -20,7 +20,7 @@ import { SERVER_WALLET_MANAGEMENT_ACCESS_TOKEN_PURPOSE, createWalletAccessToken, initVaultClient, -} from "../../engine/cloud/lib/vault.client"; +} from "../../transactions/lib/vault.client"; export default function ListAccessTokens(props: { project: Project; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/rotate-admin-key.client.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/rotate-admin-key.client.tsx index dae5b3fd31f..c7c44b7f5fc 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/rotate-admin-key.client.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/vault/components/rotate-admin-key.client.tsx @@ -31,7 +31,7 @@ import { createWalletAccessToken, initVaultClient, maskSecret, -} from "../../engine/cloud/lib/vault.client"; +} from "../../transactions/lib/vault.client"; export default function RotateAdminKeyButton(props: { project: Project }) { const [modalOpen, setModalOpen] = useState(false); diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/CreateWebhookModal.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/CreateWebhookModal.tsx index e776ff1f282..78befad46de 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/CreateWebhookModal.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/components/CreateWebhookModal.tsx @@ -19,7 +19,7 @@ import { FilterDetailsStep } from "./FilterDetailsStep"; import ReviewStep from "./ReviewStep"; import { createWebhook } from "@/api/insight/webhooks"; -import { XIcon } from "lucide-react"; +import { PlusIcon, XIcon } from "lucide-react"; import type { ThirdwebClient } from "thirdweb"; import { useAbiMultiFetch } from "../hooks/useAbiProcessing"; import { useTestWebhook } from "../hooks/useTestWebhook"; @@ -45,7 +45,7 @@ interface CreateWebhookModalProps { client: ThirdwebClient; } -export function CreateWebhookModal({ +export function CreateContractWebhookButton({ projectClientId, supportedChainIds, client, @@ -224,7 +224,10 @@ export function CreateWebhookModal({ return ( - + -
- -
+
+
+ +
); } diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/contract-webhooks/contract-webhooks-page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/contract-webhooks/contract-webhooks-page.tsx new file mode 100644 index 00000000000..c7be5dcda25 --- /dev/null +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/contract-webhooks/contract-webhooks-page.tsx @@ -0,0 +1,93 @@ +import { + type WebhookResponse, + getSupportedWebhookChains, + getWebhooks, +} from "@/api/insight/webhooks"; +import type { Project } from "@/api/projects"; +import { getClientThirdwebClient } from "@/constants/thirdweb-client.client"; +import { CreateContractWebhookButton } from "../components/CreateWebhookModal"; +import { ContractsWebhooksTable } from "../components/WebhooksTable"; + +export async function ContractsWebhooksPageContent(props: { + project: Project; + authToken: string; +}) { + let webhooks: WebhookResponse[] = []; + let errorMessage = ""; + let supportedChainIds: number[] = []; + + const projectClientId = props.project.publishableKey; + + try { + const webhooksRes = await getWebhooks(projectClientId); + if (webhooksRes.error) { + errorMessage = webhooksRes.error; + } else if (webhooksRes.data) { + webhooks = webhooksRes.data; + } + + const supportedChainsRes = await getSupportedWebhookChains(); + if ("chains" in supportedChainsRes) { + supportedChainIds = supportedChainsRes.chains; + } else { + errorMessage = supportedChainsRes.error; + } + } catch (error) { + errorMessage = "Failed to load webhooks. Please try again later."; + console.error("Error loading project or webhooks", error); + } + + if (errorMessage) { + return ( +
+
+

+ Unable to load webhooks +

+

{errorMessage}

+
+
+ ); + } + + const client = getClientThirdwebClient({ + jwt: props.authToken, + teamId: props.project.teamId, + }); + + return ( +
+ {errorMessage ? ( +
+
+

+ Unable to load webhooks +

+

{errorMessage}

+
+
+ ) : webhooks.length > 0 ? ( + + ) : ( +
+
+

No webhooks found

+

+ Create a webhook to get started. +

+
+ +
+ )} +
+ ); +} diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx index 9d254d2c52c..7bf9d89e587 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/page.tsx @@ -1,23 +1,12 @@ -import { - type WebhookResponse, - getSupportedWebhookChains, - getWebhooks, -} from "@/api/insight/webhooks"; import { getProject } from "@/api/projects"; import { UnderlineLink } from "@/components/ui/UnderlineLink"; -import { getClientThirdwebClient } from "@/constants/thirdweb-client.client"; +import { getAuthToken } from "@app/api/lib/getAuthToken"; import { notFound } from "next/navigation"; -import { getAuthToken } from "../../../../../api/lib/getAuthToken"; -import { CreateWebhookModal } from "./components/CreateWebhookModal"; -import { WebhooksTable } from "./components/WebhooksTable"; +import { ContractsWebhooksPageContent } from "./contract-webhooks/contract-webhooks-page"; export default async function WebhooksPage({ params, }: { params: Promise<{ team_slug: string; project_slug: string }> }) { - let webhooks: WebhookResponse[] = []; - let errorMessage = ""; - let supportedChainIds: number[] = []; - const [authToken, resolvedParams] = await Promise.all([ getAuthToken(), params, @@ -32,32 +21,6 @@ export default async function WebhooksPage({ notFound(); } - const projectClientId = project.publishableKey; - - try { - const webhooksRes = await getWebhooks(projectClientId); - if (webhooksRes.error) { - errorMessage = webhooksRes.error; - } else if (webhooksRes.data) { - webhooks = webhooksRes.data; - } - - const supportedChainsRes = await getSupportedWebhookChains(); - if ("chains" in supportedChainsRes) { - supportedChainIds = supportedChainsRes.chains; - } else { - errorMessage = supportedChainsRes.error; - } - } catch (error) { - errorMessage = "Failed to load webhooks. Please try again later."; - console.error("Error loading project or webhooks", error); - } - - const client = getClientThirdwebClient({ - jwt: authToken, - teamId: project.teamId, - }); - return (
@@ -80,37 +43,7 @@ export default async function WebhooksPage({
- {errorMessage ? ( -
-
-

- Unable to load webhooks -

-

{errorMessage}

-
-
- ) : webhooks.length > 0 ? ( - - ) : ( -
-
-

No webhooks found

-

- Create a webhook to get started. -

-
- -
- )} +
diff --git a/apps/dashboard/src/components/dashboard/StepsCard.tsx b/apps/dashboard/src/components/dashboard/StepsCard.tsx index 3e9542fd985..385072b75fd 100644 --- a/apps/dashboard/src/components/dashboard/StepsCard.tsx +++ b/apps/dashboard/src/components/dashboard/StepsCard.tsx @@ -37,7 +37,7 @@ export const StepsCard: React.FC = ({ return (
{/* Title + Desc */} -

+

{title}