Skip to content

Commit b72a1f3

Browse files
chore: added TrailingIcon prop
1 parent 8195359 commit b72a1f3

File tree

6 files changed

+62
-27
lines changed

6 files changed

+62
-27
lines changed

src/chips/assist-chip/AssistChip.component.tsx

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,31 @@ import {type IconProps} from '../../icons/icon-props';
55
import {getColorStyles, styles} from './assist-chip.styles';
66
import {BaseChip, type BaseChipProps} from '../base-chip/BaseChip.component';
77

8-
export enum LeadingIconType {
8+
export enum IconType {
99
COMMON = 'COMMON',
1010
FAVICON = 'FAVICON',
1111
BRANDED = 'BRANDED',
1212
}
1313

14-
export interface AssistChipProps<T extends IconProps> extends BaseChipProps {
14+
export interface AssistChipProps<T extends IconProps> extends Omit<BaseChipProps, 'leadingIcon' | 'trailingIcon'> {
1515
elevated?: boolean;
1616
LeadingIcon?: React.FC<T>;
17-
leadingIconType?: LeadingIconType;
17+
TrailingIcon?: React.FC<T>;
18+
leadingIconType?: IconType;
19+
trailingIconType?: IconType;
1820
leadingIconProps?: T;
21+
trailingIconProps?: T;
1922
iconSize?: number;
2023
}
2124

2225
export const AssistChip = <T extends IconProps>({
2326
elevated = false,
2427
LeadingIcon,
25-
leadingIconType = LeadingIconType.COMMON,
28+
TrailingIcon,
29+
leadingIconType = IconType.COMMON,
30+
trailingIconType = IconType.COMMON,
2631
leadingIconProps = {} as T,
32+
trailingIconProps = {} as T,
2733
iconSize = 18,
2834
style,
2935
labelStyle,
@@ -33,17 +39,18 @@ export const AssistChip = <T extends IconProps>({
3339
const theme = useTheme();
3440
const colorStyles = useMemo(() => getColorStyles(elevated, disabled, theme), [disabled, elevated, theme]);
3541

36-
const leadingIconPropsMap: Record<LeadingIconType, IconProps> = {
37-
[LeadingIconType.COMMON]: {size: iconSize, color: colorStyles.icon.color},
38-
[LeadingIconType.FAVICON]: {size: iconSize},
39-
[LeadingIconType.BRANDED]: {size: iconSize, style: {opacity: 0.38}},
42+
const iconPropsMap: Record<IconType, IconProps> = {
43+
[IconType.COMMON]: {size: iconSize, color: colorStyles.icon.color},
44+
[IconType.FAVICON]: {size: iconSize},
45+
[IconType.BRANDED]: {size: iconSize, style: {opacity: 0.38}},
4046
};
4147

4248
return (
4349
<BaseChip
4450
style={[elevated && !disabled ? styles.elevatedContainer : styles.outlinedContainer, colorStyles.container, style]}
4551
labelStyle={[colorStyles.label, labelStyle]}
46-
leadingIcon={LeadingIcon ? <LeadingIcon {...leadingIconPropsMap[leadingIconType]} {...leadingIconProps} /> : null}
52+
leadingIcon={LeadingIcon ? <LeadingIcon {...iconPropsMap[leadingIconType]} {...leadingIconProps} /> : null}
53+
trailingIcon={TrailingIcon ? <TrailingIcon {...iconPropsMap[trailingIconType]} {...trailingIconProps} /> : null}
4754
disabled={disabled}
4855
{...props}
4956
/>

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import React, {useMemo} from 'react';
2+
import Animated, {FadeIn, FadeOut, LinearTransition} from 'react-native-reanimated';
23

4+
import {DoneIcon} from '../../icons';
35
import {useTheme} from '../../theme/useTheme.hook';
46
import {type IconProps} from '../../icons/icon-props';
57
import {getDynamicStyles, styles} from './filter-chip.styles';
68
import {BaseChip, type BaseChipProps} from '../base-chip/BaseChip.component';
7-
import {DoneIcon} from '../../icons';
89
import {CircularActivityIndicator} from '../../activity-indicators/circular-activity-indicator/CircularActivityIndicator.component';
9-
import Animated, {FadeIn, FadeOut, LinearTransition} from 'react-native-reanimated';
1010

11-
export interface FilterChipProps<T extends IconProps> extends BaseChipProps {
11+
export interface FilterChipProps<T extends IconProps> extends Omit<BaseChipProps, 'leadingIcon' | 'trailingIcon'> {
1212
elevated?: boolean;
1313
selected?: boolean;
1414
loading?: boolean;
1515
LeadingIcon?: React.FC<T>;
16+
TrailingIcon?: React.FC<T>;
1617
leadingIconProps?: T;
18+
trailingIconProps?: T;
1719
iconSize?: number;
1820
activityIndicatorSize?: number;
1921
}
@@ -23,7 +25,9 @@ export const FilterChip = <T extends IconProps>({
2325
selected = false,
2426
loading = false,
2527
LeadingIcon,
28+
TrailingIcon,
2629
leadingIconProps = {} as T,
30+
trailingIconProps = {} as T,
2731
iconSize = 18,
2832
activityIndicatorSize = 38,
2933
style,
@@ -37,11 +41,18 @@ export const FilterChip = <T extends IconProps>({
3741
const renerCustomLeadingIcon = () =>
3842
LeadingIcon ? (
3943
<Animated.View entering={FadeIn} exiting={FadeOut}>
40-
<LeadingIcon size={iconSize} color={dynamicStyles.leadingIcon.color} {...leadingIconProps} />
44+
<LeadingIcon size={iconSize} color={dynamicStyles.icon.color} {...leadingIconProps} />
4145
</Animated.View>
4246
) : null;
4347

44-
const renderLeadingIcon = () => (selected ? <DoneIcon size={iconSize} color={dynamicStyles.selectedIcon.color} /> : renerCustomLeadingIcon());
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+
);
4556

4657
return (
4758
<Animated.View layout={LinearTransition}>
@@ -51,6 +62,7 @@ export const FilterChip = <T extends IconProps>({
5162
leadingIcon={
5263
loading ? <CircularActivityIndicator size={activityIndicatorSize} style={{height: iconSize, width: iconSize}} /> : renderLeadingIcon()
5364
}
65+
trailingIcon={TrailingIcon ? <TrailingIcon size={18} color={dynamicStyles.icon.color} {...trailingIconProps} /> : null}
5466
disabled={disabled}
5567
{...props}
5668
/>

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ export const getDynamicStyles = (selected: boolean, elevated: boolean, disabled:
2525
const [disabledUnselectedBackgroundColorByType, disabledUnselectedBorderColorByType] = elevated
2626
? [containerDisabledColor, 'transparent']
2727
: ['transparent', containerDisabledColor];
28+
const [disabledBackgroundColor, disabledBorderColor] = selected
29+
? [containerDisabledColor, 'transparent']
30+
: [disabledUnselectedBackgroundColorByType, disabledUnselectedBorderColorByType];
2831
const enabledBackgroundColorByType = elevated ? theme.surfaceContainer.backgroundLow : 'transparent';
32+
const [enabledBackgroundColor, enabledBorderColor] = selected
33+
? [theme.secondaryContainer.background, theme.secondaryContainer.background]
34+
: [enabledBackgroundColorByType, theme.outline];
2935

3036
return StyleSheet.create(
3137
disabled
@@ -34,10 +40,10 @@ export const getDynamicStyles = (selected: boolean, elevated: boolean, disabled:
3440
color: labelDisabledColor,
3541
},
3642
container: {
37-
borderColor: selected ? 'transparent' : disabledUnselectedBorderColorByType,
38-
backgroundColor: selected ? containerDisabledColor : disabledUnselectedBackgroundColorByType,
43+
borderColor: disabledBorderColor,
44+
backgroundColor: disabledBackgroundColor,
3945
},
40-
leadingIcon: {
46+
icon: {
4147
color: labelDisabledColor,
4248
},
4349
selectedIcon: {
@@ -49,11 +55,11 @@ export const getDynamicStyles = (selected: boolean, elevated: boolean, disabled:
4955
color: theme.surface.text,
5056
},
5157
container: {
52-
borderColor: theme.outline,
53-
borderWidth: Number(!selected && !elevated),
54-
backgroundColor: selected ? theme.secondaryContainer.background : enabledBackgroundColorByType,
58+
borderColor: enabledBorderColor,
59+
borderWidth: 1,
60+
backgroundColor: enabledBackgroundColor,
5561
},
56-
leadingIcon: {
62+
icon: {
5763
color: theme.primary.background,
5864
},
5965
selectedIcon: {

src/chips/input-chip/InputChip.component.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,25 @@ import {useTheme} from '../../theme/useTheme.hook';
77
import {type IconProps} from '../../icons/icon-props';
88
import {BaseChip, type BaseChipProps} from '../base-chip/BaseChip.component';
99

10-
export interface InputChipProps<T extends IconProps> extends BaseChipProps {
10+
export interface InputChipProps<T extends IconProps> extends Omit<BaseChipProps, 'leadingIcon' | 'trailingIcon'> {
1111
selected?: boolean;
1212
imageUrl?: string;
1313
LeadingIcon?: React.FC<T>;
14+
TrailingIcon?: React.FC<T>;
1415
leadingIconProps?: T;
15-
hasTrailingIcon?: boolean;
16+
trailingIconProps?: T;
17+
hasDefaultTrailingIcon?: boolean;
1618
iconSize?: number;
1719
}
1820

1921
export const InputChip = <T extends IconProps>({
2022
selected = false,
2123
LeadingIcon,
24+
TrailingIcon,
2225
imageUrl,
23-
hasTrailingIcon = true,
2426
leadingIconProps = {} as T,
27+
trailingIconProps = {} as T,
28+
hasDefaultTrailingIcon = true,
2529
style,
2630
labelStyle,
2731
iconSize = 18,
@@ -47,13 +51,14 @@ export const InputChip = <T extends IconProps>({
4751
);
4852

4953
const renderLeadingAvatar = () => (imageUrl ? <Image style={styles.leadingImage} source={{uri: imageUrl}} /> : null);
54+
const renderDefaultTrailingIcon = () => (hasDefaultTrailingIcon ? <CloseIcon size={iconSize} color={onContainerColor} /> : null);
5055

5156
return (
5257
<BaseChip
5358
style={[dynamicStyles.container, imageUrl ? styles.chipWithAvatarContainer : [], style]}
5459
labelStyle={[dynamicStyles.label, labelStyle]}
5560
leadingIcon={LeadingIcon ? <LeadingIcon size={iconSize} color={primary.background} {...leadingIconProps} /> : renderLeadingAvatar()}
56-
trailingIcon={hasTrailingIcon ? <CloseIcon size={iconSize} color={onContainerColor} /> : null}
61+
trailingIcon={TrailingIcon ? <TrailingIcon size={iconSize} color={onContainerColor} {...trailingIconProps} /> : renderDefaultTrailingIcon()}
5762
{...props}
5863
/>
5964
);

src/chips/suggestion-chip/SuggestionChip.component.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,22 @@ import {type IconProps} from '../../icons/icon-props';
55
import {getDynamicStyles, styles} from './suggestion-chip.styles';
66
import {BaseChip, type BaseChipProps} from '../base-chip/BaseChip.component';
77

8-
export interface SuggestionChipProps<T extends IconProps> extends BaseChipProps {
8+
export interface SuggestionChipProps<T extends IconProps> extends Omit<BaseChipProps, 'leadingIcon' | 'trailingIcon'> {
99
elevated?: boolean;
1010
selected?: boolean;
1111
LeadingIcon?: React.FC<T>;
12+
TrailingIcon?: React.FC<T>;
1213
leadingIconProps?: T;
14+
trailingIconProps?: T;
1315
}
1416

1517
export const SuggestionChip = <T extends IconProps>({
1618
elevated = false,
1719
selected = false,
1820
LeadingIcon,
21+
TrailingIcon,
1922
leadingIconProps = {} as T,
23+
trailingIconProps = {} as T,
2024
style,
2125
labelStyle,
2226
disabled = false,
@@ -30,6 +34,7 @@ export const SuggestionChip = <T extends IconProps>({
3034
style={[elevated && !disabled ? styles.elevatedContainer : styles.outlinedContainer, dynamicStyles.container, style]}
3135
labelStyle={[dynamicStyles.label, labelStyle]}
3236
leadingIcon={LeadingIcon ? <LeadingIcon size={18} color={dynamicStyles.icon.color} {...leadingIconProps} /> : null}
37+
trailingIcon={TrailingIcon ? <TrailingIcon size={18} color={dynamicStyles.icon.color} {...trailingIconProps} /> : null}
3338
disabled={disabled}
3439
{...props}
3540
/>

src/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export {Divider, type DividerProps} from './divider/Divider.component';
77
export {InputChip, type InputChipProps} from './chips/input-chip/InputChip.component';
88
export {FilterChip, type FilterChipProps} from './chips/filter-chip/FilterChip.component';
99
export {SuggestionChip, type SuggestionChipProps} from './chips/suggestion-chip/SuggestionChip.component';
10-
export {AssistChip, type AssistChipProps, LeadingIconType} from './chips/assist-chip/AssistChip.component';
10+
export {AssistChip, type AssistChipProps, IconType} from './chips/assist-chip/AssistChip.component';
1111

1212
export {
1313
CenterAlignedTopAppBar,

0 commit comments

Comments
 (0)