Skip to content

Commit 1e87d04

Browse files
chore: moved filter chip leading icon to separate component
1 parent 4ba6aba commit 1e87d04

File tree

3 files changed

+50
-20
lines changed

3 files changed

+50
-20
lines changed

src/chips/filter-chip/FilterChip.component.tsx

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import React, {useMemo} from 'react';
2-
import Animated, {FadeIn, FadeOut, LinearTransition} from 'react-native-reanimated';
2+
import Animated, {LinearTransition} from 'react-native-reanimated';
33

4-
import {DoneIcon} from '../../icons';
54
import {useTheme} from '../../theme/useTheme.hook';
65
import {type IconProps} from '../../icons/icon-props';
76
import {getDynamicStyles, styles} from './filter-chip.styles';
87
import {BaseChip, type BaseChipProps} from '../base-chip/BaseChip.component';
98
import {CircularActivityIndicator} from '../../activity-indicators/circular-activity-indicator/CircularActivityIndicator.component';
9+
import {FilterChipLeadingIcon} from './leading-icon/FilterChipLeadingIcon.component';
1010

1111
export interface FilterChipProps<T extends IconProps> extends Omit<BaseChipProps, 'leadingIcon' | 'trailingIcon'> {
1212
elevated?: boolean;
@@ -38,30 +38,25 @@ export const FilterChip = <T extends IconProps>({
3838
const theme = useTheme();
3939
const dynamicStyles = useMemo(() => getDynamicStyles(selected, elevated, disabled, theme), [disabled, elevated, selected, theme]);
4040

41-
const renerCustomLeadingIcon = () =>
42-
LeadingIcon ? (
43-
<Animated.View entering={FadeIn} exiting={FadeOut}>
44-
<LeadingIcon size={iconSize} color={dynamicStyles.icon.color} {...leadingIconProps} />
45-
</Animated.View>
46-
) : null;
47-
48-
const renderLeadingIcon = () =>
49-
selected ? (
50-
<Animated.View entering={FadeIn} exiting={FadeOut}>
51-
<DoneIcon size={iconSize} color={dynamicStyles.selectedIcon.color} />
52-
</Animated.View>
53-
) : (
54-
renerCustomLeadingIcon()
55-
);
41+
const leadingIcon = loading ? (
42+
<CircularActivityIndicator size={activityIndicatorSize} style={{height: iconSize, width: iconSize}} />
43+
) : (
44+
<FilterChipLeadingIcon
45+
size={iconSize}
46+
selected={selected}
47+
customLeadingIcon={LeadingIcon}
48+
color={dynamicStyles.icon.color}
49+
selectedColor={dynamicStyles.selectedIcon.color}
50+
leadingIconProps={leadingIconProps}
51+
/>
52+
);
5653

5754
return (
5855
<Animated.View layout={LinearTransition}>
5956
<BaseChip
6057
style={[elevated && !disabled ? styles.elevatedContainer : styles.outlinedContainer, dynamicStyles.container, style]}
6158
labelStyle={[dynamicStyles.label, labelStyle]}
62-
leadingIcon={
63-
loading ? <CircularActivityIndicator size={activityIndicatorSize} style={{height: iconSize, width: iconSize}} /> : renderLeadingIcon()
64-
}
59+
leadingIcon={leadingIcon}
6560
trailingIcon={TrailingIcon ? <TrailingIcon size={18} color={dynamicStyles.icon.color} {...trailingIconProps} /> : null}
6661
disabled={disabled}
6762
{...props}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import React from 'react';
2+
import {type ViewProps, type ColorValue} from 'react-native';
3+
import Animated, {FadeIn, FadeOut, type AnimatedProps} from 'react-native-reanimated';
4+
5+
import {DoneIcon} from '../../../icons';
6+
import {type IconProps} from '../../../icons/icon-props';
7+
8+
export interface FilterChipLeadingIconProps<T> extends AnimatedProps<ViewProps> {
9+
size: number;
10+
selected: boolean;
11+
color: ColorValue;
12+
selectedColor: ColorValue;
13+
14+
leadingIconProps?: T;
15+
customLeadingIcon?: React.FC<T>;
16+
}
17+
18+
export const FilterChipLeadingIcon = <T extends IconProps>({
19+
size,
20+
color,
21+
selected,
22+
selectedColor,
23+
customLeadingIcon,
24+
leadingIconProps = {} as T,
25+
}: FilterChipLeadingIconProps<T>) => {
26+
const CustomLeadingIcon = customLeadingIcon;
27+
28+
const renderUnselectedLeadingIcon = () => (CustomLeadingIcon ? <CustomLeadingIcon size={size} color={color} {...leadingIconProps} /> : null);
29+
30+
return (
31+
<Animated.View entering={FadeIn} exiting={FadeOut}>
32+
{selected ? <DoneIcon size={size} color={selectedColor} /> : renderUnselectedLeadingIcon()}
33+
</Animated.View>
34+
);
35+
};

src/chips/filter-chip/leading-icon/filter-chip-leading-icon.styles.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)