From 4a57d8668fcaa82473afc9dc63c2a5da85e9e3f4 Mon Sep 17 00:00:00 2001 From: Kumaraguru <19eucs071@skcet.ac.in> Date: Fri, 10 Jan 2025 15:42:15 +0000 Subject: [PATCH] added title and seo --- pages/index.js | 789 +++++++++++++++++++++++---------------------- public/favicon.ico | Bin 25931 -> 15406 bytes 2 files changed, 401 insertions(+), 388 deletions(-) diff --git a/pages/index.js b/pages/index.js index fe2cc6e..8794e79 100644 --- a/pages/index.js +++ b/pages/index.js @@ -37,6 +37,7 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; +import Head from "next/head"; // Initialize Supabase client const supabase = createClient( @@ -215,401 +216,413 @@ export default function Dashboard() { const totalPeerPages = getPageCount(displayPeerIds.length); return ( -
- {/* Header */} - -
-
- Codex -

Testnet Metrics

-
-
- - - - - - - - - Testnet Metrics -
- - The data displayed in this dashboard is collected from Codex nodes that use the{' '} - - Codex CLI - - {' '}for running a Codex alturistic node in the testnet. Users agree to a privacy - disclaimer before using the Codex CLI and the data collected will be used to - understand the testnet statistics and help troubleshooting users who face - difficulty in getting onboarded to Codex. - -
-
-

Don't wish to provide data?

-

- You can still run a Codex node without providing any data. To do this, please follow the steps mentioned in the - Codex documentation - which does not use the Codex CLI. -

-
-
-

Is there an incentive to run a Codex node?

-

- Codex is currently in testnet and it is not incentivized. However, in the future, Codex may be incentivized as per the roadmap. But please bear in mind that no incentives are promised for testnet node operators. -

-
-
-

I have a question or suggestion

-

- The best way to get in touch with us is to join the - - {" "}Codex discord - and ask your question in the #support channel. -

-
-
- - -
-
-
-
+ <> + + Codex Metrics + + + + + + + -
- {error ? ( - - ) : ( -
- {/* Top Section: Stats + Graph */} -
- {/* Left Column - Stats Cards */} -
- {[ - { - title: "Active Nodes", - value: currentActiveNodes, - Icon: Users, - delay: 0, - isLoading: componentLoading.nodes, - }, - { - title: "Average Peer Count", - value: averagePeerCount, - Icon: Network, - delay: 0.1, - isLoading: componentLoading.nodes, - }, - { - title: "Total Nodes", - value: totalNodes, - Icon: Database, - delay: 0.2, - isLoading: componentLoading.metrics, - }, - { - title: "Last Updated", - value: lastUpdated, - Icon: Clock, - delay: 0.3, - isLoading: componentLoading.nodes, - }, - ].map((stat) => ( - -

- - {stat.title} -

-
- {stat.isLoading ? ( -
- ) : stat.title === "Last Updated" ? ( -
- - {lastUpdated.time} - - - {lastUpdated.dateText} - -
- ) : ( -

- {stat.value} -

- )} -
- - ))} -
- - {/* Right Column - Chart */} - - -
- - - - Active Nodes - - - - Geographic Distribution - - -
- - - {componentLoading.metrics ? ( -
- -
- ) : metrics.length === 0 ? ( -
-

No data available for the selected timeframe

-
- ) : ( -
- - - - format(new Date(date), "MMM d")} - fontSize={12} - tickMargin={10} - /> - - [`${value} nodes`, 'Active Nodes']} - labelFormatter={(label) => format(new Date(label), "MMM d, yyyy")} - /> - - - -
- )} -
- - -
-

Geographic distribution view coming soon

-
-
-
-
+
+ {/* Header */} + +
+
+ Codex +

Testnet Metrics

- - {/* Bottom Section: Version Distribution + Active Peers */} -
- {/* Version Distribution */} - + + + + + + + + + Testnet Metrics +
+ + The data displayed in this dashboard is collected from Codex nodes that use the{' '} + + Codex CLI + + {' '}for running a Codex alturistic node in the testnet. Users agree to a privacy + disclaimer before using the Codex CLI and the data collected will be used to + understand the testnet statistics and help troubleshooting users who face + difficulty in getting onboarded to Codex. + +
+
+

Don't wish to provide data?

+

+ You can still run a Codex node without providing any data. To do this, please follow the steps mentioned in the + Codex documentation + which does not use the Codex CLI. +

+
+
+

Is there an incentive to run a Codex node?

