diff --git a/apps/dashboard/redirects.js b/apps/dashboard/redirects.js index 6acffb4a2f9..6ca2d1738ce 100644 --- a/apps/dashboard/redirects.js +++ b/apps/dashboard/redirects.js @@ -66,15 +66,20 @@ const projectRoute = "/team/:team_slug/:project_slug"; const projectPageRedirects = [ { - destination: `${projectRoute}/universal-bridge/:path*`, + destination: `${projectRoute}/payments/:path*`, permanent: false, source: `${projectRoute}/connect/pay/:path*`, }, { - destination: `${projectRoute}/universal-bridge/:path*`, + destination: `${projectRoute}/payments/:path*`, permanent: false, source: `${projectRoute}/connect/universal-bridge/:path*`, }, + { + destination: `${projectRoute}/payments/:path*`, + permanent: false, + source: `${projectRoute}/universal-bridge/:path*`, + }, { destination: `${projectRoute}/account-abstraction/:path*`, permanent: false, @@ -375,12 +380,22 @@ async function redirects() { permanent: false, source: "/template/:slug", }, - // redirect /connect/pay to /universal-bridge + // redirect /connect/pay to /payments { - destination: "/universal-bridge", - permanent: false, + destination: "/payments", + permanent: true, source: "/connect/pay", }, + { + destination: "/payments", + permanent: true, + source: "/universal-bridge", + }, + { + destination: "/payments/:slug", + permanent: true, + source: "/universal-bridge/:slug", + }, // PREVIOUS CAMPAIGNS { destination: "/", diff --git a/apps/dashboard/src/@/analytics/report.ts b/apps/dashboard/src/@/analytics/report.ts index 4516a4fcaff..c898ff45932 100644 --- a/apps/dashboard/src/@/analytics/report.ts +++ b/apps/dashboard/src/@/analytics/report.ts @@ -413,3 +413,18 @@ export function reportUpsellShown(properties: UpsellParams) { export function reportUpsellClicked(properties: UpsellParams) { posthog.capture("upsell clicked", properties); } + +// ---------------------------- +// PAYMENTS +// ---------------------------- + +/** + * ### Why do we need to report this event? + * - To track conversions on payment overview page + * + * ### Who is responsible for this event? + * @samina + */ +export function reportPaymentCardClick(properties: { id: string }) { + posthog.capture("payment card clicked", properties); +} diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx index 44bb77edba4..ab0f272b4c1 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx @@ -254,7 +254,7 @@ function ProductsSection(props: { teamSlug: string; projectSlug: string }) { { description: "Bridge, swap, and purchase cryptocurrencies with any fiat options or tokens via cross-chain routing", - href: `/team/${props.teamSlug}/${props.projectSlug}/universal-bridge`, + href: `/team/${props.teamSlug}/${props.projectSlug}/payments`, icon: PayIcon, title: "Payments", }, diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx index 3549bab49a8..e9dd315e7c1 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectSidebarLayout.tsx @@ -79,7 +79,7 @@ export function ProjectSidebarLayout(props: { group: "Monetize", links: [ { - href: `${layoutPath}/universal-bridge`, + href: `${layoutPath}/payments`, icon: PayIcon, label: "Payments", }, diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/components/TopChainsTable.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/components/TopChainsTable.tsx index 79c661299ae..7af51938b48 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/components/TopChainsTable.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/components/TopChainsTable.tsx @@ -13,7 +13,7 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; -import { CardHeading } from "../../universal-bridge/components/common"; +import { CardHeading } from "../../payments/components/common"; export function TopInsightChainsTable(props: { data: InsightChainStats[]; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/components/TopEndpointsTable.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/components/TopEndpointsTable.tsx index 1ee0853f08b..622ae6df8c5 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/components/TopEndpointsTable.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/components/TopEndpointsTable.tsx @@ -13,7 +13,7 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; -import { CardHeading } from "../../universal-bridge/components/common"; +import { CardHeading } from "../../payments/components/common"; export function TopInsightEndpointsTable(props: { data: InsightEndpointStats[]; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx index 58f07c263fa..87763b5c018 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx @@ -423,7 +423,7 @@ function AppHighlightsCard({ emptyContent: ( ), diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/analytics/page.tsx similarity index 90% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/page.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/analytics/page.tsx index ebd131e91b3..4bf1d7e2f00 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/analytics/page.tsx @@ -5,8 +5,8 @@ import { getAuthToken } from "@/api/auth-token"; import { getProject } from "@/api/projects"; import { getClientThirdwebClient } from "@/constants/thirdweb-client.client"; import { loginRedirect } from "@/utils/redirects"; -import { PayAnalytics } from "./components/PayAnalytics"; -import { getUniversalBridgeFiltersFromSearchParams } from "./components/time"; +import { PayAnalytics } from "../components/PayAnalytics"; +import { getUniversalBridgeFiltersFromSearchParams } from "../components/time"; export default async function Page(props: { params: Promise<{ @@ -24,9 +24,7 @@ export default async function Page(props: { const project = await getProject(params.team_slug, params.project_slug); if (!authToken) { - loginRedirect( - `/team/${params.team_slug}/${params.project_slug}/universal-bridge`, - ); + loginRedirect(`/team/${params.team_slug}/${params.project_slug}/payments`); } if (!project) { @@ -70,7 +68,7 @@ export default async function Page(props: { diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/components/PayEmbedFTUX.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/components/BuyWidgetFTUX.tsx similarity index 92% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/components/PayEmbedFTUX.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/components/BuyWidgetFTUX.tsx index 7f199bb6df7..b911530dd9a 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/components/PayEmbedFTUX.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/components/BuyWidgetFTUX.tsx @@ -8,7 +8,7 @@ import { TabButtons } from "@/components/ui/tabs"; type Tab = "embed" | "sdk" | "api"; -export function PayEmbedFTUX(props: { +export function BuyWidgetFTUX(props: { clientId: string; codeExamples: { embed: React.ReactNode; @@ -21,7 +21,7 @@ export function PayEmbedFTUX(props: {

- Start Monetizing Your App + Setup Payments to View Analytics

@@ -56,7 +56,7 @@ export function PayEmbedFTUX(props: { + + ); +} diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/components/PayAnalytics.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/components/PayAnalytics.tsx similarity index 98% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/components/PayAnalytics.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/components/PayAnalytics.tsx index 8c2696a5c86..4e5ae27166a 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/components/PayAnalytics.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/components/PayAnalytics.tsx @@ -7,10 +7,10 @@ import { import type { Range } from "@/components/analytics/date-range-selector"; import { CodeServer } from "@/components/ui/code/code.server"; import { Skeleton } from "@/components/ui/skeleton"; +import { BuyWidgetFTUX } from "./BuyWidgetFTUX"; import { apiCode, embedCode, sdkCode } from "./code-examples"; import { PayAnalyticsFilter } from "./PayAnalyticsFilter"; import { PayCustomersTable } from "./PayCustomersTable"; -import { PayEmbedFTUX } from "./PayEmbedFTUX"; import { PaymentHistory } from "./PaymentHistory"; import { PaymentsSuccessRate } from "./PaymentsSuccessRate"; import { PayNewCustomers } from "./PayNewCustomers"; @@ -67,7 +67,7 @@ export async function PayAnalytics(props: { if (!hasVolume && !hasWallet) { return ( - @@ -32,7 +32,7 @@ export default async function Layout(props: { cryptocurrencies and execute transactions with any fiat options or tokens via cross-chain routing.{" "} @@ -45,10 +45,15 @@ export default async function Layout(props: { ; + searchParams: Promise<{ + from?: string | undefined | string[]; + to?: string | undefined | string[]; + interval?: string | undefined | string[]; + }>; +}) { + const [params, authToken] = await Promise.all([props.params, getAuthToken()]); + + const project = await getProject(params.team_slug, params.project_slug); + + if (!authToken) { + loginRedirect(`/team/${params.team_slug}/${params.project_slug}/payments`); + } + + if (!project) { + redirect(`/team/${params.team_slug}`); + } + + const searchParams = await props.searchParams; + + return ( + +
+
+ } + id="earn_fees" + link={{ + href: `/team/${params.team_slug}/${params.project_slug}/payments/settings`, + label: "Configure", + }} + /> + } + id="create_payment_links" + link={{ + href: `/pay`, + label: "Create", + }} + /> + } + id="sell_your_token" + link={{ + href: `/team/${params.team_slug}/${params.project_slug}/tokens`, + label: "Launch Token", + }} + /> + } + id="get_notified" + link={{ + href: `/team/${params.team_slug}/${params.project_slug}/payments/webhooks`, + label: "Setup", + }} + /> + } + id="sell_products" + link={{ + href: "https://portal.thirdweb.com/payments/products", + label: "Get Started", + target: "_blank", + }} + /> + } + id="customize_your_experience" + link={{ + href: "https://payments.thirdweb.com/reference", + label: "Docs", + target: "_blank", + }} + /> +
+ +
+
+ +
+ + ); +} diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/PayConfig.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/settings/PayConfig.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/PayConfig.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/settings/PayConfig.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/RouteDiscovery.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/settings/RouteDiscovery.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/RouteDiscovery.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/settings/RouteDiscovery.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/settings/page.tsx similarity index 89% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/page.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/settings/page.tsx index c4cfe368d22..9347d6f0a7a 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/settings/page.tsx @@ -1,5 +1,5 @@ -import { PayConfig } from "@app/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/PayConfig"; -import { RouteDiscovery } from "@app/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/settings/RouteDiscovery"; +import { PayConfig } from "@app/team/[team_slug]/[project_slug]/(sidebar)/payments/settings/PayConfig"; +import { RouteDiscovery } from "@app/team/[team_slug]/[project_slug]/(sidebar)/payments/settings/RouteDiscovery"; import { redirect } from "next/navigation"; import { getAuthToken } from "@/api/auth-token"; import { getProject } from "@/api/projects"; @@ -23,9 +23,7 @@ export default async function Page(props: { ]); if (!authToken) { - loginRedirect( - `/team/${team_slug}/${project_slug}/universal-bridge/settings`, - ); + loginRedirect(`/team/${team_slug}/${project_slug}/payments/settings`); } if (!team) { diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/components/webhooks.client.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/webhooks/components/webhooks.client.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/components/webhooks.client.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/webhooks/components/webhooks.client.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/loading.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/webhooks/loading.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/loading.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/webhooks/loading.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/webhooks/page.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/universal-bridge/webhooks/page.tsx rename to apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/webhooks/page.tsx diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/rpc/components/MethodsTable.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/rpc/components/MethodsTable.tsx index a49f84b2fcd..ce5700566c9 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/rpc/components/MethodsTable.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/rpc/components/MethodsTable.tsx @@ -15,7 +15,7 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; -import { CardHeading } from "../../universal-bridge/components/common"; +import { CardHeading } from "../../payments/components/common"; export function TopRPCMethodsTable(props: { data: RpcMethodStats[]; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx index 8a55ee8f95e..5e9a4da51ed 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/ProjectGeneralSettingsPage.tsx @@ -223,7 +223,7 @@ export function ProjectGeneralSettingsPageUI(props: { aaConfig: `${projectLayout}/account-abstraction/settings`, afterDeleteRedirectTo: `/team/${props.teamSlug}`, inAppConfig: `${projectLayout}/wallets/settings`, - payConfig: `${projectLayout}/universal-bridge/settings`, + payConfig: `${projectLayout}/payments/settings`, }; const { project } = props; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/layout.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/layout.tsx index 852acc1ffa1..ee52f222023 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/layout.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/layout.tsx @@ -49,7 +49,7 @@ export default async function WebhooksLayout(props: { }, { name: "Payments", - path: `/team/${params.team_slug}/${params.project_slug}/webhooks/universal-bridge`, + path: `/team/${params.team_slug}/${params.project_slug}/payments/webhooks`, }, ]} scrollableClassName="container max-w-7xl" @@ -63,7 +63,7 @@ export default async function WebhooksLayout(props: { }, { name: "Payments", - path: `/team/${params.team_slug}/${params.project_slug}/webhooks/universal-bridge`, + path: `/team/${params.team_slug}/${params.project_slug}/payments/webhooks`, }, ]} scrollableClassName="container max-w-7xl" diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/universal-bridge/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/universal-bridge/page.tsx index 2a935afef9e..13408806ecc 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/universal-bridge/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/universal-bridge/page.tsx @@ -1,7 +1,7 @@ import { redirect } from "next/navigation"; import { getProject } from "@/api/projects"; import { UnderlineLink } from "@/components/ui/UnderlineLink"; -import { PayWebhooksPage } from "../../universal-bridge/webhooks/components/webhooks.client"; +import { PayWebhooksPage } from "../../payments/webhooks/components/webhooks.client"; export default async function Page(props: { params: Promise<{