UNPKG

7.19 kBJavaScriptView Raw
1import _extends from "@babel/runtime/helpers/extends";
2import _defineProperty from "@babel/runtime/helpers/defineProperty";
3import _typeof from "@babel/runtime/helpers/typeof";
4import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
6var __rest = this && this.__rest || function (s, e) {
7 var t = {};
8
9 for (var p in s) {
10 if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
11 }
12
13 if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
14 if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
15 }
16 return t;
17};
18
19import * as React from 'react';
20import classNames from 'classnames';
21import ResizeObserver from 'rc-resize-observer';
22import { composeRef } from "rc-util/es/ref";
23import { ConfigContext } from '../config-provider';
24import devWarning from '../_util/devWarning';
25import { responsiveArray } from '../_util/responsiveObserve';
26import useBreakpoint from '../grid/hooks/useBreakpoint';
27import SizeContext from './SizeContext';
28
29var InternalAvatar = function InternalAvatar(props, ref) {
30 var _classNames, _classNames2;
31
32 var groupSize = React.useContext(SizeContext);
33
34 var _React$useState = React.useState(1),
35 _React$useState2 = _slicedToArray(_React$useState, 2),
36 scale = _React$useState2[0],
37 setScale = _React$useState2[1];
38
39 var _React$useState3 = React.useState(false),
40 _React$useState4 = _slicedToArray(_React$useState3, 2),
41 mounted = _React$useState4[0],
42 setMounted = _React$useState4[1];
43
44 var _React$useState5 = React.useState(true),
45 _React$useState6 = _slicedToArray(_React$useState5, 2),
46 isImgExist = _React$useState6[0],
47 setIsImgExist = _React$useState6[1];
48
49 var avatarNodeRef = React.useRef();
50 var avatarChildrenRef = React.useRef();
51 var avatarNodeMergeRef = composeRef(ref, avatarNodeRef);
52
53 var _React$useContext = React.useContext(ConfigContext),
54 getPrefixCls = _React$useContext.getPrefixCls;
55
56 var setScaleParam = function setScaleParam() {
57 if (!avatarChildrenRef.current || !avatarNodeRef.current) {
58 return;
59 }
60
61 var childrenWidth = avatarChildrenRef.current.offsetWidth; // offsetWidth avoid affecting be transform scale
62
63 var nodeWidth = avatarNodeRef.current.offsetWidth; // denominator is 0 is no meaning
64
65 if (childrenWidth !== 0 && nodeWidth !== 0) {
66 var _props$gap = props.gap,
67 gap = _props$gap === void 0 ? 4 : _props$gap;
68
69 if (gap * 2 < nodeWidth) {
70 setScale(nodeWidth - gap * 2 < childrenWidth ? (nodeWidth - gap * 2) / childrenWidth : 1);
71 }
72 }
73 };
74
75 React.useEffect(function () {
76 setMounted(true);
77 }, []);
78 React.useEffect(function () {
79 setIsImgExist(true);
80 setScale(1);
81 }, [props.src]);
82 React.useEffect(function () {
83 setScaleParam();
84 }, [props.gap]);
85
86 var handleImgLoadError = function handleImgLoadError() {
87 var onError = props.onError;
88 var errorFlag = onError ? onError() : undefined;
89
90 if (errorFlag !== false) {
91 setIsImgExist(false);
92 }
93 };
94
95 var customizePrefixCls = props.prefixCls,
96 shape = props.shape,
97 customSize = props.size,
98 src = props.src,
99 srcSet = props.srcSet,
100 icon = props.icon,
101 className = props.className,
102 alt = props.alt,
103 draggable = props.draggable,
104 children = props.children,
105 others = __rest(props, ["prefixCls", "shape", "size", "src", "srcSet", "icon", "className", "alt", "draggable", "children"]);
106
107 var size = customSize === 'default' ? groupSize : customSize;
108 var screens = useBreakpoint();
109 var responsiveSizeStyle = React.useMemo(function () {
110 if (_typeof(size) !== 'object') {
111 return {};
112 }
113
114 var currentBreakpoint = responsiveArray.find(function (screen) {
115 return screens[screen];
116 });
117 var currentSize = size[currentBreakpoint];
118 return currentSize ? {
119 width: currentSize,
120 height: currentSize,
121 lineHeight: "".concat(currentSize, "px"),
122 fontSize: icon ? currentSize / 2 : 18
123 } : {};
124 }, [screens, size]);
125 devWarning(!(typeof icon === 'string' && icon.length > 2), 'Avatar', "`icon` is using ReactNode instead of string naming in v4. Please check `".concat(icon, "` at https://ant.design/components/icon"));
126 var prefixCls = getPrefixCls('avatar', customizePrefixCls);
127 var sizeCls = classNames((_classNames = {}, _defineProperty(_classNames, "".concat(prefixCls, "-lg"), size === 'large'), _defineProperty(_classNames, "".concat(prefixCls, "-sm"), size === 'small'), _classNames));
128 var hasImageElement = /*#__PURE__*/React.isValidElement(src);
129 var classString = classNames(prefixCls, sizeCls, (_classNames2 = {}, _defineProperty(_classNames2, "".concat(prefixCls, "-").concat(shape), shape), _defineProperty(_classNames2, "".concat(prefixCls, "-image"), hasImageElement || src && isImgExist), _defineProperty(_classNames2, "".concat(prefixCls, "-icon"), icon), _classNames2), className);
130 var sizeStyle = typeof size === 'number' ? {
131 width: size,
132 height: size,
133 lineHeight: "".concat(size, "px"),
134 fontSize: icon ? size / 2 : 18
135 } : {};
136 var childrenToRender;
137
138 if (typeof src === 'string' && isImgExist) {
139 childrenToRender = /*#__PURE__*/React.createElement("img", {
140 src: src,
141 draggable: draggable,
142 srcSet: srcSet,
143 onError: handleImgLoadError,
144 alt: alt
145 });
146 } else if (hasImageElement) {
147 childrenToRender = src;
148 } else if (icon) {
149 childrenToRender = icon;
150 } else if (mounted || scale !== 1) {
151 var transformString = "scale(".concat(scale, ") translateX(-50%)");
152 var childrenStyle = {
153 msTransform: transformString,
154 WebkitTransform: transformString,
155 transform: transformString
156 };
157 var sizeChildrenStyle = typeof size === 'number' ? {
158 lineHeight: "".concat(size, "px")
159 } : {};
160 childrenToRender = /*#__PURE__*/React.createElement(ResizeObserver, {
161 onResize: setScaleParam
162 }, /*#__PURE__*/React.createElement("span", {
163 className: "".concat(prefixCls, "-string"),
164 ref: function ref(node) {
165 avatarChildrenRef.current = node;
166 },
167 style: _extends(_extends({}, sizeChildrenStyle), childrenStyle)
168 }, children));
169 } else {
170 childrenToRender = /*#__PURE__*/React.createElement("span", {
171 className: "".concat(prefixCls, "-string"),
172 style: {
173 opacity: 0
174 },
175 ref: function ref(node) {
176 avatarChildrenRef.current = node;
177 }
178 }, children);
179 } // The event is triggered twice from bubbling up the DOM tree.
180 // see https://codesandbox.io/s/kind-snow-9lidz
181
182
183 delete others.onError;
184 delete others.gap;
185 return /*#__PURE__*/React.createElement("span", _extends({}, others, {
186 style: _extends(_extends(_extends({}, sizeStyle), responsiveSizeStyle), others.style),
187 className: classString,
188 ref: avatarNodeMergeRef
189 }), childrenToRender);
190};
191
192var Avatar = /*#__PURE__*/React.forwardRef(InternalAvatar);
193Avatar.displayName = 'Avatar';
194Avatar.defaultProps = {
195 shape: 'circle',
196 size: 'default'
197};
198export default Avatar;
\No newline at end of file