Avatar.js 7.0 KB

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