'use client' import { type Menu } from '~/data/nav' 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, cn } 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: Menu } export 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 }: { menuItem: Menu['primaryNav'][number] }) => ( {menuItem.title === 'Product' ? ( <> {Object.values(menuItem.subMenu)?.map((component) => ( setOpen(false)} /> ))}
Modules
    {Object.values(ProductModulesData).map((productModule) => ( setOpen(false)} /> ))}
setOpen(false)} >
Features Explore everything you can do with Supabase.
) : menuItem.title === 'Developers' ? (
{menuItem.subMenu['navigation'].map((column) => (
{column.label !== 'Developers' && ( )} {column.links.map((link) => ( 0 ? jobsCount : undefined} className="focus-visible:ring-offset-4 focus-visible:ring-offset-background-overlay mt-0!" onClick={() => setOpen(false)} /> ))}
))}
setOpen(false)} /> setOpen(false)} />
) : menuItem.title === 'Solutions' ? (
{menuItem.subMenu['navigation'].map((column) => (
{column.label !== 'Solutions' && ( )} {column.links.map((link) => ( setOpen(false)} /> ))}
))}
) : null}
) const Menu = () => { const className = 'py-2 pl-2 pr-4 text-base font-medium text-foreground hover:bg-surface-200' return ( {menu.primaryNav.map((menuItem) => ( {menuItem.hasDropdown ? ( {menuItem.title} ) : ( setOpen(false)} > {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 && ( )}
) }