-
+
}>
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
+
+
+
+
+
+
+
+ Publish Contract
+
+
+
+
+
+
+
}>
+
+
+
+ );
+}
+
+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
;
+}