UNPKG

@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
"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