Skip to content

Commit d538b2a

Browse files
authored
Fix list components not resizing when data changes (#872)
1 parent f88d08b commit d538b2a

File tree

6 files changed

+52
-8
lines changed

6 files changed

+52
-8
lines changed

packages/core/src/components/SimpleStyleScrollables/SimpleStyleFlashList.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import useSplitContentContainerStyles from "./useSplitContentContainerStyles";
99
*/
1010
const SimpleStyleFlashList = <T extends any>({
1111
style: styleProp,
12+
data,
1213
...rest
1314
}: Omit<FlashListProps<T>, "contentContainerStyle">) => {
1415
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
@@ -17,7 +18,8 @@ const SimpleStyleFlashList = <T extends any>({
1718
const { style, contentContainerStyle } = useSplitContentContainerStyles(
1819
styleProp,
1920
measuredWidth,
20-
measuredHeight
21+
measuredHeight,
22+
[data]
2123
);
2224

2325
return (
@@ -28,6 +30,7 @@ const SimpleStyleFlashList = <T extends any>({
2830
}}
2931
style={style}
3032
contentContainerStyle={contentContainerStyle as ContentStyle}
33+
data={data}
3134
{...rest}
3235
/>
3336
);

packages/core/src/components/SimpleStyleScrollables/SimpleStyleFlatList.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import useSplitContentContainerStyles from "./useSplitContentContainerStyles";
99
*/
1010
const SimpleStyleFlatList = <T extends any>({
1111
style: styleProp,
12+
data,
1213
...rest
1314
}: Omit<FlatListProps<T>, "contentContainerStyle">) => {
1415
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
@@ -17,7 +18,8 @@ const SimpleStyleFlatList = <T extends any>({
1718
const { style, contentContainerStyle } = useSplitContentContainerStyles(
1819
styleProp,
1920
measuredWidth,
20-
measuredHeight
21+
measuredHeight,
22+
[data]
2123
);
2224

2325
return (
@@ -28,6 +30,7 @@ const SimpleStyleFlatList = <T extends any>({
2830
}}
2931
style={style}
3032
contentContainerStyle={contentContainerStyle}
33+
data={data}
3134
{...rest}
3235
/>
3336
);

packages/core/src/components/SimpleStyleScrollables/SimpleStyleMasonryFlashList.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import useSplitContentContainerStyles from "./useSplitContentContainerStyles";
99
*/
1010
const SimpleStyleMasonryFlashList = <T extends any>({
1111
style: styleProp,
12+
data,
1213
...rest
1314
}: Omit<MasonryFlashListProps<T>, "contentContainerStyle">) => {
1415
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
@@ -17,7 +18,8 @@ const SimpleStyleMasonryFlashList = <T extends any>({
1718
const { style, contentContainerStyle } = useSplitContentContainerStyles(
1819
styleProp,
1920
measuredWidth,
20-
measuredHeight
21+
measuredHeight,
22+
[data]
2123
);
2224

2325
return (
@@ -28,6 +30,7 @@ const SimpleStyleMasonryFlashList = <T extends any>({
2830
}}
2931
style={style}
3032
contentContainerStyle={contentContainerStyle as ContentStyle}
33+
data={data}
3134
{...rest}
3235
/>
3336
);

packages/core/src/components/SimpleStyleScrollables/SimpleStyleSectionList.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import useSplitContentContainerStyles from "./useSplitContentContainerStyles";
1212
*/
1313
const SimpleStyleSectionList = <T extends { [key: string]: any }>({
1414
style: styleProp,
15+
data,
1516
...rest
1617
}: Omit<
1718
FlatListSectionListProps<T> | FlashListSectionListProps<T>,
@@ -23,7 +24,8 @@ const SimpleStyleSectionList = <T extends { [key: string]: any }>({
2324
const { style, contentContainerStyle } = useSplitContentContainerStyles(
2425
styleProp,
2526
measuredWidth,
26-
measuredHeight
27+
measuredHeight,
28+
[data]
2729
);
2830

2931
return (
@@ -35,6 +37,7 @@ const SimpleStyleSectionList = <T extends { [key: string]: any }>({
3537
}}
3638
style={style}
3739
contentContainerStyle={contentContainerStyle}
40+
data={data}
3841
{...rest}
3942
/>
4043
);

packages/core/src/components/SimpleStyleScrollables/SimpleStyleSwipeableList.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import useSplitContentContainerStyles from "./useSplitContentContainerStyles";
1212
*/
1313
const SimpleStyleSwipeableList = <T extends { [key: string]: any }>({
1414
style: styleProp,
15+
data,
1516
...rest
1617
}: Omit<
1718
FlashListSwipeableListProps<T> | FlatListSwipeableListProps<T>,
@@ -23,7 +24,8 @@ const SimpleStyleSwipeableList = <T extends { [key: string]: any }>({
2324
const { style, contentContainerStyle } = useSplitContentContainerStyles(
2425
styleProp,
2526
measuredWidth,
26-
measuredHeight
27+
measuredHeight,
28+
[data]
2729
);
2830

2931
return (
@@ -35,6 +37,7 @@ const SimpleStyleSwipeableList = <T extends { [key: string]: any }>({
3537
}}
3638
style={style}
3739
contentContainerStyle={contentContainerStyle}
40+
data={data}
3841
{...rest}
3942
/>
4043
);

packages/core/src/components/SimpleStyleScrollables/useSplitContentContainerStyles.ts

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import React from "react";
12
import { StyleProp, ViewStyle, StyleSheet } from "react-native";
23
import { pick, omit } from "lodash";
34
import { useDeepCompareMemo } from "../../utilities";
@@ -22,13 +23,35 @@ export const contentContainerStyleNames = [
2223
"alignContent",
2324
"flexDirection",
2425
"flexWrap",
26+
"gap",
27+
"columnGap",
28+
"rowGap",
2529
];
2630

2731
export default function useSplitContentContainerStyles(
2832
originalStyle: StyleProp<ViewStyle>,
2933
measuredWidth?: number,
30-
measuredHeight?: number
34+
measuredHeight?: number,
35+
recalculateSizeDeps: React.DependencyList = []
3136
) {
37+
// This temporarily removes contentContainerStyle min sizes whenever some
38+
// given dependencies change to allow the list to properly recalculate it's measured size
39+
const [tempContentContainerStyle, setTempContentContainerStyle] =
40+
React.useState<ViewStyle | null>(null);
41+
42+
React.useEffect(() => {
43+
if (tempContentContainerStyle) {
44+
setTempContentContainerStyle(null);
45+
}
46+
// We only want this to run when measured size changes
47+
// eslint-disable-next-line react-hooks/exhaustive-deps
48+
}, [measuredHeight, measuredWidth]);
49+
50+
React.useEffect(() => {
51+
setTempContentContainerStyle({ minHeight: 0, minWidth: 0 });
52+
// eslint-disable-next-line react-hooks/exhaustive-deps
53+
}, recalculateSizeDeps);
54+
3255
return useDeepCompareMemo<Styles>(() => {
3356
const flattenedStyle = StyleSheet.flatten(originalStyle);
3457

@@ -67,6 +90,12 @@ export default function useSplitContentContainerStyles(
6790
style = { flexGrow: style.flex, ...style };
6891
}
6992

70-
return { style, contentContainerStyle };
71-
}, [originalStyle, measuredWidth, measuredHeight]);
93+
return {
94+
style,
95+
contentContainerStyle: StyleSheet.flatten([
96+
contentContainerStyle,
97+
tempContentContainerStyle,
98+
]),
99+
};
100+
}, [originalStyle, measuredWidth, measuredHeight, tempContentContainerStyle]);
72101
}

0 commit comments

Comments
 (0)