@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
55 lines (51 loc) • 1.88 kB
JavaScript
"use client";
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
const require_ref = require('../../utils/ref.cjs');
let react = require("react");
react = require_rolldown_runtime.__toESM(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] = (0, react.useState)(defaultOpen);
const timingRef = (0, react.useRef)(timing ?? "after");
const handleOpen = require_ref.useCallbackRef(onOpenProp);
const handleClose = require_ref.useCallbackRef(onCloseProp);
const controlled = controlledOpen !== void 0;
const open = controlledOpen !== void 0 ? controlledOpen : uncontrolledOpen;
const onOpen = (0, react.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 = (0, react.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: (0, react.useCallback)(async (value) => !open ? await onOpen(value) : await onClose(value), [
open,
onOpen,
onClose
])
};
};
//#endregion
exports.useDisclosure = useDisclosure;
//# sourceMappingURL=use-disclosure.cjs.map