mirror of
https://github.com/datahub-project/datahub.git
synced 2025-08-15 04:37:03 +00:00

Allow the ability to now nest domains underneath other domains. This should work much like the business glossary where you can add domains underneath other domains, move domains underneath other domains or at the root, and navigate domains using a nice new navigator.
48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { useMemo, useState } from 'react';
|
|
|
|
const NOOP = (_: boolean) => {};
|
|
|
|
const useToggle = ({ initialValue = false, closeDelay = 0, openDelay = 0, onToggle = NOOP } = {}) => {
|
|
const [isOpen, setIsOpen] = useState<boolean>(initialValue);
|
|
const [transition, setTransition] = useState<'opening' | 'closing' | null>(null);
|
|
const isOpening = transition === 'opening';
|
|
const isClosing = transition === 'closing';
|
|
const isTransitioning = transition !== null;
|
|
|
|
const toggleClose = useMemo(
|
|
() => () => {
|
|
setTransition('closing');
|
|
window.setTimeout(() => {
|
|
setIsOpen(false);
|
|
setTransition(null);
|
|
onToggle(false);
|
|
}, closeDelay);
|
|
},
|
|
[closeDelay, onToggle],
|
|
);
|
|
|
|
const toggleOpen = useMemo(
|
|
() => () => {
|
|
setTransition('opening');
|
|
window.setTimeout(() => {
|
|
setIsOpen(true);
|
|
setTransition(null);
|
|
onToggle(true);
|
|
}, openDelay);
|
|
},
|
|
[openDelay, onToggle],
|
|
);
|
|
|
|
const toggle = () => {
|
|
if (isOpen) {
|
|
toggleClose();
|
|
} else {
|
|
toggleOpen();
|
|
}
|
|
};
|
|
|
|
return { isOpen, isClosing, isOpening, isTransitioning, toggle, toggleOpen, toggleClose } as const;
|
|
};
|
|
|
|
export default useToggle;
|