| 140 | * @param state - State for the menu, as returned by `useTreeState`. |
| 141 | */ |
| 142 | export function useMenuItem<T>( |
| 143 | props: AriaMenuItemProps, |
| 144 | state: TreeState<T>, |
| 145 | ref: RefObject<FocusableElement | null> |
| 146 | ): MenuItemAria { |
| 147 | let { |
| 148 | id, |
| 149 | key, |
| 150 | closeOnSelect, |
| 151 | shouldCloseOnSelect, |
| 152 | isVirtualized, |
| 153 | 'aria-haspopup': hasPopup, |
| 154 | onPressStart, |
| 155 | onPressUp: pressUpProp, |
| 156 | onPress, |
| 157 | onPressChange: pressChangeProp, |
| 158 | onPressEnd, |
| 159 | onClick: onClickProp, |
| 160 | onHoverStart: hoverStartProp, |
| 161 | onHoverChange, |
| 162 | onHoverEnd, |
| 163 | onKeyDown, |
| 164 | onKeyUp, |
| 165 | onFocus, |
| 166 | onFocusChange, |
| 167 | onBlur, |
| 168 | selectionManager = state.selectionManager |
| 169 | } = props; |
| 170 | |
| 171 | let isTrigger = !!hasPopup; |
| 172 | let isTriggerExpanded = isTrigger && props['aria-expanded'] === 'true'; |
| 173 | let isDisabled = props.isDisabled ?? selectionManager.isDisabled(key); |
| 174 | let isSelected = props.isSelected ?? selectionManager.isSelected(key); |
| 175 | let data = menuData.get(state)!; |
| 176 | let item = state.collection.getItem(key); |
| 177 | let onClose = props.onClose || data.onClose; |
| 178 | let router = useRouter(); |
| 179 | let performAction = () => { |
| 180 | if (isTrigger) { |
| 181 | return; |
| 182 | } |
| 183 | |
| 184 | if (item?.props?.onAction) { |
| 185 | item.props.onAction(); |
| 186 | } else if (props.onAction) { |
| 187 | props.onAction(key); |
| 188 | } |
| 189 | |
| 190 | if (data.onAction) { |
| 191 | // Must reassign to variable otherwise `this` binding gets messed up. Something to do with WeakMap. |
| 192 | let onAction = data.onAction; |
| 193 | onAction(key, item?.value); |
| 194 | } |
| 195 | }; |
| 196 | |
| 197 | let role = 'menuitem'; |
| 198 | if (!isTrigger) { |
| 199 | if (selectionManager.selectionMode === 'single') { |