1 | import React, { useCallback, useMemo } from 'react';
|
2 | import { any, bool, func, number, oneOfType, shape, string } from 'prop-types';
|
3 |
|
4 | import fromRenderProp from '../util/fromRenderProp';
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | const Item = props => {
|
17 | const {
|
18 | classes,
|
19 | hasFocus,
|
20 | isSelected,
|
21 | item,
|
22 | itemIndex,
|
23 | render,
|
24 | setFocus,
|
25 | uniqueId: key,
|
26 | updateSelectedKeys,
|
27 | ...restProps
|
28 | } = props;
|
29 |
|
30 | const children = typeof item === 'string' ? item : null;
|
31 |
|
32 | const onClick = useCallback(() => updateSelectedKeys(key), [
|
33 | key,
|
34 | updateSelectedKeys
|
35 | ]);
|
36 | const onFocus = useCallback(() => setFocus(key), [key, setFocus]);
|
37 |
|
38 | const customProps = {
|
39 | classes,
|
40 | hasFocus,
|
41 | isSelected,
|
42 | item,
|
43 | itemIndex,
|
44 | onClick,
|
45 | onFocus
|
46 | };
|
47 |
|
48 | const Root = useMemo(
|
49 | () => fromRenderProp(render, Object.keys(customProps)),
|
50 | [render, customProps]
|
51 | );
|
52 |
|
53 | return (
|
54 | <Root className={classes.root} {...customProps} {...restProps}>
|
55 | {children}
|
56 | </Root>
|
57 | );
|
58 | };
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 | Item.propTypes = {
|
77 | classes: shape({
|
78 | root: string
|
79 | }),
|
80 | hasFocus: bool,
|
81 | isSelected: bool,
|
82 | item: any.isRequired,
|
83 | itemIndex: number.isRequired,
|
84 | render: oneOfType([func, string]).isRequired,
|
85 | setFocus: func,
|
86 | uniqueId: oneOfType([number, string]).isRequired,
|
87 | updateSelectedKeys: func.isRequired
|
88 | };
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 | Item.defaultProps = {
|
96 | classes: {},
|
97 | hasFocus: false,
|
98 | isSelected: false,
|
99 | render: 'div'
|
100 | };
|
101 |
|
102 | export default Item;
|