diff --git a/apps/dashboard/knip.json b/apps/dashboard/knip.json index fa8063169b0..74965db63a5 100644 --- a/apps/dashboard/knip.json +++ b/apps/dashboard/knip.json @@ -3,7 +3,9 @@ "next": true, "ignore": [ "src/@/components/ui/**", - "src/components/notices/AnnouncementBanner.tsx" + "src/components/notices/AnnouncementBanner.tsx", + "src/components/cmd-k-search/index.tsx", + "src/lib/search.ts" ], "project": ["src/**"], "ignoreBinaries": ["only-allow", "biome"], diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/layout.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/layout.tsx index c4e9d6a0e07..a414618597e 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/layout.tsx @@ -1,5 +1,3 @@ -import { MobileSidebar } from "@/components/blocks/MobileSidebar"; -import { Sidebar } from "@/components/blocks/Sidebar"; import { Breadcrumb, BreadcrumbItem, @@ -15,12 +13,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { - ArrowLeftIcon, - ChevronDownIcon, - MenuIcon, - TicketCheckIcon, -} from "lucide-react"; +import { ChevronDownIcon, TicketCheckIcon } from "lucide-react"; import type { Metadata } from "next"; import Link from "next/link"; import { redirect } from "next/navigation"; @@ -71,18 +64,6 @@ export default async function ChainPageLayout(props: { const chainMetadata = await getChainMetadata(chain.chainId); - const sidebarLinks = [ - { - href: `/${chain.slug}`, - label: "Overview", - exactMatch: true, - }, - { - href: `/${chain.slug}/popular`, - label: "Popular Contracts", - }, - ]; - return ( <>
@@ -125,9 +106,7 @@ export default async function ChainPageLayout(props: {
-
- - +
{/* Icon + Background */} -
- - - - } - footer={ -
- - - View all chains - -
- } - /> -
-
diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx index 421356ecc12..a139454da52 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx @@ -1,9 +1,5 @@ -import { Button } from "@/components/ui/button"; -import { fetchTopContracts } from "lib/search"; -import { ArrowRightIcon, CircleAlertIcon } from "lucide-react"; -import Link from "next/link"; +import { CircleAlertIcon } from "lucide-react"; import { getRawAccount } from "../../../../account/settings/getAccount"; -import { TrendingContractSection } from "../../../trending/components/trending-table"; import { getChain, getChainMetadata } from "../../utils"; import { BuyFundsSection } from "./components/server/BuyFundsSection"; import { ChainOverviewSection } from "./components/server/ChainOverviewSection"; @@ -21,14 +17,7 @@ export default async function Page(props: { const chainMetadata = await getChainMetadata(chain.chainId); const isDeprecated = chain.status === "deprecated"; - const [account, topContracts] = await Promise.all([ - getRawAccount(), - fetchTopContracts({ - chainId: chain.chainId, - perPage: 3, - timeRange: "month", - }), - ]); + const account = await getRawAccount(); return (
@@ -65,31 +54,6 @@ export default async function Page(props: { )} - {topContracts.length > 0 && ( -
-
-

- Popular Contracts -

- -
- -
- )} - {chain.services.filter((s) => s.enabled).length > 0 && ( )} diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/popular/page.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/popular/page.tsx deleted file mode 100644 index 1fc7191859e..00000000000 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/popular/page.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { type SortBy, fetchTopContracts } from "lib/search"; -import { CircleAlertIcon } from "lucide-react"; -import { TrendingContractSection } from "../../../../trending/components/trending-table"; -import { getChain } from "../../../utils"; - -export default async function Page(props: { - params: Promise<{ chain_id: string }>; - searchParams: Promise<{ page?: number; sortBy?: SortBy }>; -}) { - const searchParams = await props.searchParams; - const params = await props.params; - const chain = await getChain(params.chain_id); - const topContracts = await fetchTopContracts({ - chainId: chain.chainId, - page: searchParams.page, - sortBy: searchParams.sortBy, - perPage: 15, - timeRange: "month", - }); - - return ( -
-

- Popular Contracts -

-

- Explore contracts on Ethereum and sort them by your preferred metrics -

-
- {topContracts.length > 0 && ( - - )} - {topContracts.length === 0 && ( -
-
- - No contracts found -
-
- )} -
- ); -} diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/utils.ts b/apps/dashboard/src/app/(dashboard)/(chain)/utils.ts index 06922e83917..67b2730f1bf 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/utils.ts +++ b/apps/dashboard/src/app/(dashboard)/(chain)/utils.ts @@ -692,7 +692,7 @@ const chainMetaRecord = { backgroundImageUrl: victionCTA.src, title: "Build, own, win, and be part of Viction World Wide Chain where everyone scales beyond limits.", - buttonLink: "https://thirdweb.com/viction/popular", + buttonLink: "https://thirdweb.com/viction", buttonText: "Learn More", }, }, @@ -705,7 +705,7 @@ const chainMetaRecord = { backgroundImageUrl: victionCTA.src, title: "Build, own, win, and be part of Viction World Wide Chain where everyone scales beyond limits.", - buttonLink: "https://thirdweb.com/viction/popular", + buttonLink: "https://thirdweb.com/viction", buttonText: "Learn More", }, }, diff --git a/apps/dashboard/src/app/(dashboard)/trending/components/pagination.client.tsx b/apps/dashboard/src/app/(dashboard)/trending/components/pagination.client.tsx deleted file mode 100644 index 0c11b36b6b9..00000000000 --- a/apps/dashboard/src/app/(dashboard)/trending/components/pagination.client.tsx +++ /dev/null @@ -1,54 +0,0 @@ -"use client"; -import { - Pagination, - PaginationContent, - PaginationItem, - PaginationNext, - PaginationPrevious, -} from "@/components/ui/pagination"; -import { useDashboardRouter } from "@/lib/DashboardRouter"; -import { usePathname, useSearchParams } from "next/navigation"; - -export function TablePagination() { - const router = useDashboardRouter(); - const path = usePathname(); - const searchParams = useSearchParams(); - const page = Number(searchParams?.get("page") || 1); - const range = searchParams?.get("timeRange"); - const currentSort = searchParams?.get("sortBy") || "transactionCount"; - return ( - - - - { - if (page === 1) return; - router.replace( - `${path}?page=${Number(page) - 1}${range?.length ? `&timeRange=${range}` : ""}${currentSort ? `&sortBy=${currentSort}` : ""}`, - { - scroll: false, - }, - ); - }} - /> - - - {page} - - - { - router.replace( - `${path}?page=${Number(page) + 1}${range?.length ? `&timeRange=${range}` : ""}${currentSort ? `&sortBy=${currentSort}` : ""}`, - { - scroll: false, - }, - ); - }} - /> - - - - ); -} diff --git a/apps/dashboard/src/app/(dashboard)/trending/components/sorting-header.client.tsx b/apps/dashboard/src/app/(dashboard)/trending/components/sorting-header.client.tsx deleted file mode 100644 index 1b198cee6da..00000000000 --- a/apps/dashboard/src/app/(dashboard)/trending/components/sorting-header.client.tsx +++ /dev/null @@ -1,50 +0,0 @@ -"use client"; -import { Button } from "@/components/ui/button"; -import { useDashboardRouter } from "@/lib/DashboardRouter"; -import { cn } from "@/lib/utils"; -import { ChevronDown } from "lucide-react"; -import { usePathname } from "next/navigation"; -import type { SortBy, TimeRange } from "../../../../lib/search"; - -type SortingHeaderProps = { - sortBy: string; - title: string; - searchParams: - | { timeRange?: TimeRange; page?: number; sortBy?: SortBy } - | undefined; -}; - -export function SortingHeader(props: SortingHeaderProps) { - const router = useDashboardRouter(); - const path = usePathname(); - const enableSorting = !!props.searchParams; - const { timeRange, page, sortBy } = props.searchParams || {}; - const currentSort = sortBy || "transactionCount"; - const isCurrentSort = currentSort === props.sortBy; - const justify = - props.sortBy === "transactionCountChange" ? "justify-start" : "justify-end"; - - if (!enableSorting) { - return
{props.title}
; - } - - return ( -
- -
- ); -} diff --git a/apps/dashboard/src/app/(dashboard)/trending/components/trending-table.tsx b/apps/dashboard/src/app/(dashboard)/trending/components/trending-table.tsx deleted file mode 100644 index 50de4bbd23a..00000000000 --- a/apps/dashboard/src/app/(dashboard)/trending/components/trending-table.tsx +++ /dev/null @@ -1,206 +0,0 @@ -import { Badge } from "@/components/ui/badge"; -import { - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import type { SortBy, TimeRange, TrendingContract } from "lib/search"; -import { CircleArrowDown, CircleArrowUp, DotIcon } from "lucide-react"; -import Link from "next/link"; -import type { ChainMetadata } from "thirdweb/chains"; -import { shortenAddress } from "thirdweb/utils"; -import { ChainIcon } from "../../(chain)/components/server/chain-icon"; -import { TablePagination } from "./pagination.client"; -import { SortingHeader } from "./sorting-header.client"; - -export function TrendingContractSection(props: { - topContracts: TrendingContract[]; - chainId?: number; - perPage?: number; - searchParams: - | { timeRange?: TimeRange; page?: number; sortBy?: SortBy } - | undefined; - showPagination: boolean; -}) { - const { page } = props.searchParams || {}; - const firstIndex = Math.max(0, ((page || 1) - 1) * (props.perPage || 10)); - const showChainColumn = !props.chainId; - - return ( - props.topContracts.length > 0 && ( -
- - - - - Rank - Contract - Change - {showChainColumn && Chain} - Type - - - - - - - - - - - - - - - - {props.topContracts.map((contract, index) => ( - - {/* Rank */} - - {index + 1 + firstIndex} - - - {/* Contract name */} - - - {getContractName(contract)} - - - - {/* % Change */} - - - - - {/* Chain */} - {showChainColumn && ( - - - - )} - - {/* Type */} - - {contract.type ? ( - - {contract.type} - - ) : ( - - )} - - - {/* Tx count */} - - {contract.transactionCount} - - - {/* Wallet Count */} - - {contract.walletCount} - - - {/* Gas Usage */} - - {contract.gasUsage} - - - {/* Value Moved */} - - {contract.valueMoved || ( - - )} - - - ))} - -
-
- - {props.showPagination && ( -
- -
- )} -
- ) - ); -} - -function ChangeCell(props: { displayCount: string; change: number }) { - if (!props.displayCount) { - return null; - } - - const variant = props.change > 0 ? "success" : "destructive"; - const badge = ( - - {props.change > 0 ? ( - - ) : ( - - )} - {props.change < 10 ? props.change.toFixed(1) : props.change.toFixed(0)}% - - ); - return ( -
- {badge} -
- ); -} - -function ChainCell(props: { chainMetadata: ChainMetadata }) { - const chainMetadata = props.chainMetadata; - return ( - - - {chainMetadata.name.split(" ")[0]} - - ); -} - -function getContractName(contract: TrendingContract) { - if (contract.name && contract.name !== "Unimported Contract") { - return contract.name; - } - return shortenAddress(contract.contractAddress); -} diff --git a/apps/dashboard/src/app/(dashboard)/trending/loading.tsx b/apps/dashboard/src/app/(dashboard)/trending/loading.tsx deleted file mode 100644 index 02fa48bed24..00000000000 --- a/apps/dashboard/src/app/(dashboard)/trending/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { Spinner } from "@/components/ui/Spinner/Spinner"; - -export default function Loading() { - return ( -
- -
- ); -} diff --git a/apps/dashboard/src/app/(dashboard)/trending/opengraph-image.png b/apps/dashboard/src/app/(dashboard)/trending/opengraph-image.png deleted file mode 100644 index 177c1675afd..00000000000 Binary files a/apps/dashboard/src/app/(dashboard)/trending/opengraph-image.png and /dev/null differ diff --git a/apps/dashboard/src/app/(dashboard)/trending/page.tsx b/apps/dashboard/src/app/(dashboard)/trending/page.tsx deleted file mode 100644 index c5c952cc620..00000000000 --- a/apps/dashboard/src/app/(dashboard)/trending/page.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { type SortBy, type TimeRange, fetchTopContracts } from "lib/search"; -import type { Metadata } from "next"; -import { TrendingContractSection } from "./components/trending-table"; - -export const metadata: Metadata = { - title: "Trending Contracts", - description: "See what's hot onchain right now", - openGraph: { - title: "Trending Contracts", - description: "See what's hot onchain right now", - }, -}; - -export default async function DashboardContractTrendingPage(props: { - searchParams: Promise<{ - timeRange?: TimeRange; - page?: number; - sortBy?: SortBy; - }>; -}) { - const topContracts = await fetchTopContracts({ - ...(await props.searchParams), - timeRange: "month", - perPage: 20, - }); - - return ( -
-

- Trending Contracts -

- -
- ); -} diff --git a/apps/dashboard/src/app/components/Header/SecondaryNav/ResourcesDropdownButton.tsx b/apps/dashboard/src/app/components/Header/SecondaryNav/ResourcesDropdownButton.tsx index ab1264ad691..74e0436cc30 100644 --- a/apps/dashboard/src/app/components/Header/SecondaryNav/ResourcesDropdownButton.tsx +++ b/apps/dashboard/src/app/components/Header/SecondaryNav/ResourcesDropdownButton.tsx @@ -7,19 +7,17 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { CmdKSearchModal } from "components/cmd-k-search"; -import { ChevronDownIcon, CommandIcon } from "lucide-react"; +import { ChevronDownIcon } from "lucide-react"; import Link from "next/link"; -import { useState } from "react"; export function ResourcesDropdownButton() { - const [isCMDSearchModalOpen, setIsCMDSearchModalOpen] = useState(false); + // const [isCMDSearchModalOpen, setIsCMDSearchModalOpen] = useState(false); return ( <> - + /> */} - + */} diff --git a/apps/dashboard/src/app/components/MobileBurgerMenuButton.tsx b/apps/dashboard/src/app/components/MobileBurgerMenuButton.tsx index 0cf3b0f55a1..3adc4cb69cf 100644 --- a/apps/dashboard/src/app/components/MobileBurgerMenuButton.tsx +++ b/apps/dashboard/src/app/components/MobileBurgerMenuButton.tsx @@ -15,7 +15,6 @@ import { import { useTheme } from "next-themes"; import Link from "next/link"; import { useLayoutEffect, useState } from "react"; -import { CmdKSearchModal } from "../../components/cmd-k-search"; import { ThirdwebMiniLogo } from "./ThirdwebMiniLogo"; export function MobileBurgerMenuButton( @@ -32,7 +31,7 @@ export function MobileBurgerMenuButton( ) { const [isMenuOpen, setIsMenuOpen] = useState(false); const { setTheme, theme } = useTheme(); - const [isCMDSearchModalOpen, setIsCMDSearchModalOpen] = useState(false); + // const [isCMDSearchModalOpen, setIsCMDSearchModalOpen] = useState(false); useLayoutEffect(() => { if (isMenuOpen) { @@ -48,10 +47,10 @@ export function MobileBurgerMenuButton( return ( <> - + /> */} + */} - - Trending Contracts - - - + {/* This will be added later */} + {/* */}