@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
104 lines (98 loc) • 3.56 kB
JavaScript
'use client';
;
var React = require('react');
var ReactDOM = require('react-dom');
var hooks = require('@mantine/hooks');
require('react/jsx-runtime');
require('clsx');
require('../../core/MantineProvider/Mantine.context.cjs');
require('../../core/MantineProvider/default-theme.cjs');
require('../../core/MantineProvider/MantineProvider.cjs');
var MantineThemeProvider = require('../../core/MantineProvider/MantineThemeProvider/MantineThemeProvider.cjs');
require('../../core/MantineProvider/MantineCssVariables/MantineCssVariables.cjs');
require('../../core/Box/Box.cjs');
require('../../core/DirectionProvider/DirectionProvider.cjs');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var ReactDOM__default = /*#__PURE__*/_interopDefault(ReactDOM);
function useTransition({
duration,
exitDuration,
timingFunction,
mounted,
onEnter,
onExit,
onEntered,
onExited,
enterDelay,
exitDelay
}) {
const theme = MantineThemeProvider.useMantineTheme();
const shouldReduceMotion = hooks.useReducedMotion();
const reduceMotion = theme.respectReducedMotion ? shouldReduceMotion : false;
const [transitionDuration, setTransitionDuration] = React.useState(reduceMotion ? 0 : duration);
const [transitionStatus, setStatus] = React.useState(mounted ? "entered" : "exited");
const transitionTimeoutRef = React.useRef(-1);
const delayTimeoutRef = React.useRef(-1);
const rafRef = React.useRef(-1);
function clearAllTimeouts() {
window.clearTimeout(transitionTimeoutRef.current);
window.clearTimeout(delayTimeoutRef.current);
cancelAnimationFrame(rafRef.current);
}
const handleStateChange = (shouldMount) => {
clearAllTimeouts();
const preHandler = shouldMount ? onEnter : onExit;
const handler = shouldMount ? onEntered : onExited;
const newTransitionDuration = reduceMotion ? 0 : shouldMount ? duration : exitDuration;
setTransitionDuration(newTransitionDuration);
if (newTransitionDuration === 0) {
typeof preHandler === "function" && preHandler();
typeof handler === "function" && handler();
setStatus(shouldMount ? "entered" : "exited");
} else {
rafRef.current = requestAnimationFrame(() => {
ReactDOM__default.default.flushSync(() => {
setStatus(shouldMount ? "pre-entering" : "pre-exiting");
});
rafRef.current = requestAnimationFrame(() => {
typeof preHandler === "function" && preHandler();
setStatus(shouldMount ? "entering" : "exiting");
transitionTimeoutRef.current = window.setTimeout(() => {
typeof handler === "function" && handler();
setStatus(shouldMount ? "entered" : "exited");
}, newTransitionDuration);
});
});
}
};
const handleTransitionWithDelay = (shouldMount) => {
clearAllTimeouts();
const delay = shouldMount ? enterDelay : exitDelay;
if (typeof delay !== "number") {
handleStateChange(shouldMount);
return;
}
delayTimeoutRef.current = window.setTimeout(
() => {
handleStateChange(shouldMount);
},
shouldMount ? enterDelay : exitDelay
);
};
hooks.useDidUpdate(() => {
handleTransitionWithDelay(mounted);
}, [mounted]);
React.useEffect(
() => () => {
clearAllTimeouts();
},
[]
);
return {
transitionDuration,
transitionStatus,
transitionTimingFunction: timingFunction || "ease"
};
}
exports.useTransition = useTransition;
//# sourceMappingURL=use-transition.cjs.map