Avatar.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = exports.avatarProps = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _propsUtil = require("../_util/props-util");
  11. var _vueTypes = _interopRequireDefault(require("../_util/vue-types"));
  12. var _useBreakpoint = _interopRequireDefault(require("../_util/hooks/useBreakpoint"));
  13. var _responsiveObserve = require("../_util/responsiveObserve");
  14. var _useConfigInject = _interopRequireDefault(require("../config-provider/hooks/useConfigInject"));
  15. var _vcResizeObserver = _interopRequireDefault(require("../vc-resize-observer"));
  16. var _eagerComputed = _interopRequireDefault(require("../_util/eagerComputed"));
  17. var _style = _interopRequireDefault(require("./style"));
  18. var _AvatarContext = require("./AvatarContext");
  19. const avatarProps = () => ({
  20. prefixCls: String,
  21. shape: {
  22. type: String,
  23. default: 'circle'
  24. },
  25. size: {
  26. type: [Number, String, Object],
  27. default: () => 'default'
  28. },
  29. src: String,
  30. /** Srcset of image avatar */
  31. srcset: String,
  32. icon: _vueTypes.default.any,
  33. alt: String,
  34. gap: Number,
  35. draggable: {
  36. type: Boolean,
  37. default: undefined
  38. },
  39. crossOrigin: String,
  40. loadError: {
  41. type: Function
  42. }
  43. });
  44. exports.avatarProps = avatarProps;
  45. const Avatar = (0, _vue.defineComponent)({
  46. compatConfig: {
  47. MODE: 3
  48. },
  49. name: 'AAvatar',
  50. inheritAttrs: false,
  51. props: avatarProps(),
  52. slots: Object,
  53. setup(props, _ref) {
  54. let {
  55. slots,
  56. attrs
  57. } = _ref;
  58. const isImgExist = (0, _vue.shallowRef)(true);
  59. const isMounted = (0, _vue.shallowRef)(false);
  60. const scale = (0, _vue.shallowRef)(1);
  61. const avatarChildrenRef = (0, _vue.shallowRef)(null);
  62. const avatarNodeRef = (0, _vue.shallowRef)(null);
  63. const {
  64. prefixCls
  65. } = (0, _useConfigInject.default)('avatar', props);
  66. const [wrapSSR, hashId] = (0, _style.default)(prefixCls);
  67. const avatarCtx = (0, _AvatarContext.useAvatarInjectContext)();
  68. const size = (0, _vue.computed)(() => {
  69. return props.size === 'default' ? avatarCtx.size : props.size;
  70. });
  71. const screens = (0, _useBreakpoint.default)();
  72. const responsiveSize = (0, _eagerComputed.default)(() => {
  73. if (typeof props.size !== 'object') {
  74. return undefined;
  75. }
  76. const currentBreakpoint = _responsiveObserve.responsiveArray.find(screen => screens.value[screen]);
  77. const currentSize = props.size[currentBreakpoint];
  78. return currentSize;
  79. });
  80. const responsiveSizeStyle = hasIcon => {
  81. if (responsiveSize.value) {
  82. return {
  83. width: `${responsiveSize.value}px`,
  84. height: `${responsiveSize.value}px`,
  85. lineHeight: `${responsiveSize.value}px`,
  86. fontSize: `${hasIcon ? responsiveSize.value / 2 : 18}px`
  87. };
  88. }
  89. return {};
  90. };
  91. const setScaleParam = () => {
  92. if (!avatarChildrenRef.value || !avatarNodeRef.value) {
  93. return;
  94. }
  95. const childrenWidth = avatarChildrenRef.value.offsetWidth; // offsetWidth avoid affecting be transform scale
  96. const nodeWidth = avatarNodeRef.value.offsetWidth;
  97. // denominator is 0 is no meaning
  98. if (childrenWidth !== 0 && nodeWidth !== 0) {
  99. const {
  100. gap = 4
  101. } = props;
  102. if (gap * 2 < nodeWidth) {
  103. scale.value = nodeWidth - gap * 2 < childrenWidth ? (nodeWidth - gap * 2) / childrenWidth : 1;
  104. }
  105. }
  106. };
  107. const handleImgLoadError = () => {
  108. const {
  109. loadError
  110. } = props;
  111. const errorFlag = loadError === null || loadError === void 0 ? void 0 : loadError();
  112. if (errorFlag !== false) {
  113. isImgExist.value = false;
  114. }
  115. };
  116. (0, _vue.watch)(() => props.src, () => {
  117. (0, _vue.nextTick)(() => {
  118. isImgExist.value = true;
  119. scale.value = 1;
  120. });
  121. });
  122. (0, _vue.watch)(() => props.gap, () => {
  123. (0, _vue.nextTick)(() => {
  124. setScaleParam();
  125. });
  126. });
  127. (0, _vue.onMounted)(() => {
  128. (0, _vue.nextTick)(() => {
  129. setScaleParam();
  130. isMounted.value = true;
  131. });
  132. });
  133. return () => {
  134. var _a, _b;
  135. const {
  136. shape,
  137. src,
  138. alt,
  139. srcset,
  140. draggable,
  141. crossOrigin
  142. } = props;
  143. const mergeShape = (_a = avatarCtx.shape) !== null && _a !== void 0 ? _a : shape;
  144. const icon = (0, _propsUtil.getPropsSlot)(slots, props, 'icon');
  145. const pre = prefixCls.value;
  146. const classString = {
  147. [`${attrs.class}`]: !!attrs.class,
  148. [pre]: true,
  149. [`${pre}-lg`]: size.value === 'large',
  150. [`${pre}-sm`]: size.value === 'small',
  151. [`${pre}-${mergeShape}`]: true,
  152. [`${pre}-image`]: src && isImgExist.value,
  153. [`${pre}-icon`]: icon,
  154. [hashId.value]: true
  155. };
  156. const sizeStyle = typeof size.value === 'number' ? {
  157. width: `${size.value}px`,
  158. height: `${size.value}px`,
  159. lineHeight: `${size.value}px`,
  160. fontSize: icon ? `${size.value / 2}px` : '18px'
  161. } : {};
  162. const children = (_b = slots.default) === null || _b === void 0 ? void 0 : _b.call(slots);
  163. let childrenToRender;
  164. if (src && isImgExist.value) {
  165. childrenToRender = (0, _vue.createVNode)("img", {
  166. "draggable": draggable,
  167. "src": src,
  168. "srcset": srcset,
  169. "onError": handleImgLoadError,
  170. "alt": alt,
  171. "crossorigin": crossOrigin
  172. }, null);
  173. } else if (icon) {
  174. childrenToRender = icon;
  175. } else if (isMounted.value || scale.value !== 1) {
  176. const transformString = `scale(${scale.value}) translateX(-50%)`;
  177. const childrenStyle = {
  178. msTransform: transformString,
  179. WebkitTransform: transformString,
  180. transform: transformString
  181. };
  182. const sizeChildrenStyle = typeof size.value === 'number' ? {
  183. lineHeight: `${size.value}px`
  184. } : {};
  185. childrenToRender = (0, _vue.createVNode)(_vcResizeObserver.default, {
  186. "onResize": setScaleParam
  187. }, {
  188. default: () => [(0, _vue.createVNode)("span", {
  189. "class": `${pre}-string`,
  190. "ref": avatarChildrenRef,
  191. "style": (0, _extends2.default)((0, _extends2.default)({}, sizeChildrenStyle), childrenStyle)
  192. }, [children])]
  193. });
  194. } else {
  195. childrenToRender = (0, _vue.createVNode)("span", {
  196. "class": `${pre}-string`,
  197. "ref": avatarChildrenRef,
  198. "style": {
  199. opacity: 0
  200. }
  201. }, [children]);
  202. }
  203. return wrapSSR((0, _vue.createVNode)("span", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, {
  204. "ref": avatarNodeRef,
  205. "class": classString,
  206. "style": [sizeStyle, responsiveSizeStyle(!!icon), attrs.style]
  207. }), [childrenToRender]));
  208. };
  209. }
  210. });
  211. var _default = exports.default = Avatar;