UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

98 lines (95 loc) 3.32 kB
'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, enterDelay, exitDelay }) { 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 transitionTimeoutRef = useRef(-1); const delayTimeoutRef = useRef(-1); const rafRef = 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.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 ); }; useDidUpdate(() => { handleTransitionWithDelay(mounted); }, [mounted]); useEffect( () => () => { clearAllTimeouts(); }, [] ); return { transitionDuration, transitionStatus, transitionTimingFunction: timingFunction || "ease" }; } export { useTransition }; //# sourceMappingURL=use-transition.mjs.map