choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
280 lines (230 loc) • 9.65 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _reactIntersectionObserver = _interopRequireDefault(require("react-intersection-observer"));
var _isNumber = _interopRequireDefault(require("lodash/isNumber"));
var _ConfigContext = _interopRequireDefault(require("../../../lib/config-provider/ConfigContext"));
var _UnitConvertor = require("../../../lib/_util/UnitConvertor");
var _icon = _interopRequireDefault(require("../icon"));
var _objectFitPolyfill = _interopRequireWildcard(require("../_util/objectFitPolyfill"));
var _PictureContext = _interopRequireWildcard(require("./PictureContext"));
var _preview = _interopRequireDefault(require("../modal/preview"));
var _excluded = ["src", "downloadUrl", "previewUrl", "previewTarget", "lazy", "className", "width", "height", "prefixCls", "style", "sources", "alt", "title", "block", "preview", "modalProps", "objectFit", "objectPosition", "status", "border", "index", "onClick", "children", "onPreview"];
function Picture(props, ref) {
var _classNames;
var src = props.src,
downloadUrl = props.downloadUrl,
previewUrl = props.previewUrl,
previewTarget = props.previewTarget,
lazy = props.lazy,
className = props.className,
width = props.width,
height = props.height,
prefixCls = props.prefixCls,
style = props.style,
sources = props.sources,
alt = props.alt,
title = props.title,
_props$block = props.block,
block = _props$block === void 0 ? true : _props$block,
_props$preview = props.preview,
preview = _props$preview === void 0 ? true : _props$preview,
modalProps = props.modalProps,
_props$objectFit = props.objectFit,
objectFit = _props$objectFit === void 0 ? 'fill' : _props$objectFit,
_props$objectPosition = props.objectPosition,
objectPosition = _props$objectPosition === void 0 ? 'center' : _props$objectPosition,
propStatus = props.status,
border = props.border,
index = props.index,
onClick = props.onClick,
children = props.children,
onPreview = props.onPreview,
rest = (0, _objectWithoutProperties2["default"])(props, _excluded);
var url = previewUrl || src;
var pictureRef = (0, _react.useRef)({
src: url,
downloadUrl: downloadUrl
});
var context = (0, _react.useContext)(_PictureContext["default"]);
var _useContext = (0, _react.useContext)(_ConfigContext["default"]),
getProPrefixCls = _useContext.getProPrefixCls;
var customPrefixCls = getProPrefixCls('picture', prefixCls);
var imgRef = (0, _react.useRef)(null);
var _useState = (0, _react.useState)(propStatus || 'empty'),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
status = _useState2[0],
setStatus = _useState2[1];
var _useState3 = (0, _react.useState)(!lazy || !!propStatus),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
inView = _useState4[0],
setInView = _useState4[1];
var handlePreview = (0, _react.useCallback)(function () {
if (preview && !previewTarget && status === 'loaded' && url) {
if (context && (0, _isNumber["default"])(index)) {
context.preview(index, modalProps);
} else {
(0, _preview["default"])({
list: [{
src: url,
downloadUrl: downloadUrl
}]
}, modalProps);
}
if (onPreview) {
onPreview();
}
}
}, [context, index, preview, previewTarget, status, url, downloadUrl, onPreview]);
var handleClick = (0, _react.useCallback)(function (e) {
handlePreview();
if (onClick) {
onClick(e);
}
}, [handlePreview, onClick]);
var wrapperStyle = (0, _objectSpread2["default"])({}, style);
var elementStyle = {
objectFit: objectFit,
objectPosition: objectPosition
};
if (typeof width !== 'undefined') {
var w = (0, _UnitConvertor.pxToRem)(width) || 0;
elementStyle.width = w;
wrapperStyle.width = w;
}
if (typeof height !== 'undefined') {
var h = (0, _UnitConvertor.pxToRem)(height) || 0;
elementStyle.height = h;
wrapperStyle.height = h;
}
(0, _react.useEffect)(function () {
if (!propStatus && inView && src) {
var _img = new Image(width, height);
var onLoad = function onLoad() {
setStatus('loaded');
};
var onError = function onError() {
setStatus('error');
};
_img.addEventListener('load', onLoad, false);
_img.addEventListener('error', onError, false);
_img.src = src;
return function () {
_img.removeEventListener('load', onLoad, false);
_img.removeEventListener('error', onError, false);
};
}
}, [inView, src, propStatus]);
(0, _react.useEffect)(function () {
if (propStatus) {
setStatus(propStatus);
}
}, [propStatus]);
(0, _react.useEffect)(function () {
var current = imgRef.current;
if (current && !(0, _objectFitPolyfill.isObjectFitSupport)() && objectFit && objectPosition) {
var onResize = function onResize() {
return (0, _objectFitPolyfill["default"])(current, objectFit, objectPosition);
};
onResize();
window.addEventListener('resize', onResize, false);
return function () {
return window.removeEventListener('resize', onResize, false);
};
}
}, [imgRef, objectFit, objectPosition]);
(0, _react.useEffect)(function () {
if (preview && !previewTarget && context && (0, _isNumber["default"])(index) && url) {
var current = pictureRef.current;
current.src = url;
context.registerPicture(index, current);
return function () {
return context.unRegisterPicture(index, current);
};
}
}, [index, context, pictureRef, preview, previewTarget, url]);
(0, _react.useImperativeHandle)(ref, function () {
return {
preview: handlePreview,
getImage: function getImage() {
return imgRef.current;
}
};
}, [handlePreview, imgRef]);
var renderSources = function renderSources() {
if (sources) {
return sources.map(function (source, i) {
return /*#__PURE__*/_react["default"].createElement("source", (0, _extends2["default"])({
key: String(i)
}, source));
});
}
};
var renderImg = function renderImg() {
if (children) {
return children;
}
switch (status) {
case 'loaded':
{
return /*#__PURE__*/_react["default"].createElement("img", (0, _extends2["default"])({
ref: imgRef,
style: elementStyle,
className: "".concat(customPrefixCls, "-img"),
src: src,
alt: alt || title,
title: title
}, rest));
}
case 'error':
return /*#__PURE__*/_react["default"].createElement("div", {
className: "".concat(customPrefixCls, "-icon")
}, /*#__PURE__*/_react["default"].createElement(_icon["default"], {
type: "sentiment_dissatisfied"
}));
case 'empty':
default:
return /*#__PURE__*/_react["default"].createElement("div", {
className: "".concat(customPrefixCls, "-icon")
}, /*#__PURE__*/_react["default"].createElement(_icon["default"], {
type: "photo_size_select_actual"
}));
}
};
var classString = (0, _classnames["default"])(customPrefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(customPrefixCls, "-border"), border), (0, _defineProperty2["default"])(_classNames, "".concat(customPrefixCls, "-block"), block), (0, _defineProperty2["default"])(_classNames, "".concat(customPrefixCls, "-preview"), preview && status === 'loaded'), _classNames), className);
var isPictureSupport = typeof HTMLPictureElement !== 'undefined';
var Cmp = isPictureSupport ? 'picture' : 'div';
var img = renderImg();
var picture = /*#__PURE__*/_react["default"].createElement(Cmp, {
className: classString,
style: wrapperStyle,
onClick: handleClick
}, isPictureSupport && renderSources(), preview && previewTarget ? /*#__PURE__*/_react["default"].createElement("a", {
target: previewTarget,
href: url
}, img) : img);
if (lazy && !propStatus && status !== 'loaded') {
return /*#__PURE__*/_react["default"].createElement(_reactIntersectionObserver["default"], {
onChange: setInView
}, picture);
}
return picture;
}
var ForwardPicture = /*#__PURE__*/(0, _react.forwardRef)(Picture);
ForwardPicture.Provider = _PictureContext.PictureProvider;
ForwardPicture.Context = _PictureContext["default"];
ForwardPicture.displayName = 'Picture';
var _default = ForwardPicture;
exports["default"] = _default;
//# sourceMappingURL=Picture.js.map
;