nitro-react/src/layout/notification-bubble/NotificationBubbleView.tsx

47 lines
1.4 KiB
TypeScript
Raw Normal View History

2021-10-05 21:53:16 +02:00
import { FC, useEffect, useMemo, useState } from 'react';
import { NitroLayoutBase } from '../base';
import { TransitionAnimation, TransitionAnimationTypes } from '../transitions';
2021-08-26 08:38:16 +02:00
import { NotificationBubbleViewProps } from './NotificationBubbleView.types';
export const NotificationBubbleView: FC<NotificationBubbleViewProps> = props =>
{
2021-10-05 21:53:16 +02:00
const { fadesOut = true, timeoutMs = 8000, close = null, className = '', ...rest } = props;
const [ isVisible, setIsVisible ] = useState(false);
const getClassName = useMemo(() =>
{
let newClassName = 'nitro-notification-bubble rounded';
if(className && className.length) newClassName += ` ${ className }`;
return newClassName;
}, [ className ]);
useEffect(() =>
{
setIsVisible(true);
return () => setIsVisible(false);
}, []);
2021-08-26 08:38:16 +02:00
useEffect(() =>
{
if(!fadesOut) return;
const timeout = setTimeout(() =>
2021-10-05 21:53:16 +02:00
{
setIsVisible(false);
2021-08-26 08:38:16 +02:00
2021-10-05 21:53:16 +02:00
setTimeout(() => close(), 300);
}, timeoutMs);
2021-08-26 08:38:16 +02:00
return () => clearTimeout(timeout);
2021-10-05 21:53:16 +02:00
}, [ fadesOut, timeoutMs, close ]);
2021-08-26 08:38:16 +02:00
return (
2021-10-05 21:53:16 +02:00
<TransitionAnimation type={ TransitionAnimationTypes.FADE_IN } inProp={ isVisible } timeout={ 300 }>
<NitroLayoutBase className={ getClassName } onClick={ close } { ...rest } />
</TransitionAnimation>
);
2021-08-26 08:38:16 +02:00
}