UNPKG

5.82 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
5var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
7Object.defineProperty(exports, "__esModule", {
8 value: true
9});
10exports.default = exports.styles = void 0;
11
12var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
14var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
16var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
18var React = _interopRequireWildcard(require("react"));
19
20var _propTypes = _interopRequireDefault(require("prop-types"));
21
22var _clsx = _interopRequireDefault(require("clsx"));
23
24var _debounce = _interopRequireDefault(require("../utils/debounce"));
25
26var _withStyles = _interopRequireDefault(require("../styles/withStyles"));
27
28var _isMuiElement = _interopRequireDefault(require("../utils/isMuiElement"));
29
30var styles = {
31 /* Styles applied to the root element. */
32 root: {
33 boxSizing: 'border-box',
34 flexShrink: 0
35 },
36
37 /* Styles applied to the `div` element that wraps the children. */
38 item: {
39 position: 'relative',
40 display: 'block',
41 // In case it's not rendered with a div.
42 height: '100%',
43 overflow: 'hidden'
44 },
45
46 /* Styles applied to an `img` element child, if needed to ensure it covers the item. */
47 imgFullHeight: {
48 height: '100%',
49 transform: 'translateX(-50%)',
50 position: 'relative',
51 left: '50%'
52 },
53
54 /* Styles applied to an `img` element child, if needed to ensure it covers the item. */
55 imgFullWidth: {
56 width: '100%',
57 position: 'relative',
58 transform: 'translateY(-50%)',
59 top: '50%'
60 }
61};
62exports.styles = styles;
63
64var fit = function fit(imgEl, classes) {
65 if (!imgEl || !imgEl.complete) {
66 return;
67 }
68
69 if (imgEl.width / imgEl.height > imgEl.parentElement.offsetWidth / imgEl.parentElement.offsetHeight) {
70 var _imgEl$classList, _imgEl$classList2;
71
72 (_imgEl$classList = imgEl.classList).remove.apply(_imgEl$classList, (0, _toConsumableArray2.default)(classes.imgFullWidth.split(' ')));
73
74 (_imgEl$classList2 = imgEl.classList).add.apply(_imgEl$classList2, (0, _toConsumableArray2.default)(classes.imgFullHeight.split(' ')));
75 } else {
76 var _imgEl$classList3, _imgEl$classList4;
77
78 (_imgEl$classList3 = imgEl.classList).remove.apply(_imgEl$classList3, (0, _toConsumableArray2.default)(classes.imgFullHeight.split(' ')));
79
80 (_imgEl$classList4 = imgEl.classList).add.apply(_imgEl$classList4, (0, _toConsumableArray2.default)(classes.imgFullWidth.split(' ')));
81 }
82};
83
84function ensureImageCover(imgEl, classes) {
85 if (!imgEl) {
86 return;
87 }
88
89 if (imgEl.complete) {
90 fit(imgEl, classes);
91 } else {
92 imgEl.addEventListener('load', function () {
93 fit(imgEl, classes);
94 });
95 }
96}
97
98var ImageListItem = /*#__PURE__*/React.forwardRef(function ImageListItem(props, ref) {
99 // cols rows default values are for docs only
100 var children = props.children,
101 classes = props.classes,
102 className = props.className,
103 _props$cols = props.cols,
104 cols = _props$cols === void 0 ? 1 : _props$cols,
105 _props$component = props.component,
106 Component = _props$component === void 0 ? 'li' : _props$component,
107 _props$rows = props.rows,
108 rows = _props$rows === void 0 ? 1 : _props$rows,
109 other = (0, _objectWithoutProperties2.default)(props, ["children", "classes", "className", "cols", "component", "rows"]);
110 var imgRef = React.useRef(null);
111 React.useEffect(function () {
112 ensureImageCover(imgRef.current, classes);
113 });
114 React.useEffect(function () {
115 var handleResize = (0, _debounce.default)(function () {
116 fit(imgRef.current, classes);
117 });
118 window.addEventListener('resize', handleResize);
119 return function () {
120 handleResize.clear();
121 window.removeEventListener('resize', handleResize);
122 };
123 }, [classes]);
124 return /*#__PURE__*/React.createElement(Component, (0, _extends2.default)({
125 className: (0, _clsx.default)(classes.root, className),
126 ref: ref
127 }, other), /*#__PURE__*/React.createElement("div", {
128 className: classes.item
129 }, React.Children.map(children, function (child) {
130 if (! /*#__PURE__*/React.isValidElement(child)) {
131 return null;
132 }
133
134 if (child.type === 'img' || (0, _isMuiElement.default)(child, ['Image'])) {
135 return /*#__PURE__*/React.cloneElement(child, {
136 ref: imgRef
137 });
138 }
139
140 return child;
141 })));
142});
143process.env.NODE_ENV !== "production" ? ImageListItem.propTypes = {
144 // ----------------------------- Warning --------------------------------
145 // | These PropTypes are generated from the TypeScript type definitions |
146 // | To update them edit the d.ts file and run "yarn proptypes" |
147 // ----------------------------------------------------------------------
148
149 /**
150 * While you can pass any node as children, the main use case is for an img.
151 */
152 children: _propTypes.default.node,
153
154 /**
155 * Override or extend the styles applied to the component.
156 * See [CSS API](#css) below for more details.
157 */
158 classes: _propTypes.default.object,
159
160 /**
161 * @ignore
162 */
163 className: _propTypes.default.string,
164
165 /**
166 * Width of the item in number of grid columns.
167 */
168 cols: _propTypes.default.number,
169
170 /**
171 * The component used for the root node.
172 * Either a string to use a HTML element or a component.
173 */
174 component: _propTypes.default
175 /* @typescript-to-proptypes-ignore */
176 .elementType,
177
178 /**
179 * Height of the item in number of grid rows.
180 */
181 rows: _propTypes.default.number
182} : void 0;
183
184var _default = (0, _withStyles.default)(styles, {
185 name: 'MuiImageListItem'
186})(ImageListItem);
187
188exports.default = _default;
\No newline at end of file