import * as React from 'react';
import {
isSelected,
useListItemActiveDescendant,
useListItemRegister,
} from '@workday/canvas-kit-react/collection';
import {
composeHooks,
createComponent,
createElemPropsHook,
createSubcomponent,
} from '@workday/canvas-kit-react/common';
import {SystemIcon} from '@workday/canvas-kit-react/icon';
import {mergeStyles} from '@workday/canvas-kit-react/layout';
import {OverflowTooltip} from '@workday/canvas-kit-react/tooltip';
import {checkIcon} from '@workday/canvas-system-icons-web';
import {MenuItem, MenuItemProps, menuItemStencil} from './MenuItem';
import {useMenuModel} from './useMenuModel';
const MenuOptionText = createComponent('span')({
Component: ({...elemProps}, ref, Element) => {
return (
<>
>
);
},
});
export const StyledMenuOption = createComponent('li')({
displayName: 'MenuOption',
Component: ({children, ...elemProps}: MenuItemProps, ref, Element) => {
return (
{typeof children === 'string' ? {children} : children}
);
},
});
export const useMenuOption = composeHooks(
createElemPropsHook(useMenuModel)((model, _ref, elemProps: {'data-id'?: string} = {}) => {
const id = elemProps['data-id'] || '';
const selected = isSelected(id, model.state);
const onMouseDown = (event: React.MouseEvent) => {
// Only left mouse button
if (event.button === 0) {
if (event.currentTarget.getAttribute('aria-disabled') !== 'true') {
// Keep the list cursor in sync with pointer selection so dependent UI (for example
// `aria-activedescendant` and scroll-into-view in combobox) targets the clicked option.
model.events.goTo({id});
model.events.select({id});
if (model.state.mode === 'single') {
model.events.hide(event);
}
}
}
// prevent focus changes
event.preventDefault();
};
return {
role: 'option',
'aria-selected': selected,
onMouseDown,
};
}),
useListItemActiveDescendant,
useListItemRegister
);
export const MenuOption = createSubcomponent('li')({
displayName: 'Menu.Item',
modelHook: useMenuModel,
elemPropsHook: useMenuOption,
subComponents: {
Icon: MenuItem.Icon,
Text: MenuOptionText,
},
})(({children, ...elemProps}, Element) => {
return (
{children}
);
});