import React, { useState, useContext, Suspense, useEffect, useLayoutEffect, } from "react"; import { Fade, Flex, Heading, Box, Center, chakra, Stack, useMediaQuery, Grid, Text, GridItem, SimpleGrid, Button, Image as ChakraImage, } from "@chakra-ui/react"; import dynamic from "next/dynamic"; import Link from "next/dist/client/link"; import useUser from "../src/core/hooks/useUser"; import useModals from "../src/core/hooks/useModals"; import useRouter from "../src/core/hooks/useRouter"; import { AWS_ASSETS_PATH, DEFAULT_METATAGS } from "../src/core/constants"; import UIContext from "../src/core/providers/UIProvider/context"; import TrustedBadge from "../src/components/TrustedBadge"; import Slider from "react-slick"; import { v4 as uuidv4 } from "uuid"; import RouteButton from "../src/components/RouteButton"; import { MODAL_TYPES } from "../src/core/providers/OverlayProvider/constants"; import mixpanel from "mixpanel-browser"; import { MIXPANEL_PROPS, MIXPANEL_EVENTS, } from "../src/core/providers/AnalyticsProvider/constants"; const SplitWithImage = dynamic( () => import("../src/components/SplitWithImage"), { ssr: false, } ); const FaStoreAlt = dynamic(() => import("react-icons/fa").then((mod) => mod.FaStoreAlt) ); const FaDiscord = dynamic(() => import("react-icons/fa").then((mod) => mod.FaDiscord) ); const GiRiver = dynamic(() => import("react-icons/gi").then((mod) => mod.GiRiver) ); const GiCrossedChains = dynamic(() => import("react-icons/gi").then((mod) => mod.GiCrossedChains) ); const GiChainedHeart = dynamic(() => import("react-icons/gi").then((mod) => mod.GiChainedHeart) ); const MdOutlineVerifiedUser = dynamic(() => import("react-icons/md").then((mod) => mod.MdOutlineVerifiedUser) ); const GiRadarCrossSection = dynamic(() => import("react-icons/gi").then((mod) => mod.GiRadarCrossSection) ); const GiMedallist = dynamic(() => import("react-icons/gi").then((mod) => mod.GiMedallist) ); const GiRobotGolem = dynamic(() => import("react-icons/gi").then((mod) => mod.GiRobotGolem) ); const CgUserlane = dynamic(() => import("react-icons/cg").then((mod) => mod.CgUserlane) ); const GiChaingun = dynamic(() => import("react-icons/gi").then((mod) => mod.GiChaingun) ); const GiQuickSlash = dynamic(() => import("react-icons/gi").then((mod) => mod.GiQuickSlash) ); const GiConcentrationOrb = dynamic(() => import("react-icons/gi").then((mod) => mod.GiConcentrationOrb) ); const GiTakeMyMoney = dynamic(() => import("react-icons/gi").then((mod) => mod.GiTakeMyMoney) ); const FaGithubSquare = dynamic(() => import("react-icons/fa").then((mod) => mod.FaGithubSquare) ); const GiMeshBall = dynamic(() => import("react-icons/gi").then((mod) => mod.GiMeshBall) ); const VscOrganization = dynamic(() => import("react-icons/vsc").then((mod) => mod.VscOrganization) ); const HEADING_PROPS = { fontWeight: "700", fontSize: ["4xl", "5xl", "5xl", "5xl", "6xl", "7xl"], }; const assets = { background720: `${AWS_ASSETS_PATH}/background720.png`, background1920: `${AWS_ASSETS_PATH}/background720.png`, background2880: `${AWS_ASSETS_PATH}/background720.png`, background3840: `${AWS_ASSETS_PATH}/background720.png`, minedTransactions: `${AWS_ASSETS_PATH}/Ethereum+mined+transactions.png`, pendingTransactions: `${AWS_ASSETS_PATH}/Ethereum+pending+transactions.png`, priceInformation: `${AWS_ASSETS_PATH}/Price+information.png`, socialMediaPosts: `${AWS_ASSETS_PATH}/Social+media+posts.png`, cryptoTraders: `${AWS_ASSETS_PATH}/crypto+traders.png`, smartDevelopers: `${AWS_ASSETS_PATH}/smart+contract+developers.png`, cointelegraph: `${AWS_ASSETS_PATH}/featured_by/Cointelegraph_logo.png`, forte: `${AWS_ASSETS_PATH}/featured_by/forte_logo.png`, educativesessions: `${AWS_ASSETS_PATH}/featured_by/educative_logo.png`, cryptoinsiders: `${AWS_ASSETS_PATH}/featured_by/crypto_insiders.png`, cryptoslate: `${AWS_ASSETS_PATH}/featured_by/cs-media-logo-light.png`, bitcoinLogo: `${AWS_ASSETS_PATH}/bitcoin.png`, ethereumBlackLogo: `${AWS_ASSETS_PATH}/eth-diamond-black.png`, ethereumRainbowLogo: `${AWS_ASSETS_PATH}/eth-diamond-rainbow.png`, maticLogo: `${AWS_ASSETS_PATH}/matic-token-inverted-icon.png`, lender: `${AWS_ASSETS_PATH}/lender.png`, DAO: `${AWS_ASSETS_PATH}/DAO .png`, NFT: `${AWS_ASSETS_PATH}/NFT.png`, bc101: `${AWS_ASSETS_PATH}/featured_by/blockchain101_logo.png`, laguna: `${AWS_ASSETS_PATH}/featured_by/laguna_logo.svg`, game7io: `${AWS_ASSETS_PATH}/featured_by/game7io_logo.png`, orangedao: `${AWS_ASSETS_PATH}/featured_by/orangedao_logo.png`, meetup: `${AWS_ASSETS_PATH}/featured_by/meetup_logo.png`, }; const carousel_content = [ { title: "Bitcoin coming soon!", img: assets["bitcoinLogo"] }, { title: "Ethereum", img: assets["ethereumBlackLogo"] }, { title: "Ethereum transaction pool", img: assets["ethereumRainbowLogo"] }, { title: "Polygon", img: assets["maticLogo"] }, { title: "Bitcoin coming soon!", img: assets["bitcoinLogo"] }, { title: "Ethereum", img: assets["ethereumBlackLogo"] }, { title: "Ethereum transaction pool", img: assets["ethereumRainbowLogo"] }, { title: "Polygon", img: assets["maticLogo"] }, ]; const Homepage = () => { const ui = useContext(UIContext); const [background, setBackground] = useState("background720"); const [backgroundLoaded720, setBackgroundLoaded720] = useState(false); const [backgroundLoaded1920, setBackgroundLoaded1920] = useState(false); const [backgroundLoaded2880, setBackgroundLoaded2880] = useState(false); const [backgroundLoaded3840, setBackgroundLoaded3840] = useState(false); const [imageIndex, setImageIndex] = useState(0); const router = useRouter(); const { isInit } = useUser(); const { toggleModal } = useModals(); const [ isLargerThan720px, isLargerThan1920px, isLargerThan2880px, isLargerThan3840px, ] = useMediaQuery([ "(min-width: 720px)", "(min-width: 1920px)", "(min-width: 2880px)", "(min-width: 3840px)", ]); useEffect(() => { assets["background720"] = `${AWS_ASSETS_PATH}/background720.png`; assets["background1920"] = `${AWS_ASSETS_PATH}/background1920.png`; assets["background2880"] = `${AWS_ASSETS_PATH}/background2880.png`; assets["background3840"] = `${AWS_ASSETS_PATH}/background3840.png`; }, []); useLayoutEffect(() => { if (backgroundLoaded3840) { setBackground("background3840"); } else if (backgroundLoaded2880) { setBackground("background2880"); } else if (backgroundLoaded1920) { setBackground("background1920"); } else { setBackground("background720"); } }, [ isLargerThan720px, isLargerThan1920px, isLargerThan2880px, isLargerThan3840px, backgroundLoaded720, backgroundLoaded1920, backgroundLoaded2880, backgroundLoaded3840, ]); useEffect(() => { if ( router.nextRouter.asPath !== "/" && router.nextRouter.asPath.slice(0, 2) !== "/?" && router.nextRouter.asPath.slice(0, 2) !== "/#" && router.nextRouter.asPath.slice(0, 11) !== "/index.html" ) { console.warn("redirect attempt.."); if (typeof window !== "undefined") { console.warn("window present:", window.location.pathname); router.replace(router.nextRouter.asPath, router.nextRouter.asPath, { shallow: false, }); } } }, [isInit, router]); useLayoutEffect(() => { const imageLoader720 = new Image(); imageLoader720.src = `${AWS_ASSETS_PATH}/background720.png`; imageLoader720.onload = () => { setBackgroundLoaded720(true); }; }, []); useLayoutEffect(() => { const imageLoader1920 = new Image(); imageLoader1920.src = `${AWS_ASSETS_PATH}/background1920.png`; imageLoader1920.onload = () => { setBackgroundLoaded1920(true); }; }, []); useLayoutEffect(() => { const imageLoader2880 = new Image(); imageLoader2880.src = `${AWS_ASSETS_PATH}/background2880.png`; imageLoader2880.onload = () => { setBackgroundLoaded2880(true); }; }, []); useLayoutEffect(() => { const imageLoader3840 = new Image(); imageLoader3840.src = `${AWS_ASSETS_PATH}/background3840.png`; imageLoader3840.onload = () => { setBackgroundLoaded3840(true); }; }, []); const settings = { infinite: true, lazyLoad: true, speed: 2000, autoplay: true, autoplaySpeed: 0, // cssEase: "linear", cssEase: "cubic-bezier(0.165, 0.840, 0.440, 1.000)", // cssEase: "ease-in", slidesToScroll: 1, slidesToShow: ui.isMobileView ? 3 : 5, centerMode: true, centerPadding: 0, // nextArrow: "", // prevArrow: "", beforeChange: (current, next) => setImageIndex(next), }; return ( Building blocks for your blockchain economy Moonstream DAO makes tools that help you build, manage, and secure your blockchain economy. Moonstream has handled over{" "} $1B {" "} in transaction value to date. {carousel_content.map((content_item, idx) => ( {content_item.title} ))} Features: Analytics Get the full picture of your economy with automated customizable dashboards. Markets Create goods and resources for your economy. Set up fully customizable storefronts for these items. Engine Create and manage tokens with custom mechanics specific to your project. {`Loyalty`} Reward the most active participants in your economy with loyalty programs and token sale whitelists. {`Security`} Secure your economy against bad actors. Detect attacks on your economy and defend against them. Trusted by{" "}
Learn more about Moonstream DAO use cases
{ mixpanel.get_distinct_id() && mixpanel.track(`${MIXPANEL_EVENTS.BUTTON_CLICKED}`, { [`${MIXPANEL_PROPS.BUTTON_NAME}`]: `Early access CTA: developer txpool button`, }); router.push("/whitepapers"); }, label: "NFT market report", }} socialButton={{ url: "https://discord.gg/K56VNUQGvA", title: "Contact us on discord", icon: "discord", }} elementName={"element1"} colorScheme="green" badge={`Moonstream analytics`} bullets={[ { text: `See how value flows into and out of every component of your economy.`, icon: GiRiver, color: "green.50", bgColor: "green.900", }, { text: `Track inflation or deflation of your currencies.`, icon: GiTakeMyMoney, color: "green.50", bgColor: "green.900", }, { text: `Track the concentration of wealth in your economy.`, icon: GiConcentrationOrb, color: "green.50", bgColor: "green.900", }, ]} imgURL={assets["cryptoTraders"]} /> Featured by{" "} Check out our GitHub repository and join our community on Discord } > git clone moonstream } w="250px" > Join our Discord
); }; export async function getStaticProps() { const assetPreload = Object.keys(assets).map((key) => { return { rel: "preload", href: assets[key], as: "image", }; }); const preconnects = [{ rel: "preconnect", href: "https://s3.amazonaws.com" }]; const preloads = assetPreload.concat(preconnects); return { props: { metaTags: DEFAULT_METATAGS, preloads }, }; } export default Homepage;