import { Avatar, Badge, Box, BoxedNextImage as Image, Button, ChevronDownIcon, ChevronUpIcon, CloseIcon, Dashboard, Flex, HamburgerIcon, Icon, Link, LogOut, Menu, MenuButton, MenuItem, MenuList, MetaButton, Profile, SimpleGrid, Spinner, Stack, Text, Tooltip, useBreakpointValue, useDisclosure, } from '@metafam/ds'; import { numbers } from '@metafam/utils'; import Alliances from 'assets/menuIcon/alliances.svg'; import Asketh from 'assets/menuIcon/asketh.svg'; import BecomeAPatron from 'assets/menuIcon/becomeapatron.svg'; import Contribute from 'assets/menuIcon/contribute.svg'; import Discord from 'assets/menuIcon/discord.svg'; import Events from 'assets/menuIcon/events.svg'; import Forum from 'assets/menuIcon/forum.svg'; import Grants from 'assets/menuIcon/grants.svg'; import Guilds from 'assets/menuIcon/guilds.svg'; import Invest from 'assets/menuIcon/invest.svg'; import Learn from 'assets/menuIcon/learn.svg'; import MetaGameWiki from 'assets/menuIcon/metagamewiki.svg'; import MetaRadio from 'assets/menuIcon/metaradio.svg'; import Patrons from 'assets/menuIcon/patrons.svg'; import Playbooks from 'assets/menuIcon/playbooks.svg'; import Players from 'assets/menuIcon/players.svg'; import Quests from 'assets/menuIcon/quests.svg'; import Raids from 'assets/menuIcon/raids.svg'; import Roles from 'assets/menuIcon/roles.svg'; import SeedEarned from 'assets/menuIcon/seedearned.svg'; import Seeds from 'assets/menuIcon/seeds.svg'; import TheGreatHouses from 'assets/menuIcon/thegreathouses.svg'; import WelcomeToMetaGame from 'assets/menuIcon/welcometometagame.svg'; import XPEarned from 'assets/menuIcon/xpearned.svg'; import Youtube from 'assets/menuIcon/youtube.svg'; import SeedMarket from 'assets/seed-icon.svg'; import XPStar from 'assets/xp-star.svg'; import { MetaLink } from 'components/Link'; import { PlayerAvatar } from 'components/Player/PlayerAvatar'; import { Player } from 'graphql/autogen/types'; import { useUser, useWeb3 } from 'lib/hooks'; import { usePSeedBalance } from 'lib/hooks/balances'; import { useRouter } from 'next/router'; import React, { useCallback, useEffect, useState } from 'react'; import { MenuLinkItem, MenuLinkSet, MenuSectionLinks } from 'utils/menuLinks'; import { getPlayerURL } from 'utils/playerHelpers'; const { amountToDecimal } = numbers; const menuIcons: { [key: string]: string } = { alliances: Alliances, asketh: Asketh, contribute: Contribute, discord: Discord, forum: Forum, grants: Grants, guilds: Guilds, invest: Invest, learn: Learn, metagamewiki: MetaGameWiki, patrons: Patrons, playbooks: Playbooks, players: Players, quests: Quests, raids: Raids, roles: Roles, seedearned: SeedEarned, seeds: Seeds, thegreathouses: TheGreatHouses, welcometometagame: WelcomeToMetaGame, xpearned: XPEarned, youtube: Youtube, metaradio: MetaRadio, events: Events, becomeapatron: BecomeAPatron, }; type LogoProps = { link: string; }; // Navbar logo const Logo = ({ link }: LogoProps) => { const width = useBreakpointValue({ base: 36, lg: 55 }) ?? (36 as number); const height = useBreakpointValue({ base: 45, lg: 75 }) ?? (45 as number); return ( ); }; type MenuItemProps = { title: string; url: string; explainerText: string; icon: string; }; // Menu links (with icons and explanatory text) -- used in DesktopNavLinks below const DesktopMenuItem = ({ title, url, explainerText, icon, }: MenuItemProps) => ( {title} {explainerText} ); const useWindowSize = () => { const [windowSize, setWindowSize] = useState({ width: 0, height: 0, }); useEffect(() => { if (typeof window !== 'undefined') { const handleResize = () => { setWindowSize({ width: window.innerWidth, height: window.innerHeight, }); }; window.addEventListener('resize', handleResize); handleResize(); return () => window.removeEventListener('resize', handleResize); } return undefined; }, []); return windowSize; }; // Nav links on desktop -- text and links from utils/menuLinks.ts const DesktopNavLinks = () => { const size = useWindowSize(); return ( {MenuSectionLinks.map((section: MenuLinkSet) => ( 1463 && size.width < 2200 ? [0, -10] : [-56, -10] } > {({ isOpen }) => ( <> {section.label} {isOpen ? ( ) : ( )} {isOpen ? ( ) : ( )} 3 ? 'repeat(2, 1fr)' : 'repeat(1, 1fr)' } width={section.menuItems.length > 3 ? '948px' : '474px'} p="2rem" boxShadow="dark-lg" bg="linear-gradient(180deg, rgba(42, 31, 71, 0.9) 6.18%, rgba(17, 3, 32, 0.86) 140%)" borderRadius="0.618vmax" border="0" > {section.menuItems.map((item: MenuLinkItem) => ( ))} )} ))} ); }; // Search -- not working yet // const Search = () => ( // // search // // find anything // // // ); type PlayerStatsProps = { player: Player; }; // Display player XP and Seed const PlayerStats: React.FC = ({ player }) => { const { disconnect } = useWeb3(); const { pSeedBalance } = usePSeedBalance(); return ( XP {Math.floor(player.totalXP)} pSeed {parseInt(amountToDecimal(pSeedBalance || '0', 18), 10)} View Profile Dashboard Disconnect ); }; export const MegaMenu: React.FC = () => { const { connected, connect } = useWeb3(); const router = useRouter(); const handleLoginClick = useCallback(async () => { await connect(); }, [connect]); const { user, fetching } = useUser(); const { player } = user ?? {}; const { isOpen, onOpen, onClose } = useDisclosure(); const menuToggle = () => { if (isOpen) { document.body.style.height = 'auto'; document.body.style.overflowY = 'scroll'; return onClose(); } document.body.style.height = '100%'; document.body.style.overflow = 'hidden'; return onOpen(); }; return ( {isOpen ? ( ) : ( )} {/* */} {fetching ? ( ) : ( <> {connected && !!player ? ( ) : ( Connect )} )} {MenuSectionLinks.map((section) => ( {section.label} {section.menuItems.map(({ title, icon, url }) => ( {title} ))} ))} ); };