diff --git a/_data/pages/dapps.yml b/_data/pages/dapps.yml
index 2e44f7d316..0f5d47532c 100644
--- a/_data/pages/dapps.yml
+++ b/_data/pages/dapps.yml
@@ -7,7 +7,11 @@ parent_page: /ecosystem/
breadcrumbs: false
page_last_updated: true
blocks:
+ - type: hero
+ variant: block_explorers
+ title: Hundreds of dApps, Services & Wallets
+ description: Immerse yourself in the Starknet Ecosystem by discovering projects, jobs, metrics and learning resources.
- type: dapps
variant: dapps
title: dApps
- description: Discover apps in the Starknet ecosystem across NFTs, Gaming, Defi,
\ No newline at end of file
+ description: ""
\ No newline at end of file
diff --git a/workspaces/cms-scripts/src/index.ts b/workspaces/cms-scripts/src/index.ts
index a9ef0708ec..585dd19e61 100644
--- a/workspaces/cms-scripts/src/index.ts
+++ b/workspaces/cms-scripts/src/index.ts
@@ -317,7 +317,19 @@ export interface TagObject {
label: string;
slug: string;
}
-const blackListTags = ["all"];
+const blackListTags = [
+ "all",
+ "governance",
+ "pfp",
+ "green finance",
+ "cairo",
+ "formal-verification",
+ "dex, wallet, multi-chain, cross-chain, okx, bridge, blockchain",
+ "staking",
+ "access node",
+ "data",
+ "starkware",
+];
const slugifyTags = (objects: Project[]): Project[] => {
return objects.map((obj) => {
@@ -345,7 +357,9 @@ const extractTags = (projects: Project[]): TagObject[] => {
}));
};
const slugifyDApps = slugifyTags(dAppsData.content);
-const categories = extractTags(dAppsData.content);
+const categories = extractTags(dAppsData.content).sort((a, b) =>
+ a.label > b.label ? 1 : b.label > a.label ? -1 : 0
+);
await fs.mkdir("public/data/starknet-db-projects-dapps", { recursive: true });
await write(
diff --git a/workspaces/website/src/pages/starknet-db-projects-dapps/(components)/DappsPage.tsx b/workspaces/website/src/pages/starknet-db-projects-dapps/(components)/DappsPage.tsx
index b865baf261..3c27017596 100644
--- a/workspaces/website/src/pages/starknet-db-projects-dapps/(components)/DappsPage.tsx
+++ b/workspaces/website/src/pages/starknet-db-projects-dapps/(components)/DappsPage.tsx
@@ -6,6 +6,8 @@ import {
List,
ListItem,
HStack,
+ Circle,
+ Text,
} from "@chakra-ui/react";
import {
DappsProps,
@@ -13,13 +15,15 @@ import {
} from "@starknet-io/cms-data/src/starknet-db-projects-dapps";
import { Button } from "@ui/Button";
import { useEffect, useMemo, useState } from "react";
-import { Input, Select } from "@chakra-ui/react";
+import { Input } from "@chakra-ui/react";
import { navigate } from "vite-plugin-ssr/client/router";
import useQueryString from "src/hooks/useQueryString";
+import { IoSearchOutline } from "react-icons/io5";
enum SORT_BY {
- A_Z = "A-Z",
- FOLLOWERS = "Followers",
+ ALL = "All",
+ MAINNET = "Mainnet",
+ TESTNET = "Testnet",
}
const DappsPage = ({ list, categories }: DappsProps) => {
@@ -51,7 +55,9 @@ const DappsPage = ({ list, categories }: DappsProps) => {
sortBy && queryParams.set("sortBy", sortBy);
searchValue && queryParams.set("searchValue", searchValue);
- navigate(`${url.pathname}?${queryParams.toString()}`);
+ navigate(`${url.pathname}?${queryParams.toString()}`, {
+ keepScrollPosition: true,
+ });
}, [searchValue, sortBy, selectedCategory, url.pathname]);
const projects = useMemo(() => {
const byCategory =
@@ -65,12 +71,11 @@ const DappsPage = ({ list, categories }: DappsProps) => {
}, [selectedCategory, searchValue]);
const projectsSort = useMemo(() => {
- if (sortBy === SORT_BY.A_Z)
- return projects.sort((a, b) => a.name.localeCompare(b.name));
- return projects.sort(
- (a, b) =>
- a.socialMetrics?.twitterFollower - b.socialMetrics?.twitterFollower
- );
+ if (sortBy === SORT_BY.MAINNET)
+ return projects.filter((project) => project.isLive);
+ if (sortBy === SORT_BY.TESTNET)
+ return projects.filter((project) => project.isTestnetLive);
+ else return projects;
}, [sortBy, projects]);
const handleChangeCategory = (category: string | undefined) => {
@@ -81,13 +86,22 @@ const DappsPage = ({ list, categories }: DappsProps) => {
return (
<>
<>
- Dapps
-
+
+ Categories
+
+
+ {selectedCategory === undefined && (
+
+ )}
{categories.map((category) => {
return (
-
+
+ {selectedCategory === category && (
+
+ )}
);
})}
-
-
- List length:{projects.length}
-
- setSearchValue(e.target.value)}
- />
+
+ setSearchValue(e.target.value)}
+ />
+
-
+
{projectsSort.map((item) => {
return (
-
- {item.name}
-
+
+
+
+
+
+ {item.name}
+
+ {item.description}
);
})}