diff --git a/apps/dashboard/src/app/account/contracts/DeployedContractsPageHeader.tsx b/apps/dashboard/src/app/account/contracts/DeployedContractsPageHeader.tsx index a2569047f0f..5227a2fd3a3 100644 --- a/apps/dashboard/src/app/account/contracts/DeployedContractsPageHeader.tsx +++ b/apps/dashboard/src/app/account/contracts/DeployedContractsPageHeader.tsx @@ -17,14 +17,14 @@ export function DeployedContractsPageHeader() { setImportModalOpen(false); }} /> -
+
-

- Your contracts +

+ Deployed contracts

- The list of contract instances that you have deployed or imported - with thirdweb across all networks + The list of contracts that you have deployed or imported with + thirdweb across all networks

diff --git a/apps/dashboard/src/app/account/contracts/_components/DeployedContractsPage.tsx b/apps/dashboard/src/app/account/contracts/_components/DeployedContractsPage.tsx index d7d137e31d1..20b1827cd57 100644 --- a/apps/dashboard/src/app/account/contracts/_components/DeployedContractsPage.tsx +++ b/apps/dashboard/src/app/account/contracts/_components/DeployedContractsPage.tsx @@ -8,12 +8,11 @@ import { getSortedDeployedContracts } from "./getSortedDeployedContracts"; export function DeployedContractsPage(props: { address: string; - className?: string; }) { return ( -
+
-
+
}> diff --git a/apps/dashboard/src/app/account/contracts/layout.tsx b/apps/dashboard/src/app/account/contracts/layout.tsx index 500764ffd23..fc483138d38 100644 --- a/apps/dashboard/src/app/account/contracts/layout.tsx +++ b/apps/dashboard/src/app/account/contracts/layout.tsx @@ -1,5 +1,26 @@ +import { SidebarLayout } from "@/components/blocks/SidebarLayout"; + export default function Layout(props: { children: React.ReactNode; }) { - return
{props.children}
; + const layoutPath = "/account/contracts"; + + return ( + + {props.children} + + ); } diff --git a/apps/dashboard/src/app/account/contracts/page.tsx b/apps/dashboard/src/app/account/contracts/page.tsx index 3fbb5fa369d..2132b151126 100644 --- a/apps/dashboard/src/app/account/contracts/page.tsx +++ b/apps/dashboard/src/app/account/contracts/page.tsx @@ -9,10 +9,5 @@ export default async function Page() { return redirect(`/login?next=${encodeURIComponent("/account/contracts")}`); } - return ( - - ); + return ; } diff --git a/apps/dashboard/src/app/account/contracts/published/PublishedContractsPage.tsx b/apps/dashboard/src/app/account/contracts/published/PublishedContractsPage.tsx new file mode 100644 index 00000000000..b41c3cb4c68 --- /dev/null +++ b/apps/dashboard/src/app/account/contracts/published/PublishedContractsPage.tsx @@ -0,0 +1,81 @@ +import { GenericLoadingPage } from "@/components/blocks/skeletons/GenericLoadingPage"; +import { Button } from "@/components/ui/button"; +import { PlusIcon } from "lucide-react"; +import Link from "next/link"; +import { Suspense } from "react"; +import { PublishedContracts } from "../../../(dashboard)/profile/[addressOrEns]/components/published-contracts"; +import { resolveAddressAndEns } from "../../../(dashboard)/profile/[addressOrEns]/resolveAddressAndEns"; +import { fetchPublishedContracts } from "../../../../components/contract-components/fetchPublishedContracts"; + +export async function PublishedContractsPage(props: { + publisherAddress: string; +}) { + const resolvedInfo = await resolveAddressAndEns(props.publisherAddress); + + return ( +
+
+
+

+ Published contracts +

+ +

+ The list of contracts published to thirdweb across all networks.{" "} + + Learn more about publishing contracts + +

+
+ + +
+ +
+ + }> + + +
+ ); +} + +async function AsyncPublishedContractsTable(props: { + publisherAddress: string; + publisherEnsName: string | undefined; +}) { + const publishedContracts = await fetchPublishedContracts( + props.publisherAddress, + ); + + if (publishedContracts.length === 0) { + return ( +
+ No published contracts found +
+ ); + } + + return ( + + ); +} diff --git a/apps/dashboard/src/app/account/contracts/published/page.tsx b/apps/dashboard/src/app/account/contracts/published/page.tsx new file mode 100644 index 00000000000..5f2a78b9865 --- /dev/null +++ b/apps/dashboard/src/app/account/contracts/published/page.tsx @@ -0,0 +1,13 @@ +import { getAuthTokenWalletAddress } from "../../../api/lib/getAuthToken"; +import { loginRedirect } from "../../../login/loginRedirect"; +import { PublishedContractsPage } from "./PublishedContractsPage"; + +export default async function Page() { + const accountAddress = await getAuthTokenWalletAddress(); + + if (!accountAddress) { + loginRedirect("/account/contracts"); + } + + return ; +} diff --git a/apps/dashboard/src/app/account/layout.tsx b/apps/dashboard/src/app/account/layout.tsx index 4017cc0c235..b2cd2bb6c37 100644 --- a/apps/dashboard/src/app/account/layout.tsx +++ b/apps/dashboard/src/app/account/layout.tsx @@ -51,7 +51,6 @@ async function HeaderAndNav(props: { { path: "/account/contracts", name: "Contracts", - exactMatch: true, }, { path: "/account/settings", diff --git a/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/layout.tsx b/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/layout.tsx new file mode 100644 index 00000000000..8b149207893 --- /dev/null +++ b/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/layout.tsx @@ -0,0 +1,28 @@ +import { SidebarLayout } from "@/components/blocks/SidebarLayout"; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ team_slug: string }>; +}) { + const params = await props.params; + const layoutPath = `/team/${params.team_slug}/~/contracts`; + + return ( + + {props.children} + + ); +} diff --git a/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/page.tsx b/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/page.tsx index 29cd3bddbb7..e6d1cd524ae 100644 --- a/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/page.tsx +++ b/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/page.tsx @@ -14,12 +14,5 @@ export default async function Page(props: { ); } - return ( -
- -
- ); + return ; } diff --git a/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/published/page.tsx b/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/published/page.tsx new file mode 100644 index 00000000000..0c5fb325531 --- /dev/null +++ b/apps/dashboard/src/app/team/[team_slug]/(team)/~/contracts/published/page.tsx @@ -0,0 +1,16 @@ +import { PublishedContractsPage } from "../../../../../../account/contracts/published/PublishedContractsPage"; +import { getAuthTokenWalletAddress } from "../../../../../../api/lib/getAuthToken"; +import { loginRedirect } from "../../../../../../login/loginRedirect"; + +export default async function Page(props: { + params: Promise<{ team_slug: string }>; +}) { + const accountAddress = await getAuthTokenWalletAddress(); + const params = await props.params; + + if (!accountAddress) { + loginRedirect(`/team/${params.team_slug}/~/contracts`); + } + + return ; +} diff --git a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/layout.tsx b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/layout.tsx new file mode 100644 index 00000000000..8a05a282fa8 --- /dev/null +++ b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/layout.tsx @@ -0,0 +1,28 @@ +import { SidebarLayout } from "@/components/blocks/SidebarLayout"; + +export default async function Layout(props: { + children?: React.ReactNode; + params: Promise<{ team_slug: string; project_slug: string }>; +}) { + const params = await props.params; + const layoutPath = `/team/${params.team_slug}/${params.project_slug}/contracts`; + + return ( + + {props.children} + + ); +} diff --git a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/page.tsx b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/page.tsx index 8623f972cb6..121e6529797 100644 --- a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/page.tsx +++ b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/page.tsx @@ -1,6 +1,6 @@ -import { redirect } from "next/navigation"; import { DeployedContractsPage } from "../../../../account/contracts/_components/DeployedContractsPage"; import { getAuthTokenWalletAddress } from "../../../../api/lib/getAuthToken"; +import { loginRedirect } from "../../../../login/loginRedirect"; export default async function Page(props: { params: Promise<{ team_slug: string; project_slug: string }>; @@ -9,17 +9,8 @@ export default async function Page(props: { if (!accountAddress) { const { team_slug, project_slug } = await props.params; - return redirect( - `/login?next=${encodeURIComponent(`/team/${team_slug}/${project_slug}/contracts`)}`, - ); + loginRedirect(`/team/${team_slug}/${project_slug}/contracts`); } - return ( -
- -
- ); + return ; } diff --git a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/published/page.tsx b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/published/page.tsx new file mode 100644 index 00000000000..3b8c77fa925 --- /dev/null +++ b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/contracts/published/page.tsx @@ -0,0 +1,16 @@ +import { PublishedContractsPage } from "../../../../../account/contracts/published/PublishedContractsPage"; +import { getAuthTokenWalletAddress } from "../../../../../api/lib/getAuthToken"; +import { loginRedirect } from "../../../../../login/loginRedirect"; + +export default async function Page(props: { + params: Promise<{ team_slug: string; project_slug: string }>; +}) { + const accountAddress = await getAuthTokenWalletAddress(); + const params = await props.params; + + if (!accountAddress) { + loginRedirect(`/team/${params.team_slug}/${params.project_slug}/contracts`); + } + + return ; +}