Skip to content

Commit 4d55b25

Browse files
author
Pierre Poupin
authored
chore: refactor example components part 2 (#151)
* chore(example): fix weird size behaviours * chore(example): take out isItemLarge function * chore(example): extract itemSize function * chore(example): pass list size as props
1 parent 7242ba8 commit 4d55b25

5 files changed

Lines changed: 42 additions & 24 deletions

File tree

packages/example/src/design-system/theme/sizes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { scaledPixels } from '../helpers/scaledPixels';
22

33
export const sizes = {
44
program: {
5-
landscape: { width: scaledPixels(250), height: scaledPixels(200) },
5+
landscape: { width: scaledPixels(450), height: scaledPixels(200) },
66
portrait: { width: scaledPixels(200), height: scaledPixels(250) },
77
long: { width: scaledPixels(416), height: scaledPixels(250) },
88
},

packages/example/src/modules/program/view/Program.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const ProgramContainer = styled(Animated.View)<{
5151
height: theme.sizes.program.portrait.height, // Height is the same for both variants
5252
width:
5353
variant === 'landscape'
54-
? theme.sizes.program.landscape.width * 2
54+
? theme.sizes.program.landscape.width
5555
: theme.sizes.program.portrait.width,
5656
overflow: 'hidden',
5757
borderRadius: 20,

packages/example/src/modules/program/view/ProgramList.tsx

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,32 @@ const NUMBER_OF_ITEMS_VISIBLE_ON_SCREEN = 7;
2121
const WINDOW_SIZE = NUMBER_OF_ITEMS_VISIBLE_ON_SCREEN + 8;
2222
const ROW_PADDING = scaledPixels(70);
2323

24+
const GAP_BETWEEN_ELEMENTS = scaledPixels(30);
25+
2426
type ProgramListProps = {
2527
orientation?: 'vertical' | 'horizontal';
2628
containerStyle?: object;
2729
listRef?: MutableRefObject<SpatialNavigationVirtualizedListRef>;
2830
data?: ProgramInfo[];
31+
listSize?: number;
2932
variant?: 'normal' | 'variable-size';
3033
};
3134

35+
const isItemLarge = (item: { id: string }) => {
36+
return parseInt(item.id, 10) % 2 === 0; // Arbitrary condition to decide size
37+
};
38+
3239
export const ProgramList = ({
3340
orientation = 'horizontal',
3441
containerStyle,
3542
listRef,
3643
data,
3744
variant = 'normal',
45+
listSize = 1000,
3846
}: ProgramListProps) => {
3947
const navigation = useNavigation<NativeStackNavigationProp<RootStackParamList>>();
4048
const theme = useTheme();
4149

42-
const isItemLarge = useCallback((item: ProgramInfo) => {
43-
return parseInt(item.id, 10) % 2 === 0; // Arbitrary condition to decide size
44-
}, []);
45-
4650
const renderItem = useCallback(
4751
({ item, index }: { item: ProgramInfo; index: number }) => (
4852
<ProgramNode
@@ -52,12 +56,23 @@ export const ProgramList = ({
5256
variant={variant === 'variable-size' && isItemLarge(item) ? 'landscape' : 'portrait'}
5357
/>
5458
),
55-
[navigation, isItemLarge, variant],
59+
[navigation, variant],
5660
);
5761

58-
const programInfos = useMemo(
59-
() => data ?? getPrograms(variant === 'variable-size' ? 10 : 1000),
60-
[data, variant],
62+
const programInfos = useMemo(() => data ?? getPrograms(listSize), [data, listSize]);
63+
64+
const itemSize = useMemo(
65+
() => {
66+
if (variant === 'normal') {
67+
return theme.sizes.program.portrait.width + GAP_BETWEEN_ELEMENTS;
68+
}
69+
70+
return (item: ProgramInfo) =>
71+
isItemLarge(item)
72+
? theme.sizes.program.landscape.width + GAP_BETWEEN_ELEMENTS
73+
: theme.sizes.program.portrait.width + GAP_BETWEEN_ELEMENTS;
74+
}, // Default item size for "normal"
75+
[theme.sizes.program.landscape.width, theme.sizes.program.portrait.width, variant],
6176
);
6277

6378
return (
@@ -68,14 +83,7 @@ export const ProgramList = ({
6883
orientation={orientation}
6984
data={programInfos}
7085
renderItem={renderItem}
71-
itemSize={
72-
variant === 'variable-size'
73-
? (item: ProgramInfo) =>
74-
isItemLarge(item)
75-
? theme.sizes.program.landscape.width * 2 + 45
76-
: theme.sizes.program.portrait.width + 30
77-
: theme.sizes.program.portrait.width + 30 // Default item size for "normal"
78-
}
86+
itemSize={itemSize}
7987
numberOfRenderedItems={WINDOW_SIZE}
8088
numberOfItemsVisibleOnScreen={NUMBER_OF_ITEMS_VISIBLE_ON_SCREEN}
8189
onEndReachedThresholdItemsNumber={NUMBER_OF_ITEMS_VISIBLE_ON_SCREEN}
@@ -95,10 +103,12 @@ export const ProgramsRow = ({
95103
containerStyle,
96104
listRef,
97105
variant = 'normal',
106+
listSize,
98107
}: {
99108
containerStyle?: object;
100109
listRef?: MutableRefObject<SpatialNavigationVirtualizedListRef>;
101110
variant?: 'normal' | 'variable-size';
111+
listSize?: number;
102112
}) => {
103113
const theme = useTheme();
104114
return (
@@ -109,6 +119,7 @@ export const ProgramsRow = ({
109119
}}
110120
listRef={listRef}
111121
variant={variant}
122+
listSize={listSize}
112123
/>
113124
);
114125
};

packages/example/src/modules/program/view/ProgramListWithTitle.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,29 @@ import { SpatialNavigationVirtualizedListRef } from '../../../../../lib/src/spat
88
type Props = {
99
title: string;
1010
listRef?: MutableRefObject<SpatialNavigationVirtualizedListRef>;
11+
listSize?: number;
1112
};
1213

13-
export const ProgramListWithTitle = ({ title, listRef }: Props) => {
14+
export const ProgramListWithTitle = ({ title, listRef, listSize }: Props) => {
1415
return (
1516
<Box direction="vertical">
1617
<Typography variant="body" fontWeight="strong">
1718
{title}
1819
</Typography>
1920
<Spacer direction="vertical" gap="$2" />
20-
<ProgramsRow listRef={listRef ?? null} />
21+
<ProgramsRow listRef={listRef ?? null} listSize={listSize} />
2122
</Box>
2223
);
2324
};
2425

25-
export const ProgramListWithTitleAndVariableSizes = ({ title }: Props) => {
26+
export const ProgramListWithTitleAndVariableSizes = ({ title, listSize }: Props) => {
2627
return (
2728
<Box direction="vertical">
2829
<Typography variant="body" fontWeight="strong">
2930
{title}
3031
</Typography>
3132
<Spacer direction="vertical" gap="$2" />
32-
<ProgramsRow variant="variable-size" />
33+
<ProgramsRow variant="variable-size" listSize={listSize} />
3334
</Box>
3435
);
3536
};

packages/example/src/pages/Home.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,15 @@ export const Home = () => {
3535
<Spacer gap="$6" />
3636
<ProgramListWithTitle title="You may also like..." />
3737
<Spacer gap="$6" />
38-
<ProgramListWithTitleAndVariableSizes title="Our selection"></ProgramListWithTitleAndVariableSizes>
38+
<ProgramListWithTitleAndVariableSizes
39+
listSize={10}
40+
title="Our selection"
41+
></ProgramListWithTitleAndVariableSizes>
3942
<Spacer gap="$6" />
40-
<ProgramListWithTitleAndVariableSizes title="Oscar Winners"></ProgramListWithTitleAndVariableSizes>
43+
<ProgramListWithTitleAndVariableSizes
44+
listSize={100}
45+
title="Oscar Winners"
46+
></ProgramListWithTitleAndVariableSizes>
4147
<Spacer gap="$6" />
4248
<ProgramListWithTitleAndVariableSizes title="Child section"></ProgramListWithTitleAndVariableSizes>
4349
</Box>

0 commit comments

Comments
 (0)