UNPKG

@aplus-frontend/antdv

Version:

Vue basic component library maintained based on ant-design-vue

212 lines (211 loc) 7.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.avatarProps = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _vue = require("vue"); var _propsUtil = require("../_util/props-util"); var _vueTypes = _interopRequireDefault(require("../_util/vue-types")); var _useBreakpoint = _interopRequireDefault(require("../_util/hooks/useBreakpoint")); var _responsiveObserve = require("../_util/responsiveObserve"); var _useConfigInject = _interopRequireDefault(require("../config-provider/hooks/useConfigInject")); var _vcResizeObserver = _interopRequireDefault(require("../vc-resize-observer")); var _eagerComputed = _interopRequireDefault(require("../_util/eagerComputed")); var _style = _interopRequireDefault(require("./style")); var _AvatarContext = require("./AvatarContext"); const avatarProps = () => ({ prefixCls: String, shape: { type: String, default: 'circle' }, size: { type: [Number, String, Object], default: () => 'default' }, src: String, /** Srcset of image avatar */ srcset: String, icon: _vueTypes.default.any, alt: String, gap: Number, draggable: { type: Boolean, default: undefined }, crossOrigin: String, loadError: { type: Function } }); exports.avatarProps = avatarProps; const Avatar = (0, _vue.defineComponent)({ compatConfig: { MODE: 3 }, name: 'AAvatar', inheritAttrs: false, props: avatarProps(), slots: Object, setup(props, _ref) { let { slots, attrs } = _ref; const isImgExist = (0, _vue.shallowRef)(true); const isMounted = (0, _vue.shallowRef)(false); const scale = (0, _vue.shallowRef)(1); const avatarChildrenRef = (0, _vue.shallowRef)(null); const avatarNodeRef = (0, _vue.shallowRef)(null); const { prefixCls } = (0, _useConfigInject.default)('avatar', props); const [wrapSSR, hashId] = (0, _style.default)(prefixCls); const avatarCtx = (0, _AvatarContext.useAvatarInjectContext)(); const size = (0, _vue.computed)(() => { return props.size === 'default' ? avatarCtx.size : props.size; }); const screens = (0, _useBreakpoint.default)(); const responsiveSize = (0, _eagerComputed.default)(() => { if (typeof props.size !== 'object') { return undefined; } const currentBreakpoint = _responsiveObserve.responsiveArray.find(screen => screens.value[screen]); const currentSize = props.size[currentBreakpoint]; return currentSize; }); const responsiveSizeStyle = hasIcon => { if (responsiveSize.value) { return { width: `${responsiveSize.value}px`, height: `${responsiveSize.value}px`, lineHeight: `${responsiveSize.value}px`, fontSize: `${hasIcon ? responsiveSize.value / 2 : 18}px` }; } return {}; }; const setScaleParam = () => { if (!avatarChildrenRef.value || !avatarNodeRef.value) { return; } const childrenWidth = avatarChildrenRef.value.offsetWidth; // offsetWidth avoid affecting be transform scale const nodeWidth = avatarNodeRef.value.offsetWidth; // denominator is 0 is no meaning if (childrenWidth !== 0 && nodeWidth !== 0) { const { gap = 4 } = props; if (gap * 2 < nodeWidth) { scale.value = nodeWidth - gap * 2 < childrenWidth ? (nodeWidth - gap * 2) / childrenWidth : 1; } } }; const handleImgLoadError = () => { const { loadError } = props; const errorFlag = loadError === null || loadError === void 0 ? void 0 : loadError(); if (errorFlag !== false) { isImgExist.value = false; } }; (0, _vue.watch)(() => props.src, () => { (0, _vue.nextTick)(() => { isImgExist.value = true; scale.value = 1; }); }); (0, _vue.watch)(() => props.gap, () => { (0, _vue.nextTick)(() => { setScaleParam(); }); }); (0, _vue.onMounted)(() => { (0, _vue.nextTick)(() => { setScaleParam(); isMounted.value = true; }); }); return () => { var _a, _b; const { shape, src, alt, srcset, draggable, crossOrigin } = props; const mergeShape = (_a = avatarCtx.shape) !== null && _a !== void 0 ? _a : shape; const icon = (0, _propsUtil.getPropsSlot)(slots, props, 'icon'); const pre = prefixCls.value; const classString = { [`${attrs.class}`]: !!attrs.class, [pre]: true, [`${pre}-lg`]: size.value === 'large', [`${pre}-sm`]: size.value === 'small', [`${pre}-${mergeShape}`]: true, [`${pre}-image`]: src && isImgExist.value, [`${pre}-icon`]: icon, [hashId.value]: true }; const sizeStyle = typeof size.value === 'number' ? { width: `${size.value}px`, height: `${size.value}px`, lineHeight: `${size.value}px`, fontSize: icon ? `${size.value / 2}px` : '18px' } : {}; const children = (_b = slots.default) === null || _b === void 0 ? void 0 : _b.call(slots); let childrenToRender; if (src && isImgExist.value) { childrenToRender = (0, _vue.createVNode)("img", { "draggable": draggable, "src": src, "srcset": srcset, "onError": handleImgLoadError, "alt": alt, "crossorigin": crossOrigin }, null); } else if (icon) { childrenToRender = icon; } else if (isMounted.value || scale.value !== 1) { const transformString = `scale(${scale.value}) translateX(-50%)`; const childrenStyle = { msTransform: transformString, WebkitTransform: transformString, transform: transformString }; const sizeChildrenStyle = typeof size.value === 'number' ? { lineHeight: `${size.value}px` } : {}; childrenToRender = (0, _vue.createVNode)(_vcResizeObserver.default, { "onResize": setScaleParam }, { default: () => [(0, _vue.createVNode)("span", { "class": `${pre}-string`, "ref": avatarChildrenRef, "style": (0, _extends2.default)((0, _extends2.default)({}, sizeChildrenStyle), childrenStyle) }, [children])] }); } else { childrenToRender = (0, _vue.createVNode)("span", { "class": `${pre}-string`, "ref": avatarChildrenRef, "style": { opacity: 0 } }, [children]); } return wrapSSR((0, _vue.createVNode)("span", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, { "ref": avatarNodeRef, "class": classString, "style": [sizeStyle, responsiveSizeStyle(!!icon), attrs.style] }), [childrenToRender])); }; } }); var _default = exports.default = Avatar;