UNPKG

5.7 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 tile: {
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 tile. */
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 tile. */
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 GridListTile = /*#__PURE__*/React.forwardRef(function GridListTile(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.tile
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" ? GridListTile.propTypes = {
144 /**
145 * Theoretically you can pass any node as children, but the main use case is to pass an img,
146 * in which case GridListTile takes care of making the image "cover" available space
147 * (similar to `background-size: cover` or to `object-fit: cover`).
148 */
149 children: _propTypes.default.node,
150
151 /**
152 * Override or extend the styles applied to the component.
153 * See [CSS API](#css) below for more details.
154 */
155 classes: _propTypes.default.object.isRequired,
156
157 /**
158 * @ignore
159 */
160 className: _propTypes.default.string,
161
162 /**
163 * Width of the tile in number of grid cells.
164 */
165 cols: _propTypes.default.number,
166
167 /**
168 * The component used for the root node.
169 * Either a string to use a HTML element or a component.
170 */
171 component: _propTypes.default
172 /* @typescript-to-proptypes-ignore */
173 .elementType,
174
175 /**
176 * Height of the tile in number of grid cells.
177 */
178 rows: _propTypes.default.number
179} : void 0;
180
181var _default = (0, _withStyles.default)(styles, {
182 name: 'MuiGridListTile'
183})(GridListTile);
184
185exports.default = _default;
\No newline at end of file