@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
1 lines • 3.84 kB
Source Map (JSON)
{"version":3,"file":"use-disclosure.cjs","names":["useCallbackRef"],"sources":["../../../../src/hooks/use-disclosure/use-disclosure.ts"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useRef, useState } from \"react\"\nimport { useCallbackRef } from \"../../utils\"\n\nexport type DisclosureCallback<Y, M> = [Y] extends [never]\n ? () => M\n : undefined extends Y\n ? (value?: Y) => M\n : (value: Y) => M\n\nexport interface UseDisclosureProps<\n Y = never,\n M = never,\n D = Promise<void> | void,\n H = Promise<void> | void,\n> {\n /**\n * If `true`, the element will be initially opened.\n */\n defaultOpen?: boolean\n /**\n * If `true`, the element will be opened.\n */\n open?: boolean\n /**\n * The timing of the open and close.\n *\n * @default 'after'\n */\n timing?: \"after\" | \"before\"\n /**\n * Callback invoked to close the element.\n */\n onClose?: DisclosureCallback<M, H>\n /**\n * Callback invoked to open the element.\n */\n onOpen?: DisclosureCallback<Y, D>\n}\n\n/**\n * `useDisclosure` is a custom hook that helps handle common open/close or toggle scenarios.\n * It can be used to control components such as `Modal`, `Dialog`, `Drawer`, etc.\n *\n * @see https://yamada-ui.com/docs/hooks/use-disclosure\n */\nexport const useDisclosure = <\n Y = never,\n M = never,\n D = Promise<void> | void,\n H = Promise<void> | void,\n>({\n defaultOpen = false,\n open: controlledOpen,\n timing,\n onClose: onCloseProp,\n onOpen: onOpenProp,\n}: UseDisclosureProps<Y, M, D, H> = {}) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState<boolean>(defaultOpen)\n\n const timingRef = useRef(timing ?? \"after\")\n const handleOpen = useCallbackRef(onOpenProp)\n const handleClose = useCallbackRef(onCloseProp)\n\n const controlled = controlledOpen !== undefined\n const open = controlledOpen !== undefined ? controlledOpen : uncontrolledOpen\n\n const onOpen = useCallback(\n async (value: Y) => {\n if (timingRef.current === \"before\") await handleOpen(value)\n\n if (!controlled) setUncontrolledOpen(true)\n\n if (timingRef.current === \"after\") await handleOpen(value)\n },\n [controlled, handleOpen, timingRef],\n ) as DisclosureCallback<Y, D>\n\n const onClose = useCallback(\n async (value: M) => {\n if (timingRef.current === \"before\") await handleClose(value)\n\n if (!controlled) setUncontrolledOpen(false)\n\n if (timingRef.current === \"after\") await handleClose(value)\n },\n [controlled, handleClose, timingRef],\n ) as DisclosureCallback<M, H>\n\n const onToggle = useCallback(\n async (value: M | Y) =>\n !open ? await onOpen(value as Y) : await onClose(value as M),\n [open, onOpen, onClose],\n ) as DisclosureCallback<M, H> | DisclosureCallback<Y, D>\n\n return {\n open,\n onClose,\n onOpen,\n onToggle,\n }\n}\n\nexport type UseDisclosureReturn<\n Y = never,\n M = never,\n D = Promise<void> | void,\n H = Promise<void> | void,\n> = ReturnType<typeof useDisclosure<Y, M, D, H>>\n"],"mappings":";;;;;;;;;;;;;;;AA+CA,MAAa,iBAKX,EACA,cAAc,OACd,MAAM,gBACN,QACA,SAAS,aACT,QAAQ,eAC0B,EAAE,KAAK;CACzC,MAAM,CAAC,kBAAkB,2CAAyC,YAAY;CAE9E,MAAM,8BAAmB,UAAU,QAAQ;CAC3C,MAAM,aAAaA,2BAAe,WAAW;CAC7C,MAAM,cAAcA,2BAAe,YAAY;CAE/C,MAAM,aAAa,mBAAmB;CACtC,MAAM,OAAO,mBAAmB,SAAY,iBAAiB;CAE7D,MAAM,gCACJ,OAAO,UAAa;AAClB,MAAI,UAAU,YAAY,SAAU,OAAM,WAAW,MAAM;AAE3D,MAAI,CAAC,WAAY,qBAAoB,KAAK;AAE1C,MAAI,UAAU,YAAY,QAAS,OAAM,WAAW,MAAM;IAE5D;EAAC;EAAY;EAAY;EAAU,CACpC;CAED,MAAM,iCACJ,OAAO,UAAa;AAClB,MAAI,UAAU,YAAY,SAAU,OAAM,YAAY,MAAM;AAE5D,MAAI,CAAC,WAAY,qBAAoB,MAAM;AAE3C,MAAI,UAAU,YAAY,QAAS,OAAM,YAAY,MAAM;IAE7D;EAAC;EAAY;EAAa;EAAU,CACrC;AAQD,QAAO;EACL;EACA;EACA;EACA,iCATA,OAAO,UACL,CAAC,OAAO,MAAM,OAAO,MAAW,GAAG,MAAM,QAAQ,MAAW,EAC9D;GAAC;GAAM;GAAQ;GAAQ,CACxB;EAOA"}