@jengaui/alert-dialog
Version:
Jenga UI Alert Dialog component in React
25 lines (18 loc) • 4.08 kB
JavaScript
;
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;