You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.6 KiB
82 lines
2.6 KiB
import { Button } from '@/components/ui/button' |
|
import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerOverlay } from '@/components/ui/drawer' |
|
import { ArrowLeft } from 'lucide-react' |
|
import { MenuAction, SubMenuAction } from './useMenuActions' |
|
|
|
interface MobileMenuProps { |
|
menuActions: MenuAction[] |
|
trigger: React.ReactNode |
|
isDrawerOpen: boolean |
|
setIsDrawerOpen: (open: boolean) => void |
|
showSubMenu: boolean |
|
activeSubMenu: SubMenuAction[] |
|
subMenuTitle: string |
|
closeDrawer: () => void |
|
goBackToMainMenu: () => void |
|
} |
|
|
|
export function MobileMenu({ |
|
menuActions, |
|
trigger, |
|
isDrawerOpen, |
|
setIsDrawerOpen, |
|
showSubMenu, |
|
activeSubMenu, |
|
subMenuTitle, |
|
closeDrawer, |
|
goBackToMainMenu |
|
}: MobileMenuProps) { |
|
return ( |
|
<> |
|
{trigger} |
|
<Drawer open={isDrawerOpen} onOpenChange={setIsDrawerOpen}> |
|
<DrawerOverlay onClick={closeDrawer} /> |
|
<DrawerContent hideOverlay className="max-h-[80vh]"> |
|
<DrawerHeader className="sr-only"> |
|
<DrawerTitle>Options</DrawerTitle> |
|
</DrawerHeader> |
|
<div className="overflow-y-auto overscroll-contain py-2" style={{ touchAction: 'pan-y' }}> |
|
{!showSubMenu ? ( |
|
menuActions.map((action, index) => { |
|
const Icon = action.icon |
|
return ( |
|
<Button |
|
key={index} |
|
onClick={action.onClick} |
|
className={`w-full p-6 justify-start text-lg gap-4 [&_svg]:size-5 ${action.className || ''}`} |
|
variant="ghost" |
|
> |
|
<Icon /> |
|
{action.label} |
|
</Button> |
|
) |
|
}) |
|
) : ( |
|
<> |
|
<Button |
|
onClick={goBackToMainMenu} |
|
className="w-full p-6 justify-start text-lg gap-4 [&_svg]:size-5 mb-2" |
|
variant="ghost" |
|
> |
|
<ArrowLeft /> |
|
{subMenuTitle} |
|
</Button> |
|
<div className="border-t border-border mb-2" /> |
|
{activeSubMenu.map((subAction, index) => ( |
|
<Button |
|
key={index} |
|
onClick={subAction.onClick} |
|
className={`w-full p-6 justify-start text-lg gap-4 ${subAction.className || ''}`} |
|
variant="ghost" |
|
> |
|
{subAction.label} |
|
</Button> |
|
))} |
|
</> |
|
)} |
|
</div> |
|
</DrawerContent> |
|
</Drawer> |
|
</> |
|
) |
|
}
|
|
|