UNPKG

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