Skip to content

Commit 5ec128f

Browse files
authored
Simplify calculation of SimpleStyle scrollable components styles (#876)
1 parent 42d7e81 commit 5ec128f

File tree

8 files changed

+19
-136
lines changed

8 files changed

+19
-136
lines changed

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,11 @@ const SimpleStyleFlashList = <T extends any>({
1212
data,
1313
...rest
1414
}: Omit<FlashListProps<T>, "contentContainerStyle">) => {
15-
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
16-
const [measuredHeight, setMeasuredHeight] = React.useState<number>();
17-
18-
const { style, contentContainerStyle } = useSplitContentContainerStyles(
19-
styleProp,
20-
measuredWidth,
21-
measuredHeight,
22-
[data]
23-
);
15+
const { style, contentContainerStyle } =
16+
useSplitContentContainerStyles(styleProp);
2417

2518
return (
2619
<FlashList
27-
onLayout={(event) => {
28-
setMeasuredWidth(event.nativeEvent.layout.width);
29-
setMeasuredHeight(event.nativeEvent.layout.height);
30-
}}
3120
style={style}
3221
contentContainerStyle={contentContainerStyle as ContentStyle}
3322
data={data}

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,11 @@ const SimpleStyleFlatList = <T extends any>({
1212
data,
1313
...rest
1414
}: Omit<FlatListProps<T>, "contentContainerStyle">) => {
15-
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
16-
const [measuredHeight, setMeasuredHeight] = React.useState<number>();
17-
18-
const { style, contentContainerStyle } = useSplitContentContainerStyles(
19-
styleProp,
20-
measuredWidth,
21-
measuredHeight,
22-
[data]
23-
);
15+
const { style, contentContainerStyle } =
16+
useSplitContentContainerStyles(styleProp);
2417

2518
return (
2619
<FlatList
27-
onLayout={(event) => {
28-
setMeasuredWidth(event.nativeEvent.layout.width);
29-
setMeasuredHeight(event.nativeEvent.layout.height);
30-
}}
3120
style={style}
3221
contentContainerStyle={contentContainerStyle}
3322
data={data}

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

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,11 @@ import useSplitContentContainerStyles from "./useSplitContentContainerStyles";
1010
const SimpleStyleKeyboardAwareScrollView: React.FC<
1111
Omit<KeyboardAwareScrollViewProps, "contentContainerStyle">
1212
> = ({ style: styleProp, ...rest }) => {
13-
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
14-
const [measuredHeight, setMeasuredHeight] = React.useState<number>();
15-
16-
const { style, contentContainerStyle } = useSplitContentContainerStyles(
17-
styleProp,
18-
measuredWidth,
19-
measuredHeight
20-
);
13+
const { style, contentContainerStyle } =
14+
useSplitContentContainerStyles(styleProp);
2115

2216
return (
2317
<KeyboardAwareScrollView
24-
onLayout={(event) => {
25-
setMeasuredWidth(event.nativeEvent.layout.width);
26-
setMeasuredHeight(event.nativeEvent.layout.height);
27-
}}
2818
style={style}
2919
contentContainerStyle={contentContainerStyle}
3020
{...rest}

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,11 @@ const SimpleStyleMasonryFlashList = <T extends any>({
1212
data,
1313
...rest
1414
}: Omit<MasonryFlashListProps<T>, "contentContainerStyle">) => {
15-
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
16-
const [measuredHeight, setMeasuredHeight] = React.useState<number>();
17-
18-
const { style, contentContainerStyle } = useSplitContentContainerStyles(
19-
styleProp,
20-
measuredWidth,
21-
measuredHeight,
22-
[data]
23-
);
15+
const { style, contentContainerStyle } =
16+
useSplitContentContainerStyles(styleProp);
2417

2518
return (
2619
<MasonryFlashList
27-
onLayout={(event) => {
28-
setMeasuredWidth(event.nativeEvent.layout.width);
29-
setMeasuredHeight(event.nativeEvent.layout.height);
30-
}}
3120
style={style}
3221
contentContainerStyle={contentContainerStyle as ContentStyle}
3322
data={data}

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

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,11 @@ import useSplitContentContainerStyles from "./useSplitContentContainerStyles";
1010
const SimpleStyleScrollView: React.FC<
1111
Omit<ScrollViewProps, "contentContainerStyle">
1212
> = ({ style: styleProp, ...rest }) => {
13-
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
14-
const [measuredHeight, setMeasuredHeight] = React.useState<number>();
15-
16-
const { style, contentContainerStyle } = useSplitContentContainerStyles(
17-
styleProp,
18-
measuredWidth,
19-
measuredHeight
20-
);
13+
const { style, contentContainerStyle } =
14+
useSplitContentContainerStyles(styleProp);
2115

2216
return (
2317
<ScrollView
24-
onLayout={(event) => {
25-
setMeasuredWidth(event.nativeEvent.layout.width);
26-
setMeasuredHeight(event.nativeEvent.layout.height);
27-
}}
2818
style={style}
2919
contentContainerStyle={contentContainerStyle}
3020
{...rest}

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,12 @@ const SimpleStyleSectionList = <T extends { [key: string]: any }>({
1818
FlatListSectionListProps<T> | FlashListSectionListProps<T>,
1919
"contentContainerStyle"
2020
>) => {
21-
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
22-
const [measuredHeight, setMeasuredHeight] = React.useState<number>();
23-
24-
const { style, contentContainerStyle } = useSplitContentContainerStyles(
25-
styleProp,
26-
measuredWidth,
27-
measuredHeight,
28-
[data]
29-
);
21+
const { style, contentContainerStyle } =
22+
useSplitContentContainerStyles(styleProp);
3023

3124
return (
3225
//@ts-ignore contentContainerStyle has different types for FlashList and FlatList implmentations and confuses TS
3326
<SectionList
34-
onLayout={(event) => {
35-
setMeasuredWidth(event.nativeEvent.layout.width);
36-
setMeasuredHeight(event.nativeEvent.layout.height);
37-
}}
3827
style={style}
3928
contentContainerStyle={contentContainerStyle}
4029
data={data}

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,12 @@ const SimpleStyleSwipeableList = <T extends { [key: string]: any }>({
1818
FlashListSwipeableListProps<T> | FlatListSwipeableListProps<T>,
1919
"contentContainerStyle"
2020
>) => {
21-
const [measuredWidth, setMeasuredWidth] = React.useState<number>();
22-
const [measuredHeight, setMeasuredHeight] = React.useState<number>();
23-
24-
const { style, contentContainerStyle } = useSplitContentContainerStyles(
25-
styleProp,
26-
measuredWidth,
27-
measuredHeight,
28-
[data]
29-
);
21+
const { style, contentContainerStyle } =
22+
useSplitContentContainerStyles(styleProp);
3023

3124
return (
3225
//@ts-ignore contentContainerStyle has different types for FlashList and FlatList implmentations and confuses TS
3326
<SwipeableList
34-
onLayout={(event) => {
35-
setMeasuredWidth(event.nativeEvent.layout.width);
36-
setMeasuredHeight(event.nativeEvent.layout.height);
37-
}}
3827
style={style}
3928
contentContainerStyle={contentContainerStyle}
4029
data={data}
Lines changed: 5 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import React from "react";
21
import { StyleProp, ViewStyle, StyleSheet } from "react-native";
32
import { pick, omit } from "lodash";
43
import { useDeepCompareMemo } from "../../utilities";
@@ -29,56 +28,18 @@ export const contentContainerStyleNames = [
2928
];
3029

3130
export default function useSplitContentContainerStyles(
32-
originalStyle: StyleProp<ViewStyle>,
33-
measuredWidth?: number,
34-
measuredHeight?: number,
35-
recalculateSizeDeps: React.DependencyList = []
31+
originalStyle: StyleProp<ViewStyle>
3632
) {
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-
5533
return useDeepCompareMemo<Styles>(() => {
5634
const flattenedStyle = StyleSheet.flatten(originalStyle);
5735

58-
let contentContainerStyle = pick(
36+
const contentContainerStyle = pick(
5937
flattenedStyle,
6038
contentContainerStyleNames
6139
);
6240

63-
const leftBorderWidth =
64-
flattenedStyle?.borderLeftWidth ?? flattenedStyle?.borderWidth ?? 0;
65-
const rightBorderWidth =
66-
flattenedStyle?.borderRightWidth ?? flattenedStyle?.borderWidth ?? 0;
67-
const topBorderWidth =
68-
flattenedStyle?.borderTopWidth ?? flattenedStyle?.borderWidth ?? 0;
69-
const bottomBorderWidth =
70-
flattenedStyle?.borderBottomWidth ?? flattenedStyle?.borderWidth ?? 0;
71-
7241
// contentContainerStyle should always at least fill the parent to ensure sizing changes reflects properly on component and children.
73-
// The measured sizes include borders, so we need to subtract those before applying
74-
if (measuredWidth) {
75-
contentContainerStyle.minWidth =
76-
measuredWidth - leftBorderWidth - rightBorderWidth;
77-
}
78-
if (measuredHeight) {
79-
contentContainerStyle.minHeight =
80-
measuredHeight - topBorderWidth - bottomBorderWidth;
81-
}
42+
contentContainerStyle.flexGrow = 1;
8243

8344
let style = omit(flattenedStyle, contentContainerStyleNames);
8445

@@ -92,10 +53,7 @@ export default function useSplitContentContainerStyles(
9253

9354
return {
9455
style,
95-
contentContainerStyle: StyleSheet.flatten([
96-
contentContainerStyle,
97-
tempContentContainerStyle,
98-
]),
56+
contentContainerStyle,
9957
};
100-
}, [originalStyle, measuredWidth, measuredHeight, tempContentContainerStyle]);
58+
}, [originalStyle]);
10159
}

0 commit comments

Comments
 (0)