import Dot from "@material-symbols/svg-400/rounded/fiber_manual_record-fill.svg"; import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; import { type ComponentType, forwardRef, type ReactElement, type ReactNode, } from "react"; import type { PressableProps } from "react-native"; import type { SvgProps } from "react-native-svg"; import { cn } from "~/utils"; import { Icon } from "./icons"; import { useLinkTo } from "./links"; import { P } from "./text"; export const InternalTrigger = forwardRef(function _Triger( { Component, ComponentProps, ...props }, ref, ) { return ( ); }); const Menu = ({ Trigger, onMenuOpen, onMenuClose, children, isOpen, setOpen, ...props }: { Trigger: ComponentType; children: ReactNode | ReactNode[] | null; onMenuOpen?: () => void; onMenuClose?: () => void; isOpen?: boolean; setOpen?: (v: boolean) => void; } & Omit) => { return ( { if (setOpen) setOpen(newOpen); if (newOpen) onMenuOpen?.call(null); else onMenuClose?.call(null); }} > e.stopImmediatePropagation()} className="z-10 min-w-2xs overflow-y-auto rounded bg-popover shadow-xl" style={{ maxHeight: "calc(var(--radix-dropdown-menu-content-available-height) * 0.8)", }} > {children} ); }; const MenuItem = forwardRef< HTMLDivElement, { label: string; icon?: ComponentType; left?: ReactElement; disabled?: boolean; selected?: boolean; closeOnSelect?: boolean; className?: string; } & ( | { onSelect: () => void; href?: undefined } | { href: string; onSelect?: undefined } ) >(function MenuItem( { label, icon, left, selected, onSelect, href, disabled, closeOnSelect = true, className, ...props }, ref, ) { const icn = (icon || selected) && ( ); const { onPress, ...linkProps } = useLinkTo({ href }); return ( { if (!closeOnSelect) e.preventDefault(); onSelect?.(); onPress?.(undefined!); }} disabled={disabled} className={cn( "group flex h-10 flex-row items-center p-2 py-6 outline-0 data-highlighted:bg-accent", className, )} {...props} > {left && left} {!left && icn}

{label}

{left && icn}
); }); Menu.Item = MenuItem; const Sub = ({ children, disabled, ...props }: { label: string; selected?: boolean; left?: ReactElement; disabled?: boolean; icon?: ComponentType; children: ReactNode | ReactNode[] | null; } & AsProps) => { return ( e.preventDefault()} /> e.stopImmediatePropagation()} className="z-10 min-w-2xs overflow-hidden rounded bg-popover shadow-xl" style={{ maxHeight: "calc(var(--radix-dropdown-menu-content-available-height) * 0.8)", }} > {children} ); }; Menu.Sub = Sub; export { Menu };