UNPKG

9.96 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.setTranslateValue = setTranslateValue;
11exports.default = void 0;
12
13var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
14
15var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
16
17var React = _interopRequireWildcard(require("react"));
18
19var _propTypes = _interopRequireDefault(require("prop-types"));
20
21var ReactDOM = _interopRequireWildcard(require("react-dom"));
22
23var _debounce = _interopRequireDefault(require("../utils/debounce"));
24
25var _reactTransitionGroup = require("react-transition-group");
26
27var _utils = require("@material-ui/utils");
28
29var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
30
31var _useTheme = _interopRequireDefault(require("../styles/useTheme"));
32
33var _transitions = require("../styles/transitions");
34
35var _utils2 = require("../transitions/utils");
36
37// Translate the node so he can't be seen on the screen.
38// Later, we gonna translate back the node to his original location
39// with `none`.`
40function getTranslateValue(direction, node) {
41 var rect = node.getBoundingClientRect();
42 var transform;
43
44 if (node.fakeTransform) {
45 transform = node.fakeTransform;
46 } else {
47 var computedStyle = window.getComputedStyle(node);
48 transform = computedStyle.getPropertyValue('-webkit-transform') || computedStyle.getPropertyValue('transform');
49 }
50
51 var offsetX = 0;
52 var offsetY = 0;
53
54 if (transform && transform !== 'none' && typeof transform === 'string') {
55 var transformValues = transform.split('(')[1].split(')')[0].split(',');
56 offsetX = parseInt(transformValues[4], 10);
57 offsetY = parseInt(transformValues[5], 10);
58 }
59
60 if (direction === 'left') {
61 return "translateX(".concat(window.innerWidth, "px) translateX(").concat(offsetX - rect.left, "px)");
62 }
63
64 if (direction === 'right') {
65 return "translateX(-".concat(rect.left + rect.width - offsetX, "px)");
66 }
67
68 if (direction === 'up') {
69 return "translateY(".concat(window.innerHeight, "px) translateY(").concat(offsetY - rect.top, "px)");
70 } // direction === 'down'
71
72
73 return "translateY(-".concat(rect.top + rect.height - offsetY, "px)");
74}
75
76function setTranslateValue(direction, node) {
77 var transform = getTranslateValue(direction, node);
78
79 if (transform) {
80 node.style.webkitTransform = transform;
81 node.style.transform = transform;
82 }
83}
84
85var defaultTimeout = {
86 enter: _transitions.duration.enteringScreen,
87 exit: _transitions.duration.leavingScreen
88};
89/**
90 * The Slide transition is used by the [Drawer](/components/drawers/) component.
91 * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.
92 */
93
94var Slide = /*#__PURE__*/React.forwardRef(function Slide(props, ref) {
95 var children = props.children,
96 _props$direction = props.direction,
97 direction = _props$direction === void 0 ? 'down' : _props$direction,
98 inProp = props.in,
99 onEnter = props.onEnter,
100 onEntered = props.onEntered,
101 onEntering = props.onEntering,
102 onExit = props.onExit,
103 onExited = props.onExited,
104 onExiting = props.onExiting,
105 style = props.style,
106 _props$timeout = props.timeout,
107 timeout = _props$timeout === void 0 ? defaultTimeout : _props$timeout,
108 _props$TransitionComp = props.TransitionComponent,
109 TransitionComponent = _props$TransitionComp === void 0 ? _reactTransitionGroup.Transition : _props$TransitionComp,
110 other = (0, _objectWithoutProperties2.default)(props, ["children", "direction", "in", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "style", "timeout", "TransitionComponent"]);
111 var theme = (0, _useTheme.default)();
112 var childrenRef = React.useRef(null);
113 /**
114 * used in cloneElement(children, { ref: handleRef })
115 */
116
117 var handleOwnRef = React.useCallback(function (instance) {
118 // #StrictMode ready
119 childrenRef.current = ReactDOM.findDOMNode(instance);
120 }, []);
121 var handleRefIntermediary = (0, _useForkRef.default)(children.ref, handleOwnRef);
122 var handleRef = (0, _useForkRef.default)(handleRefIntermediary, ref);
123
124 var normalizedTransitionCallback = function normalizedTransitionCallback(callback) {
125 return function (isAppearing) {
126 if (callback) {
127 // onEnterXxx and onExitXxx callbacks have a different arguments.length value.
128 if (isAppearing === undefined) {
129 callback(childrenRef.current);
130 } else {
131 callback(childrenRef.current, isAppearing);
132 }
133 }
134 };
135 };
136
137 var handleEnter = normalizedTransitionCallback(function (node, isAppearing) {
138 setTranslateValue(direction, node);
139 (0, _utils2.reflow)(node);
140
141 if (onEnter) {
142 onEnter(node, isAppearing);
143 }
144 });
145 var handleEntering = normalizedTransitionCallback(function (node, isAppearing) {
146 var transitionProps = (0, _utils2.getTransitionProps)({
147 timeout: timeout,
148 style: style
149 }, {
150 mode: 'enter'
151 });
152 node.style.webkitTransition = theme.transitions.create('-webkit-transform', (0, _extends2.default)({}, transitionProps, {
153 easing: theme.transitions.easing.easeOut
154 }));
155 node.style.transition = theme.transitions.create('transform', (0, _extends2.default)({}, transitionProps, {
156 easing: theme.transitions.easing.easeOut
157 }));
158 node.style.webkitTransform = 'none';
159 node.style.transform = 'none';
160
161 if (onEntering) {
162 onEntering(node, isAppearing);
163 }
164 });
165 var handleEntered = normalizedTransitionCallback(onEntered);
166 var handleExiting = normalizedTransitionCallback(onExiting);
167 var handleExit = normalizedTransitionCallback(function (node) {
168 var transitionProps = (0, _utils2.getTransitionProps)({
169 timeout: timeout,
170 style: style
171 }, {
172 mode: 'exit'
173 });
174 node.style.webkitTransition = theme.transitions.create('-webkit-transform', (0, _extends2.default)({}, transitionProps, {
175 easing: theme.transitions.easing.sharp
176 }));
177 node.style.transition = theme.transitions.create('transform', (0, _extends2.default)({}, transitionProps, {
178 easing: theme.transitions.easing.sharp
179 }));
180 setTranslateValue(direction, node);
181
182 if (onExit) {
183 onExit(node);
184 }
185 });
186 var handleExited = normalizedTransitionCallback(function (node) {
187 // No need for transitions when the component is hidden
188 node.style.webkitTransition = '';
189 node.style.transition = '';
190
191 if (onExited) {
192 onExited(node);
193 }
194 });
195 var updatePosition = React.useCallback(function () {
196 if (childrenRef.current) {
197 setTranslateValue(direction, childrenRef.current);
198 }
199 }, [direction]);
200 React.useEffect(function () {
201 // Skip configuration where the position is screen size invariant.
202 if (inProp || direction === 'down' || direction === 'right') {
203 return undefined;
204 }
205
206 var handleResize = (0, _debounce.default)(function () {
207 if (childrenRef.current) {
208 setTranslateValue(direction, childrenRef.current);
209 }
210 });
211 window.addEventListener('resize', handleResize);
212 return function () {
213 handleResize.clear();
214 window.removeEventListener('resize', handleResize);
215 };
216 }, [direction, inProp]);
217 React.useEffect(function () {
218 if (!inProp) {
219 // We need to update the position of the drawer when the direction change and
220 // when it's hidden.
221 updatePosition();
222 }
223 }, [inProp, updatePosition]);
224 return /*#__PURE__*/React.createElement(TransitionComponent, (0, _extends2.default)({
225 nodeRef: childrenRef,
226 onEnter: handleEnter,
227 onEntered: handleEntered,
228 onEntering: handleEntering,
229 onExit: handleExit,
230 onExited: handleExited,
231 onExiting: handleExiting,
232 appear: true,
233 in: inProp,
234 timeout: timeout
235 }, other), function (state, childProps) {
236 return /*#__PURE__*/React.cloneElement(children, (0, _extends2.default)({
237 ref: handleRef,
238 style: (0, _extends2.default)({
239 visibility: state === 'exited' && !inProp ? 'hidden' : undefined
240 }, style, children.props.style)
241 }, childProps));
242 });
243});
244process.env.NODE_ENV !== "production" ? Slide.propTypes = {
245 // ----------------------------- Warning --------------------------------
246 // | These PropTypes are generated from the TypeScript type definitions |
247 // | To update them edit the d.ts file and run "yarn proptypes" |
248 // ----------------------------------------------------------------------
249
250 /**
251 * A single child content element.
252 */
253 children: _utils.elementAcceptingRef,
254
255 /**
256 * Direction the child node will enter from.
257 */
258 direction: _propTypes.default.oneOf(['down', 'left', 'right', 'up']),
259
260 /**
261 * If `true`, show the component; triggers the enter or exit animation.
262 */
263 in: _propTypes.default.bool,
264
265 /**
266 * @ignore
267 */
268 onEnter: _propTypes.default.func,
269
270 /**
271 * @ignore
272 */
273 onEntered: _propTypes.default.func,
274
275 /**
276 * @ignore
277 */
278 onEntering: _propTypes.default.func,
279
280 /**
281 * @ignore
282 */
283 onExit: _propTypes.default.func,
284
285 /**
286 * @ignore
287 */
288 onExited: _propTypes.default.func,
289
290 /**
291 * @ignore
292 */
293 onExiting: _propTypes.default.func,
294
295 /**
296 * @ignore
297 */
298 style: _propTypes.default.object,
299
300 /**
301 * The duration for the transition, in milliseconds.
302 * You may specify a single timeout for all transitions, or individually with an object.
303 */
304 timeout: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({
305 appear: _propTypes.default.number,
306 enter: _propTypes.default.number,
307 exit: _propTypes.default.number
308 })])
309} : void 0;
310var _default = Slide;
311exports.default = _default;
\No newline at end of file