+

+ Codex is currently in testnet and it is not incentivized. However, in the future, Codex may be incentivized as per the roadmap. But please bear in mind that no incentives are promised for testnet node operators. +

+
+
+

I have a question or suggestion

+

+ The best way to get in touch with us is to join the + + {" "}Codex discord + and ask your question in the #support channel. +

+
+
+ + +
+
+
+
+ +
+ {error ? ( + + ) : ( +
+ {/* Top Section: Stats + Graph */} +
+ {/* Left Column - Stats Cards */} +
+ {[ + { + title: "Active Nodes", + value: currentActiveNodes, + Icon: Users, + delay: 0, + isLoading: componentLoading.nodes, + }, + { + title: "Average Peer Count", + value: averagePeerCount, + Icon: Network, + delay: 0.1, + isLoading: componentLoading.nodes, + }, + { + title: "Total Nodes", + value: totalNodes, + Icon: Database, + delay: 0.2, + isLoading: componentLoading.metrics, + }, + { + title: "Last Updated", + value: lastUpdated, + Icon: Clock, + delay: 0.3, + isLoading: componentLoading.nodes, + }, + ].map((stat) => ( + +

+ + {stat.title} +

+
+ {stat.isLoading ? ( +
+ ) : stat.title === "Last Updated" ? ( +
+ + {lastUpdated.time} + + + {lastUpdated.dateText}
-
- -
-
- ))} -
- - - )} -
- - {/* Active Peer IDs List */} - -
-

- - Active Peer IDs -

-
- setSearchQuery(e.target.value)} - className="w-full bg-neutral-800 border border-neutral-700 rounded-lg px-4 py-2 - text-sm placeholder-neutral-500 focus:border-[#7afbaf] focus:ring-1 - focus:ring-[#7afbaf] transition-colors outline-none" - /> - -
+ ) : ( +

+ {stat.value} +

+ )} +
+
+ ))}
- {componentLoading.peers ? ( - - ) : activePeerIds.length === 0 ? ( -
-

No active peers available

-
- ) : isSearching ? ( -
- -
- ) : searchQuery && searchResults.length === 0 ? ( -
-

No matching peer IDs found

-
- ) : ( - <> -
- {paginatedPeerIds.map((peerId, index) => ( - - {peerId} - - ))} + + {/* Right Column - Chart */} + + +
+ + + + Active Nodes + + + + Geographic Distribution + +
- - - )} -
+ + + {componentLoading.metrics ? ( +
+ +
+ ) : metrics.length === 0 ? ( +
+

No data available for the selected timeframe

+
+ ) : ( +
+ + + + format(new Date(date), "MMM d")} + fontSize={12} + tickMargin={10} + /> + + [`${value} nodes`, 'Active Nodes']} + labelFormatter={(label) => format(new Date(label), "MMM d, yyyy")} + /> + + + +
+ )} +
+ + +
+

Geographic distribution view coming soon

+
+
+ + +
+ + {/* Bottom Section: Version Distribution + Active Peers */} +
+ {/* Version Distribution */} + +

+ + Version Distribution +

+ {componentLoading.versions ? ( + + ) : Object.keys(versionDistribution).length === 0 ? ( +
+

No version data available

+
+ ) : ( + <> +
+ {paginatedVersions.map(([version, count]) => ( +
+
+ {version} + + {count} + +
+
+ +
+
+ ))} +
+ + + )} +
+ + {/* Active Peer IDs List */} + +
+

+ + Active Peer IDs +

+
+ setSearchQuery(e.target.value)} + className="w-full bg-neutral-800 border border-neutral-700 rounded-lg px-4 py-2 + text-sm placeholder-neutral-500 focus:border-[#7afbaf] focus:ring-1 + focus:ring-[#7afbaf] transition-colors outline-none" + /> + +
+
+ {componentLoading.peers ? ( + + ) : activePeerIds.length === 0 ? ( +
+

No active peers available

+
+ ) : isSearching ? ( +
+ +
+ ) : searchQuery && searchResults.length === 0 ? ( +
+

No matching peer IDs found

+
+ ) : ( + <> +
+ {paginatedPeerIds.map((peerId, index) => ( + + {peerId} + + ))} +
+ + + )} +
+
-
- )} -
-
+ )} +
+
+ ); } diff --git a/public/favicon.ico b/public/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..096e2b42c813459112ed864f937b6c47100790b2 100644 GIT binary patch literal 15406 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 LrJugUA?W`A8`#=m