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) => (
);
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) => (
))}
);
};
// Search -- not working yet
// const Search = () => (
//
//
//
// find anything
//
//
// );
type PlayerStatsProps = {
player: Player;
};
// Display player XP and Seed
const PlayerStats: React.FC = ({ player }) => {
const { disconnect } = useWeb3();
const { pSeedBalance } = usePSeedBalance();
return (
{Math.floor(player.totalXP)}
{parseInt(amountToDecimal(pSeedBalance || '0', 18), 10)}
);
};
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 (
);
};