Skip to content

Commit bbeb393

Browse files
authored
Fix/grid list padding issue (#2982)
* Fix issue with nested list and contentContainerStyle in GridList * Fix GridListItem itemSize typing to support string for percentage
1 parent 20bdb61 commit bbeb393

File tree

5 files changed

+73
-29
lines changed

5 files changed

+73
-29
lines changed

demo/src/screens/componentScreens/GridListScreen.tsx

Lines changed: 57 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,76 @@
11
import React, {Component} from 'react';
22
import {StyleSheet} from 'react-native';
3-
import {View, Text, Constants, GridList, Card, Spacings, BorderRadiuses, GridListProps} from 'react-native-ui-lib';
3+
import {
4+
View,
5+
Text,
6+
Constants,
7+
GridList,
8+
Card,
9+
Spacings,
10+
BorderRadiuses,
11+
GridListProps,
12+
GridListItem
13+
} from 'react-native-ui-lib';
414
import products from '../../data/products';
15+
import {renderBooleanOption} from '../ExampleScreenPresenter';
516

617
class GridListScreen extends Component {
718
state = {
8-
orientation: Constants.orientation
19+
orientation: Constants.orientation,
20+
useGridListItem: false
921
};
1022

11-
renderItem: GridListProps<typeof products[0]>['renderItem'] = ({item}) => {
23+
renderHeader = () => {
1224
return (
13-
<Card flex>
14-
<Card.Section imageSource={{uri: item.mediaUrl}} imageStyle={styles.itemImage}/>
15-
<View padding-s2>
16-
<Text $textDefault>{item.name}</Text>
17-
<Text $textDefault>{item.formattedPrice}</Text>
18-
{item.inventory.status === 'Out of Stock' && (
19-
<Text text90M $textDangerLight>
20-
{item.inventory.status}
21-
</Text>
22-
)}
23-
</View>
24-
</Card>
25+
<View>
26+
<Text h1 marginB-s5>
27+
GridList
28+
</Text>
29+
{renderBooleanOption.call(this, 'UseGridListItem', 'useGridListItem')}
30+
</View>
2531
);
2632
};
2733

34+
renderItem: GridListProps<(typeof products)[0]>['renderItem'] = ({item}) => {
35+
const {useGridListItem} = this.state;
36+
37+
if (useGridListItem) {
38+
return (
39+
<GridListItem
40+
// containerStyle={{width: '100%', borderWidth: 1}}
41+
itemSize={{width: '100%', height: 200}}
42+
imageProps={{source: {uri: item.mediaUrl}}}
43+
title="Title"
44+
subtitle="Subitle"
45+
overlayText
46+
/>
47+
);
48+
} else {
49+
return (
50+
<Card flex>
51+
<Card.Section imageSource={{uri: item.mediaUrl}} imageStyle={styles.itemImage}/>
52+
<View padding-s2>
53+
<Text $textDefault>{item.name}</Text>
54+
<Text $textDefault>{item.formattedPrice}</Text>
55+
{item.inventory.status === 'Out of Stock' && (
56+
<Text text90M $textDangerLight>
57+
{item.inventory.status}
58+
</Text>
59+
)}
60+
</View>
61+
</Card>
62+
);
63+
}
64+
};
65+
2866
render() {
2967
return (
30-
<GridList<typeof products[0]>
31-
ListHeaderComponent={
32-
<Text h1 marginB-s5>
33-
GridList
34-
</Text>
35-
}
68+
<GridList<(typeof products)[0]>
69+
ListHeaderComponent={() => this.renderHeader()}
3670
data={products}
3771
renderItem={this.renderItem}
38-
// numColumns={2}
39-
maxItemWidth={140}
72+
numColumns={2}
73+
// maxItemWidth={140}
4074
itemSpacing={Spacings.s3}
4175
listPadding={Spacings.s5}
4276
// keepItemSize

src/components/gridList/index.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,19 @@ function GridList<T = any>(props: GridListProps<T>) {
1313
listPadding = 0,
1414
keepItemSize,
1515
containerWidth,
16+
style,
1617
contentContainerStyle,
1718
...others
1819
} = props;
1920

20-
const {itemContainerStyle, numberOfColumns, listContentStyle} = useGridLayout({
21+
const {itemContainerStyle, numberOfColumns, listStyle} = useGridLayout({
2122
numColumns,
2223
itemSpacing,
2324
maxItemWidth,
2425
listPadding,
2526
keepItemSize,
2627
containerWidth,
28+
style,
2729
contentContainerStyle
2830
});
2931

@@ -37,7 +39,10 @@ function GridList<T = any>(props: GridListProps<T>) {
3739
<FlatList
3840
key={numberOfColumns}
3941
{...others}
40-
contentContainerStyle={listContentStyle}
42+
/* NOTE: Using style instead of contentContainerStyle because of RN issue with a flatlist nested in another flatlist
43+
losing their contentContainerStyle */
44+
style={listStyle}
45+
// contentContainerStyle={listContentStyle}
4146
renderItem={_renderItem}
4247
numColumns={numberOfColumns}
4348
/>

src/components/gridList/types.ts

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

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

src/components/gridList/useGridLayout.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const useGridLayout = (props: GridListBaseProps) => {
1515
listPadding = 0,
1616
keepItemSize,
1717
containerWidth,
18+
style,
1819
contentContainerStyle
1920
} = props;
2021

@@ -47,8 +48,12 @@ const useGridLayout = (props: GridListBaseProps) => {
4748
const listContentStyle = useMemo(() => {
4849
return [{paddingHorizontal: listPadding}, contentContainerStyle];
4950
}, [listPadding, contentContainerStyle]);
51+
52+
const listStyle = useMemo(() => {
53+
return [{paddingHorizontal: listPadding}, style];
54+
}, [listPadding, style]);
5055

51-
return {itemContainerStyle, numberOfColumns, listContentStyle};
56+
return {itemContainerStyle, numberOfColumns, listStyle, listContentStyle};
5257
};
5358

5459
export default useGridLayout;

src/components/gridListItem/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,6 @@ const styles = StyleSheet.create({
277277
export default GridListItem;
278278

279279
interface ImageSize {
280-
width?: number;
281-
height?: number;
280+
width?: number | string;
281+
height?: number | string;
282282
}

0 commit comments

Comments
 (0)