/*
Copyright (c) 2018-2020 Uber Technologies, Inc.
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
*/
// @flow
import * as React from 'react';
import {LocaleContext} from '../locale/index.js';
import {getOverrides} from '../helpers/overrides.js';
import {OPTION_LIST_SIZE} from './constants.js';
import MaybeChildMenu from './maybe-child-menu.js';
import {StyledListItem, StyledListItemAnchor} from './styled-components.js';
import type {OptionListPropsT} from './types.js';
function OptionList(props: OptionListPropsT, ref: React.ElementRef<*>) {
const {
getChildMenu,
getItemLabel = item => (item ? item.label : ''),
item,
onMouseEnter = () => {},
overrides = {},
renderHrefAsAnchor = true,
resetMenu = () => {},
size = OPTION_LIST_SIZE.default,
$isHighlighted,
renderAll,
...restProps
} = props;
const [ListItem, listItemProps] = getOverrides(
overrides.ListItem,
StyledListItem,
);
const [ListItemAnchor, listItemAnchorProps] = getOverrides(
overrides.ListItemAnchor,
StyledListItemAnchor,
);
const getItem = item => {
if (item.href && renderHrefAsAnchor) {
return (
{getItemLabel(item)}
);
} else {
return <>{getItemLabel(item)}>;
}
};
return (
{locale => (
{getItem({isHighlighted: $isHighlighted, ...item})}
)}
);
}
function areEqualShallow(a, b) {
if (!a || !b) return false;
for (var key in a) {
if (a[key] !== b[key]) {
return false;
}
}
return true;
}
function compare(prevProps, nextProps) {
return (
prevProps.$isHighlighted === nextProps.$isHighlighted &&
prevProps.$isFocused === nextProps.$isFocused &&
areEqualShallow(prevProps.item, nextProps.item) &&
areEqualShallow(prevProps.overrides, nextProps.overrides) &&
prevProps.size === nextProps.size &&
prevProps.getItemLabel === nextProps.getItemLabel &&
prevProps.getChildMenu === nextProps.getChildMenu &&
prevProps.resetMenu === nextProps.resetMenu
);
}
const forwarded = React.forwardRef(OptionList);
forwarded.displayName = 'OptionList';
export default React.memo(forwarded, compare);
declare var __DEV__: boolean;
declare var __NODE__: boolean;
declare var __BROWSER__: boolean;