40 lines
1.4 KiB
JavaScript
40 lines
1.4 KiB
JavaScript
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
||
|
import { ListActionTypes, listReducer } from '../useList';
|
||
|
export function menuReducer(state, action) {
|
||
|
if (action.type === ListActionTypes.itemHover) {
|
||
|
return _extends({}, state, {
|
||
|
highlightedValue: action.item
|
||
|
});
|
||
|
}
|
||
|
const newState = listReducer(state, action);
|
||
|
|
||
|
// make sure an item is always highlighted
|
||
|
if (newState.highlightedValue === null && action.context.items.length > 0) {
|
||
|
return _extends({}, newState, {
|
||
|
highlightedValue: action.context.items[0]
|
||
|
});
|
||
|
}
|
||
|
if (action.type === ListActionTypes.keyDown) {
|
||
|
if (action.event.key === 'Escape') {
|
||
|
return _extends({}, newState, {
|
||
|
open: false
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
if (action.type === ListActionTypes.blur) {
|
||
|
if (!action.context.listboxRef.current?.contains(action.event.relatedTarget)) {
|
||
|
// To prevent the menu from closing when the focus leaves the menu to the button.
|
||
|
// For more details, see https://github.com/mui/material-ui/pull/36917#issuecomment-1566992698
|
||
|
const listboxId = action.context.listboxRef.current?.getAttribute('id');
|
||
|
const controlledBy = action.event.relatedTarget?.getAttribute('aria-controls');
|
||
|
if (listboxId && controlledBy && listboxId === controlledBy) {
|
||
|
return newState;
|
||
|
}
|
||
|
return _extends({}, newState, {
|
||
|
open: false,
|
||
|
highlightedValue: action.context.items[0]
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
return newState;
|
||
|
}
|