-
Notifications
You must be signed in to change notification settings - Fork 153
/
SimpleGrid.js
119 lines (110 loc) · 2.7 KB
/
SimpleGrid.js
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import React, { forwardRef, memo, useMemo } from 'react';
import { View } from 'react-native';
import { generateStyles } from './utils';
import useRenderRow from './hooks/useRenderRow';
import useDimensions from './hooks/useDimensions';
import useRows from './hooks/useRows';
const defaultProps = {
fixed: false,
itemDimension: 120,
spacing: 10,
style: {},
additionalRowStyle: undefined,
itemContainerStyle: undefined,
staticDimension: undefined,
horizontal: false,
onLayout: null,
keyExtractor: null,
listKey: undefined,
maxDimension: undefined,
invertedRow: false,
maxItemsPerRow: undefined,
adjustGridToStyles: false,
onItemsPerRowChange: undefined,
};
const SimpleGrid = memo(
forwardRef((props, ref) => {
const options = {
...defaultProps,
...props,
};
const {
style,
spacing,
fixed,
data,
itemDimension,
renderItem,
horizontal,
additionalRowStyle: externalRowStyle,
itemContainerStyle,
keyExtractor: customKeyExtractor,
invertedRow,
onItemsPerRowChange,
...restProps
} = options;
const {
onLayout,
itemsPerRow,
containerDimension,
fixedSpacing,
} = useDimensions(options);
const { containerStyle, containerFullWidthStyle, rowStyle } = useMemo(
() => generateStyles({
horizontal,
itemDimension,
containerDimension,
spacing,
fixedSpacing,
fixed,
itemsPerRow,
}),
[horizontal, itemDimension, containerDimension, itemsPerRow, spacing, fixedSpacing, fixed],
);
const { rows, keyExtractor } = useRows({
data,
invertedRow,
itemsPerRow,
keyExtractor: customKeyExtractor,
onItemsPerRowChange,
});
const renderRow = useRenderRow({
renderItem,
spacing,
keyExtractor: customKeyExtractor,
externalRowStyle,
itemContainerStyle,
horizontal,
invertedRow,
});
return (
<View
style={[
{
...(horizontal ? { paddingLeft: spacing } : { paddingTop: spacing }),
},
style,
]}
ref={ref}
{...restProps}
>
{rows.map((row, index) => (
<View key={keyExtractor(row, index)} onLayout={onLayout}>
{renderRow({
rowItems: row,
rowIndex: index,
isLastRow: index === rows.length - 1,
itemsPerRow,
rowStyle,
containerStyle,
containerFullWidthStyle,
separators: null,
})}
</View>
))}
</View>
);
}),
);
SimpleGrid.displayName = 'SimpleGrid';
export default SimpleGrid;