-
Notifications
You must be signed in to change notification settings - Fork 129
Expand file tree
/
Copy pathPickerItem.tsx
More file actions
65 lines (56 loc) · 1.66 KB
/
PickerItem.tsx
File metadata and controls
65 lines (56 loc) · 1.66 KB
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
import { HTMLProps, ReactNode, useCallback, useEffect, useMemo, useRef } from 'react'
import { usePickerActions, usePickerData } from './Picker'
import { useColumnData } from './PickerColumn'
interface PickerItemRenderProps {
selected: boolean
}
export interface PickerItemProps extends Omit<HTMLProps<HTMLDivElement>, 'value' | 'children'> {
children: ReactNode | ((renderProps: PickerItemRenderProps) => ReactNode)
value: string | number
}
// eslint-disable-next-line
function isFunction(functionToCheck: any): functionToCheck is Function {
return typeof functionToCheck === 'function'
}
function PickerItem({
style,
children,
value,
...restProps
}: PickerItemProps) {
const optionRef = useRef<HTMLDivElement | null>(null)
const { itemHeight, value: pickerValue, mouseMode } = usePickerData('Picker.Item')
const pickerActions = usePickerActions('Picker.Item')
const { key } = useColumnData('Picker.Item')
useEffect(
() => pickerActions.registerOption(key, { value, element: optionRef }),
[key, pickerActions, value],
)
const itemStyle = useMemo(
() => ({
height: `${itemHeight}px`,
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
}),
[itemHeight],
)
const handleClick = useCallback(() => {
if (mouseMode === 'drag') return
pickerActions.change(key, value)
}, [pickerActions, key, value])
return (
<div
style={{
...itemStyle,
...style,
}}
ref={optionRef}
onClick={handleClick}
{...restProps}
>
{isFunction(children) ? children({ selected: pickerValue[key] === value }) : children}
</div>
)
}
export default PickerItem