Skip to content

Commit 4a5c4cd

Browse files
committed
refactor: avatar
1 parent 0984951 commit 4a5c4cd

File tree

8 files changed

+89
-47
lines changed

8 files changed

+89
-47
lines changed
Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
1-
import { computed, inject } from 'vue';
2-
import { defaultConfigProvider } from '../../config-provider';
1+
import { computed, ComputedRef, inject, UnwrapRef } from 'vue';
2+
import {
3+
ConfigProviderProps,
4+
defaultConfigProvider,
5+
Direction,
6+
SizeType,
7+
} from '../../config-provider';
38

4-
export default (name: string, props: Record<any, any>) => {
5-
const configProvider = inject('configProvider', defaultConfigProvider);
9+
export default (
10+
name: string,
11+
props: Record<any, any>,
12+
): {
13+
configProvider: UnwrapRef<ConfigProviderProps>;
14+
prefixCls: ComputedRef<string>;
15+
direction: ComputedRef<Direction>;
16+
size: ComputedRef<SizeType>;
17+
} => {
18+
const configProvider = inject<UnwrapRef<ConfigProviderProps>>(
19+
'configProvider',
20+
defaultConfigProvider,
21+
);
622
const prefixCls = computed(() => configProvider.getPrefixCls(name, props.prefixCls));
7-
return { configProvider, prefixCls };
23+
const direction = computed(() => configProvider.direction);
24+
const size = computed(() => props.size || configProvider.componentSize);
25+
return { configProvider, prefixCls, direction, size };
826
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { computed, ComputedRef, inject } from 'vue';
2+
import { defaultConfigProvider } from '../../config-provider';
3+
4+
export default (name: string, props: Record<any, any>): ComputedRef<string> => {
5+
const configProvider = inject('configProvider', defaultConfigProvider);
6+
const prefixCls = computed(() => configProvider.getPrefixCls(name, props.prefixCls));
7+
return prefixCls;
8+
};

components/_util/responsiveObserve.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export type Breakpoint = 'xxl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs';
2-
export type BreakpointMap = Partial<Record<Breakpoint, string>>;
2+
export type BreakpointMap = Record<Breakpoint, string>;
33
export type ScreenMap = Partial<Record<Breakpoint, boolean>>;
44
export type ScreenSizeMap = Partial<Record<Breakpoint, number>>;
55

@@ -44,15 +44,15 @@ const responsiveObserve = {
4444
},
4545
unregister() {
4646
Object.keys(responsiveMap).forEach((screen: string) => {
47-
const matchMediaQuery = responsiveMap[screen]!;
47+
const matchMediaQuery = responsiveMap[screen];
4848
const handler = this.matchHandlers[matchMediaQuery];
4949
handler?.mql.removeListener(handler?.listener);
5050
});
5151
subscribers.clear();
5252
},
5353
register() {
5454
Object.keys(responsiveMap).forEach((screen: string) => {
55-
const matchMediaQuery = responsiveMap[screen]!;
55+
const matchMediaQuery = responsiveMap[screen];
5656
const listener = ({ matches }: { matches: boolean }) => {
5757
this.dispatch({
5858
...screens,

components/avatar/Avatar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export type AvatarSize = 'large' | 'small' | 'default' | number | ScreenSizeMap;
2222

2323
export const avatarProps = {
2424
prefixCls: PropTypes.string,
25-
shape: PropTypes.oneOf(tuple('circle', 'square')),
25+
shape: PropTypes.oneOf(tuple('circle', 'square')).def('circle'),
2626
size: {
2727
type: [Number, String, Object] as PropType<AvatarSize>,
2828
default: (): AvatarSize => 'default',

components/avatar/Group.tsx

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,11 @@
1-
import toArray from 'lodash/toArray';
21
import { cloneElement } from '../_util/vnode';
3-
import { defaultConfigProvider } from '../config-provider';
4-
import Avatar, { avatarProps } from './Avatar';
2+
import Avatar, { avatarProps, AvatarSize } from './Avatar';
53
import Popover from '../popover';
6-
import {
7-
computed,
8-
defineComponent,
9-
inject,
10-
provide,
11-
PropType,
12-
ExtractPropTypes,
13-
CSSProperties,
14-
} from 'vue';
4+
import { defineComponent, provide, PropType, ExtractPropTypes, CSSProperties } from 'vue';
155
import PropTypes from '../_util/vue-types';
16-
import { getPropsSlot } from '../_util/props-util';
6+
import { flattenChildren, getPropsSlot } from '../_util/props-util';
177
import { tuple } from '../_util/type';
8+
import useConfigInject from '../_util/hooks/useConfigInject';
189

1910
const groupProps = {
2011
prefixCls: PropTypes.string,
@@ -31,39 +22,30 @@ const groupProps = {
3122
size: avatarProps.size,
3223
};
3324

34-
export type AvatarGroupProps = Partial<ExtractPropTypes<typeof groupProps>>;
25+
export type AvatarGroupProps = Partial<ExtractPropTypes<typeof groupProps>> & {
26+
size?: AvatarSize;
27+
};
3528

3629
const Group = defineComponent({
3730
name: 'AAvatarGroup',
3831
props: groupProps,
3932
inheritAttrs: false,
4033
setup(props, { slots, attrs }) {
41-
const configProvider = inject('configProvider', defaultConfigProvider);
34+
const { prefixCls, direction, size } = useConfigInject('avatar-group', props);
4235

43-
provide(
44-
'SizeProvider',
45-
computed(() => props.size || configProvider.componentSize),
46-
);
36+
provide('SizeProvider', size);
4737

4838
return () => {
49-
const {
50-
prefixCls: customizePrefixCls,
51-
maxPopoverPlacement = 'top',
52-
maxCount,
53-
maxStyle,
54-
} = props;
55-
56-
const { getPrefixCls } = configProvider;
57-
const prefixCls = getPrefixCls('avatar-group', customizePrefixCls);
58-
const className = attrs.class as string;
39+
const { maxPopoverPlacement = 'top', maxCount, maxStyle } = props;
5940

6041
const cls = {
61-
[prefixCls]: true,
62-
[className]: className !== undefined,
42+
[prefixCls.value]: true,
43+
[`${prefixCls.value}-rtl`]: direction.value === 'rtl',
44+
[`${attrs.class}`]: !!attrs.class,
6345
};
6446

6547
const children = getPropsSlot(slots, props);
66-
const childrenWithProps = toArray(children).map((child, index) =>
48+
const childrenWithProps = flattenChildren(children).map((child, index) =>
6749
cloneElement(child, {
6850
key: `avatar-key-${index}`,
6951
}),
@@ -80,20 +62,20 @@ const Group = defineComponent({
8062
content={childrenHidden}
8163
trigger="hover"
8264
placement={maxPopoverPlacement}
83-
overlayClassName={`${prefixCls}-popover`}
65+
overlayClassName={`${prefixCls.value}-popover`}
8466
>
8567
<Avatar style={maxStyle}>{`+${numOfChildren - maxCount}`}</Avatar>
8668
</Popover>,
8769
);
8870
return (
89-
<div class={cls} style={attrs.style}>
71+
<div {...attrs} class={cls} style={attrs.style}>
9072
{childrenShow}
9173
</div>
9274
);
9375
}
9476

9577
return (
96-
<div class={cls} style={attrs.style}>
78+
<div {...attrs} class={cls} style={attrs.style}>
9779
{childrenWithProps}
9880
</div>
9981
);

components/avatar/style/index.less

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
background: transparent;
2020
}
2121

22+
.@{ant-prefix}-image-img {
23+
display: block;
24+
}
25+
2226
.avatar-size(@avatar-size-base, @avatar-font-size-base);
2327

2428
&-lg {
@@ -55,7 +59,12 @@
5559

5660
&.@{avatar-prefix-cls}-icon {
5761
font-size: @font-size;
62+
63+
> .@{iconfont-css-prefix} {
64+
margin: 0;
65+
}
5866
}
5967
}
6068

6169
@import './group';
70+
@import './rtl';

components/avatar/style/rtl.less

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.@{avatar-prefix-cls}-group {
2+
&-rtl {
3+
.@{avatar-prefix-cls}:not(:first-child) {
4+
margin-right: @avatar-group-overlapping;
5+
margin-left: 0;
6+
}
7+
}
8+
9+
&-popover.@{ant-prefix}-popover-rtl {
10+
.@{ant-prefix}-avatar + .@{ant-prefix}-avatar {
11+
margin-right: @avatar-group-space;
12+
margin-left: 0;
13+
}
14+
}
15+
}

components/config-provider/index.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { reactive, provide, PropType, defineComponent, watch, ExtractPropTypes } from 'vue';
1+
import {
2+
reactive,
3+
provide,
4+
PropType,
5+
defineComponent,
6+
watch,
7+
ExtractPropTypes,
8+
UnwrapRef,
9+
} from 'vue';
210
import PropTypes from '../_util/vue-types';
311
import defaultRenderEmpty, { RenderEmptyHandler } from './renderEmpty';
412
import LocaleProvider, { Locale, ANT_MARK } from '../locale-provider';
@@ -14,6 +22,8 @@ export interface CSPConfig {
1422

1523
export { RenderEmptyHandler };
1624

25+
export type Direction = 'ltr' | 'rtl';
26+
1727
export interface ConfigConsumerProps {
1828
getTargetContainer?: () => HTMLElement;
1929
getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;
@@ -146,13 +156,13 @@ const ConfigProvider = defineComponent({
146156
},
147157
});
148158

149-
export const defaultConfigProvider: ConfigProviderProps = {
159+
export const defaultConfigProvider: UnwrapRef<ConfigProviderProps> = reactive({
150160
getPrefixCls: (suffixCls: string, customizePrefixCls?: string) => {
151161
if (customizePrefixCls) return customizePrefixCls;
152162
return `ant-${suffixCls}`;
153163
},
154164
renderEmpty: defaultRenderEmpty,
155165
direction: 'ltr',
156-
};
166+
});
157167

158168
export default withInstall(ConfigProvider);

0 commit comments

Comments
 (0)