@redocly/theme
Version:
Shared UI components lib
39 lines (31 loc) • 929 B
text/typescript
import { useState, useCallback, useRef } from 'react';
const DEFAULT_CONTROL_OPEN_DELAY = 300;
export type UseControlReturnType = {
isOpened: boolean;
handleOpen: () => void;
handleClose: () => void;
};
export const useControl = (initialVal = false): UseControlReturnType => {
const [isOpened, setIsOpened] = useState<boolean>(initialVal);
const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const clearOpenTimer = useCallback(() => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
}, []);
const handleOpen = useCallback(() => {
clearOpenTimer();
timeoutRef.current = setTimeout(() => {
setIsOpened(true);
}, DEFAULT_CONTROL_OPEN_DELAY);
}, [clearOpenTimer]);
const handleClose = useCallback(() => {
clearOpenTimer();
setIsOpened(false);
}, [clearOpenTimer]);
return {
isOpened,
handleOpen,
handleClose,
};
};