-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathNumberPlease.tsx
104 lines (96 loc) · 2.48 KB
/
NumberPlease.tsx
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import * as React from 'react';
import { View, StyleSheet } from 'react-native';
import { find } from './utils/array.utils';
import type { INumberPleaseProps, IValue } from './NumberPlease.interface';
import range from './utils/range';
import { Picker } from '@react-native-picker/picker';
const PickerFactory: React.FC<any> = React.forwardRef(
(
{ pickerProps, selectedValue, onChange, style, itemStyle, disabled }: any,
ref: any
) => {
const { id, label = '', min, max } = pickerProps;
const numbers = range(min, max);
return (
<Picker
testID={`${id}-picker`}
ref={ref}
style={{ ...styles.picker, ...style }}
selectedValue={selectedValue}
onValueChange={(value: any) => onChange({ [id]: value })}
itemStyle={itemStyle}
enabled={!disabled}
>
{numbers.map((number, index) => (
<Picker.Item
key={`${id}-${number}-${index}`}
value={number}
label={`${number} ${label}`}
enabled={!disabled}
/>
))}
</Picker>
);
}
);
const NumberPlease: React.FC<INumberPleaseProps> = ({
pickers,
values,
onChange,
itemStyle,
style,
...rest
}: any) => {
React.useEffect(() => {
Object.keys(values).some((key) => {
if (!find(pickers, (picker) => picker.id === key)) {
throw new Error(
`Picker with id '${key}' not found. Double check your initialValues.`
);
}
});
}, [values, pickers]);
const onChangeHandle = (value: IValue) => {
onChange({
...values,
...value,
});
};
const findPickerValue = (picker: any) => {
return values[picker.id];
};
return (
<View style={styles.container}>
{pickers.map((picker: any, index: any) => {
const { id, ref, disabled = false } = picker;
const pickerValue = findPickerValue(picker);
return (
<PickerFactory
ref={ref}
key={`${id}-picker-${index}`}
pickerProps={picker}
selectedValue={pickerValue}
onChange={onChangeHandle}
disabled={disabled}
itemStyle={itemStyle}
style={style}
{...rest}
/>
);
})}
</View>
);
};
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
width: '100%',
justifyContent: 'center',
alignItems: 'center',
},
picker: {
height: '100%',
flex: 1,
},
});
export default NumberPlease;