diff --git a/package-lock.json b/package-lock.json
index aba38620..f348fee8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,7 +26,7 @@
"clsx": "2.1.0",
"d3": "7.8.5",
"dompurify": "3.0.8",
- "framer-motion": "^11.0.3",
+ "framer-motion": "11.0.3",
"lucide-react": "0.309.0",
"moment": "2.30.1",
"moment-timezone": "0.5.44",
diff --git a/src/App.tsx b/src/App.tsx
index ccb48d6b..ba49a857 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -9,6 +9,7 @@ import { TransactionsToastList, NotificationModal, SignTransactionsModals } from
import { apiTimeout, walletConnectV2ProjectId, sampleAuthenticatedDomains, ELROND_NETWORK } from "config";
import { MultiversxBubbles, MultiversxInfographics, MyWallet, PageNotFound, Unlock } from "pages";
import { ItheumTrailblazer } from "pages/AppMarketplace/ItheumTrailblazer/ItheumTrailblazer";
+import { TimeCapsule } from "pages/AppMarketplace/TimeCapsule/TimeCapsule";
import { NFTunes } from "pages/AppMarketplace/NFTunes";
import { routes, routeNames } from "routes";
import { ThemeProvider } from "./libComponents/ThemeProvider";
@@ -44,6 +45,7 @@ export const App = () => {
} />
} />
} />
+ } />
} />
} />
diff --git a/src/appsConfig.tsx b/src/appsConfig.tsx
index 24bb48f5..4452e968 100644
--- a/src/appsConfig.tsx
+++ b/src/appsConfig.tsx
@@ -50,7 +50,10 @@ export const PLAYSTATION_GAMER_PASSPORT_TOKENS: app_token[] = [
export const ESDT_BUBBLE_TOKENS: app_token[] = [
// { tokenIdentifier: "DATANFTFT-e0b917", nonce: 417 }
];
+export const TIMECAPSULE_TOKENS: app_token[] = IS_DEVNET
+ ? [{ tokenIdentifier: "DATANFTFT-e0b917", nonce: 57 }]
+ : [{ tokenIdentifier: "DATANFTFT-e936d4", nonce: 5 }];
export const SUPPORTED_APPS = IS_DEVNET
- ? ["itheumtrailblazer", "multiversxbubbles", "esdtBubble", "playstationgamerpassport", "multiversxinfographics", "nftunes"]
+ ? ["itheumtrailblazer", "multiversxbubbles", "esdtBubble", "playstationgamerpassport", "multiversxinfographics", "nftunes", "timecapsule"]
: ["itheumtrailblazer", "multiversxbubbles", "multiversxinfographics", "nftunes"];
diff --git a/src/assets/img/timecapsule/custom-app-header-timecapsule.png b/src/assets/img/timecapsule/custom-app-header-timecapsule.png
new file mode 100644
index 00000000..74d1d486
Binary files /dev/null and b/src/assets/img/timecapsule/custom-app-header-timecapsule.png differ
diff --git a/src/assets/img/timecapsule/expl-app-timecapsule-icon.png b/src/assets/img/timecapsule/expl-app-timecapsule-icon.png
new file mode 100644
index 00000000..61d5acb9
Binary files /dev/null and b/src/assets/img/timecapsule/expl-app-timecapsule-icon.png differ
diff --git a/src/components/AudioPlayer.tsx b/src/components/AudioPlayer.tsx
index b8b529d2..1885a340 100644
--- a/src/components/AudioPlayer.tsx
+++ b/src/components/AudioPlayer.tsx
@@ -340,9 +340,9 @@ export const AudioPlayer = (props: AudioPlayerProps) => {
{props.previewUrl ? (
{props.songs[currentTrackIndex]?.title} {" "}
- {props.songs[currentTrackIndex]?.category}
-
- {props.songs[currentTrackIndex]?.album}
+ Preview
+
+ {props.songs[currentTrackIndex]?.description}
) : (
diff --git a/src/components/Layout/Footer.tsx b/src/components/Layout/Footer.tsx
index e3ea70a1..7787380d 100644
--- a/src/components/Layout/Footer.tsx
+++ b/src/components/Layout/Footer.tsx
@@ -12,8 +12,8 @@ export const Footer = () => {
{...{
target: "_blank",
}}
- className="flex items-center dark:text-white text-black"
- href="https://itheum.com">
+ className="flex items-center dark:text-white text-black text-sm"
+ href="https://itheum.io">
Made with ♥ by Itheum
diff --git a/src/libComponents/YouTubeEmbed.tsx b/src/libComponents/YouTubeEmbed.tsx
new file mode 100644
index 00000000..75a5d082
--- /dev/null
+++ b/src/libComponents/YouTubeEmbed.tsx
@@ -0,0 +1,19 @@
+import React from "react";
+
+const YouTubeEmbed = ({ embedId, title }: { embedId: string; title: string }) => {
+ return (
+ VIDEO
+ );
+};
+
+export default YouTubeEmbed;
diff --git a/src/libs/utils/constant.ts b/src/libs/utils/constant.ts
index 7765d266..237e529b 100644
--- a/src/libs/utils/constant.ts
+++ b/src/libs/utils/constant.ts
@@ -1,6 +1,7 @@
import iconBubbleMaps from "assets/img/expl-app-bubblemaps-icon.png";
import iconInfrographics from "assets/img/expl-app-infographics-icon.png";
import iconTrailblazer from "assets/img/expl-app-trailblazer-icon.png";
+import iconTimeCapsule from "assets/img/timecapsule/expl-app-timecapsule-icon.png";
import iconNFTunes from "assets/img/nf-tunes-logo.png";
export const ERROR_CONNECT_WALLET = "Connect your wallet";
@@ -50,6 +51,13 @@ export const APP_MAPPINGS = [
desc: "Explore a multisensory journey with this app, extending art beyond visuals. Through vibrations, it unveils the creative potentials of Data NFTs, offering a unique and immersive experience.",
img: iconNFTunes,
},
+ {
+ appName: "Time Capsule",
+ appDescription: "Time Capsule",
+ routeKey: "timecapsule",
+ desc: "Capture, archive, and relive historic social media events through photos and videos, preserving memories for future generations. Join the nostalgia journey!",
+ img: iconTimeCapsule,
+ },
];
export const ITHEUM_EXPLORER_PROD_URL = "https://explorer.itheum.io";
diff --git a/src/pages/AppMarketplace/ItheumTrailblazer/components/TrailBlazerModal.tsx b/src/pages/AppMarketplace/ItheumTrailblazer/components/TrailBlazerModal.tsx
index 3b93e956..39dc91f3 100644
--- a/src/pages/AppMarketplace/ItheumTrailblazer/components/TrailBlazerModal.tsx
+++ b/src/pages/AppMarketplace/ItheumTrailblazer/components/TrailBlazerModal.tsx
@@ -1,24 +1,21 @@
import React, { useEffect, useState } from "react";
-import { useGetLoginInfo } from "@multiversx/sdk-dapp/hooks";
-import { Banknote, BarChart3, CalendarCheck, Flag, HeartHandshake, Map, ShoppingCart, Trophy } from "lucide-react";
+import { Banknote, BarChart3, CalendarCheck, Flag, HeartHandshake, Map, ShoppingCart, Trophy, Drama } from "lucide-react";
import { VerticalTimeline, VerticalTimelineElement } from "react-vertical-timeline-component";
import { Loader } from "components";
-import { Modal } from "../../../../components/Modal/Modal";
-import { NoDataFound } from "../../../../components/NoDataFound";
-import { Button } from "../../../../libComponents/Button";
-import { Card } from "../../../../libComponents/Card";
-import { useFilterStore } from "../../../../store/FilterStore";
+import { Modal } from "components/Modal/Modal";
+import { NoDataFound } from "components/NoDataFound";
+import { Button } from "libComponents/Button";
+import { Card } from "libComponents/Card";
+import { useFilterStore } from "store/FilterStore";
export const TrailBlazerModal = ({ owned, isFetchingDataMarshal, data }: { owned: boolean; isFetchingDataMarshal?: boolean; data: any }) => {
const { filter } = useFilterStore();
- const { loginMethod } = useGetLoginInfo();
const [filteredData, setFilteredData] = useState(1000);
useEffect(() => {
const filteredDataTemp = new Set();
const allData = new Set(data);
allData.forEach((dataT: any) => {
- // console.log(data.category);
if (dataT.category === filter) {
filteredDataTemp.add(dataT);
} else {
@@ -28,8 +25,6 @@ export const TrailBlazerModal = ({ owned, isFetchingDataMarshal, data }: { owned
});
}, [filter]);
- // console.log(allData);
-
const getIconForCategory = (dataItem: any) => {
switch (dataItem.category) {
case "Partnership":
@@ -47,6 +42,9 @@ export const TrailBlazerModal = ({ owned, isFetchingDataMarshal, data }: { owned
case "Leaderboard":
return ;
break;
+ case "Meme":
+ return ;
+ break;
default:
return ;
break;
@@ -165,6 +163,24 @@ export const TrailBlazerModal = ({ owned, isFetchingDataMarshal, data }: { owned
);
break;
+ case "Meme":
+ tileCode = (
+
+
+ {dataItem.title}
+ {new Date(dataItem.date).toDateString()}
+ {dataItem.file && dataItem["file_mimeType"] && (
+
+
+
+ )}
+
+ See more...
+
+
+
+ );
+ break;
default:
tileCode = (
diff --git a/src/pages/AppMarketplace/NFTunes/index.tsx b/src/pages/AppMarketplace/NFTunes/index.tsx
index b18978a3..19a80414 100644
--- a/src/pages/AppMarketplace/NFTunes/index.tsx
+++ b/src/pages/AppMarketplace/NFTunes/index.tsx
@@ -34,6 +34,7 @@ import benefitsLogo1 from "../../../assets/img/nf-tunes/benefits-logo1.png";
import benefitsLogo2 from "../../../assets/img/nf-tunes/benefits-logo2.png";
import benefitsLogo3 from "../../../assets/img/nf-tunes/benefits-logo3.png";
import { motion } from "framer-motion";
+import YouTubeEmbed from "libComponents/YouTubeEmbed";
interface ExtendedViewDataReturnType extends ViewDataReturnType {
blobDataType: BlobDataType;
@@ -41,12 +42,8 @@ interface ExtendedViewDataReturnType extends ViewDataReturnType {
export const NFTunes = () => {
const { address } = useGetAccount();
-
- ///native auth
const { tokenLogin } = useGetLoginInfo();
-
const { hasPendingTransactions } = useGetPendingTransactions();
-
const [dataNfts, setDataNfts] = useState([]);
const [featuredArtistDataNft, setFeaturedArtistDataNft] = useState();
const [featuredDataNftIndex, setFeaturedDataNftIndex] = useState(-1);
@@ -73,28 +70,29 @@ export const NFTunes = () => {
}
}, [isLoading, address]);
- ///get the nfts that are able to open nfTunes app
+ // get the nfts that are able to open nfTunes app
async function fetchDataNfts() {
setIsLoading(true);
const _nfts: DataNft[] = await DataNft.createManyFromApi(NF_TUNES_TOKENS.map((v) => ({ nonce: v.nonce, tokenIdentifier: v.tokenIdentifier })));
- const _featuredNft: DataNft = await DataNft.createFromApi(FEATURED_NF_TUNES_TOKEN);
- setDataNfts(_nfts);
- setFeaturedArtistDataNft(_featuredNft);
+ setDataNfts(_nfts);
+ _nfts.map((currentNft, index) => {
+ if (currentNft.nonce === FEATURED_NF_TUNES_TOKEN.nonce && currentNft.collection === FEATURED_NF_TUNES_TOKEN.tokenIdentifier) {
+ setFeaturedDataNftIndex(index);
+ setFeaturedArtistDataNft(currentNft);
+ }
+ });
setIsLoading(false);
}
- ///fetch the nfts owned by the logged in address and if the user has any of them set flag to true,
- //on those will be shown view data otherwise show market place explore button
+ // fetch the nfts owned by the logged in address and if the user has any of them set flag to true,
+ // on those will be shown view data otherwise show market place explore button
async function fetchMyNfts() {
const _dataNfts = await DataNft.ownedByAddress(address);
const _flags = [];
for (const currentNft of dataNfts) {
- if (currentNft.nonce == FEATURED_NF_TUNES_TOKEN.nonce) {
- setFeaturedDataNftIndex(_flags.length);
- }
const matches = _dataNfts.filter((ownedNft) => currentNft.nonce === ownedNft.nonce);
_flags.push(matches.length > 0);
}
@@ -102,19 +100,16 @@ export const NFTunes = () => {
setFlags(_flags);
}
- /// after pressing the button to view data open modal
+ // after pressing the button to view data open modal
async function viewData(index: number) {
try {
if (!(index >= 0 && index < dataNfts.length)) {
toastError("Data is not loaded");
return;
}
-
const _owned = flags[index];
-
if (_owned) {
setIsFetchingDataMarshal(true);
-
const dataNft = dataNfts[index];
let res: any;
if (!(tokenLogin && tokenLogin.nativeAuthToken)) {
@@ -171,15 +166,15 @@ export const NFTunes = () => {
- Empowering Indie musicians to engage with a fresh fan community and discover alternative avenues for music distribution.{" "}
+ Empowering Indie musicians to engage with a fresh fan community and discover alternative avenues for music distribution{" "}
scrollToSection("featured-artist")}
className="hover:scale-110 transition duration-700 text-sm md:text-xl p-2 md:p-4 rounded-lg max-w-[50%] xl:max-w-[35%] text-primary
- bg-gradient-to-br from-[#737373] from-5% via-[#A76262] via-40% to-[#5D3899] to-100% ">
- Visualize NF-tunes
+ bg-gradient-to-br from-[#737373] from-5% via-[#A76262] via-40% to-[#5D3899] to-100%">
+ Visualize NF-Tunes
@@ -191,7 +186,7 @@ export const NFTunes = () => {
@@ -199,47 +194,48 @@ export const NFTunes = () => {
- Driven by the innovation of Itheum's Music Data NFTs
+ Driven by the innovation of Itheum Music Data NFTs
{/* Benefits of NF-Tunes */}
-
+
-
+
- Benefits of NF-Tunes
+ Benefits of NF-Tunes
-
-
+
+
Transform your music streams into NFT Masterpieces
-
- Forge a direct connection with your fans, experiment with diverse royalty and distribution approaches, showcase the demand for your music.
+
+ Release single music tracks or entire playlists, mixes, or extended compositions through a unified Music Data NFT. Update your music at any
+ time and your NFT holders receive the latest content instantly.{" "}
-
-
+
+
-
Cultivate a DeGeN Fan Community for Your Music NFTs
-
+ Cultivate a DeGeN Fan Community for Your Music NFTs
+
Explore the availability of Music Data NFTs across various NFT platforms, connecting you with "new fans" and fostering a direct relationship
with your audience.{" "}
-
+
-
-
Take Command of Royalties and Distribution for Your Music NFTs
-
+ Take Command of Royalties and Distribution
+
Forge a direct connection with your fans, experiment with diverse royalty and distribution approaches, showcase the demand for your music.
@@ -247,33 +243,52 @@ export const NFTunes = () => {
+ {/* What Musicians are saying */}
+
+
+
+
+
Hear what Indie Musicians are saying about Music Data NFTs and NF-Tunes
+
+
+
+
+
+
{/* Featured Artist Section */}
+ className="bg-manu-image bg-cover bg-top flex flex-col xl:flex-row justify-center items-center xl:items-start w-full h-full gap-12 mb-16 xl:mb-32">
-
+
- Featured Artist Sections
+ Featured Artist Section
-
-
Meet Manu YFGP
+
+
Meet Manu YFGP
-
- Empowering Indie musicians to engage with a fresh fan community and discover alternative avenues for music distribution. Empowering Indie
- musicians to engage with a fresh fan community and discover alternative avenues for music distribution.{" "}
+
+ Manu, who goes by the name of YFGP (Your Favorite Ghost Producer) is a Music Producer, SFX Artist, Live Streamer and Music NFT pioneer based
+ out of Sibiu, Romania.
+
+ Learn More
+
-
Preview Manu’s Music Stream
+
Preview Manu’s Music Stream
-
+
}
closeOnOverlayClick={false}
@@ -300,9 +315,8 @@ export const NFTunes = () => {
songs={[
{
"idx": 1,
- // "date": featuredArtistDataNft.creationTime,
+ "description": featuredArtistDataNft.description,
"category": "Preview",
- // "artist": "YFGP",
"album": featuredArtistDataNft.description,
"cover_art_url": featuredArtistDataNft.nftImgUrl,
"title": featuredArtistDataNft.title,
@@ -315,12 +329,11 @@ export const NFTunes = () => {
-
Own Manu’s Music Data NFT
-
+
Own Manu’s Music Data NFT
+
{featuredArtistDataNft ? (
{
- Storage solution for your music data NFT
+ Storage Solution for your Music Data NFT
@@ -393,12 +406,11 @@ export const NFTunes = () => {
- Empowering Indie musicians to engage with a fresh fan community and discover alternative avenues for music distribution.{" "}
+ Searching for a streamlined solution to store your Music Data NFTs?{" "}
- {/*
*/}
Try Zedge Storage today
@@ -452,18 +464,18 @@ export const NFTunes = () => {
Effortless Music Management
-
- Effortlessly add, update, and manage your music files, art, and music metadata. Simplify your workflow with seamless control and organization.{" "}
+
+ Effortlessly add, update, and manage your music files, art, and music metadata. Simplify your workflow with seamless control and organization{" "}
-
+
02.
-
+
Eternal Resonance with Zedge Storage
-
+
Safeguard your data on a resilient, censorship-resistant network or choose traditional web2-style storage for ultimate versatility and control{" "}
@@ -473,10 +485,10 @@ export const NFTunes = () => {
03.
- Link Zedge Storage Music Streams to Itheum Data NFTs
+ Link Music Streams to Itheum Data NFTs
-
- Easily mint, manage, and showcase your Data NFT collection on the marketplace.{" "}
+
+ Easily mint, manage, and showcase your Music Data NFT collection on all platforms and marketplaces where NFTs are supported{" "}
@@ -484,21 +496,28 @@ export const NFTunes = () => {
{/* Calling musicians Section */}
-
-
Calling all Indie musicians!
+
+
Calling all Indie Musicians!
- Explore the possibilities with NFTunes—we're here to assist you in onboarding and minting your Music Data NFTs.
+ Explore the possibilities with NF-Tunes — we're here to assist you in onboarding and minting your Music Data NFTs.
+
+
+
+ Reach Out Today
+
{/* Supported Platforms */}
-
-
-
-
- Supported Platforms for
+
+
+
+ Platforms for
Music Data NFTs
@@ -511,7 +530,7 @@ export const NFTunes = () => {
Accessible
,
-
Just Like
+
Just Like
Regular NFTs
@@ -520,11 +539,11 @@ export const NFTunes = () => {
+ className="hover:scale-110 transition duration-700 flex flex-row items-center shadow-inner shadow-gray-600 justify-center bg-gradient-to-t from-black from-20% to-gray-400 dark:to-background to-70% brightness-125 rounded-full w-52 h-52 ">
Itheum Data DEX
-
+
NFT Marketplaces
@@ -536,70 +555,72 @@ export const NFTunes = () => {
+ className="hover:scale-110 transition duration-700 flex items-center shadow-inner shadow-gray-600 justify-center bg-gradient-to-t from-black from-20% to-gray-400 dark:to-background to-70% brightness-125 rounded-full w-52 h-52 ">
+ className=" hover:scale-110 transition duration-700 flex flex-col items-center shadow-inner shadow-gray-600 justify-center bg-gradient-to-t from-black from-20% to-gray-400 dark:to-background to-70% brightness-125 rounded-full w-52 h-52 ">
xPand DAO
+ className="hover:scale-110 transition duration-700 flex flex-col gap-2 items-center shadow-inner shadow-gray-600 justify-center bg-gradient-to-t from-black from-20% to-gray-400 dark:to-background to-70% brightness-125 rounded-full w-52 h-52 ">
-
Ecosystem
+
Ecosystem
-
-
- {dataNfts.length > 0 ? (
- dataNfts.map((dataNft, index) => (
-
-
-
-
Loading...
+ {IS_DEVNET && (
+
+
+ {dataNfts.length > 0 ? (
+ dataNfts.map((dataNft, index) => (
+
+
-
- ) : (
- <>
- {viewDataRes && !viewDataRes.error && tokenLogin && currentIndex > -1 && (
-
- )}
- >
- )
- }
- modalTitle={"NF-Tunes"}
- modalTitleStyle="p-4"
- />
- ))
- ) : (
- No DataNFT
- )}
-
-
+ ) : (
+ <>
+ {viewDataRes && !viewDataRes.error && tokenLogin && currentIndex > -1 && (
+
+ )}
+ >
+ )
+ }
+ modalTitle={"NF-Tunes"}
+ modalTitleStyle="p-4"
+ />
+ ))
+ ) : (
+
No DataNFT
+ )}
+
+
+ )}
diff --git a/src/pages/AppMarketplace/TimeCapsule/TimeCapsule.tsx b/src/pages/AppMarketplace/TimeCapsule/TimeCapsule.tsx
new file mode 100644
index 00000000..be44f43d
--- /dev/null
+++ b/src/pages/AppMarketplace/TimeCapsule/TimeCapsule.tsx
@@ -0,0 +1,135 @@
+import React, { useEffect, useState } from "react";
+import { DataNft } from "@itheum/sdk-mx-data-nft";
+import { useGetLoginInfo } from "@multiversx/sdk-dapp/hooks";
+import { TIMECAPSULE_TOKENS } from "appsConfig";
+import headerHero from "assets/img/timecapsule/custom-app-header-timecapsule.png";
+import { DataNftCard, Loader } from "components";
+import { HeaderComponent } from "components/Layout/HeaderComponent";
+import { useGetAccount, useGetPendingTransactions } from "hooks";
+import { decodeNativeAuthToken, toastError } from "libs/utils";
+import "react-vertical-timeline-component/style.min.css";
+import { TrailBlazerModal } from "../ItheumTrailblazer/components/TrailBlazerModal";
+
+export const TimeCapsule = () => {
+ const { address } = useGetAccount();
+ const { hasPendingTransactions } = useGetPendingTransactions();
+ const { tokenLogin } = useGetLoginInfo();
+
+ const [itDataNfts, setItDataNfts] = useState
([]);
+ const [flags, setFlags] = useState([]);
+ const [isLoading, setIsLoading] = useState(true);
+ const [isFetchingDataMarshal, setIsFetchingDataMarshal] = useState(true);
+ const [owned, setOwned] = useState(false);
+ const [data, setData] = useState();
+
+ useEffect(() => {
+ if (!hasPendingTransactions) {
+ fetchAppNfts();
+ }
+ }, [hasPendingTransactions]);
+
+ useEffect(() => {
+ if (!isLoading && address) {
+ fetchMyNfts();
+ }
+ }, [isLoading, address]);
+
+ async function fetchAppNfts() {
+ setIsLoading(true);
+
+ const _nfts: DataNft[] = await DataNft.createManyFromApi(TIMECAPSULE_TOKENS.map((v) => ({ nonce: v.nonce, tokenIdentifier: v.tokenIdentifier })));
+
+ setItDataNfts(_nfts);
+ setIsLoading(false);
+ }
+
+ async function fetchMyNfts() {
+ const _dataNfts = await DataNft.ownedByAddress(address);
+ const _flags = [];
+
+ for (const cnft of itDataNfts) {
+ const matches = _dataNfts.filter((mnft) => cnft.nonce === mnft.nonce);
+ _flags.push(matches.length > 0);
+ }
+
+ setFlags(_flags);
+ }
+
+ async function viewData(index: number) {
+ try {
+ if (!(index >= 0 && index < itDataNfts.length)) {
+ toastError("Data is not loaded");
+ return;
+ }
+
+ const dataNft = itDataNfts[index];
+ const _owned = flags[index];
+ setOwned(_owned);
+
+ if (_owned) {
+ setIsFetchingDataMarshal(true);
+
+ let res: any;
+ if (!(tokenLogin && tokenLogin.nativeAuthToken)) {
+ throw Error("No nativeAuth token");
+ }
+
+ const arg = {
+ mvxNativeAuthOrigins: [decodeNativeAuthToken(tokenLogin.nativeAuthToken).origin],
+ mvxNativeAuthMaxExpirySeconds: 3600,
+ fwdHeaderMapLookup: {
+ "authorization": `Bearer ${tokenLogin.nativeAuthToken}`,
+ },
+ };
+
+ res = await dataNft.viewDataViaMVXNativeAuth(arg);
+ res.data = await (res.data as Blob).text();
+ res.data = JSON.parse(res.data);
+
+ const orderedDataByDateDesc = res.data.data.sort((a: any, b: any) => {
+ return new Date(b.date).valueOf() - new Date(a.date).valueOf();
+ });
+
+ setData(orderedDataByDateDesc);
+ setIsFetchingDataMarshal(false);
+ }
+ } catch (err) {
+ console.error(err);
+ toastError((err as Error).message);
+ setIsFetchingDataMarshal(false);
+ }
+ }
+
+ if (isLoading) {
+ return ;
+ }
+
+ return (
+
+ {itDataNfts.length > 0 ? (
+ itDataNfts.map((dataNft, index) => (
+ }
+ modalTitle={"Time Capsule"}
+ modalTitleStyle="md:p-5 pt-5 pb-5 px-2"
+ hasFilter={false}
+ />
+ ))
+ ) : (
+ No Data NFTs
+ )}
+
+ );
+};
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index 736f1edb..24a609b8 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -4,6 +4,7 @@ export * from "./AppMarketplace/MultiversxBubbles/MultiversxBubbles";
export * from "./AppMarketplace/MultiversxInfographics";
export * from "./AppMarketplace/ItheumTrailblazer/components/TrailBlazerModal";
export * from "./AppMarketplace/NFTunes";
+export * from "./AppMarketplace/TimeCapsule/TimeCapsule";
export * from "./Home";
export * from "./MyListed";
export * from "./MyWallet";
diff --git a/src/routes.ts b/src/routes.ts
index d2aac5b5..2662b5f7 100644
--- a/src/routes.ts
+++ b/src/routes.ts
@@ -1,6 +1,7 @@
import { dAppName } from "config";
import { RouteType } from "libs/types";
import { ItheumTrailblazer } from "pages/AppMarketplace/ItheumTrailblazer/ItheumTrailblazer";
+import { TimeCapsule } from "pages/AppMarketplace/TimeCapsule/TimeCapsule";
import { NFTunes } from "pages/AppMarketplace/NFTunes";
import { withPageTitle } from "./components/PageTitle";
import { PlayStationGamer, Home, MyListed, MyWallet, MultiversxBubbles, MultiversxInfographics } from "./pages";
@@ -16,6 +17,7 @@ export const routeNames = {
multiversxbubbles: "/multiversx-bubbles",
multiversxinfographics: "/multiversx-infographics",
nftunes: "/nftunes",
+ timecapsule: "/timecapsule",
};
interface RouteWithTitleType extends RouteType {
@@ -70,6 +72,12 @@ export const routes: RouteWithTitleType[] = [
component: NFTunes,
authenticatedRoute: false,
},
+ {
+ path: routeNames.timecapsule,
+ title: "Time Capsule",
+ component: TimeCapsule,
+ authenticatedRoute: false,
+ },
];
export const mappedRoutes = routes.map((route) => {