import { Menu, Portal } from '@mantine/core'; import React, { useState } from 'react'; import { type MantineBetterMenuInstanceItem, useMantineBetterMenus } from './Store'; export function MenuRenderer() { const { menus, providerID, setInstanceState, width } = useMantineBetterMenus((s) => ({ menus: s.menus, providerID: s.providerID, setInstanceState: s.setInstanceState, setState: s.setState, width: s.width, })); return ( {React.Children.toArray( menus?.map((m, menuIndex) => { return ( { setInstanceState(m.id, 'visible', false); m.menuProps?.onClose?.(); }} opened={m.visible} >
{m.renderer ? m.renderer : React.Children.toArray( m.items?.map((item, itemIndex) => ( )) )}
); }) )}
); } const MenuItemRenderer = ({ children, label, ...props }: MantineBetterMenuInstanceItem) => { const [loading, setLoading] = useState(false); if (typeof props.renderer === 'function') { return props.renderer({ ...props, loading, renderer: undefined, setLoading }); } if (typeof props.renderer === 'object') { return props.renderer; } if (props.isDivider) { return ; } if (props.items && props.items.length > 0) { return ( { props.onClick?.(e); if (props.onClickAsync) { setLoading(true); props.onClickAsync().finally(() => setLoading(false)); } }} styles={{ itemLabel: { overflow: 'auto', wordWrap: 'break-word', }, ...props.styles, }} > {children ?? label} {React.Children.toArray( props.items.map((subitem, subitemIndex) => ( )) )} ); } if (!props.onClick && !props.onClickAsync) { return )}> {children ?? label}; } return ( { props.onClick?.(e); if (props.onClickAsync) { setLoading(true); props.onClickAsync(e).finally(() => setLoading(false)); } }} styles={{ itemLabel: { overflow: 'auto', wordWrap: 'break-word', }, ...props.styles, }} > {children ?? label} ); };