'use client' import { useIsLoggedIn, useIsUserLoading } from 'common' import { AnimatePresence, domAnimation, LazyMotion, m } from 'framer-motion' import { ChevronRight } from 'lucide-react' import Link from 'next/link' import { useEffect } from 'react' import type { Dispatch, SetStateAction } from 'react' import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Button } from 'ui' import { TextLink } from 'ui-patterns/TextLink' import MenuItem from './MenuItem' import SupabaseWordmark from './SupabaseWordmark' import staticContent from '@/.generated/staticContent/_index.json' import ProductModulesData from '@/data/ProductModules' import { DEFAULT_EASE } from '@/lib/animations' import { useSendTelemetryEvent } from '@/lib/telemetry' interface Props { open: boolean setOpen: Dispatch> menu: any } const MobileMenu = ({ open, setOpen, menu }: Props) => { const isLoggedIn = useIsLoggedIn() const isUserLoading = useIsUserLoading() const sendTelemetryEvent = useSendTelemetryEvent() const { jobsCount } = staticContent const container = { hidden: { opacity: 0 }, show: { opacity: 1, transition: { duration: 0.15, staggerChildren: 0.05, ease: DEFAULT_EASE } }, exit: { opacity: 0, transition: { duration: 0.15 } }, } const listItem = { hidden: { opacity: 0, y: 10 }, show: { opacity: 1, y: 0, transition: { duration: 0.25, ease: DEFAULT_EASE } }, exit: { opacity: 0, transition: { duration: 0.05 } }, } useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { setOpen(false) } } window.addEventListener('keydown', onKeyDown) return () => window.removeEventListener('keydown', onKeyDown) }, [setOpen]) const AccordionMenuItem = ({ menuItem }: any) => ( {menuItem.title === 'Product' ? ( <> {Object.values(menuItem.subMenu)?.map((component: any) => ( ))}
Modules
    {Object.values(ProductModulesData).map((productModule) => ( ))}
Features Explore everything you can do with Supabase.
) : menuItem.title === 'Developers' ? (
{menuItem.subMenu['navigation'].map((column: any) => (
{column.label !== 'Developers' && ( )} {column.links.map((link: any) => ( 0 ? jobsCount : undefined} className="focus-visible:ring-offset-4 focus-visible:ring-offset-background-overlay mt-0!" /> ))}
))}
) : menuItem.title === 'Solutions' ? (
{menuItem.subMenu['navigation'].map((column: any) => (
{column.label !== 'Solutions' && ( )} {column.links.map((link: any) => ( ))}
))}
) : null}
) const Menu = () => ( {menu.primaryNav.map((menuItem: any) => ( {menuItem.hasDropdown ? ( {menuItem.title} ) : ( {menuItem.title} )} ))} ) return ( {open && (
{!isUserLoading && ( <> {isLoggedIn ? ( ) : ( <> sendTelemetryEvent({ action: 'sign_in_button_clicked', properties: { buttonLocation: 'Mobile Nav' }, }) } > sendTelemetryEvent({ action: 'start_project_button_clicked', properties: { buttonLocation: 'Mobile Nav' }, }) } > )} )}
)}
{open && ( )}
) } export default MobileMenu