diff --git a/package.json b/package.json index d82ca89f..5de09642 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "explorer-dapp", "description": "Itheum Explorer is a DApp for the public to explore and visualize data within the Itheum protocol", - "version": "1.21.1", + "version": "1.22.0", "author": "Itheum", "license": "GPL-3.0-or-later", "dependencies": { diff --git a/src/components/Layout/Navbar.tsx b/src/components/Layout/Navbar.tsx index 0f1b6a98..a9a345b9 100644 --- a/src/components/Layout/Navbar.tsx +++ b/src/components/Layout/Navbar.tsx @@ -97,6 +97,13 @@ export const Navbar = () => { Gamer Passport + + + AI Workforce + + { - const envKey = chainID === "1" ? "VITE_ENV_BACKEND_MAINNET_API" : "VITE_ENV_BACKEND_API"; - const defaultUrl = chainID === "1" ? "https://production-itheum-api.up.railway.app" : "https://staging-itheum-api.up.railway.app"; +export const backendApi = (chainID?: string) => { + if (!chainID) { + if (import.meta.env.VITE_ENV_NETWORK === "mainnet") { + return "https://production-itheum-api.up.railway.app"; + } else { + return "https://staging-itheum-api.up.railway.app"; + } + } else { + const envKey = chainID === "1" ? "VITE_ENV_BACKEND_MAINNET_API" : "VITE_ENV_BACKEND_API"; + const defaultUrl = chainID === "1" ? "https://production-itheum-api.up.railway.app" : "https://staging-itheum-api.up.railway.app"; - return import.meta.env[envKey] || defaultUrl; + return import.meta.env[envKey] || defaultUrl; + } }; export async function getHealthCheckFromBackendApi(chainID: string): Promise { diff --git a/src/pages/AIWorkforce/AIWorkforce.tsx b/src/pages/AIWorkforce/AIWorkforce.tsx new file mode 100644 index 00000000..2717abcc --- /dev/null +++ b/src/pages/AIWorkforce/AIWorkforce.tsx @@ -0,0 +1,182 @@ +import React, { useEffect, useState } from "react"; +import axios from "axios"; +import { Link } from "react-router-dom"; +import { Button } from "libComponents/Button"; +import { backendApi } from "libs/backend-api"; +import { WorkersSnapShotGrid } from "./SharedComps"; + +// const rankedWorkforce = [ +// { +// "uuid": 358, +// "address": "erd1eweqykxcrhh5nps4fzktu9eftf7rxpa8xdfkypwz0k4huhl0s04sa6tqyd", +// "rankScore": 10, +// "bondAmount": 566, +// "livelinessScore": 1, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-024b", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmUHzpCRRLguzjAEnXB33Ar2FbR4EE18KRCChjUPyLyCUo", +// "creationTime": "2024-09-02T08:18:32.000Z", +// "lastUpdated": 1725277510, +// }, +// { +// "uuid": 359, +// "address": "erd1rzjsadakpqfqm2umcv96d7d95zcwzm7pac8g4kmcp6kdfgzmuhgs2kyrzv", +// "rankScore": 0, +// "bondAmount": 1001, +// "livelinessScore": 0, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-0244", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmWxrgB4o6QTJUsbCmZXSSPc3WvFvh4RBrLs9pwJSpEGUw", +// "creationTime": "2024-08-27T07:13:14.000Z", +// "lastUpdated": 1725277508, +// }, +// { +// "uuid": 360, +// "address": "erd1rzjsadakpqfqm2umcv96d7d95zcwzm7pac8g4kmcp6kdfgzmuhgs2kyrzv", +// "rankScore": 0, +// "bondAmount": 1001, +// "livelinessScore": 0, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-0249", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmRicYzifHSQP9xk6FaA7QqnRQN3qgd4WqLhqGxrJJqto9", +// "creationTime": "2024-08-27T07:23:56.000Z", +// "lastUpdated": 1725277509, +// }, +// { +// "uuid": 361, +// "address": "erd1mywl5r9ptxurzhnz2ztrjdjswssd44l05n3l5ly3795gf777ujmqma76gx", +// "rankScore": 0, +// "bondAmount": 811, +// "livelinessScore": 0, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-0242", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmWDyB3mQMEgJ2cfNS2yWf8AmZ7CRs52eDmvtqqgELuLnK", +// "creationTime": "2024-08-27T07:05:56.000Z", +// "lastUpdated": 1725277507, +// }, +// { +// "uuid": 362, +// "address": "erd1cyp3c6plhrmlwzue7f7cg8kqs6jf0c6temmh6gsh3tfj3de3a7csddfm6t", +// "rankScore": 0, +// "bondAmount": 722, +// "livelinessScore": 0, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-0248", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmPgQ3brZgf8izBNYKAERiaKDnmxeGhUZQYXhCLJ2kqvFV", +// "creationTime": "2024-08-27T07:20:44.000Z", +// "lastUpdated": 1725277509, +// }, +// { +// "uuid": 363, +// "address": "erd1cyp3c6plhrmlwzue7f7cg8kqs6jf0c6temmh6gsh3tfj3de3a7csddfm6t", +// "rankScore": 0, +// "bondAmount": 722, +// "livelinessScore": 0, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-024a", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmRSRLEcPJ2hgeAJ6bey83AWgg3QVjojVwi5CCYLj7R82h", +// "creationTime": "2024-08-27T07:58:32.000Z", +// "lastUpdated": 1725277509, +// }, +// { +// "uuid": 364, +// "address": "erd1fet6nrput6ujj0yf4cj70ex0sldxsf79ruxsucapeuf5k4acmldqwkkgp2", +// "rankScore": 0, +// "bondAmount": 522, +// "livelinessScore": 0, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-023b", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmNXaJen63E65Qvzc2j4guZ3chUmUUJwtfsyj31gk9317i", +// "creationTime": "2024-08-23T04:43:32.000Z", +// "lastUpdated": 1725277504, +// }, +// { +// "uuid": 365, +// "address": "erd1fj4v79xn96ew4fu05e9m2hxzuw0d03txsj7ptn2ls0pa7y56hhksexjhxj", +// "rankScore": 0, +// "bondAmount": 380, +// "livelinessScore": 0, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-0243", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmVBAHqgRCSWi6ZAH1D4bMBBmsfvsiXLMdngNZQCSTKwb1", +// "creationTime": "2024-08-27T07:09:44.000Z", +// "lastUpdated": 1725277507, +// }, +// { +// "uuid": 366, +// "address": "erd1fj4v79xn96ew4fu05e9m2hxzuw0d03txsj7ptn2ls0pa7y56hhksexjhxj", +// "rankScore": 0, +// "bondAmount": 380, +// "livelinessScore": 0, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-0245", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmVGN1ptYoccudhB66jKvs6puFyaWJp9mmB2MybtEM1nf9", +// "creationTime": "2024-08-27T07:16:32.000Z", +// "lastUpdated": 1725277509, +// }, +// { +// "uuid": 367, +// "address": "erd1yz6vqzlv6zw70u2rq5sdljnq59tn2ue879xxrfpyfts4wy09rd0qpnctn8", +// "rankScore": 0, +// "bondAmount": 299, +// "livelinessScore": 0, +// "bitzXp": 0, +// "vault": "DATANFTFT-e0b917-0234", +// "vaultImg": "https://devnet-media.elrond.com/nfts/asset/QmNkuz9Xx9pCibCFxaDwZvnd3KbxYQ7HTWruzpQwonJwsf", +// "creationTime": "2024-08-22T10:36:26.000Z", +// "lastUpdated": 1725277500, +// }, +// ]; + +export const AIWorkforce = () => { + const [appBootingUp, setAppBootingUp] = useState(true); + const [rankedWorkforce, setRankedWorkforce] = useState([]); + + useEffect(() => { + window.scrollTo({ + top: 0, + behavior: "smooth", + }); + + async function getDataAndInitGraphData() { + setAppBootingUp(true); + const workforceDataList = await getWorkforceData(); + setRankedWorkforce(workforceDataList); + setAppBootingUp(false); + } + + getDataAndInitGraphData(); + }, []); + + async function getWorkforceData() { + const apiResponse = await axios.get(`${backendApi()}/workforce?size=50`); + const dataResponse = apiResponse.data; + + return dataResponse; + } + + return ( +
+
+
+
+

Join the Itheum AI Workforce

+

+ Mint Your NFMe ID, Boost Your Liveliness, Farm Staking Rewards and Join the Itheum AI Workforce as a Data Provider +

+
+ + + + +
+
+ +
+
{appBootingUp ? <>Loading : }
+
+
+ ); +}; diff --git a/src/pages/AIWorkforce/SharedComps.tsx b/src/pages/AIWorkforce/SharedComps.tsx new file mode 100644 index 00000000..a6d59998 --- /dev/null +++ b/src/pages/AIWorkforce/SharedComps.tsx @@ -0,0 +1,34 @@ +import React from "react"; + +export function WorkersSnapShotGrid({ snapShotData }: { snapShotData: any[] }) { + const flattenedFixedData: any[] = []; + + if (snapShotData) { + snapShotData.map((worker: any) => { + flattenedFixedData.push(worker); + }); + } + + return ( +
+ {flattenedFixedData && + flattenedFixedData.length > 0 && + flattenedFixedData.map((worker: any, idx: number) => ( +
+
+ + Rank: {idx + 1} + +
+ {worker.vault} +
+

{worker.vault}

+

Score: {worker.rankScore}

+

Bonded Amount: {worker.bondAmount}

+

Liveliness Score: {worker.livelinessScore}

+
+
+ ))} +
+ ); +} diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index 7e86adfb..5b81bdbf 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -12,11 +12,16 @@ export const Dashboard = () => { network: { explorerAddress }, } = useGetNetworkConfig(); const { hasPendingTransactions } = useGetPendingTransactions(); - const [scAddress, setScAddress] = useState(""); const [marketRequirements, setMarketRequirements] = useState(); const [isLoading, setIsLoading] = useState(true); + useEffect(() => { + if (!hasPendingTransactions) { + fetchMarketplaceRequirements(); + } + }, [hasPendingTransactions]); + async function fetchMarketplaceRequirements() { setIsLoading(true); @@ -28,12 +33,6 @@ export const Dashboard = () => { setIsLoading(false); } - useEffect(() => { - if (!hasPendingTransactions) { - fetchMarketplaceRequirements(); - } - }, [hasPendingTransactions]); - if (isLoading) { return ; } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 5b381384..dd2393d2 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -4,6 +4,7 @@ export * from "./NotFound"; export * from "./Unlock"; export * from "./Analytics/AnalyticsPage"; export * from "./GamerPassport/GamerPassport"; +export * from "./AIWorkforce/AIWorkforce"; //Widgets export * from "./AppMarketplace/MultiversxBubbles/MultiversxBubbles"; export * from "./AppMarketplace/MultiversxInfographics"; diff --git a/src/routes.ts b/src/routes.ts index cb376df9..4349c6fb 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -8,7 +8,7 @@ import { NFTunes } from "pages/AppMarketplace/NFTunes"; import { SpreadsheetNfts } from "pages/AppMarketplace/SpreadsheetNfts"; import { TimeCapsule } from "pages/AppMarketplace/TimeCapsule/TimeCapsule"; import { withPageTitle } from "./components/PageTitle"; -import { Home, MyListed, MyWallet, MultiversxBubbles, MultiversxInfographics, BoberGameRoom, AnalyticsPage, GamerPassport } from "./pages"; +import { Home, MyListed, MyWallet, MultiversxBubbles, MultiversxInfographics, BoberGameRoom, AnalyticsPage, GamerPassport, AIWorkforce } from "./pages"; export const routeNames = { home: "/", @@ -29,6 +29,7 @@ export const routeNames = { spreadsheetnfts: "/spreadsheetnfts", nfpodcast: "/nfpodcast", gamerpassport: "/gamerpassport", + aiworkforce: "/aiworkforce", }; interface RouteWithTitleType extends RouteType { @@ -123,6 +124,11 @@ export const routes: RouteWithTitleType[] = [ title: "Gamer Passport", component: GamerPassport, }, + { + path: routeNames.aiworkforce, + title: "AI Workforce", + component: AIWorkforce, + }, ]; export const mappedRoutes = routes.map((route) => {