UNPKG

@jengaui/alert-dialog

Version:

Jenga UI Alert Dialog component in React

25 lines (18 loc) 4.08 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var react = require('react'); var K = require('tiny-invariant'); var portal = require('@jengaui/portal'); var dialog = require('@jengaui/dialog'); var button = require('@jengaui/button'); var buttonGroup = require('@jengaui/button-group'); var content = require('@jengaui/content'); var utils = require('@react-aria/utils'); var jsxRuntime = require('react/jsx-runtime'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var K__default = /*#__PURE__*/_interopDefaultLegacy(K); var I={label:"Ok",type:"primary"},N={label:"Cancel"};function j(l,m){let{onClose:i}=dialog.useDialogContext(),{danger:D,actions:p,title:f,styles:c,noActions:u,content:a,...s}=l,{confirm:r,secondary:e,cancel:n}=p??{};return r=r!==!1?{...I,...typeof r=="object"?r:null}:void 0,n=n?{...N,...typeof n=="object"?n:null}:void 0,jsxRuntime.jsxs(dialog.Dialog,{ref:m,role:"alertdialog",isDismissable:!1,...s,children:[f?jsxRuntime.jsx(content.Header,{children:jsxRuntime.jsx(content.Title,{children:f})}):null,a?jsxRuntime.jsx(content.Content,{children:typeof a=="string"?jsxRuntime.jsx(content.Paragraph,{children:a}):a}):null,u?null:jsxRuntime.jsx(content.Footer,{children:jsxRuntime.jsxs(buttonGroup.ButtonGroup,{align:"end",children:[jsxRuntime.jsx(button.Button,{autoFocus:!0,theme:D?"danger":void 0,...r,onPress:t=>{var o;return utils.chain((o=r==null?void 0:r.onPress)==null?void 0:o.call(r,t),i==null?void 0:i("confirm"))}}),e&&jsxRuntime.jsx(button.Button,{...e,onPress:t=>{var o;return utils.chain((o=e==null?void 0:e.onPress)==null?void 0:o.call(e,t),i==null?void 0:i("secondary"))}}),n&&jsxRuntime.jsx(button.Button,{...n,onPress:t=>{var o;return utils.chain((o=n==null?void 0:n.onPress)==null?void 0:o.call(n,t),i==null?void 0:i("cancel"))}})]})})]})}var v=react.forwardRef(j);var x="AlertDialogZone";function B(l){let{openedDialog:m}=l;if(m===null)return jsxRuntime.jsx(portal.Portal,{},x);let{type:i,isDismissable:D=!0,actions:p,onDismiss:f,content:c,...u}=m.props,{resolve:a,reject:s,isVisible:r,dialogType:e}=m.meta,n=(()=>{let t=(o,d)=>{if(typeof o>"u")return;if(typeof o=="boolean")return o?{onPress:()=>a(d)}:!1;let P=o.onPress;return {...o,onPress:h=>{P==null||P(h),a(d);}}};return typeof p>"u"?{}:{confirm:t(p.confirm,"confirm"),secondary:t(p.secondary,"secondary"),cancel:t(p.cancel,"cancel")}})();return jsxRuntime.jsx(portal.Portal,{children:jsxRuntime.jsx(dialog.DialogContainer,{isOpen:r,isDismissable:D,type:i,onDismiss:f,children:jsxRuntime.jsx(v,{noActions:e==="form",actions:n,isHidden:!r,content:typeof c=="function"?c({resolve:a,reject:s}):c,...u})})},x)}var T=react.createContext(null);function Do(l){let[m,i]=react.useState(null),D=react.useRef(0),p=react.useMemo(()=>({open:(f,c={})=>{let{onDismiss:u,...a}=f,{cancelToken:s}=c,r=++D.current,e={props:null,meta:{id:r,isClosed:!1,isVisible:!0}},n=()=>{var t;e.meta.isClosed||(e.meta.isClosed=!0,(t=c.cancelToken)==null||t.removeEventListener("abort",n),i(o=>(o==null?void 0:o.meta.id)!==r?o:{props:o.props,meta:{...o.meta,isVisible:!1}}),setTimeout(()=>i(o=>(o==null?void 0:o.meta.id)!==r?o:null),300));};return s!=null&&s.aborted?new Promise(()=>{}):(s==null||s.addEventListener("abort",n,{once:!0}),e.meta.promise=new Promise((t,o)=>{e.meta.resolve=d=>{n(),t(d);},e.meta.reject=d=>{n(),o(d);};}),e.props={...a,onDismiss:t=>{u==null||u(t),e.meta.reject(void 0);}},i(t=>t!==null?(e.meta.reject(new Error("Another dialog is already opened. It's a bad practice to open more than one <AlertDialog /> at the same time")),t):e),e.meta.promise)}}),[]);return jsxRuntime.jsxs(T.Provider,{value:p,children:[jsxRuntime.jsx(B,{openedDialog:m}),l.children]})}function Ao(){let l=react.useContext(T);return K__default["default"](l!==null,"You can't use DialogApi outside of <Root /> component. Please, check if your component is descendant of <Root/> component"),l} exports.AlertDialog = v; exports.AlertDialogApiProvider = Do; exports.AlertDialogZone = B; exports.useAlertDialogAPI = Ao;