Skip to content

Commit df65124

Browse files
committed
feat: rendering and memoizing custom tile if renderTile is supplied
1 parent e35bc99 commit df65124

File tree

1 file changed

+31
-12
lines changed

1 file changed

+31
-12
lines changed

src/index.tsx

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ const SegmentedControl: React.FC<SegmentedControlProps> = ({
123123
activeBadgeStyle,
124124
inactiveBadgeStyle,
125125
badgeTextStyle,
126+
renderTile,
126127
}: SegmentedControlProps) => {
127128
const width = widthPercentageToDP('100%') - containerMargin * 2;
128129
const translateValue = width / segments.length;
@@ -190,22 +191,40 @@ const SegmentedControl: React.FC<SegmentedControlProps> = ({
190191
...badgeTextStyle,
191192
};
192193

194+
const flattenedTileStyle: ViewStyle = StyleSheet.flatten<ViewStyle>([
195+
styles.movingSegmentStyle,
196+
defaultShadowStyle,
197+
StyleSheet.absoluteFill,
198+
{
199+
width: width / segments.length - 4,
200+
},
201+
tileStyle,
202+
]);
203+
204+
const memoizedTile = React.useMemo<React.ReactNode>(() => {
205+
if (renderTile) {
206+
return renderTile({
207+
style: flattenedTileStyle,
208+
transform: tabTranslateAnimatedStyles.transform,
209+
width: translateValue,
210+
});
211+
}
212+
213+
return (
214+
<Animated.View style={[flattenedTileStyle, tabTranslateAnimatedStyles]} />
215+
);
216+
}, [
217+
flattenedTileStyle,
218+
renderTile,
219+
tabTranslateAnimatedStyles,
220+
translateValue,
221+
]);
222+
193223
return (
194224
<Animated.View
195225
style={[styles.defaultSegmentedControlWrapper, segmentedControlWrapper]}
196226
>
197-
<Animated.View
198-
style={[
199-
styles.movingSegmentStyle,
200-
defaultShadowStyle,
201-
tileStyle,
202-
StyleSheet.absoluteFill,
203-
{
204-
width: width / segments.length - 4,
205-
},
206-
tabTranslateAnimatedStyles,
207-
]}
208-
/>
227+
{memoizedTile}
209228
{segments.map((segment, index) => {
210229
return (
211230
<Pressable

0 commit comments

Comments
 (0)