mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2025-12-30 11:22:31 +00:00
Since we unmount the dialog after a timeout because of an animation we need to cancel the timeout in case we need to render new dialog. Otherwise the actual hiding can be executed after we render the new dialog.
40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import React, { ReactElement, useEffect, useState } from 'react';
|
|
|
|
export const DialogTransitionContext = React.createContext({ isUnmounting: false });
|
|
|
|
type TimeoutType = ReturnType<typeof setTimeout>;
|
|
|
|
const DialogTransition = ({ children }: { children: ReactElement | null; }) => {
|
|
const [ childrenToRender, setChildrenToRender ] = useState(children);
|
|
const [ isUnmounting, setIsUnmounting ] = useState(false);
|
|
const [ timeoutID, setTimeoutID ] = useState<TimeoutType | undefined>(undefined);
|
|
|
|
useEffect(() => {
|
|
if (children === null) {
|
|
setIsUnmounting(true);
|
|
if (typeof timeoutID === 'undefined') {
|
|
setTimeoutID(setTimeout(() => {
|
|
setChildrenToRender(children);
|
|
setIsUnmounting(false);
|
|
setTimeoutID(undefined);
|
|
}, 150));
|
|
}
|
|
} else {
|
|
if (typeof timeoutID !== 'undefined') {
|
|
clearTimeout(timeoutID);
|
|
setTimeoutID(undefined);
|
|
setIsUnmounting(false);
|
|
}
|
|
setChildrenToRender(children);
|
|
}
|
|
}, [ children ]);
|
|
|
|
return (
|
|
<DialogTransitionContext.Provider value = {{ isUnmounting }}>
|
|
{childrenToRender}
|
|
</DialogTransitionContext.Provider>
|
|
);
|
|
};
|
|
|
|
export default DialogTransition;
|