nitro-react/src/common/transitions/TransitionAnimation.tsx

53 lines
1.4 KiB
TypeScript
Raw Normal View History

2022-05-02 08:34:10 +02:00
import { FC, ReactNode, useEffect, useState } from 'react';
2021-04-21 05:36:39 +02:00
import { Transition } from 'react-transition-group';
import { getTransitionAnimationStyle } from './TransitionAnimationStyles';
2022-03-03 08:23:01 +01:00
interface TransitionAnimationProps
{
type: string;
inProp: boolean;
timeout?: number;
className?: string;
2022-05-02 08:34:10 +02:00
children?: ReactNode;
2022-03-03 08:23:01 +01:00
}
2021-05-12 10:34:40 +02:00
export const TransitionAnimation: FC<TransitionAnimationProps> = props =>
2021-04-21 05:36:39 +02:00
{
const { type = null, inProp = false, timeout = 300, className = null, children = null } = props;
2021-05-12 10:34:40 +02:00
const [ isChildrenVisible, setChildrenVisible ] = useState(false);
2021-05-12 03:12:42 +02:00
useEffect(() =>
{
2021-05-12 10:34:40 +02:00
let timeoutData: ReturnType<typeof setTimeout> = null;
2021-05-12 03:12:42 +02:00
if(inProp)
{
2021-05-12 10:34:40 +02:00
setChildrenVisible(true);
2021-05-12 03:12:42 +02:00
}
else
{
2021-05-12 10:34:40 +02:00
timeoutData = setTimeout(() =>
{
setChildrenVisible(false);
clearTimeout(timeout);
}, timeout);
}
return () =>
{
if(timeoutData) clearTimeout(timeoutData);
2021-05-12 03:12:42 +02:00
}
2021-05-12 10:34:40 +02:00
}, [ inProp, timeout ]);
2021-05-12 03:12:42 +02:00
2021-04-21 05:36:39 +02:00
return (
<Transition in={ inProp } timeout={ timeout }>
2021-05-12 10:34:40 +02:00
{ state => (
2021-08-16 08:00:31 +02:00
<div className={ (className ?? '') + ' animate__animated' } style={ { ...getTransitionAnimationStyle(type, state, timeout) } }>
2021-05-12 10:34:40 +02:00
{ isChildrenVisible && children }
2021-04-21 05:36:39 +02:00
</div>
2022-04-04 04:45:47 +02:00
) }
2021-04-21 05:36:39 +02:00
</Transition>
);
}