@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
77 lines (74 loc) • 2.74 kB
JavaScript
'use client';
import { useState, useRef, useEffect } from 'react';
import ReactDOM from 'react-dom';
import { useReducedMotion, useDidUpdate } from '@mantine/hooks';
import 'react/jsx-runtime';
import 'clsx';
import '../../core/MantineProvider/Mantine.context.mjs';
import '../../core/MantineProvider/default-theme.mjs';
import '../../core/MantineProvider/MantineProvider.mjs';
import { useMantineTheme } from '../../core/MantineProvider/MantineThemeProvider/MantineThemeProvider.mjs';
import '../../core/MantineProvider/MantineCssVariables/MantineCssVariables.mjs';
import '../../core/Box/Box.mjs';
import '../../core/DirectionProvider/DirectionProvider.mjs';
function useTransition({
duration,
exitDuration,
timingFunction,
mounted,
onEnter,
onExit,
onEntered,
onExited
}) {
const theme = useMantineTheme();
const shouldReduceMotion = useReducedMotion();
const reduceMotion = theme.respectReducedMotion ? shouldReduceMotion : false;
const [transitionDuration, setTransitionDuration] = useState(reduceMotion ? 0 : duration);
const [transitionStatus, setStatus] = useState(mounted ? "entered" : "exited");
const timeoutRef = useRef(-1);
const rafRef = useRef(-1);
const handleStateChange = (shouldMount) => {
const preHandler = shouldMount ? onEnter : onExit;
const handler = shouldMount ? onEntered : onExited;
window.clearTimeout(timeoutRef.current);
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.flushSync(() => {
setStatus(shouldMount ? "pre-entering" : "pre-exiting");
});
rafRef.current = requestAnimationFrame(() => {
typeof preHandler === "function" && preHandler();
setStatus(shouldMount ? "entering" : "exiting");
timeoutRef.current = window.setTimeout(() => {
typeof handler === "function" && handler();
setStatus(shouldMount ? "entered" : "exited");
}, newTransitionDuration);
});
});
}
};
useDidUpdate(() => {
handleStateChange(mounted);
}, [mounted]);
useEffect(
() => () => {
window.clearTimeout(timeoutRef.current);
cancelAnimationFrame(rafRef.current);
},
[]
);
return {
transitionDuration,
transitionStatus,
transitionTimingFunction: timingFunction || "ease"
};
}
export { useTransition };
//# sourceMappingURL=use-transition.mjs.map