diff --git a/apps/dashboard/src/@/actions/chain-integration-request.ts b/apps/dashboard/src/@/actions/chain-integration-request.ts new file mode 100644 index 00000000000..56ebc95bc13 --- /dev/null +++ b/apps/dashboard/src/@/actions/chain-integration-request.ts @@ -0,0 +1,62 @@ +"use server"; +import "server-only"; + +import { getAuthToken } from "@/api/auth-token"; +import { NEXT_PUBLIC_THIRDWEB_API_HOST } from "@/constants/public-envs"; + +export type ChainIntegrationRequest = { + companyName: string; + telegram: string; + email: string; + chainName: string; + chainShortName: string; + chainId: string; + publicRpc: string; + iconUrl: string; + iconWidth: string; + iconHeight: string; + iconFormat: string; + nativeCurrencyName: string; + nativeCurrencySymbol: string; + nativeCurrencyDecimals: string; + blockExplorerUrl: string; + blockExplorerStandard: string; + explorerIconWidth: string; + explorerIconHeight: string; + explorerIconFormat: string; + faucetOrBridge: string; + chainStack?: string; +}; + +export async function submitChainIntegrationRequest( + request: ChainIntegrationRequest, +): Promise<{ ok: true } | { ok: false; error: string }> { + const token = await getAuthToken(); + if (!token) { + return { error: "You are not logged in", ok: false }; + } + + const res = await fetch( + new URL("/v1/chains/integration-requests", NEXT_PUBLIC_THIRDWEB_API_HOST), + { + body: JSON.stringify(request), + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + method: "POST", + }, + ); + + if (!res.ok) { + return { + error: + res.status === 429 + ? "Too many requests, please try again in a minute" + : "Failed to submit request, please try again later", + ok: false, + }; + } + + return { ok: true }; +} diff --git a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/chainlist/components/server/add-chain-button.tsx b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/chainlist/components/server/add-chain-button.tsx index 5618eab206e..f27fc92dabf 100644 --- a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/chainlist/components/server/add-chain-button.tsx +++ b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/chainlist/components/server/add-chain-button.tsx @@ -7,7 +7,7 @@ export function AddYourChainButton(props: { className?: string }) { + + + ); +} diff --git a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/chainlist/request/page.tsx b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/chainlist/request/page.tsx new file mode 100644 index 00000000000..953a59caa94 --- /dev/null +++ b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/chainlist/request/page.tsx @@ -0,0 +1,29 @@ +import type { Metadata } from "next"; +import { getAuthToken } from "@/api/auth-token"; +import { loginRedirect } from "@/utils/redirects"; +import { ChainIntegrationRequestForm } from "./chain-integration-request-form"; + +export const metadata: Metadata = { + title: "Mainnet Chain Integration Request", +}; + +export default async function ChainIntegrationRequestPage() { + const authToken = await getAuthToken(); + if (!authToken) { + loginRedirect("/chainlist/request"); + } + + return ( +
+

+ Mainnet Chain Integration Request +

+

+ Share your chain details and our team will get back to you. +

+
+ +
+
+ ); +} diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/page.tsx index c4294402cdc..0e915c1c5c4 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/page.tsx @@ -106,7 +106,7 @@ export default function DeployInfrastructurePage() { Share your chain details via{" "}