@jengaui/alert-dialog
Version:
Jenga UI Alert Dialog component in React
23 lines (16 loc) • 4.03 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,c){let{onClose:r}=dialog.useDialogContext(),{danger:D,actions:p,title:f,styles:m,noActions:u,content:a,...s}=l,{confirm:i,secondary:e,cancel:t}=p??{};return i=i!==!1?{...I,...typeof i=="object"?i:null}:void 0,t=t?{...N,...typeof t=="object"?t:null}:void 0,jsxRuntime.jsxs(dialog.Dialog,{ref:c,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,...i,onPress:n=>{var o;return utils.chain((o=i==null?void 0:i.onPress)==null?void 0:o.call(i,n),r==null?void 0:r("confirm"))}}),e&&jsxRuntime.jsx(button.Button,{...e,onPress:n=>{var o;return utils.chain((o=e==null?void 0:e.onPress)==null?void 0:o.call(e,n),r==null?void 0:r("secondary"))}}),t&&jsxRuntime.jsx(button.Button,{...t,onPress:n=>{var o;return utils.chain((o=t==null?void 0:t.onPress)==null?void 0:o.call(t,n),r==null?void 0:r("cancel"))}})]})})]})}var v=react.forwardRef(j);var B="AlertDialogZone";function T(l){let{openedDialog:c}=l;if(c===null)return jsxRuntime.jsx(portal.Portal,{},B);let{type:r,isDismissable:D=!0,actions:p,onDismiss:f,content:m,...u}=c.props,{resolve:a,reject:s,isVisible:i,dialogType:e}=c.meta,t=(()=>{let n=(o,d)=>{if(typeof o>"u")return;if(typeof o=="boolean")return o?{onPress:()=>a(d)}:!1;let P=o.onPress;return {...o,onPress:x=>{P==null||P(x),a(d);}}};return typeof p>"u"?{}:{confirm:n(p.confirm,"confirm"),secondary:n(p.secondary,"secondary"),cancel:n(p.cancel,"cancel")}})();return jsxRuntime.jsx(portal.Portal,{children:jsxRuntime.jsx(dialog.DialogContainer,{isOpen:i,isDismissable:D,type:r,onDismiss:f,children:jsxRuntime.jsx(v,{noActions:e==="form",actions:t,isHidden:!i,content:typeof m=="function"?m({resolve:a,reject:s}):m,...u})})},B)}var h=react.createContext(null);function Do(l){let[c,r]=react.useState(null),D=react.useRef(0),p=react.useMemo(()=>({open:(f,m={})=>{let{onDismiss:u,...a}=f,{cancelToken:s}=m,i=++D.current,e={props:null,meta:{id:i,isClosed:!1,isVisible:!0}},t=()=>{var n;e.meta.isClosed||(e.meta.isClosed=!0,(n=m.cancelToken)==null||n.removeEventListener("abort",t),r(o=>(o==null?void 0:o.meta.id)!==i?o:{props:o.props,meta:{...o.meta,isVisible:!1}}),setTimeout(()=>r(o=>(o==null?void 0:o.meta.id)!==i?o:null),300));};return s!=null&&s.aborted?new Promise(()=>{}):(s==null||s.addEventListener("abort",t,{once:!0}),e.meta.promise=new Promise((n,o)=>{e.meta.resolve=d=>{t(),n(d);},e.meta.reject=d=>{t(),o(d);};}),e.props={...a,onDismiss:n=>{u==null||u(n),e.meta.reject(void 0);}},r(n=>n!==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")),n):e),e.meta.promise)}}),[]);return jsxRuntime.jsxs(h.Provider,{value:p,children:[jsxRuntime.jsx(T,{openedDialog:c}),l.children]})}function Ao(){let l=react.useContext(h);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.AlertDialogApiProvider = Do;
exports.useAlertDialogAPI = Ao;