Avatar.js 7.8 KB

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