Skip to content

Instantly share code, notes, and snippets.

@jlozovei
Last active February 9, 2024 17:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jlozovei/11e49ceb6adda66ad4efb5f2dfb2d303 to your computer and use it in GitHub Desktop.
Save jlozovei/11e49ceb6adda66ad4efb5f2dfb2d303 to your computer and use it in GitHub Desktop.
FadeInOut React component
import { useState, useEffect } from 'react';
import './styles.css';
const stages = {
unmounted: 'unmounted',
entering: 'entering',
entered: 'entered',
completed: 'completed',
exiting: 'exiting',
exited: 'exited'
};
const FadeInOut = ({ children, show = false, duration = 200, ...props }) => {
const [transitionStage, setTransitionStage] = useState(stages.unmounted);
useEffect(() => {
if (show) {
setTransitionStage(stages.entering);
}
}, []);
useEffect(() => {
if (show) {
if (transitionStage !== stages.entering && transitionStage !== stages.entered) {
setTransitionStage(stages.entering);
}
} else {
if (transitionStage === stages.entering || transitionStage === stages.entered) {
setTransitionStage(stages.exiting);
}
}
}, [show]);
useEffect(() => {
if (transitionStage === stages.exited) {
setTransitionStage(stages.unmounted);
} else if (transitionStage === stages.entering) {
setTimeout(() => {
setTransitionStage(stages.entered);
}, 0);
} else if (transitionStage === stages.exiting) {
setTimeout(() => {
setTransitionStage(stages.exited);
}, duration);
}
}, [transitionStage]);
return (
<>
{transitionStage === stages.unmounted ? null : (
<div
className={`fade-${stages[transitionStage]}`}
style={{ transitionDuration: `${duration}ms` }}
{...props}
>
{children}
</div>
)}
</>
);
};
export { FadeInOut };
.fade-exiting,
.fade-exited,
.fade-unmounted {
height: 0;
opacity: 0;
visibility: hidden;
}
.fade-entered {
opacity: 1;
visibility: visible;
}
.fade-entering,
.fade-exiting {
transition-property: opacity;
transition-timing-function: ease-in-out;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment