MobileMenu.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { gsap } from 'gsap'
  2. import Image from 'next/image'
  3. import Link from 'next/link'
  4. import { useRouter } from 'next/router'
  5. import { useContext, useEffect, useRef } from 'react'
  6. import { ClusterContext, DEFAULT_CLUSTER } from '../../contexts/ClusterContext'
  7. import { BurgerState } from './Header'
  8. import orb from '../../images/burger.png'
  9. interface MenuProps {
  10. headerState: BurgerState
  11. setHeaderState: Function
  12. }
  13. const MobileMenu = ({ headerState, setHeaderState }: MenuProps) => {
  14. let burgerMenu = useRef(null)
  15. const router = useRouter()
  16. const { cluster } = useContext(ClusterContext)
  17. const navigation = [
  18. {
  19. name: 'Main',
  20. href: `/${cluster === DEFAULT_CLUSTER ? '' : `?cluster=${cluster}`}`,
  21. target: '_self',
  22. },
  23. {
  24. name: 'Pyth Network',
  25. href: 'https://pyth.network/',
  26. target: '_blank',
  27. },
  28. ]
  29. useEffect(() => {
  30. // close menu
  31. if (!headerState.opened) {
  32. gsap.to(burgerMenu.current, {
  33. duration: 0.3,
  34. ease: 'power4.out',
  35. css: { right: '-100%' },
  36. })
  37. gsap.set(document.body, { overflow: 'initial' })
  38. } else {
  39. // show menu
  40. gsap.to(burgerMenu.current, {
  41. duration: 0.3,
  42. ease: 'power4.out',
  43. css: { right: '0' },
  44. })
  45. gsap.set(document.body, { overflow: 'hidden' })
  46. }
  47. }, [headerState])
  48. return (
  49. <div
  50. ref={burgerMenu}
  51. className="fixed top-0 -right-full z-30 h-full w-full overscroll-y-none bg-darkGray landscape:overflow-auto "
  52. >
  53. <div className="relative flex min-h-[100vh] flex-col sm:justify-between">
  54. <Image
  55. src={orb}
  56. alt=""
  57. layout="fill"
  58. objectFit="cover"
  59. objectPosition="bottom center"
  60. />
  61. <div className="sm:after:gradient-border relative flex px-14 pt-16 sm:flex-1 sm:items-center md:px-28 ">
  62. <div className="grid w-full sm:grid-cols-2">
  63. <ul className="list-none pt-5 sm:pt-10">
  64. {navigation.map((item) => (
  65. <li key={item.name} className="mb-5 sm:mb-10">
  66. <Link href={item.href}>
  67. <a
  68. target={item.target}
  69. className=" inline-block font-body text-4xl leading-none tracking-wide transition-colors hover:text-white"
  70. aria-current={
  71. router.pathname === item.href ? 'page' : undefined
  72. }
  73. >
  74. {item.name}
  75. </a>
  76. </Link>
  77. </li>
  78. ))}
  79. </ul>
  80. </div>
  81. </div>
  82. </div>
  83. </div>
  84. )
  85. }
  86. export default MobileMenu