@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
1 lines • 3.22 kB
Source Map (JSON)
{"version":3,"file":"use-promise-disclosure.cjs","names":["useDisclosure","value"],"sources":["../../../../src/hooks/use-disclosure/use-promise-disclosure.ts"],"sourcesContent":["\"use client\"\n\nimport type { DisclosureCallback, UseDisclosureProps } from \"./use-disclosure\"\nimport { useCallback, useRef } from \"react\"\nimport { noop } from \"../../utils\"\nimport { useDisclosure } from \"./use-disclosure\"\n\nexport interface UsePromiseDisclosureProps<\n Y = never,\n M = never,\n D = never,\n H = Promise<void> | void,\n R = Promise<void> | void,\n> extends UseDisclosureProps<M, D | Y, H, R> {\n disableCloseOnSuccess?: boolean\n error?: unknown\n}\n\n/**\n * `usePromiseDisclosure` is a custom hook that helps handle common open/close or toggle scenarios with promises.\n * It can be used to control components such as `Modal`, `Dialog`, `Drawer`, etc.\n *\n * @see https://yamada-ui.com/docs/hooks/use-promise-disclosure\n */\nexport const usePromiseDisclosure = <\n Y = never,\n M = never,\n D = never,\n H = Promise<void> | void,\n R = Promise<void> | void,\n>({\n disableCloseOnSuccess = false,\n error,\n ...rest\n}: UsePromiseDisclosureProps<Y, M, D, H, R> = {}) => {\n const {\n open,\n onClose: onInternalClose,\n onOpen: onInternalOpen,\n onToggle,\n } = useDisclosure<M, D | Y, H, R>(rest)\n\n const rejectRef = useRef<((reason?: any) => void) | undefined>(undefined)\n const resolveRef = useRef(noop as DisclosureCallback<Y, R>)\n\n const onOpen = useCallback(\n async (value: M) => {\n const promise = new Promise<Y>((resolve, reject) => {\n resolveRef.current = (async (value: Y) => {\n rejectRef.current = undefined\n\n resolve(value)\n\n if (!disableCloseOnSuccess) await onInternalClose(value)\n }) as DisclosureCallback<Y, R>\n\n rejectRef.current = reject\n })\n\n await onInternalOpen(value)\n\n return await promise\n },\n [onInternalOpen, onInternalClose, disableCloseOnSuccess],\n ) as DisclosureCallback<M, [Y] extends [never] ? Promise<void> : Promise<Y>>\n\n const onClose = useCallback(\n async (value: D) => {\n rejectRef.current?.(error)\n\n await onInternalClose(value)\n },\n [onInternalClose, error],\n ) as DisclosureCallback<D, R>\n\n return {\n open,\n onClose,\n onOpen,\n onSuccess: resolveRef.current,\n onToggle,\n }\n}\n\nexport type UsePromiseDisclosureReturn<\n Y = never,\n M = never,\n D = never,\n H = Promise<void> | void,\n R = Promise<void> | void,\n> = ReturnType<typeof usePromiseDisclosure<Y, M, D, H, R>>\n"],"mappings":";;;;;;;;;;;;;;;;AAwBA,MAAa,wBAMX,EACA,wBAAwB,OACxB,MACA,GAAG,SACyC,EAAE,KAAK;CACnD,MAAM,EACJ,MACA,SAAS,iBACT,QAAQ,gBACR,aACEA,qCAA8B,KAAK;CAEvC,MAAM,8BAAyD,OAAU;CACzE,MAAM,iEAAoB,KAAiC;CAE3D,MAAM,gCACJ,OAAO,UAAa;EAClB,MAAM,UAAU,IAAI,SAAY,SAAS,WAAW;AAClD,cAAW,WAAW,OAAO,YAAa;AACxC,cAAU,UAAU;AAEpB,YAAQC,QAAM;AAEd,QAAI,CAAC,sBAAuB,OAAM,gBAAgBA,QAAM;;AAG1D,aAAU,UAAU;IACpB;AAEF,QAAM,eAAe,MAAM;AAE3B,SAAO,MAAM;IAEf;EAAC;EAAgB;EAAiB;EAAsB,CACzD;AAWD,QAAO;EACL;EACA,gCAVA,OAAO,UAAa;AAClB,aAAU,UAAU,MAAM;AAE1B,SAAM,gBAAgB,MAAM;KAE9B,CAAC,iBAAiB,MAAM,CACzB;EAKC;EACA,WAAW,WAAW;EACtB;EACD"}