-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathStandardMenu.jsx
executable file
·81 lines (73 loc) · 2.13 KB
/
StandardMenu.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import React from 'react';
import PropTypes from 'prop-types';
import cx from 'classnames';
import Frame from '../Frame';
import StandardMenuItem from './StandardMenuItem';
import './_StandardMenu.scss';
const DIVIDER = 'divider';
export const flattenWithDividers = options =>
options.reduce((acc, val, idx) => {
if (!Array.isArray(val)) {
acc.push(val);
} else {
acc = acc.concat([
`${DIVIDER}--group-${idx}-start`,
...val,
`${DIVIDER}--group-${idx}-end`,
]);
}
return acc;
}, []);
const StandardMenu = props => {
const options = flattenWithDividers(props.options);
const hasOptions = Array.isArray(options);
return (
<Frame
className={cx('StandardMenu', props.className, props.direction, {
'StandardMenu--visible': props.isVisible,
})}
>
{hasOptions && options.length > 0 ? (
options.map(option => {
if (typeof option === 'string' && option.includes(DIVIDER)) {
return (
<div key={option.toString()} className={`${DIVIDER} ${option}`} />
);
}
return (
<StandardMenuItem
key={`StandardMenu-item-${option.title}`}
{...option}
value={[...props.value, option.title]}
closeOnClick={props.closeOnClick}
mouseEnterItem={props.mouseEnterItem}
StandardMenu={StandardMenu}
/>
);
})
) : (
<StandardMenuItem
title="(Empty)"
className={'StandardMenuItem--empty'}
mouseEnterItem={props.mouseEnterItem}
closeOnClick={props.closeOnClick}
StandardMenu={StandardMenu}
isDisabled
/>
)}
</Frame>
);
};
StandardMenu.defaultProps = {
value: [],
};
export const standardMenuProps = {
value: PropTypes.arrayOf(PropTypes.string),
mouseEnterItem: PropTypes.func,
className: PropTypes.string,
direction: PropTypes.oneOf(['up', 'down', 'left', 'right']),
options: PropTypes.any,
isVisible: PropTypes.bool,
};
StandardMenu.propTypes = standardMenuProps;
export default StandardMenu;