diff --git a/apps/dashboard/src/@/analytics/report.ts b/apps/dashboard/src/@/analytics/report.ts
index 0e5c4485af2..849149dc0b2 100644
--- a/apps/dashboard/src/@/analytics/report.ts
+++ b/apps/dashboard/src/@/analytics/report.ts
@@ -503,3 +503,17 @@ export function reportFundWalletSuccessful() {
export function reportFundWalletFailed(params: { errorMessage: string }) {
posthog.capture("fund wallet failed", params);
}
+
+/**
+ * ### Why do we need to report this event?
+ * - To track the conversion rate of the users choosing to create a token from new flow instead of the old flow
+ *
+ * ### Who is responsible for this event?
+ * @MananTank
+ */
+export function reportTokenUpsellClicked(params: {
+ assetType: "nft" | "coin";
+ pageType: "explore" | "deploy-contract";
+}) {
+ posthog.capture("token upsell clicked", params);
+}
diff --git a/apps/dashboard/src/@/components/blocks/dismissible-alert.tsx b/apps/dashboard/src/@/components/blocks/dismissible-alert.tsx
index 88aa4bd41b1..85f082af1ae 100644
--- a/apps/dashboard/src/@/components/blocks/dismissible-alert.tsx
+++ b/apps/dashboard/src/@/components/blocks/dismissible-alert.tsx
@@ -1,12 +1,39 @@
"use client";
import { XIcon } from "lucide-react";
+import { useState } from "react";
import { Button } from "@/components/ui/button";
import { useLocalStorage } from "@/hooks/useLocalStorage";
-export function DismissibleAlert(props: {
+export function DismissibleAlert(
+ props: {
+ title: React.ReactNode;
+ header?: React.ReactNode;
+ className?: string;
+ description: React.ReactNode;
+ children?: React.ReactNode;
+ } & (
+ | {
+ preserveState: true;
+ localStorageId: string;
+ }
+ | {
+ preserveState: false;
+ }
+ ),
+) {
+ if (props.preserveState) {
+ return ;
+ }
+
+ return ;
+}
+
+function DismissibleAlertWithLocalStorage(props: {
title: React.ReactNode;
+ header?: React.ReactNode;
description: React.ReactNode;
+ children?: React.ReactNode;
localStorageId: string;
}) {
const [isVisible, setIsVisible] = useLocalStorage(
@@ -17,19 +44,48 @@ export function DismissibleAlert(props: {
if (!isVisible) return null;
+ return setIsVisible(false)} />;
+}
+
+function DismissibleAlertWithoutLocalStorage(props: {
+ title: React.ReactNode;
+ description: React.ReactNode;
+ children?: React.ReactNode;
+}) {
+ const [isVisible, setIsVisible] = useState(true);
+
+ if (!isVisible) return null;
+
+ return setIsVisible(false)} />;
+}
+
+function AlertUI(props: {
+ title: React.ReactNode;
+ header?: React.ReactNode;
+ description: React.ReactNode;
+ children?: React.ReactNode;
+ className?: string;
+ onClose: () => void;
+}) {
return (
-
-
-
-
{props.title}
-
{props.description}
+
+
+
+
+ {props.header}
+
{props.title}
+
+ {props.description}
+
+ {props.children}
+
);
diff --git a/apps/dashboard/src/app/(app)/(dashboard)/explore/page.tsx b/apps/dashboard/src/app/(app)/(dashboard)/explore/page.tsx
index 808e095f3ab..1f97e16d9eb 100644
--- a/apps/dashboard/src/app/(app)/(dashboard)/explore/page.tsx
+++ b/apps/dashboard/src/app/(app)/(dashboard)/explore/page.tsx
@@ -4,6 +4,7 @@ import { ContractRow } from "./components/contract-row";
import { DeployUpsellCard } from "./components/upsells/deploy-your-own";
import { PublishUpsellCard } from "./components/upsells/publish-submit";
import { EXPLORE_PAGE_DATA } from "./data";
+import { TokensSection } from "./tokens-section";
const title = "List of smart contracts for EVM Developers";
const description =
@@ -22,11 +23,11 @@ export default async function ExplorePage() {
return (
-
-
+
+
Explore
-
+
The best place for web3 developers to explore smart contracts from
world-class web3 protocols & engineers — all deployable with one
click.
@@ -34,7 +35,11 @@ export default async function ExplorePage() {
-
+
+
+
+
+
{EXPLORE_PAGE_DATA.map((category, idx) => (
diff --git a/apps/dashboard/src/app/(app)/(dashboard)/explore/tokens-section.tsx b/apps/dashboard/src/app/(app)/(dashboard)/explore/tokens-section.tsx
new file mode 100644
index 00000000000..9bc971b9384
--- /dev/null
+++ b/apps/dashboard/src/app/(app)/(dashboard)/explore/tokens-section.tsx
@@ -0,0 +1,111 @@
+"use client";
+
+import { ZapIcon } from "lucide-react";
+import Link from "next/link";
+import { reportTokenUpsellClicked } from "@/analytics/report";
+import { GridPattern } from "@/components/ui/background-patterns";
+import { Badge } from "@/components/ui/badge";
+import { cn } from "@/lib/utils";
+
+export function TokensSection() {
+ return (
+
+
+
+
+
+ New
+
+
+
+ Launch Your Tokens Effortlessly
+
+
+ Deploy contract and configure all settings you need to launch your token
+ in one seamless flow
+