@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
53 lines (49 loc) • 1.69 kB
JavaScript
"use client";
import { useCallbackRef } from "../../utils/ref.js";
import { useCallback, useRef, useState } from "react";
//#region src/hooks/use-disclosure/use-disclosure.ts
/**
* `useDisclosure` is a custom hook that helps handle common open/close or toggle scenarios.
* It can be used to control components such as `Modal`, `Dialog`, `Drawer`, etc.
*
* @see https://yamada-ui.com/docs/hooks/use-disclosure
*/
const useDisclosure = ({ defaultOpen = false, open: controlledOpen, timing, onClose: onCloseProp, onOpen: onOpenProp } = {}) => {
const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
const timingRef = useRef(timing ?? "after");
const handleOpen = useCallbackRef(onOpenProp);
const handleClose = useCallbackRef(onCloseProp);
const controlled = controlledOpen !== void 0;
const open = controlledOpen !== void 0 ? controlledOpen : uncontrolledOpen;
const onOpen = useCallback(async (value) => {
if (timingRef.current === "before") await handleOpen(value);
if (!controlled) setUncontrolledOpen(true);
if (timingRef.current === "after") await handleOpen(value);
}, [
controlled,
handleOpen,
timingRef
]);
const onClose = useCallback(async (value) => {
if (timingRef.current === "before") await handleClose(value);
if (!controlled) setUncontrolledOpen(false);
if (timingRef.current === "after") await handleClose(value);
}, [
controlled,
handleClose,
timingRef
]);
return {
open,
onClose,
onOpen,
onToggle: useCallback(async (value) => !open ? await onOpen(value) : await onClose(value), [
open,
onOpen,
onClose
])
};
};
//#endregion
export { useDisclosure };
//# sourceMappingURL=use-disclosure.js.map