UNPKG

@ozen-ui/kit

Version:

React component library

48 lines (47 loc) 4.23 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ImageBase = exports.cnImageBase = void 0; var tslib_1 = require("tslib"); require("./ImageBase.css"); var react_1 = tslib_1.__importStar(require("react")); var logger_1 = require("@ozen-ui/logger"); var react_transition_group_1 = require("react-transition-group"); var useMultiRef_1 = require("../../hooks/useMultiRef"); var utils_1 = require("../../utils"); var components_1 = require("./components"); var constants_1 = require("./constants"); var hooks_1 = require("./hooks"); var modules_1 = require("./modules"); exports.cnImageBase = (0, utils_1.cn)('ImageBase'); var FADE_TIMEOUT = 120; exports.ImageBase = (0, utils_1.polymorphicComponentWithRef)(function (_a, ref) { var className = _a.className, src = _a.src, _b = _a.as, Tag = _b === void 0 ? constants_1.IMAGE_BASE_DEFAULT_ELEMENT : _b, alt = _a.alt, placeholder = _a.placeholder, _c = _a.loading, loading = _c === void 0 ? 'lazy' : _c, _d = _a.loader, loader = _d === void 0 ? react_1.default.createElement(modules_1.ImageBaseLoader, null) : _d, style = _a.style, _e = _a.decoding, decoding = _e === void 0 ? 'async' : _e, aspectRatio = _a.aspectRatio, sources = _a.sources, pictureRef = _a.pictureRef, imgRefProp = _a.imgRef, other = tslib_1.__rest(_a, ["className", "src", "as", "alt", "placeholder", "loading", "loader", "style", "decoding", "aspectRatio", "sources", "pictureRef", "imgRef"]); var loaderRef = (0, react_1.useRef)(null); var placeholderRef = (0, react_1.useRef)(null); var internalImgRef = (0, react_1.useRef)(null); var imgRef = (0, useMultiRef_1.useMultiRef)([imgRefProp, internalImgRef]); var _f = (0, hooks_1.useImageBaseStatus)(src), onLoad = _f.onLoad, onError = _f.onError, isError = _f.isError, isLoading = _f.isLoading; var paddingBottom = (function () { if (!aspectRatio) { return undefined; } var _a = tslib_1.__read(aspectRatio.split('x'), 2), width = _a[0], height = _a[1]; if (!width || !height) { logger_1.logger.error("\u041D\u0435\u0432\u0435\u0440\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u043D \"aspectRatio\", \u043E\u043D \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 `${number}x${number}`"); return undefined; } return "".concat((Number.parseFloat(height) / Number.parseFloat(width)) * 100, "%"); })(); var isShowPlaceholder = !!placeholder && (isError || !src); var isShowLoader = isLoading && !isShowPlaceholder && !!src; return (react_1.default.createElement(Tag, tslib_1.__assign({}, other, { ref: ref, role: "img", className: (0, exports.cnImageBase)('', className), style: tslib_1.__assign(tslib_1.__assign({}, style), { paddingBlockEnd: paddingBottom }) }), react_1.default.createElement(react_transition_group_1.CSSTransition, { nodeRef: loaderRef, in: isShowLoader, timeout: FADE_TIMEOUT, mountOnEnter: true, unmountOnExit: true, classNames: (0, exports.cnImageBase)('Fade') }, react_1.default.createElement("div", { ref: loaderRef, className: (0, exports.cnImageBase)('Loader') }, loader)), react_1.default.createElement(react_transition_group_1.CSSTransition, { nodeRef: placeholderRef, in: isShowPlaceholder, timeout: FADE_TIMEOUT, mountOnEnter: true, unmountOnExit: true, classNames: (0, exports.cnImageBase)('Fade') }, react_1.default.createElement("div", { ref: placeholderRef, className: (0, exports.cnImageBase)('Placeholder') }, placeholder)), src && (react_1.default.createElement(react_transition_group_1.Transition, { nodeRef: internalImgRef, in: !isShowLoader && !isShowPlaceholder, timeout: FADE_TIMEOUT }, function (state) { return (react_1.default.createElement(components_1.ImageBasePicture, { ref: pictureRef, sources: sources }, react_1.default.createElement("img", { ref: imgRef, className: (0, exports.cnImageBase)('Image', { visible: state === 'entered', }), onLoad: onLoad, onError: onError, alt: alt, src: src, decoding: decoding, loading: loading }))); })))); }); exports.ImageBase.displayName = 'ImageBase';