Skip to content

Commit 8ef823c

Browse files
authored
Use rowGap and columnGap feature in our GridList and SortableGridList… (#3064)
* Use rowGap and columnGap feature in our GridList and SortableGridList components * PR review fixes
1 parent 6b56751 commit 8ef823c

File tree

4 files changed

+28
-20
lines changed

4 files changed

+28
-20
lines changed

src/components/gridList/index.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ function GridList<T = any>(props: GridListProps<T>) {
1818
...others
1919
} = props;
2020

21-
const {itemContainerStyle, numberOfColumns, listStyle} = useGridLayout({
21+
const {itemContainerStyle, numberOfColumns, listStyle, listContentStyle, listColumnWrapperStyle} = useGridLayout({
2222
numColumns,
2323
itemSpacing,
2424
maxItemWidth,
@@ -39,10 +39,11 @@ function GridList<T = any>(props: GridListProps<T>) {
3939
<FlatList
4040
key={numberOfColumns}
4141
{...others}
42-
/* NOTE: Using style instead of contentContainerStyle because of RN issue with a flatlist nested in another flatlist
42+
/* NOTE: Using style with contentContainerStyle because of RN issue with a flatlist nested in another flatlist
4343
losing their contentContainerStyle */
4444
style={listStyle}
45-
// contentContainerStyle={listContentStyle}
45+
columnWrapperStyle={listColumnWrapperStyle}
46+
contentContainerStyle={listContentStyle}
4647
renderItem={_renderItem}
4748
numColumns={numberOfColumns}
4849
/>

src/components/gridList/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import {FlatListProps, ScrollViewProps} from 'react-native';
1+
import {FlatListProps} from 'react-native';
22

3-
export interface GridListBaseProps extends Pick<ScrollViewProps, 'style' | 'contentContainerStyle'> {
3+
export interface GridListBaseProps extends Pick<FlatListProps<any>, 'style' | 'contentContainerStyle' | 'columnWrapperStyle'> {
44
/**
55
* Allow a responsive item width to the maximum item width
66
*/

src/components/gridList/useGridLayout.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ const useGridLayout = (props: GridListBaseProps) => {
1616
keepItemSize,
1717
containerWidth,
1818
style,
19-
contentContainerStyle
19+
contentContainerStyle,
20+
columnWrapperStyle
2021
} = props;
2122

2223
const {orientation} = useOrientation();
@@ -42,18 +43,22 @@ const useGridLayout = (props: GridListBaseProps) => {
4243
}, [numberOfColumns, itemSpacing, keepItemSize ? undefined : _containerWidth]);
4344

4445
const itemContainerStyle = useMemo(() => {
45-
return {width: itemWidth /* + itemSpacing */, marginRight: itemSpacing, marginBottom: itemSpacing};
46-
}, [itemWidth, itemSpacing]);
46+
return {width: itemWidth /* , marginRight: itemSpacing, marginBottom: itemSpacing */};
47+
}, [itemWidth]);
4748

4849
const listContentStyle = useMemo(() => {
49-
return [{paddingHorizontal: listPadding}, contentContainerStyle];
50-
}, [listPadding, contentContainerStyle]);
51-
50+
return [{/* paddingHorizontal: listPadding, */ rowGap: itemSpacing}, contentContainerStyle];
51+
}, [itemSpacing, contentContainerStyle]);
52+
5253
const listStyle = useMemo(() => {
53-
return [{paddingHorizontal: listPadding}, style];
54-
}, [listPadding, style]);
54+
return [{paddingHorizontal: listPadding, rowGap: itemSpacing}, style];
55+
}, [listPadding, itemSpacing, style]);
56+
57+
const listColumnWrapperStyle = useMemo(() => {
58+
return [{columnGap: itemSpacing}, columnWrapperStyle];
59+
}, [itemSpacing, columnWrapperStyle]);
5560

56-
return {itemContainerStyle, numberOfColumns, listStyle, listContentStyle};
61+
return {itemContainerStyle, numberOfColumns, listStyle, listContentStyle, listColumnWrapperStyle};
5762
};
5863

5964
export default useGridLayout;

src/components/sortableGridList/index.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ function generateItemsOrder(data: SortableGridListProps['data']) {
1919
function SortableGridList<T = any>(props: SortableGridListProps<T>) {
2020
const {renderItem, onOrderChange, flexMigration, ...others} = props;
2121

22-
const {itemContainerStyle, numberOfColumns, listContentStyle} = useGridLayout(props);
22+
const {itemContainerStyle, numberOfColumns, listStyle, listContentStyle, listColumnWrapperStyle} =
23+
useGridLayout(props);
2324
const {itemSpacing = DEFAULT_ITEM_SPACINGS, data} = others;
2425
const itemsOrder = useSharedValue<ItemsOrder>(generateItemsOrder(data));
2526

@@ -50,14 +51,12 @@ function SortableGridList<T = any>(props: SortableGridListProps<T>) {
5051
}, [onOrderChange, data]);
5152

5253
const _renderItem = useCallback(({item, index}: ListRenderItemInfo<ItemProps<T>>) => {
53-
const lastItemInRow = (index + 1) % numberOfColumns === 0;
54-
5554
return (
5655
<SortableItem
5756
key={item.id}
5857
data={data}
5958
{...presenter}
60-
style={[itemContainerStyle, lastItemInRow && {marginRight: 0}]}
59+
style={itemContainerStyle}
6160
itemsOrder={itemsOrder}
6261
id={item.id}
6362
onChange={onChange}
@@ -67,11 +66,14 @@ function SortableGridList<T = any>(props: SortableGridListProps<T>) {
6766
</SortableItem>
6867
);
6968
},
70-
[data]);
69+
[data, itemContainerStyle, onChange, renderItem]);
7170

7271
return (
7372
<GestureHandlerRootView style={flexMigration ? styles.container : undefined}>
74-
<ScrollView contentContainerStyle={[styles.listContent, listContentStyle]}>
73+
<ScrollView
74+
style={listStyle}
75+
contentContainerStyle={[styles.listContent, listContentStyle, listColumnWrapperStyle]}
76+
>
7577
{_.map(data, (item, index) => _renderItem({item, index} as ListRenderItemInfo<ItemProps<T>>))}
7678
</ScrollView>
7779
</GestureHandlerRootView>

0 commit comments

Comments
 (0)