@lerx/promise-modal 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Anchor/Anchor.d.ts.map +1 -1
- package/dist/components/Foreground/components/AlertInner.d.ts.map +1 -1
- package/dist/components/Foreground/components/ConfirmInner.d.ts.map +1 -1
- package/dist/components/Foreground/components/PromptInner.d.ts.map +1 -1
- package/dist/hooks/useDestroyAfter.d.ts.map +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +8 -8
- package/dist/index.cjs.js +0 -2
- package/dist/index.cjs.js.map +0 -1
- package/dist/index.esm.js +0 -2
- package/dist/index.esm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Anchor.d.ts","sourceRoot":"","sources":["../../../src/components/Anchor/Anchor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Anchor.d.ts","sourceRoot":"","sources":["../../../src/components/Anchor/Anchor.tsx"],"names":[],"mappings":"AA8CA,eAAO,MAAM,MAAM,oIAAuC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlertInner.d.ts","sourceRoot":"","sources":["../../../../src/components/Foreground/components/AlertInner.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AlertInner.d.ts","sourceRoot":"","sources":["../../../../src/components/Foreground/components/AlertInner.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,UAAU,eAAe,CAAC,CAAC;IACzB,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;CAC3C;AAED,eAAO,MAAM,UAAU,wCACpB,CAAC,uBAAwB,eAAe,CAAC,CAAC,CAAC,8CA2D7C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmInner.d.ts","sourceRoot":"","sources":["../../../../src/components/Foreground/components/ConfirmInner.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConfirmInner.d.ts","sourceRoot":"","sources":["../../../../src/components/Foreground/components/ConfirmInner.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,UAAU,iBAAiB,CAAC,CAAC;IAC3B,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;CACvD;AAED,eAAO,MAAM,YAAY,wCACtB,CAAC,uBAAwB,iBAAiB,CAAC,CAAC,CAAC,8CAkE/C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptInner.d.ts","sourceRoot":"","sources":["../../../../src/components/Foreground/components/PromptInner.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PromptInner.d.ts","sourceRoot":"","sources":["../../../../src/components/Foreground/components/PromptInner.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,UAAU,gBAAgB,CAAC,CAAC,EAAE,CAAC;IAC7B,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC;CACpE;AAED,eAAO,MAAM,WAAW,wCACrB,CAAC,EAAE,CAAC,uBAAuB,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,8CAuHnD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDestroyAfter.d.ts","sourceRoot":"","sources":["../../src/hooks/useDestroyAfter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useDestroyAfter.d.ts","sourceRoot":"","sources":["../../src/hooks/useDestroyAfter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKtD,eAAO,MAAM,eAAe,GAC1B,SAAS,SAAS,CAAC,IAAI,CAAC,EACxB,UAAU,QAAQ,GAAG,MAAM,SAuB5B,CAAC"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function _EMOTION_STRINGIFIED_CSS_ERROR__$4(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}function _EMOTION_STRINGIFIED_CSS_ERROR__$3(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}function _EMOTION_STRINGIFIED_CSS_ERROR__$2(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}var e=require("react/jsx-runtime"),n=require("react"),o=require("@winglet/common-utils/convert"),t=require("@winglet/react-utils/hook"),r=require("@winglet/common-utils/lib"),i=require("@emotion/css"),s=require("react-dom"),a=require("@winglet/common-utils/array"),l=require("@winglet/react-utils/hoc"),c=require("@winglet/common-utils/filter"),d=require("@winglet/react-utils/render"),u=require("@winglet/common-utils/console");class ModalManager{static#e=0;static activate(){return ModalManager.#e?0:ModalManager.#e=1}static#n=null;static anchor(e){if(ModalManager.#n){const e=document.getElementById(ModalManager.#n.id);if(e)return e}const{tag:n="div",prefix:o="promise-modal",root:t=document.body}=e||{},i=document.createElement(n);return i.setAttribute("id",`${o}-${r.getRandomString(36)}`),t.appendChild(i),ModalManager.#n=i,i}static#o=[];static get prerender(){return ModalManager.#o}static#t=e=>ModalManager.#o.push(e);static set openHandler(e){ModalManager.#t=e,ModalManager.#o=[]}static get unanchored(){return!ModalManager.#n}static reset(){ModalManager.#e=0,ModalManager.#n=null,ModalManager.#o=[],ModalManager.#t=e=>ModalManager.#o.push(e)}static open(e){ModalManager.#t(e)}}class AbstractNode{id;initiator;title;subtitle;background;manualDestroy;closeOnBackdropClick;dimmed;ForegroundComponent;BackgroundComponent;#r;get alive(){return this.#r}#i;get visible(){return this.#i}#s;#a=new Set;constructor({id:e,initiator:n,title:o,subtitle:t,background:r,dimmed:i=1,manualDestroy:s=0,closeOnBackdropClick:a=1,resolve:l,ForegroundComponent:c,BackgroundComponent:d}){this.id=e,this.initiator=n,this.title=o,this.subtitle=t,this.background=r,this.dimmed=i,this.manualDestroy=s,this.closeOnBackdropClick=a,this.ForegroundComponent=c,this.BackgroundComponent=d,this.#r=1,this.#i=1,this.#s=l}subscribe(e){return this.#a.add(e),()=>{this.#a.delete(e)}}publish(){for(const e of this.#a)e()}resolve(e){this.#s(e)}onDestroy(){const e=1==this.#r;this.#r=0,this.manualDestroy&&e&&this.publish()}onShow(){const e=0==this.#i;this.#i=1,e&&this.publish()}onHide(){const e=1==this.#i;this.#i=0,e&&this.publish()}}class AlertNode extends AbstractNode{type;subtype;content;footer;constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:s,footer:a,background:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}){super({id:e,initiator:n,title:r,subtitle:i,background:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}),this.type=o,this.subtype=t,this.content=s,this.footer=a}onClose(){this.resolve(null)}onConfirm(){this.resolve(null)}}class ConfirmNode extends AbstractNode{type;subtype;content;footer;constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:s,footer:a,background:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}){super({id:e,initiator:n,title:r,subtitle:i,background:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}),this.type=o,this.subtype=t,this.content=s,this.footer=a}onClose(){this.resolve(0)}onConfirm(){this.resolve(1)}}class PromptNode extends AbstractNode{type;content;defaultValue;Input;disabled;returnOnCancel;footer;#l;constructor({id:e,initiator:n,type:o,title:t,subtitle:r,content:i,defaultValue:s,Input:a,disabled:l,returnOnCancel:c,footer:d,background:u,dimmed:m,manualDestroy:p,closeOnBackdropClick:C,resolve:h,ForegroundComponent:g,BackgroundComponent:f}){super({id:e,initiator:n,title:t,subtitle:r,background:u,dimmed:m,manualDestroy:p,closeOnBackdropClick:C,resolve:h,ForegroundComponent:g,BackgroundComponent:f}),this.type=o,this.content=i,this.Input=a,this.defaultValue=s,this.#l=s,this.disabled=l,this.returnOnCancel=c,this.footer=d}onChange(e){this.#l=e}onConfirm(){this.resolve(this.#l??null)}onClose(){this.returnOnCancel?this.resolve(this.#l??null):this.resolve(null)}}const nodeFactory=e=>{switch(e.type){case"alert":return new AlertNode(e);case"confirm":return new ConfirmNode(e);case"prompt":return new PromptNode(e)}throw new Error(`Unknown modal: ${e.type}`,{modal:e})},m=n.createContext({}),p=n.memo((({usePathname:r,children:i})=>{const s=n.useRef(new Map),[a,l]=n.useState([]),c=t.useReference(a),{pathname:d}=r(),u=n.useRef(d),p=n.useRef(0),C=useConfigurationOptions(),h=n.useMemo((()=>o.convertMsFromDuration(C.duration)),[C]);t.useOnMountLayout((()=>{const{manualDestroy:e,closeOnBackdropClick:n}=C;for(const o of ModalManager.prerender){const t=nodeFactory({...o,id:p.current++,initiator:u.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});s.current.set(t.id,t),l((e=>[...e,t.id]))}return ModalManager.openHandler=o=>{const t=nodeFactory({...o,id:p.current++,initiator:u.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});s.current.set(t.id,t),l((e=>{const n=[];for(let o=0;o<e.length;o++){const t=e[o];s.current.get(t)?.alive?n.push(t):s.current.delete(t)}return[...n,t.id]}))},()=>{ModalManager.reset()}})),n.useLayoutEffect((()=>{for(const e of c.current){const n=s.current.get(e);n?.alive&&(n.initiator===d?n.onShow():n.onHide())}u.current=d}),[d]);const g=n.useCallback((e=>s.current.get(e)),[]),f=n.useCallback((e=>{const n=s.current.get(e);n&&(n.onDestroy(),b.current?.())}),[]),b=n.useRef(void 0),v=n.useCallback((e=>{const n=s.current.get(e);n&&(n.onHide(),b.current?.(),n.manualDestroy||setTimeout((()=>{n.onDestroy()}),h))}),[h]),y=n.useCallback(((e,n)=>{const o=s.current.get(e);o&&"prompt"===o.type&&o.onChange(n)}),[]),x=n.useCallback((e=>{const n=s.current.get(e);n&&(n.onConfirm(),v(e))}),[v]),k=n.useCallback((e=>{const n=s.current.get(e);n&&(n.onClose(),v(e))}),[v]),M=n.useCallback((e=>({modal:g(e),onConfirm:()=>x(e),onClose:()=>k(e),onChange:n=>y(e,n),onDestroy:()=>f(e)})),[g,x,k,y,f]),O=n.useMemo((()=>({modalIds:a,getModalNode:g,onChange:y,onConfirm:x,onClose:k,onDestroy:f,getModal:M,setUpdater:e=>{b.current=e}})),[a,M,g,y,x,k,f]);return e.jsx(m.Provider,{value:O,children:i})})),useModalManagerContext=()=>n.useContext(m),useModal=e=>{const{getModal:o}=useModalManagerContext();return n.useMemo((()=>o(e)),[e,o])},C=i.css("production"===process.env.NODE_ENV?{name:"131j9g2",styles:"margin:unset"}:{name:"1w3kbco-fallback",styles:"margin:unset;label:fallback;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$4}),h=i.css("production"===process.env.NODE_ENV?{name:"1kuk3a3",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black"}:{name:"16dbbea-frame",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black;label:frame;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$4}),FallbackTitle=({children:n})=>e.jsx("h2",{className:C,children:n}),FallbackSubtitle=({children:n})=>e.jsx("h3",{className:C,children:n}),FallbackContent=({children:n})=>e.jsx("div",{className:C,children:n}),FallbackFooter=({confirmLabel:n,hideConfirm:o=0,cancelLabel:t,hideCancel:r=0,disabled:i,onConfirm:s,onCancel:a})=>e.jsxs("div",{children:[!o&&e.jsx("button",{onClick:s,disabled:i,children:n||"Confirm"}),!r&&"function"==typeof a&&e.jsx("button",{onClick:a,children:t||"Cancel"})]}),defaultValidate=e=>e?.visible,useActiveModalCount=(e=defaultValidate,o=0)=>{const{modalIds:t,getModalNode:r}=useModalManagerContext();return n.useMemo((()=>{let n=0;for(const o of t)e(r(o))&&n++;return n}),[r,t,o])},g=n.forwardRef((({id:o,onChangeOrder:t,children:r},i)=>{const s=useActiveModalCount(),[a,l]=n.useMemo((()=>{const e=s>1;return[e?Math.floor(o/5)%3*100:0,e?o%5*35:0]}),[s,o]);return e.jsx("div",{ref:i,className:h,onClick:t,style:{marginBottom:`calc(25vh + ${a}px)`,marginLeft:`${a}px`,transform:`translate(${l}px, ${l}px)`},children:r})})),f=n.createContext({}),b=n.memo((({ForegroundComponent:o,BackgroundComponent:t,TitleComponent:r,SubtitleComponent:i,ContentComponent:s,FooterComponent:a,options:l,children:c})=>{const d=n.useMemo((()=>({BackgroundComponent:t,ForegroundComponent:o||g,TitleComponent:r||FallbackTitle,SubtitleComponent:i||FallbackSubtitle,ContentComponent:n.memo(s||FallbackContent),FooterComponent:n.memo(a||FallbackFooter),options:{duration:"300ms",backdrop:"rgba(0, 0, 0, 0.5)",closeOnBackdropClick:1,manualDestroy:0,...l}})),[o,t,s,a,i,r,l]);return e.jsx(f.Provider,{value:d,children:c})})),useConfigurationContext=()=>n.useContext(f),useConfigurationOptions=()=>n.useContext(f).options,v=n.createContext({}),UserDefinedContextProvider=({context:o,children:t})=>{const r=n.useMemo((()=>({context:o||{}})),[o]);return e.jsx(v.Provider,{value:r,children:t})},useUserDefinedContext=()=>n.useContext(v),usePathname=()=>{const[e,o]=n.useState(window.location.pathname);return n.useLayoutEffect((()=>{let n;const checkPathname=()=>{n&&cancelAnimationFrame(n),e!==window.location.pathname?o(window.location.pathname):n=requestAnimationFrame(checkPathname)};return n=requestAnimationFrame(checkPathname),()=>{n&&cancelAnimationFrame(n)}}),[e]),{pathname:e}},y=i.css("production"===process.env.NODE_ENV?{name:"u7uu4v",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;}"}:{name:"coymdj-background",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;};label:background;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$3}),x=i.css("production"===process.env.NODE_ENV?{name:"n07k1x",styles:"pointer-events:all"}:{name:"1hektcs-active",styles:"pointer-events:all;label:active;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$3}),k=i.css("production"===process.env.NODE_ENV?{name:"1wnowod",styles:"display:flex;align-items:center;justify-content:center"}:{name:"xppew7-visible",styles:"display:flex;align-items:center;justify-content:center;label:visible;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$3}),BackgroundFrame=({modalId:o,onChangeOrder:t})=>{const{BackgroundComponent:r}=useConfigurationContext(),{context:s}=useUserDefinedContext(),{modal:a,onClose:l,onChange:c,onConfirm:d,onDestroy:u}=useModal(o),m=n.useCallback((e=>{a&&a.closeOnBackdropClick&&a.visible&&l(),e.stopPropagation()}),[a,l]),p=n.useMemo((()=>a?.BackgroundComponent||r),[r,a]);return a?e.jsx("div",{className:i.cx(y,{[k]:a.manualDestroy?a.alive:a.visible,[x]:a.closeOnBackdropClick&&a.visible}),onClick:m,children:p&&e.jsx(p,{id:a.id,type:a.type,alive:a.alive,visible:a.visible,initiator:a.initiator,manualDestroy:a.manualDestroy,closeOnBackdropClick:a.closeOnBackdropClick,background:a.background,onChange:c,onConfirm:d,onClose:l,onDestroy:u,onChangeOrder:t,context:s})}):null},M=i.css("production"===process.env.NODE_ENV?{name:"12g0hx0",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1"}:{name:"1hcczik-foreground",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1;label:foreground;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$2}),O=i.css("production"===process.env.NODE_ENV?{name:"1g95xyq",styles:">*{pointer-events:all;}"}:{name:"123csva-active",styles:">*{pointer-events:all;};label:active;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$2}),_=i.css("production"===process.env.NODE_ENV?{name:"1fmljv2",styles:"display:flex!important;justify-content:center;align-items:center"}:{name:"1p4unab-visible",styles:"display:flex!important;justify-content:center;align-items:center;label:visible;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$2}),I=n.memo((({modal:o,handlers:r})=>{const{title:i,subtitle:s,content:a,footer:l}=n.useMemo((()=>o),[o]),{context:u}=useUserDefinedContext(),{onConfirm:m}=n.useMemo((()=>r),[r]),p=t.useHandle(m),{TitleComponent:C,SubtitleComponent:h,ContentComponent:g,FooterComponent:f}=useConfigurationContext();return e.jsxs(n.Fragment,{children:[i&&(c.isString(i)?e.jsx(C,{context:u,children:i}):i),s&&(c.isString(s)?e.jsx(h,{context:u,children:s}):s),a&&(c.isString(a)?e.jsx(g,{context:u,children:a}):d.renderComponent(a,{onConfirm:p})),0!=l&&("function"==typeof l?l({onConfirm:p,context:u}):e.jsx(f,{onConfirm:p,confirmLabel:l?.confirm,hideConfirm:l?.hideConfirm,context:u}))]})})),S=n.memo((({modal:o,handlers:r})=>{const{title:i,subtitle:s,content:a,footer:l}=n.useMemo((()=>o),[o]),{context:u}=useUserDefinedContext(),{onConfirm:m,onClose:p}=n.useMemo((()=>r),[r]),C=t.useHandle(m),h=t.useHandle(p),{TitleComponent:g,SubtitleComponent:f,ContentComponent:b,FooterComponent:v}=useConfigurationContext();return e.jsxs(n.Fragment,{children:[i&&(c.isString(i)?e.jsx(g,{context:u,children:i}):i),s&&(c.isString(s)?e.jsx(f,{context:u,children:s}):s),a&&(c.isString(a)?e.jsx(b,{context:u,children:a}):d.renderComponent(a,{onConfirm:C,onCancel:h,context:u})),0!=l&&("function"==typeof l?l({onConfirm:C,onCancel:h,context:u}):e.jsx(v,{onConfirm:C,onCancel:h,confirmLabel:l?.confirm,cancelLabel:l?.cancel,hideConfirm:l?.hideConfirm,hideCancel:l?.hideCancel,context:u}))]})})),D=n.memo((({modal:o,handlers:r})=>{const{Input:i,defaultValue:s,disabled:a,title:u,subtitle:m,content:p,footer:C}=n.useMemo((()=>({...o,Input:n.memo(l.withErrorBoundary(o.Input))})),[o]),{context:h}=useUserDefinedContext(),[g,f]=n.useState(s),{onChange:b,onClose:v,onConfirm:y}=n.useMemo((()=>r),[r]),x=t.useHandle(v),k=t.useHandle((e=>{const n=c.isFunction(e)?e(g):e;f(n),b(n)})),M=n.useCallback((()=>{requestAnimationFrame(y)}),[y]),O=n.useMemo((()=>g?!!a?.(g):0),[a,g]),{TitleComponent:_,SubtitleComponent:I,ContentComponent:S,FooterComponent:D}=useConfigurationContext();return e.jsxs(n.Fragment,{children:[u&&(c.isString(u)?e.jsx(_,{context:h,children:u}):u),m&&(c.isString(m)?e.jsx(I,{context:h,children:m}):m),p&&(c.isString(p)?e.jsx(S,{context:h,children:p}):d.renderComponent(p,{onConfirm:M,onCancel:x,context:h})),i&&e.jsx(i,{defaultValue:s,value:g,onChange:k,onConfirm:M,onCancel:x,context:h}),0!=C&&("function"==typeof C?C({value:g,disabled:O,onChange:k,onConfirm:M,onCancel:x,context:h}):e.jsx(D,{disabled:O,onConfirm:M,onCancel:x,confirmLabel:C?.confirm,cancelLabel:C?.cancel,hideConfirm:C?.hideConfirm,hideCancel:C?.hideCancel,context:h}))]})})),ForegroundFrame=({modalId:o,onChangeOrder:t})=>{const{ForegroundComponent:r}=useConfigurationContext(),{context:s}=useUserDefinedContext(),{modal:a,onChange:l,onConfirm:c,onClose:d,onDestroy:u}=useModal(o),m=n.useMemo((()=>a?.ForegroundComponent||r),[r,a]);return a?e.jsx("div",{className:i.cx(M,{[_]:a.manualDestroy?a.alive:a.visible,[O]:a.visible}),children:e.jsxs(m,{id:a.id,type:a.type,alive:a.alive,visible:a.visible,initiator:a.initiator,manualDestroy:a.manualDestroy,closeOnBackdropClick:a.closeOnBackdropClick,background:a.background,onChange:l,onConfirm:c,onClose:d,onDestroy:u,onChangeOrder:t,context:s,children:["alert"===a.type&&e.jsx(I,{modal:a,handlers:{onConfirm:c}}),"confirm"===a.type&&e.jsx(S,{modal:a,handlers:{onConfirm:c,onClose:d}}),"prompt"===a.type&&e.jsx(D,{modal:a,handlers:{onChange:l,onConfirm:c,onClose:d}})]})}):null},useSubscribeModal=e=>{const[o,r]=t.useVersion();return n.useEffect((()=>{if(e)return e.subscribe(r)}),[e,r]),o},N=i.css("production"===process.env.NODE_ENV?{name:"13dmkf4",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden"}:{name:"yjeu12-presenter",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden;label:presenter;",toString:function _EMOTION_STRINGIFIED_CSS_ERROR__$1(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),{increment:E}=r.counterFactory(1),R=n.memo((({modalId:o})=>{const r=n.useRef(null),{modal:i}=useModal(o);useSubscribeModal(i);const s=t.useHandle((()=>{r.current&&(r.current.style.zIndex=`${E()}`)}));return e.jsxs("div",{ref:r,className:N,children:[e.jsx(BackgroundFrame,{modalId:o,onChangeOrder:s}),e.jsx(ForegroundFrame,{modalId:o,onChangeOrder:s})]})})),F=i.css("production"===process.env.NODE_ENV?{name:"2hpasy",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out"}:{name:"lhj8co-anchor",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out;label:anchor;",toString:function _EMOTION_STRINGIFIED_CSS_ERROR__(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),validateDimmable=e=>e?.visible&&e.dimmed,j=n.memo(l.withErrorBoundary((()=>{const[o,r]=t.useVersion(),{modalIds:i,setUpdater:s}=useModalManagerContext();n.useEffect((()=>{s(r)}),[s,r]);const l=useConfigurationOptions(),c=useActiveModalCount(validateDimmable,o);return e.jsx("div",{className:F,style:{transitionDuration:l.duration,backgroundColor:c?l.backdrop:"transparent"},children:a.map(i,(n=>e.jsx(R,{modalId:n},n)))})}))),bootstrap=({ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:i,FooterComponent:a,usePathname:l,options:c,context:d,anchor:u})=>s.createPortal(e.jsx(UserDefinedContextProvider,{context:d,children:e.jsx(b,{ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:i,FooterComponent:a,options:c,children:e.jsx(p,{usePathname:l,children:e.jsx(j,{})})})}),u),useInitialize=()=>{const e=n.useRef(ModalManager.activate()),o=n.useRef(null),[,r]=t.useVersion(),i=n.useCallback((n=>{e.current?(o.current=ModalManager.anchor({root:n}),r()):u.printError("ModalProvider is already initialized",["ModalProvider can only be initialized once.","Nesting ModalProvider will be ignored..."],{info:"Something is wrong with the ModalProvider initialization..."})}),[r]);return{anchorRef:o,handleInitialize:i}},B=n.forwardRef((({usePathname:o,ForegroundComponent:r,BackgroundComponent:i,TitleComponent:s,SubtitleComponent:a,ContentComponent:l,FooterComponent:c,options:d,context:u,children:m},p)=>{const C=n.useMemo((()=>o||usePathname),[o]),{anchorRef:h,handleInitialize:g}=useInitialize();return n.useImperativeHandle(p,(()=>({initialize:g})),[g]),t.useOnMount((()=>(null===p&&g(),()=>{h.current&&h.current.remove()}))),e.jsxs(n.Fragment,{children:[m,h.current&&bootstrap({ForegroundComponent:r,BackgroundComponent:i,TitleComponent:s,SubtitleComponent:a,ContentComponent:l,FooterComponent:c,usePathname:C,options:d,context:u,anchor:h.current})]})}));exports.ModalProvider=B,exports.alert=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,dimmed:s,manualDestroy:a,closeOnBackdropClick:l,ForegroundComponent:c,BackgroundComponent:d})=>new Promise(((u,m)=>{try{ModalManager.open({type:"alert",subtype:e,resolve:()=>u(),title:n,subtitle:o,content:t,background:r,footer:i,dimmed:s,manualDestroy:a,closeOnBackdropClick:l,ForegroundComponent:c,BackgroundComponent:d})}catch(e){m(e)}})),exports.confirm=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,dimmed:s,manualDestroy:a,closeOnBackdropClick:l,ForegroundComponent:c,BackgroundComponent:d})=>new Promise(((u,m)=>{try{ModalManager.open({type:"confirm",subtype:e,resolve:e=>u(e??0),title:n,subtitle:o,content:t,background:r,footer:i,dimmed:s,manualDestroy:a,closeOnBackdropClick:l,ForegroundComponent:c,BackgroundComponent:d})}catch(e){m(e)}})),exports.prompt=({defaultValue:e,title:n,subtitle:o,content:t,Input:r,disabled:i,returnOnCancel:s,background:a,footer:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,ForegroundComponent:m,BackgroundComponent:p})=>new Promise(((C,h)=>{try{ModalManager.open({type:"prompt",resolve:e=>C(e),title:n,subtitle:o,content:t,Input:r,defaultValue:e,disabled:i,returnOnCancel:s,background:a,footer:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,ForegroundComponent:m,BackgroundComponent:p})}catch(e){h(e)}})),exports.useActiveModalCount=useActiveModalCount,exports.useDestroyAfter=(e,t)=>{const{modal:r,onDestroy:i}=useModal(e),s=useSubscribeModal(r),a=n.useRef({modal:r,onDestroy:i,milliseconds:c.isString(t)?o.convertMsFromDuration(t):t});n.useEffect((()=>{const{modal:e,onDestroy:n,milliseconds:o}=a.current;if(!e||e.visible||!e.alive)return;const t=setTimeout((()=>{n()}),o);return()=>{t&&clearTimeout(t)}}),[s])},exports.useInitializeModal=({usePathname:e,ForegroundComponent:o,BackgroundComponent:r,TitleComponent:i,SubtitleComponent:s,ContentComponent:a,FooterComponent:l,options:c,context:d,mode:u="auto"}={})=>{const m=n.useMemo((()=>e||usePathname),[e]),{anchorRef:p,handleInitialize:C}=useInitialize();t.useOnMount((()=>("auto"===u&&C(),()=>{p.current&&p.current.remove()})));const h=n.useCallback((e=>{"manual"===u&&C(e)}),[u,C]);return{portal:p.current&&bootstrap({usePathname:m,ForegroundComponent:o,BackgroundComponent:r,TitleComponent:i,SubtitleComponent:s,ContentComponent:a,FooterComponent:l,options:c,context:d,anchor:p.current}),initialize:h}},exports.useModalAnimation=(e,o)=>{const t=n.useRef(o);t.current=o,n.useLayoutEffect((()=>{if(!t.current)return;let n;return n=e?requestAnimationFrame((()=>t.current.onVisible?.())):requestAnimationFrame((()=>t.current.onHidden?.())),()=>{n&&cancelAnimationFrame(n)}}),[e])},exports.useModalBackdrop=()=>useConfigurationOptions().backdrop,exports.useModalDuration=()=>{const e=useConfigurationOptions();return{duration:e.duration,milliseconds:o.convertMsFromDuration(e.duration)}},exports.useModalOptions=useConfigurationOptions,exports.useSubscribeModal=useSubscribeModal;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/app/ModalManager.ts","../src/core/node/ModalNode/AbstractNode.ts","../src/core/node/ModalNode/AlertNode.ts","../src/core/node/ModalNode/ConfirmNode.ts","../src/core/node/ModalNode/PromptNode.ts","../src/core/node/nodeFactory.ts","../src/providers/ModalManagerContext/ModalManagerContext.ts","../src/providers/ModalManagerContext/ModalManagerContextProvider.tsx","../src/providers/ModalManagerContext/useModalManagerContext.ts","../src/components/FallbackComponents/classNames.emotion.ts","../src/components/FallbackComponents/FallbackTitle.tsx","../src/components/FallbackComponents/FallbackSubtitle.tsx","../src/components/FallbackComponents/FallbackContent.tsx","../src/components/FallbackComponents/FallbackFooter.tsx","../src/hooks/useActiveModalCount.ts","../src/components/FallbackComponents/FallbackForegroundFrame.tsx","../src/providers/ConfigurationContext/ConfigurationContext.ts","../src/providers/ConfigurationContext/ConfigurationContextProvider.tsx","../src/app/constant.ts","../src/providers/ConfigurationContext/useConfigurationContext.ts","../src/providers/UserDefinedContext/UserDefinedContext.ts","../src/providers/UserDefinedContext/UserDefinedContextProvider.tsx","../src/providers/UserDefinedContext/useUserDefinedContext.ts","../src/hooks/useDefaultPathname.ts","../src/components/Background/classNames.emotion.ts","../src/components/Background/Background.tsx","../src/components/Foreground/classNames.emotion.ts","../src/components/Foreground/components/AlertInner.tsx","../src/components/Foreground/components/ConfirmInner.tsx","../src/components/Foreground/components/PromptInner.tsx","../src/components/Foreground/Foreground.tsx","../src/hooks/useSubscribeModal.ts","../src/components/Presenter/classNames.emotion.ts","../src/components/Presenter/Presenter.tsx","../src/components/Anchor/classNames.emotion.ts","../src/components/Anchor/Anchor.tsx","../src/bootstrap/BootstrapProvider/helpers/bootstrap.tsx","../src/bootstrap/BootstrapProvider/hooks/useInitialize.ts","../src/bootstrap/BootstrapProvider/BootstrapProvider.tsx","../src/core/handle/alert.ts","../src/core/handle/confirm.ts","../src/core/handle/prompt.ts","../src/hooks/useDestroyAfter.ts","../src/bootstrap/BootstrapProvider/useBootstrap.tsx","../src/hooks/useModalAnimation.ts"],"sourcesContent":["import { getRandomString } from '@winglet/common-utils/lib';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { Modal } from '@/promise-modal/types';\n\nexport class ModalManager {\n static #active = false;\n static activate() {\n if (ModalManager.#active) return false;\n return (ModalManager.#active = true);\n }\n\n static #anchor: HTMLElement | null = null;\n static anchor(options?: {\n tag?: string;\n prefix?: string;\n root?: HTMLElement;\n }): HTMLElement {\n if (ModalManager.#anchor) {\n const anchor = document.getElementById(ModalManager.#anchor.id);\n if (anchor) return anchor;\n }\n const {\n tag = 'div',\n prefix = 'promise-modal',\n root = document.body,\n } = options || {};\n const node = document.createElement(tag);\n node.setAttribute('id', `${prefix}-${getRandomString(36)}`);\n root.appendChild(node);\n ModalManager.#anchor = node;\n return node;\n }\n\n static #prerenderList: Modal[] = [];\n static get prerender() {\n return ModalManager.#prerenderList;\n }\n\n static #openHandler: Fn<[Modal], void> = (modal: Modal) =>\n ModalManager.#prerenderList.push(modal);\n static set openHandler(handler: Fn<[Modal], void>) {\n ModalManager.#openHandler = handler;\n ModalManager.#prerenderList = [];\n }\n\n static get unanchored() {\n return !ModalManager.#anchor;\n }\n\n static reset() {\n ModalManager.#active = false;\n ModalManager.#anchor = null;\n ModalManager.#prerenderList = [];\n ModalManager.#openHandler = (modal: Modal) =>\n ModalManager.#prerenderList.push(modal);\n }\n\n static open(modal: Modal) {\n ModalManager.#openHandler(modal);\n }\n}\n","import type { ReactNode } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type {\n BackgroundComponent,\n BaseModal,\n ForegroundComponent,\n ManagedEntity,\n ModalBackground,\n} from '@/promise-modal/types';\n\ntype AbstractNodeProps<T, B> = BaseModal<T, B> & ManagedEntity;\n\nexport abstract class AbstractNode<T, B> {\n readonly id: number;\n readonly initiator: string;\n\n readonly title?: ReactNode;\n readonly subtitle?: ReactNode;\n readonly background?: ModalBackground<B>;\n\n readonly manualDestroy: boolean;\n readonly closeOnBackdropClick: boolean;\n readonly dimmed: boolean;\n\n readonly ForegroundComponent?: ForegroundComponent;\n readonly BackgroundComponent?: BackgroundComponent;\n\n #alive: boolean;\n get alive() {\n return this.#alive;\n }\n #visible: boolean;\n get visible() {\n return this.#visible;\n }\n\n #resolve: (result: T | null) => void;\n #listeners: Set<Fn> = new Set();\n\n constructor({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed = true,\n manualDestroy = false,\n closeOnBackdropClick = true,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: AbstractNodeProps<T, B>) {\n this.id = id;\n this.initiator = initiator;\n this.title = title;\n this.subtitle = subtitle;\n this.background = background;\n\n this.dimmed = dimmed;\n this.manualDestroy = manualDestroy;\n this.closeOnBackdropClick = closeOnBackdropClick;\n\n this.ForegroundComponent = ForegroundComponent;\n this.BackgroundComponent = BackgroundComponent;\n\n this.#alive = true;\n this.#visible = true;\n this.#resolve = resolve;\n }\n\n subscribe(listener: Fn) {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n }\n publish() {\n for (const listener of this.#listeners) listener();\n }\n protected resolve(result: T | null) {\n this.#resolve(result);\n }\n onDestroy() {\n const needPublish = this.#alive === true;\n this.#alive = false;\n if (this.manualDestroy && needPublish) this.publish();\n }\n onShow() {\n const needPublish = this.#visible === false;\n this.#visible = true;\n if (needPublish) this.publish();\n }\n onHide() {\n const needPublish = this.#visible === true;\n this.#visible = false;\n if (needPublish) this.publish();\n }\n abstract onClose(): void;\n abstract onConfirm(): void;\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n AlertContentProps,\n AlertFooterRender,\n AlertModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype AlertNodeProps<B> = AlertModal<B> & ManagedEntity;\n\nexport class AlertNode<B> extends AbstractNode<null, B> {\n readonly type: 'alert';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<AlertContentProps>;\n readonly footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: AlertNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(null);\n }\n onConfirm() {\n this.resolve(null);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n ConfirmModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype ConfirmNodeProps<B> = ConfirmModal<B> & ManagedEntity;\n\nexport class ConfirmNode<B> extends AbstractNode<boolean, B> {\n readonly type: 'confirm';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<ConfirmContentProps>;\n readonly footer?: ConfirmFooterRender | FooterOptions | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: ConfirmNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(false);\n }\n onConfirm() {\n this.resolve(true);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ManagedEntity,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n PromptModal,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype PromptNodeProps<T, B> = PromptModal<T, B> & ManagedEntity;\n\nexport class PromptNode<T, B> extends AbstractNode<T, B> {\n readonly type: 'prompt';\n readonly content?: ReactNode | ComponentType<PromptContentProps>;\n readonly defaultValue: T | undefined;\n readonly Input: (props: PromptInputProps<T>) => ReactNode;\n readonly disabled?: (value: T) => boolean;\n readonly returnOnCancel?: boolean;\n readonly footer?: PromptFooterRender<T> | FooterOptions | false;\n\n #value: T | undefined;\n\n constructor({\n id,\n initiator,\n type,\n title,\n subtitle,\n content,\n defaultValue,\n Input,\n disabled,\n returnOnCancel,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: PromptNodeProps<T, B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.content = content;\n this.Input = Input;\n this.defaultValue = defaultValue;\n this.#value = defaultValue;\n this.disabled = disabled;\n this.returnOnCancel = returnOnCancel;\n this.footer = footer;\n }\n\n onChange(value: T) {\n this.#value = value;\n }\n onConfirm() {\n this.resolve(this.#value ?? null);\n }\n onClose() {\n if (this.returnOnCancel) this.resolve(this.#value ?? null);\n else this.resolve(null);\n }\n}\n","import type { ManagedModal } from '@/promise-modal/types';\n\nimport { AlertNode, ConfirmNode, PromptNode } from './ModalNode';\n\nexport const nodeFactory = <T, B>(modal: ManagedModal<T, B>) => {\n switch (modal.type) {\n case 'alert':\n return new AlertNode<B>(modal);\n case 'confirm':\n return new ConfirmNode<B>(modal);\n case 'prompt':\n return new PromptNode<T, B>(modal);\n }\n // @ts-expect-error: This state is unreachable by design and should NEVER occur.\n throw new Error(`Unknown modal: ${modal.type}`, { modal });\n};\n","import { createContext } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport type { ModalActions, ModalHandlersWithId } from '@/promise-modal/types';\n\nexport interface ModalManagerContextProps extends ModalHandlersWithId {\n modalIds: ModalNode['id'][];\n getModal: Fn<[id: ModalNode['id']], ModalActions>;\n getModalNode: Fn<[id: ModalNode['id']], ModalNode | undefined>;\n setUpdater: Fn<[updater: Fn]>;\n}\n\nexport const ModalManagerContext = createContext<ModalManagerContextProps>(\n {} as ModalManagerContextProps,\n);\n","import {\n type PropsWithChildren,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils/convert';\nimport { useOnMountLayout, useReference } from '@winglet/react-utils/hook';\n\nimport type { Fn } from '@aileron/declare';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport { type ModalNode, nodeFactory } from '@/promise-modal/core';\nimport { useConfigurationOptions } from '@/promise-modal/providers';\nimport type { Modal } from '@/promise-modal/types';\n\nimport { ModalManagerContext } from './ModalManagerContext';\n\ninterface ModalManagerContextProviderProps {\n usePathname: Fn<[], { pathname: string }>;\n}\n\nexport const ModalManagerContextProvider = memo(\n ({\n usePathname,\n children,\n }: PropsWithChildren<ModalManagerContextProviderProps>) => {\n const modalDictionary = useRef<Map<ModalNode['id'], ModalNode>>(new Map());\n\n const [modalIds, setModalIds] = useState<ModalNode['id'][]>([]);\n const modalIdsRef = useReference(modalIds);\n const { pathname } = usePathname();\n\n const initiator = useRef(pathname);\n const modalIdSequence = useRef(0);\n\n const options = useConfigurationOptions();\n\n const duration = useMemo(\n () => convertMsFromDuration(options.duration),\n [options],\n );\n\n useOnMountLayout(() => {\n const { manualDestroy, closeOnBackdropClick } = options;\n\n for (const data of ModalManager.prerender) {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => [...ids, modal.id]);\n }\n\n ModalManager.openHandler = (data: Modal) => {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => {\n const aliveIds: number[] = [];\n for (let index = 0; index < ids.length; index++) {\n const id = ids[index];\n const destroyed = !modalDictionary.current.get(id)?.alive;\n if (destroyed) modalDictionary.current.delete(id);\n else aliveIds.push(id);\n }\n return [...aliveIds, modal.id];\n });\n };\n return () => {\n ModalManager.reset();\n };\n });\n\n useLayoutEffect(() => {\n for (const id of modalIdsRef.current) {\n const modal = modalDictionary.current.get(id);\n if (!modal?.alive) continue;\n if (modal.initiator === pathname) modal.onShow();\n else modal.onHide();\n }\n initiator.current = pathname;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname]);\n\n const getModalNode = useCallback((modalId: ModalNode['id']) => {\n return modalDictionary.current.get(modalId);\n }, []);\n\n const onDestroy = useCallback((modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onDestroy();\n updaterRef.current?.();\n }, []);\n\n const updaterRef = useRef<Fn>(undefined);\n const hideModal = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onHide();\n updaterRef.current?.();\n if (!modal.manualDestroy)\n setTimeout(() => {\n modal.onDestroy();\n }, duration);\n },\n [duration],\n );\n\n const onChange = useCallback((modalId: ModalNode['id'], value: any) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n if (modal.type === 'prompt') modal.onChange(value);\n }, []);\n\n const onConfirm = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onConfirm();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const onClose = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onClose();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const getModal = useCallback(\n (modalId: ModalNode['id']) => ({\n modal: getModalNode(modalId),\n onConfirm: () => onConfirm(modalId),\n onClose: () => onClose(modalId),\n onChange: (value: any) => onChange(modalId, value),\n onDestroy: () => onDestroy(modalId),\n }),\n [getModalNode, onConfirm, onClose, onChange, onDestroy],\n );\n\n const value = useMemo(() => {\n return {\n modalIds,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n getModal,\n setUpdater: (updater: Fn) => {\n updaterRef.current = updater;\n },\n };\n }, [\n modalIds,\n getModal,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n ]);\n\n return (\n <ModalManagerContext.Provider value={value}>\n {children}\n </ModalManagerContext.Provider>\n );\n },\n);\n","import { useContext, useMemo } from 'react';\n\nimport type { ManagedModal } from '@/promise-modal/types';\n\nimport { ModalManagerContext } from './ModalManagerContext';\n\nexport const useModalManagerContext = () => useContext(ModalManagerContext);\n\nexport const useModal = (id: ManagedModal['id']) => {\n const { getModal } = useModalManagerContext();\n return useMemo(() => getModal(id), [id, getModal]);\n};\n","import { css } from '@emotion/css';\n\nexport const fallback = css`\n margin: unset;\n`;\n\nexport const frame = css`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: white;\n padding: 20px 80px;\n gap: 10px;\n border: 1px solid black;\n`;\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackTitle = ({ children }: PropsWithChildren) => {\n return <h2 className={fallback}>{children}</h2>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackSubtitle = ({ children }: PropsWithChildren) => {\n return <h3 className={fallback}>{children}</h3>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackContent = ({ children }: PropsWithChildren) => {\n return <div className={fallback}>{children}</div>;\n};\n","import type { FooterComponentProps } from '@/promise-modal/types';\n\nexport const FallbackFooter = ({\n confirmLabel,\n hideConfirm = false,\n cancelLabel,\n hideCancel = false,\n disabled,\n onConfirm,\n onCancel,\n}: FooterComponentProps) => {\n return (\n <div>\n {!hideConfirm && (\n <button onClick={onConfirm} disabled={disabled}>\n {confirmLabel || 'Confirm'}\n </button>\n )}\n\n {!hideCancel && typeof onCancel === 'function' && (\n <button onClick={onCancel}>{cancelLabel || 'Cancel'}</button>\n )}\n </div>\n );\n};\n","import { useMemo } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useModalManagerContext } from '@/promise-modal/providers';\n\nconst defaultValidate = (modal?: ModalNode) => modal?.visible;\n\nexport const useActiveModalCount = (\n validate: Fn<[ModalNode?], boolean | undefined> = defaultValidate,\n refreshKey: string | number = 0,\n) => {\n const { modalIds, getModalNode } = useModalManagerContext();\n return useMemo(() => {\n let count = 0;\n for (const id of modalIds) {\n if (validate(getModalNode(id))) count++;\n }\n return count;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getModalNode, modalIds, refreshKey]);\n};\n","import {\n type ForwardedRef,\n type PropsWithChildren,\n forwardRef,\n useMemo,\n} from 'react';\n\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport type { ModalFrameProps } from '@/promise-modal/types';\n\nimport { frame } from './classNames.emotion';\n\nconst MAX_MODAL_COUNT = 5;\nconst MAX_MODAL_LEVEL = 3;\n\nexport const FallbackForegroundFrame = forwardRef(\n (\n { id, onChangeOrder, children }: PropsWithChildren<ModalFrameProps>,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const activeCount = useActiveModalCount();\n const [level, offset] = useMemo(() => {\n const stacked = activeCount > 1;\n const level = stacked\n ? (Math.floor(id / MAX_MODAL_COUNT) % MAX_MODAL_LEVEL) * 100\n : 0;\n const offset = stacked ? (id % MAX_MODAL_COUNT) * 35 : 0;\n return [level, offset];\n }, [activeCount, id]);\n\n return (\n <div\n ref={ref}\n className={frame}\n onClick={onChangeOrder}\n style={{\n marginBottom: `calc(25vh + ${level}px)`,\n marginLeft: `${level}px`,\n transform: `translate(${offset}px, ${offset}px)`,\n }}\n >\n {children}\n </div>\n );\n },\n);\n","import { type ComponentType, createContext } from 'react';\n\nimport type { Color, Duration } from '@aileron/declare';\n\nimport type {\n BackgroundComponent,\n FooterComponentProps,\n ForegroundComponent,\n WrapperComponentProps,\n} from '@/promise-modal/types';\n\nexport interface ConfigurationContextProps {\n ForegroundComponent: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n TitleComponent: ComponentType<WrapperComponentProps>;\n SubtitleComponent: ComponentType<WrapperComponentProps>;\n ContentComponent: ComponentType<WrapperComponentProps>;\n FooterComponent: ComponentType<FooterComponentProps>;\n options: {\n duration: Duration;\n backdrop: Color;\n manualDestroy: boolean;\n closeOnBackdropClick: boolean;\n };\n}\n\nexport const ConfigurationContext = createContext<ConfigurationContextProps>(\n {} as ConfigurationContextProps,\n);\n","import {\n type ComponentType,\n type PropsWithChildren,\n memo,\n useMemo,\n} from 'react';\n\nimport type { Color, Duration } from '@aileron/declare';\n\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n WrapperComponentProps,\n} from '@/promise-modal/types';\n\nimport { ConfigurationContext } from './ConfigurationContext';\n\nexport interface ConfigurationContextProviderProps {\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n ForegroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent?: ComponentType<WrapperComponentProps>;\n SubtitleComponent?: ComponentType<WrapperComponentProps>;\n ContentComponent?: ComponentType<WrapperComponentProps>;\n FooterComponent?: ComponentType<FooterComponentProps>;\n options?: {\n /** Modal transition time(ms, s) */\n duration?: Duration;\n /** Modal backdrop color */\n backdrop?: Color;\n /** Whether to destroy the modal manually */\n manualDestroy?: boolean;\n /** Whether to close the modal when the backdrop is clicked */\n closeOnBackdropClick?: boolean;\n };\n}\n\nexport const ConfigurationContextProvider = memo(\n ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n children,\n }: PropsWithChildren<ConfigurationContextProviderProps>) => {\n const value = useMemo(\n () => ({\n BackgroundComponent,\n ForegroundComponent: ForegroundComponent || FallbackForegroundFrame,\n TitleComponent: TitleComponent || FallbackTitle,\n SubtitleComponent: SubtitleComponent || FallbackSubtitle,\n ContentComponent: memo(ContentComponent || FallbackContent),\n FooterComponent: memo(FooterComponent || FallbackFooter),\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n closeOnBackdropClick: true,\n manualDestroy: false,\n ...options,\n } satisfies ConfigurationContextProviderProps['options'],\n }),\n [\n ForegroundComponent,\n BackgroundComponent,\n ContentComponent,\n FooterComponent,\n SubtitleComponent,\n TitleComponent,\n options,\n ],\n );\n return (\n <ConfigurationContext.Provider value={value}>\n {children}\n </ConfigurationContext.Provider>\n );\n },\n);\n","import type { Color, Duration } from '@aileron/declare';\n\nexport const DEFAULT_ANIMATION_DURATION: Duration = '300ms';\n\nexport const DEFAULT_BACKDROP_COLOR: Color = 'rgba(0, 0, 0, 0.5)';\n","import { useContext } from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils/convert';\n\nimport { ConfigurationContext } from './ConfigurationContext';\n\nexport const useConfigurationContext = () => useContext(ConfigurationContext);\n\nexport const useConfigurationOptions = () => {\n const context = useContext(ConfigurationContext);\n return context.options;\n};\n\nexport const useConfigurationDuration = () => {\n const context = useConfigurationOptions();\n return {\n duration: context.duration,\n milliseconds: convertMsFromDuration(context.duration),\n };\n};\n\nexport const useConfigurationBackdrop = () => {\n const context = useConfigurationOptions();\n return context.backdrop;\n};\n","import { createContext } from 'react';\n\nimport type { Dictionary } from '@aileron/declare';\n\nexport interface UserDefinedContext {\n context: Dictionary;\n}\n\nexport const UserDefinedContext = createContext<UserDefinedContext>(\n {} as UserDefinedContext,\n);\n","import { PropsWithChildren, useMemo } from 'react';\n\nimport type { Dictionary } from '@aileron/declare';\n\nimport { UserDefinedContext } from './UserDefinedContext';\n\ninterface UserDefinedContextProviderProps {\n /** User defined context */\n context?: Dictionary;\n}\n\nexport const UserDefinedContextProvider = ({\n context,\n children,\n}: PropsWithChildren<UserDefinedContextProviderProps>) => {\n const contextValue = useMemo(() => ({ context: context || {} }), [context]);\n return (\n <UserDefinedContext.Provider value={contextValue}>\n {children}\n </UserDefinedContext.Provider>\n );\n};\n","import { useContext } from 'react';\n\nimport { UserDefinedContext } from './UserDefinedContext';\n\nexport const useUserDefinedContext = () => {\n return useContext(UserDefinedContext);\n};\n","import { useLayoutEffect, useState } from 'react';\n\nexport const usePathname = () => {\n const [pathname, setPathname] = useState(window.location.pathname);\n useLayoutEffect(() => {\n let requestId: number;\n const checkPathname = () => {\n if (requestId) cancelAnimationFrame(requestId);\n if (pathname !== window.location.pathname) {\n setPathname(window.location.pathname);\n } else {\n requestId = requestAnimationFrame(checkPathname);\n }\n };\n requestId = requestAnimationFrame(checkPathname);\n return () => {\n if (requestId) cancelAnimationFrame(requestId);\n };\n }, [pathname]);\n return { pathname };\n};\n","import { css } from '@emotion/css';\n\nexport const background = css`\n display: none;\n position: fixed;\n inset: 0;\n z-index: -999;\n pointer-events: none;\n > * {\n pointer-events: none;\n }\n`;\n\nexport const active = css`\n pointer-events: all;\n`;\n\nexport const visible = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","import { type MouseEvent, useCallback, useMemo } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport {\n useConfigurationContext,\n useModal,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, background, visible } from './classNames.emotion';\n\nexport const BackgroundFrame = ({\n modalId,\n onChangeOrder,\n}: ModalLayerProps) => {\n const { BackgroundComponent } = useConfigurationContext();\n const { context: userDefinedContext } = useUserDefinedContext();\n const { modal, onClose, onChange, onConfirm, onDestroy } = useModal(modalId);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n if (modal && modal.closeOnBackdropClick && modal.visible) onClose();\n event.stopPropagation();\n },\n [modal, onClose],\n );\n\n const Background = useMemo(\n () => modal?.BackgroundComponent || BackgroundComponent,\n [BackgroundComponent, modal],\n );\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(background, {\n [visible]: modal.manualDestroy ? modal.alive : modal.visible,\n [active]: modal.closeOnBackdropClick && modal.visible,\n })}\n onClick={handleClose}\n >\n {Background && (\n <Background\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n context={userDefinedContext}\n />\n )}\n </div>\n );\n};\n","import { css } from '@emotion/css';\n\nexport const foreground = css`\n pointer-events: none;\n display: none;\n position: fixed;\n inset: 0;\n z-index: 1;\n`;\n\nexport const active = css`\n > * {\n pointer-events: all;\n }\n`;\n\nexport const visible = css`\n display: flex !important;\n justify-content: center;\n align-items: center;\n`;\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils/filter';\nimport { useHandle } from '@winglet/react-utils/hook';\nimport { renderComponent } from '@winglet/react-utils/render';\n\nimport type { AlertNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface AlertInnerProps<B> {\n modal: AlertNode<B>;\n handlers: Pick<ModalActions, 'onConfirm'>;\n}\n\nexport const AlertInner = memo(\n <B,>({ modal, handlers }: AlertInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { context: userDefinedContext } = useUserDefinedContext();\n const { onConfirm } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n confirmLabel={footer?.confirm}\n hideConfirm={footer?.hideConfirm}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils/filter';\nimport { useHandle } from '@winglet/react-utils/hook';\nimport { renderComponent } from '@winglet/react-utils/render';\n\nimport type { ConfirmNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface ConfirmInnerProps<B> {\n modal: ConfirmNode<B>;\n handlers: Pick<ModalActions, 'onConfirm' | 'onClose'>;\n}\n\nexport const ConfirmInner = memo(\n <B,>({ modal, handlers }: ConfirmInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { context: userDefinedContext } = useUserDefinedContext();\n const { onConfirm, onClose } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n const handleClose = useHandle(onClose);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useCallback, useMemo, useState } from 'react';\n\nimport { isFunction, isString } from '@winglet/common-utils/filter';\nimport { withErrorBoundary } from '@winglet/react-utils/hoc';\nimport { useHandle } from '@winglet/react-utils/hook';\nimport { renderComponent } from '@winglet/react-utils/render';\n\nimport type { PromptNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface PromptInnerProps<T, B> {\n modal: PromptNode<T, B>;\n handlers: Pick<ModalActions, 'onChange' | 'onClose' | 'onConfirm'>;\n}\n\nexport const PromptInner = memo(\n <T, B>({ modal, handlers }: PromptInnerProps<T, B>) => {\n const {\n Input,\n defaultValue,\n disabled: checkDisabled,\n title,\n subtitle,\n content,\n footer,\n } = useMemo(\n () => ({\n ...modal,\n Input: memo(withErrorBoundary(modal.Input)),\n }),\n [modal],\n );\n\n const { context: userDefinedContext } = useUserDefinedContext();\n\n const [value, setValue] = useState<T | undefined>(defaultValue);\n\n const { onChange, onClose, onConfirm } = useMemo(\n () => handlers,\n [handlers],\n );\n\n const handleClose = useHandle(onClose);\n const handleChange = useHandle(\n (inputValue?: T | ((prevState: T | undefined) => T | undefined)) => {\n const input = isFunction(inputValue) ? inputValue(value) : inputValue;\n setValue(input);\n onChange(input);\n },\n );\n\n const handleConfirm = useCallback(() => {\n // NOTE: wait for the next tick to ensure the value is updated\n requestAnimationFrame(onConfirm);\n }, [onConfirm]);\n\n const disabled = useMemo(\n () => (value ? !!checkDisabled?.(value) : false),\n [checkDisabled, value],\n );\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ))}\n\n {Input && (\n <Input\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n onConfirm={handleConfirm}\n onCancel={handleClose}\n context={userDefinedContext}\n />\n )}\n\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n value,\n disabled,\n onChange: handleChange,\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n disabled={disabled}\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { useMemo } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport {\n useConfigurationContext,\n useModal,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, foreground, visible } from './classNames.emotion';\nimport { AlertInner, ConfirmInner, PromptInner } from './components';\n\nexport const ForegroundFrame = ({\n modalId,\n onChangeOrder,\n}: ModalLayerProps) => {\n const { ForegroundComponent } = useConfigurationContext();\n const { context: userDefinedContext } = useUserDefinedContext();\n\n const { modal, onChange, onConfirm, onClose, onDestroy } = useModal(modalId);\n\n const Foreground = useMemo(\n () => modal?.ForegroundComponent || ForegroundComponent,\n [ForegroundComponent, modal],\n );\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(foreground, {\n [visible]: modal.manualDestroy ? modal.alive : modal.visible,\n [active]: modal.visible,\n })}\n >\n <Foreground\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n context={userDefinedContext}\n >\n {modal.type === 'alert' && (\n <AlertInner modal={modal} handlers={{ onConfirm }} />\n )}\n {modal.type === 'confirm' && (\n <ConfirmInner modal={modal} handlers={{ onConfirm, onClose }} />\n )}\n {modal.type === 'prompt' && (\n <PromptInner\n modal={modal}\n handlers={{ onChange, onConfirm, onClose }}\n />\n )}\n </Foreground>\n </div>\n );\n};\n","import { useEffect } from 'react';\n\nimport { useVersion } from '@winglet/react-utils/hook';\n\nimport type { ModalNode } from '@/promise-modal/core';\n\nexport const useSubscribeModal = (modal?: ModalNode) => {\n const [version, update] = useVersion();\n useEffect(() => {\n if (!modal) return;\n const unsubscribe = modal.subscribe(update);\n return unsubscribe;\n }, [modal, update]);\n return version;\n};\n","import { css } from '@emotion/css';\n\nexport const presenter = css`\n position: fixed;\n inset: 0;\n pointer-events: none;\n overflow: hidden;\n`;\n","import { memo, useRef } from 'react';\n\nimport { counterFactory } from '@winglet/common-utils/lib';\nimport { useHandle } from '@winglet/react-utils/hook';\n\nimport { Background } from '@/promise-modal/components/Background';\nimport { Foreground } from '@/promise-modal/components/Foreground';\nimport { useSubscribeModal } from '@/promise-modal/hooks/useSubscribeModal';\nimport { useModal } from '@/promise-modal/providers';\nimport type { ModalIdProps } from '@/promise-modal/types';\n\nimport { presenter } from './classNames.emotion';\n\nconst { increment } = counterFactory(1);\n\nexport const Presenter = memo(({ modalId }: ModalIdProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { modal } = useModal(modalId);\n useSubscribeModal(modal);\n const handleChangeOrder = useHandle(() => {\n if (ref.current) {\n ref.current.style.zIndex = `${increment()}`;\n }\n });\n return (\n <div ref={ref} className={presenter}>\n <Background modalId={modalId} onChangeOrder={handleChangeOrder} />\n <Foreground modalId={modalId} onChangeOrder={handleChangeOrder} />\n </div>\n );\n});\n","import { css } from '@emotion/css';\n\nexport const anchor = css`\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 1000;\n transition: background-color ease-in-out;\n`;\n","import { memo, useEffect } from 'react';\n\nimport { map } from '@winglet/common-utils/array';\nimport { withErrorBoundary } from '@winglet/react-utils/hoc';\nimport { useVersion } from '@winglet/react-utils/hook';\n\nimport { Presenter } from '@/promise-modal/components/Presenter';\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport {\n useConfigurationOptions,\n useModalManagerContext,\n} from '@/promise-modal/providers';\n\nimport { anchor } from './classNames.emotion';\n\nconst AnchorInner = () => {\n const [version, update] = useVersion();\n\n const { modalIds, setUpdater } = useModalManagerContext();\n\n useEffect(() => {\n setUpdater(update);\n }, [setUpdater, update]);\n\n const options = useConfigurationOptions();\n\n const dimmed = useActiveModalCount(validateDimmable, version);\n\n return (\n <div\n className={anchor}\n style={{\n transitionDuration: options.duration,\n backgroundColor: dimmed ? options.backdrop : 'transparent',\n }}\n >\n {map(modalIds, (id) => (\n <Presenter key={id} modalId={id} />\n ))}\n </div>\n );\n};\n\nconst validateDimmable = (modal?: ModalNode) => modal?.visible && modal.dimmed;\n\nexport const Anchor = memo(withErrorBoundary(AnchorInner));\n","import { createPortal } from 'react-dom';\n\nimport type { Dictionary, Fn } from '@aileron/declare';\n\nimport { Anchor } from '@/promise-modal/components/Anchor';\nimport {\n ConfigurationContextProvider,\n type ConfigurationContextProviderProps,\n} from '@/promise-modal/providers/ConfigurationContext';\nimport { ModalManagerContextProvider } from '@/promise-modal/providers/ModalManagerContext';\nimport { UserDefinedContextProvider } from '@/promise-modal/providers/UserDefinedContext';\n\ninterface BootstrapProps extends ConfigurationContextProviderProps {\n usePathname: Fn<[], { pathname: string }>;\n context?: Dictionary;\n anchor: HTMLElement;\n}\n\nexport const bootstrap = ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n usePathname,\n options,\n context,\n anchor,\n}: BootstrapProps) =>\n createPortal(\n <UserDefinedContextProvider context={context}>\n <ConfigurationContextProvider\n ForegroundComponent={ForegroundComponent}\n BackgroundComponent={BackgroundComponent}\n TitleComponent={TitleComponent}\n SubtitleComponent={SubtitleComponent}\n ContentComponent={ContentComponent}\n FooterComponent={FooterComponent}\n options={options}\n >\n <ModalManagerContextProvider usePathname={usePathname}>\n <Anchor />\n </ModalManagerContextProvider>\n </ConfigurationContextProvider>\n </UserDefinedContextProvider>,\n anchor,\n );\n","import { useCallback, useRef } from 'react';\n\nimport { printError } from '@winglet/common-utils/console';\nimport { useVersion } from '@winglet/react-utils/hook';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\n\nexport const useInitialize = () => {\n const permitted = useRef(ModalManager.activate());\n const anchorRef = useRef<HTMLElement | null>(null);\n const [, update] = useVersion();\n\n const handleInitialize = useCallback(\n (root?: HTMLElement) => {\n if (permitted.current) {\n anchorRef.current = ModalManager.anchor({ root });\n update();\n } else\n printError(\n 'ModalProvider is already initialized',\n [\n 'ModalProvider can only be initialized once.',\n 'Nesting ModalProvider will be ignored...',\n ],\n {\n info: 'Something is wrong with the ModalProvider initialization...',\n },\n );\n },\n [update],\n );\n\n return {\n anchorRef,\n handleInitialize,\n } as const;\n};\n","import {\n Fragment,\n type PropsWithChildren,\n forwardRef,\n useImperativeHandle,\n useMemo,\n} from 'react';\n\nimport { useOnMount } from '@winglet/react-utils/hook';\n\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\n\nimport { bootstrap } from './helpers/bootstrap';\nimport { useInitialize } from './hooks/useInitialize';\nimport type { BootstrapProviderHandle, BootstrapProviderProps } from './type';\n\nexport const BootstrapProvider = forwardRef<\n BootstrapProviderHandle,\n PropsWithChildren<BootstrapProviderProps>\n>(\n (\n {\n usePathname: useExternalPathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n children,\n },\n handleRef,\n ) => {\n const usePathname = useMemo(\n () => useExternalPathname || useDefaultPathname,\n [useExternalPathname],\n );\n\n const { anchorRef, handleInitialize } = useInitialize();\n\n useImperativeHandle(\n handleRef,\n () => ({\n initialize: handleInitialize,\n }),\n [handleInitialize],\n );\n\n useOnMount(() => {\n /**\n * NOTE: `handleRef` being null indicates that no `ref` was provided.\n * In this case, the `ModalProvider`(=`BootstrapProvider`) is not receiving the `ref`,\n * so it should be initialized automatically.\n */\n if (handleRef === null) handleInitialize();\n return () => {\n if (anchorRef.current) anchorRef.current.remove();\n };\n });\n\n return (\n <Fragment>\n {children}\n {anchorRef.current &&\n bootstrap({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n usePathname,\n options,\n context,\n anchor: anchorRef.current,\n })}\n </Fragment>\n );\n },\n);\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n AlertContentProps,\n AlertFooterRender,\n BackgroundComponent,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface AlertProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<AlertContentProps>;\n background?: ModalBackground<B>;\n footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const alert = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: AlertProps<B>) => {\n return new Promise<void>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'alert',\n subtype,\n resolve: () => resolve(),\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n BackgroundComponent,\n ConfirmContentProps,\n ConfirmFooterRender,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface ConfirmProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<ConfirmContentProps>;\n background?: ModalBackground<B>;\n footer?: ConfirmFooterRender | FooterOptions | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const confirm = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: ConfirmProps<B>) => {\n return new Promise<boolean>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'confirm',\n subtype,\n resolve: (result) => resolve(result ?? false),\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n BackgroundComponent,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n} from '@/promise-modal/types';\n\ninterface PromptProps<T, B = any> {\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<PromptContentProps>;\n Input: (props: PromptInputProps<T>) => ReactNode;\n defaultValue?: T;\n disabled?: (value: T) => boolean;\n returnOnCancel?: boolean;\n background?: ModalBackground<B>;\n footer?: PromptFooterRender<T> | FooterOptions | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const prompt = <T, B = any>({\n defaultValue,\n title,\n subtitle,\n content,\n Input,\n disabled,\n returnOnCancel,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: PromptProps<T, B>) => {\n return new Promise<T>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'prompt',\n resolve: (result) => resolve(result as T),\n title,\n subtitle,\n content,\n Input,\n defaultValue,\n disabled,\n returnOnCancel,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import { useEffect, useRef } from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils/convert';\nimport { isString } from '@winglet/common-utils/filter';\n\nimport type { Duration } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useModal } from '@/promise-modal/providers';\n\nimport { useSubscribeModal } from './useSubscribeModal';\n\nexport const useDestroyAfter = (\n modalId: ModalNode['id'],\n duration: Duration | number,\n) => {\n const { modal, onDestroy } = useModal(modalId);\n const tick = useSubscribeModal(modal);\n\n const reference = useRef({\n modal,\n onDestroy,\n milliseconds: isString(duration)\n ? convertMsFromDuration(duration)\n : duration,\n });\n\n useEffect(() => {\n const { modal, onDestroy, milliseconds } = reference.current;\n if (!modal || modal.visible || !modal.alive) return;\n const timer = setTimeout(() => {\n onDestroy();\n }, milliseconds);\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [tick]);\n};\n","import { useCallback, useMemo } from 'react';\n\nimport { useOnMount } from '@winglet/react-utils/hook';\n\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\n\nimport { bootstrap } from './helpers/bootstrap';\nimport { useInitialize } from './hooks/useInitialize';\nimport type { BootstrapProviderProps } from './type';\n\nexport const useBootstrap = ({\n usePathname: useExternalPathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n mode = 'auto',\n}: BootstrapProviderProps & { mode?: 'manual' | 'auto' } = {}) => {\n const usePathname = useMemo(\n () => useExternalPathname || useDefaultPathname,\n [useExternalPathname],\n );\n\n const { anchorRef, handleInitialize } = useInitialize();\n\n useOnMount(() => {\n if (mode === 'auto') handleInitialize();\n return () => {\n if (anchorRef.current) anchorRef.current.remove();\n };\n });\n\n const initialize = useCallback(\n (element: HTMLElement) => {\n if (mode === 'manual') handleInitialize(element);\n },\n [mode, handleInitialize],\n );\n\n const portal =\n anchorRef.current &&\n bootstrap({\n usePathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n anchor: anchorRef.current,\n });\n\n return { portal, initialize };\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\ninterface ModalAnimationHandler {\n onVisible?: Fn;\n onHidden?: Fn;\n}\n\nexport const useModalAnimation = (\n visible: boolean,\n handler: ModalAnimationHandler,\n) => {\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n useLayoutEffect(() => {\n if (!handlerRef.current) return;\n let frame: ReturnType<typeof requestAnimationFrame>;\n if (visible)\n frame = requestAnimationFrame(() => handlerRef.current.onVisible?.());\n else frame = requestAnimationFrame(() => handlerRef.current.onHidden?.());\n return () => {\n if (frame) cancelAnimationFrame(frame);\n };\n }, [visible]);\n};\n"],"names":["ModalManager","static","activate","active","anchor","options","document","getElementById","id","tag","prefix","root","body","node","createElement","setAttribute","getRandomString","appendChild","prerender","prerenderList","modal","push","openHandler","handler","unanchored","reset","open","AbstractNode","initiator","title","subtitle","background","manualDestroy","closeOnBackdropClick","dimmed","ForegroundComponent","BackgroundComponent","alive","this","visible","resolve","listeners","Set","constructor","subscribe","listener","add","delete","publish","result","onDestroy","needPublish","onShow","onHide","AlertNode","type","subtype","content","footer","super","onClose","onConfirm","ConfirmNode","PromptNode","defaultValue","Input","disabled","returnOnCancel","value","onChange","nodeFactory","Error","ModalManagerContext","createContext","ModalManagerContextProvider","memo","usePathname","children","modalDictionary","useRef","Map","modalIds","setModalIds","useState","modalIdsRef","useReference","pathname","modalIdSequence","useConfigurationOptions","duration","useMemo","convertMsFromDuration","useOnMountLayout","data","current","undefined","set","ids","aliveIds","index","length","get","useLayoutEffect","getModalNode","useCallback","modalId","updaterRef","hideModal","setTimeout","getModal","setUpdater","updater","_jsx","jsx","Provider","useModalManagerContext","useContext","useModal","fallback","css","process","env","NODE_ENV","name","styles","toString","_EMOTION_STRINGIFIED_CSS_ERROR__","frame","FallbackTitle","className","FallbackSubtitle","FallbackContent","FallbackFooter","confirmLabel","hideConfirm","cancelLabel","hideCancel","onCancel","_jsxs","onClick","defaultValidate","useActiveModalCount","validate","refreshKey","count","FallbackForegroundFrame","forwardRef","onChangeOrder","ref","activeCount","level","offset","stacked","Math","floor","style","marginBottom","marginLeft","transform","ConfigurationContext","ConfigurationContextProvider","TitleComponent","SubtitleComponent","ContentComponent","FooterComponent","backdrop","useConfigurationContext","UserDefinedContext","UserDefinedContextProvider","context","contextValue","useUserDefinedContext","setPathname","window","location","requestId","checkPathname","cancelAnimationFrame","requestAnimationFrame","BackgroundFrame","userDefinedContext","handleClose","event","stopPropagation","Background","cx","visible$1","active$1","foreground","AlertInner","handlers","handleConfirm","useHandle","Fragment","isString","renderComponent","confirm","ConfirmInner","cancel","PromptInner","checkDisabled","withErrorBoundary","setValue","handleChange","inputValue","input","isFunction","ForegroundFrame","Foreground","useSubscribeModal","version","update","useVersion","useEffect","presenter","increment","counterFactory","Presenter","handleChangeOrder","zIndex","validateDimmable","Anchor","transitionDuration","backgroundColor","map","bootstrap","createPortal","useInitialize","permitted","anchorRef","handleInitialize","printError","info","BootstrapProvider","useExternalPathname","handleRef","useDefaultPathname","useImperativeHandle","initialize","useOnMount","remove","Promise","reject","error","tick","reference","milliseconds","timer","clearTimeout","mode","element","portal","handlerRef","onVisible","onHidden"],"mappings":"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"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function _EMOTION_STRINGIFIED_CSS_ERROR__$4(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}function _EMOTION_STRINGIFIED_CSS_ERROR__$3(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}function _EMOTION_STRINGIFIED_CSS_ERROR__$2(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}import{jsx as e,jsxs as n}from"react/jsx-runtime";import{createContext as o,memo as t,useRef as r,useState,useMemo as i,useLayoutEffect as a,useCallback as l,useContext as s,forwardRef as c,Fragment as d,useEffect,useImperativeHandle as u}from"react";import{convertMsFromDuration as m}from"@winglet/common-utils/convert";import{useReference as p,useOnMountLayout as C,useHandle as h,useVersion as g,useOnMount as f}from"@winglet/react-utils/hook";import{getRandomString as b,counterFactory as v}from"@winglet/common-utils/lib";import{css as y,cx as k}from"@emotion/css";import{createPortal as O}from"react-dom";import{map as _}from"@winglet/common-utils/array";import{withErrorBoundary as x}from"@winglet/react-utils/hoc";import{isString as I,isFunction as M}from"@winglet/common-utils/filter";import{renderComponent as N}from"@winglet/react-utils/render";import{printError as D}from"@winglet/common-utils/console";class ModalManager{static#e=0;static activate(){return ModalManager.#e?0:ModalManager.#e=1}static#n=null;static anchor(e){if(ModalManager.#n){const e=document.getElementById(ModalManager.#n.id);if(e)return e}const{tag:n="div",prefix:o="promise-modal",root:t=document.body}=e||{},r=document.createElement(n);return r.setAttribute("id",`${o}-${b(36)}`),t.appendChild(r),ModalManager.#n=r,r}static#o=[];static get prerender(){return ModalManager.#o}static#t=e=>ModalManager.#o.push(e);static set openHandler(e){ModalManager.#t=e,ModalManager.#o=[]}static get unanchored(){return!ModalManager.#n}static reset(){ModalManager.#e=0,ModalManager.#n=null,ModalManager.#o=[],ModalManager.#t=e=>ModalManager.#o.push(e)}static open(e){ModalManager.#t(e)}}const alert=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,dimmed:a,manualDestroy:l,closeOnBackdropClick:s,ForegroundComponent:c,BackgroundComponent:d})=>new Promise(((u,m)=>{try{ModalManager.open({type:"alert",subtype:e,resolve:()=>u(),title:n,subtitle:o,content:t,background:r,footer:i,dimmed:a,manualDestroy:l,closeOnBackdropClick:s,ForegroundComponent:c,BackgroundComponent:d})}catch(e){m(e)}})),confirm=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,dimmed:a,manualDestroy:l,closeOnBackdropClick:s,ForegroundComponent:c,BackgroundComponent:d})=>new Promise(((u,m)=>{try{ModalManager.open({type:"confirm",subtype:e,resolve:e=>u(e??0),title:n,subtitle:o,content:t,background:r,footer:i,dimmed:a,manualDestroy:l,closeOnBackdropClick:s,ForegroundComponent:c,BackgroundComponent:d})}catch(e){m(e)}})),prompt=({defaultValue:e,title:n,subtitle:o,content:t,Input:r,disabled:i,returnOnCancel:a,background:l,footer:s,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,ForegroundComponent:m,BackgroundComponent:p})=>new Promise(((C,h)=>{try{ModalManager.open({type:"prompt",resolve:e=>C(e),title:n,subtitle:o,content:t,Input:r,defaultValue:e,disabled:i,returnOnCancel:a,background:l,footer:s,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,ForegroundComponent:m,BackgroundComponent:p})}catch(e){h(e)}}));class AbstractNode{id;initiator;title;subtitle;background;manualDestroy;closeOnBackdropClick;dimmed;ForegroundComponent;BackgroundComponent;#r;get alive(){return this.#r}#i;get visible(){return this.#i}#a;#l=new Set;constructor({id:e,initiator:n,title:o,subtitle:t,background:r,dimmed:i=1,manualDestroy:a=0,closeOnBackdropClick:l=1,resolve:s,ForegroundComponent:c,BackgroundComponent:d}){this.id=e,this.initiator=n,this.title=o,this.subtitle=t,this.background=r,this.dimmed=i,this.manualDestroy=a,this.closeOnBackdropClick=l,this.ForegroundComponent=c,this.BackgroundComponent=d,this.#r=1,this.#i=1,this.#a=s}subscribe(e){return this.#l.add(e),()=>{this.#l.delete(e)}}publish(){for(const e of this.#l)e()}resolve(e){this.#a(e)}onDestroy(){const e=1==this.#r;this.#r=0,this.manualDestroy&&e&&this.publish()}onShow(){const e=0==this.#i;this.#i=1,e&&this.publish()}onHide(){const e=1==this.#i;this.#i=0,e&&this.publish()}}class AlertNode extends AbstractNode{type;subtype;content;footer;constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:a,footer:l,background:s,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}){super({id:e,initiator:n,title:r,subtitle:i,background:s,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}),this.type=o,this.subtype=t,this.content=a,this.footer=l}onClose(){this.resolve(null)}onConfirm(){this.resolve(null)}}class ConfirmNode extends AbstractNode{type;subtype;content;footer;constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:a,footer:l,background:s,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}){super({id:e,initiator:n,title:r,subtitle:i,background:s,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}),this.type=o,this.subtype=t,this.content=a,this.footer=l}onClose(){this.resolve(0)}onConfirm(){this.resolve(1)}}class PromptNode extends AbstractNode{type;content;defaultValue;Input;disabled;returnOnCancel;footer;#s;constructor({id:e,initiator:n,type:o,title:t,subtitle:r,content:i,defaultValue:a,Input:l,disabled:s,returnOnCancel:c,footer:d,background:u,dimmed:m,manualDestroy:p,closeOnBackdropClick:C,resolve:h,ForegroundComponent:g,BackgroundComponent:f}){super({id:e,initiator:n,title:t,subtitle:r,background:u,dimmed:m,manualDestroy:p,closeOnBackdropClick:C,resolve:h,ForegroundComponent:g,BackgroundComponent:f}),this.type=o,this.content=i,this.Input=l,this.defaultValue=a,this.#s=a,this.disabled=s,this.returnOnCancel=c,this.footer=d}onChange(e){this.#s=e}onConfirm(){this.resolve(this.#s??null)}onClose(){this.returnOnCancel?this.resolve(this.#s??null):this.resolve(null)}}const nodeFactory=e=>{switch(e.type){case"alert":return new AlertNode(e);case"confirm":return new ConfirmNode(e);case"prompt":return new PromptNode(e)}throw new Error(`Unknown modal: ${e.type}`,{modal:e})},S=o({}),E=t((({usePathname:n,children:o})=>{const t=r(new Map),[s,c]=useState([]),d=p(s),{pathname:u}=n(),h=r(u),g=r(0),f=useConfigurationOptions(),b=i((()=>m(f.duration)),[f]);C((()=>{const{manualDestroy:e,closeOnBackdropClick:n}=f;for(const o of ModalManager.prerender){const r=nodeFactory({...o,id:g.current++,initiator:h.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});t.current.set(r.id,r),c((e=>[...e,r.id]))}return ModalManager.openHandler=o=>{const r=nodeFactory({...o,id:g.current++,initiator:h.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});t.current.set(r.id,r),c((e=>{const n=[];for(let o=0;o<e.length;o++){const r=e[o];t.current.get(r)?.alive?n.push(r):t.current.delete(r)}return[...n,r.id]}))},()=>{ModalManager.reset()}})),a((()=>{for(const e of d.current){const n=t.current.get(e);n?.alive&&(n.initiator===u?n.onShow():n.onHide())}h.current=u}),[u]);const v=l((e=>t.current.get(e)),[]),y=l((e=>{const n=t.current.get(e);n&&(n.onDestroy(),k.current?.())}),[]),k=r(void 0),O=l((e=>{const n=t.current.get(e);n&&(n.onHide(),k.current?.(),n.manualDestroy||setTimeout((()=>{n.onDestroy()}),b))}),[b]),_=l(((e,n)=>{const o=t.current.get(e);o&&"prompt"===o.type&&o.onChange(n)}),[]),x=l((e=>{const n=t.current.get(e);n&&(n.onConfirm(),O(e))}),[O]),I=l((e=>{const n=t.current.get(e);n&&(n.onClose(),O(e))}),[O]),M=l((e=>({modal:v(e),onConfirm:()=>x(e),onClose:()=>I(e),onChange:n=>_(e,n),onDestroy:()=>y(e)})),[v,x,I,_,y]),N=i((()=>({modalIds:s,getModalNode:v,onChange:_,onConfirm:x,onClose:I,onDestroy:y,getModal:M,setUpdater:e=>{k.current=e}})),[s,M,v,_,x,I,y]);return e(S.Provider,{value:N,children:o})})),useModalManagerContext=()=>s(S),useModal=e=>{const{getModal:n}=useModalManagerContext();return i((()=>n(e)),[e,n])},B=y("production"===process.env.NODE_ENV?{name:"131j9g2",styles:"margin:unset"}:{name:"1w3kbco-fallback",styles:"margin:unset;label:fallback;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$4}),F=y("production"===process.env.NODE_ENV?{name:"1kuk3a3",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black"}:{name:"16dbbea-frame",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black;label:frame;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$4}),FallbackTitle=({children:n})=>e("h2",{className:B,children:n}),FallbackSubtitle=({children:n})=>e("h3",{className:B,children:n}),FallbackContent=({children:n})=>e("div",{className:B,children:n}),FallbackFooter=({confirmLabel:o,hideConfirm:t=0,cancelLabel:r,hideCancel:i=0,disabled:a,onConfirm:l,onCancel:s})=>n("div",{children:[!t&&e("button",{onClick:l,disabled:a,children:o||"Confirm"}),!i&&"function"==typeof s&&e("button",{onClick:s,children:r||"Cancel"})]}),defaultValidate=e=>e?.visible,useActiveModalCount=(e=defaultValidate,n=0)=>{const{modalIds:o,getModalNode:t}=useModalManagerContext();return i((()=>{let n=0;for(const r of o)e(t(r))&&n++;return n}),[t,o,n])},R=c((({id:n,onChangeOrder:o,children:t},r)=>{const a=useActiveModalCount(),[l,s]=i((()=>{const e=a>1;return[e?Math.floor(n/5)%3*100:0,e?n%5*35:0]}),[a,n]);return e("div",{ref:r,className:F,onClick:o,style:{marginBottom:`calc(25vh + ${l}px)`,marginLeft:`${l}px`,transform:`translate(${s}px, ${s}px)`},children:t})})),T=o({}),w=t((({ForegroundComponent:n,BackgroundComponent:o,TitleComponent:r,SubtitleComponent:a,ContentComponent:l,FooterComponent:s,options:c,children:d})=>{const u=i((()=>({BackgroundComponent:o,ForegroundComponent:n||R,TitleComponent:r||FallbackTitle,SubtitleComponent:a||FallbackSubtitle,ContentComponent:t(l||FallbackContent),FooterComponent:t(s||FallbackFooter),options:{duration:"300ms",backdrop:"rgba(0, 0, 0, 0.5)",closeOnBackdropClick:1,manualDestroy:0,...c}})),[n,o,l,s,a,r,c]);return e(T.Provider,{value:u,children:d})})),useConfigurationContext=()=>s(T),useConfigurationOptions=()=>s(T).options,useConfigurationDuration=()=>{const e=useConfigurationOptions();return{duration:e.duration,milliseconds:m(e.duration)}},useConfigurationBackdrop=()=>useConfigurationOptions().backdrop,P=o({}),UserDefinedContextProvider=({context:n,children:o})=>{const t=i((()=>({context:n||{}})),[n]);return e(P.Provider,{value:t,children:o})},useUserDefinedContext=()=>s(P),usePathname=()=>{const[e,n]=useState(window.location.pathname);return a((()=>{let o;const checkPathname=()=>{o&&cancelAnimationFrame(o),e!==window.location.pathname?n(window.location.pathname):o=requestAnimationFrame(checkPathname)};return o=requestAnimationFrame(checkPathname),()=>{o&&cancelAnimationFrame(o)}}),[e]),{pathname:e}},$=y("production"===process.env.NODE_ENV?{name:"u7uu4v",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;}"}:{name:"coymdj-background",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;};label:background;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$3}),j=y("production"===process.env.NODE_ENV?{name:"n07k1x",styles:"pointer-events:all"}:{name:"1hektcs-active",styles:"pointer-events:all;label:active;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$3}),V=y("production"===process.env.NODE_ENV?{name:"1wnowod",styles:"display:flex;align-items:center;justify-content:center"}:{name:"xppew7-visible",styles:"display:flex;align-items:center;justify-content:center;label:visible;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$3}),BackgroundFrame=({modalId:n,onChangeOrder:o})=>{const{BackgroundComponent:t}=useConfigurationContext(),{context:r}=useUserDefinedContext(),{modal:a,onClose:s,onChange:c,onConfirm:d,onDestroy:u}=useModal(n),m=l((e=>{a&&a.closeOnBackdropClick&&a.visible&&s(),e.stopPropagation()}),[a,s]),p=i((()=>a?.BackgroundComponent||t),[t,a]);return a?e("div",{className:k($,{[V]:a.manualDestroy?a.alive:a.visible,[j]:a.closeOnBackdropClick&&a.visible}),onClick:m,children:p&&e(p,{id:a.id,type:a.type,alive:a.alive,visible:a.visible,initiator:a.initiator,manualDestroy:a.manualDestroy,closeOnBackdropClick:a.closeOnBackdropClick,background:a.background,onChange:c,onConfirm:d,onClose:s,onDestroy:u,onChangeOrder:o,context:r})}):null},z=y("production"===process.env.NODE_ENV?{name:"12g0hx0",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1"}:{name:"1hcczik-foreground",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1;label:foreground;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$2}),A=y("production"===process.env.NODE_ENV?{name:"1g95xyq",styles:">*{pointer-events:all;}"}:{name:"123csva-active",styles:">*{pointer-events:all;};label:active;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$2}),L=y("production"===process.env.NODE_ENV?{name:"1fmljv2",styles:"display:flex!important;justify-content:center;align-items:center"}:{name:"1p4unab-visible",styles:"display:flex!important;justify-content:center;align-items:center;label:visible;",toString:_EMOTION_STRINGIFIED_CSS_ERROR__$2}),G=t((({modal:o,handlers:t})=>{const{title:r,subtitle:a,content:l,footer:s}=i((()=>o),[o]),{context:c}=useUserDefinedContext(),{onConfirm:u}=i((()=>t),[t]),m=h(u),{TitleComponent:p,SubtitleComponent:C,ContentComponent:g,FooterComponent:f}=useConfigurationContext();return n(d,{children:[r&&(I(r)?e(p,{context:c,children:r}):r),a&&(I(a)?e(C,{context:c,children:a}):a),l&&(I(l)?e(g,{context:c,children:l}):N(l,{onConfirm:m})),0!=s&&("function"==typeof s?s({onConfirm:m,context:c}):e(f,{onConfirm:m,confirmLabel:s?.confirm,hideConfirm:s?.hideConfirm,context:c}))]})})),H=t((({modal:o,handlers:t})=>{const{title:r,subtitle:a,content:l,footer:s}=i((()=>o),[o]),{context:c}=useUserDefinedContext(),{onConfirm:u,onClose:m}=i((()=>t),[t]),p=h(u),C=h(m),{TitleComponent:g,SubtitleComponent:f,ContentComponent:b,FooterComponent:v}=useConfigurationContext();return n(d,{children:[r&&(I(r)?e(g,{context:c,children:r}):r),a&&(I(a)?e(f,{context:c,children:a}):a),l&&(I(l)?e(b,{context:c,children:l}):N(l,{onConfirm:p,onCancel:C,context:c})),0!=s&&("function"==typeof s?s({onConfirm:p,onCancel:C,context:c}):e(v,{onConfirm:p,onCancel:C,confirmLabel:s?.confirm,cancelLabel:s?.cancel,hideConfirm:s?.hideConfirm,hideCancel:s?.hideCancel,context:c}))]})})),q=t((({modal:o,handlers:r})=>{const{Input:a,defaultValue:s,disabled:c,title:u,subtitle:m,content:p,footer:C}=i((()=>({...o,Input:t(x(o.Input))})),[o]),{context:g}=useUserDefinedContext(),[f,b]=useState(s),{onChange:v,onClose:y,onConfirm:k}=i((()=>r),[r]),O=h(y),_=h((e=>{const n=M(e)?e(f):e;b(n),v(n)})),D=l((()=>{requestAnimationFrame(k)}),[k]),S=i((()=>f?!!c?.(f):0),[c,f]),{TitleComponent:E,SubtitleComponent:B,ContentComponent:F,FooterComponent:R}=useConfigurationContext();return n(d,{children:[u&&(I(u)?e(E,{context:g,children:u}):u),m&&(I(m)?e(B,{context:g,children:m}):m),p&&(I(p)?e(F,{context:g,children:p}):N(p,{onConfirm:D,onCancel:O,context:g})),a&&e(a,{defaultValue:s,value:f,onChange:_,onConfirm:D,onCancel:O,context:g}),0!=C&&("function"==typeof C?C({value:f,disabled:S,onChange:_,onConfirm:D,onCancel:O,context:g}):e(R,{disabled:S,onConfirm:D,onCancel:O,confirmLabel:C?.confirm,cancelLabel:C?.cancel,hideConfirm:C?.hideConfirm,hideCancel:C?.hideCancel,context:g}))]})})),ForegroundFrame=({modalId:o,onChangeOrder:t})=>{const{ForegroundComponent:r}=useConfigurationContext(),{context:a}=useUserDefinedContext(),{modal:l,onChange:s,onConfirm:c,onClose:d,onDestroy:u}=useModal(o),m=i((()=>l?.ForegroundComponent||r),[r,l]);return l?e("div",{className:k(z,{[L]:l.manualDestroy?l.alive:l.visible,[A]:l.visible}),children:n(m,{id:l.id,type:l.type,alive:l.alive,visible:l.visible,initiator:l.initiator,manualDestroy:l.manualDestroy,closeOnBackdropClick:l.closeOnBackdropClick,background:l.background,onChange:s,onConfirm:c,onClose:d,onDestroy:u,onChangeOrder:t,context:a,children:["alert"===l.type&&e(G,{modal:l,handlers:{onConfirm:c}}),"confirm"===l.type&&e(H,{modal:l,handlers:{onConfirm:c,onClose:d}}),"prompt"===l.type&&e(q,{modal:l,handlers:{onChange:s,onConfirm:c,onClose:d}})]})}):null},useSubscribeModal=e=>{const[n,o]=g();return useEffect((()=>{if(e)return e.subscribe(o)}),[e,o]),n},Y=y("production"===process.env.NODE_ENV?{name:"13dmkf4",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden"}:{name:"yjeu12-presenter",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden;label:presenter;",toString:function _EMOTION_STRINGIFIED_CSS_ERROR__$1(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),{increment:U}=v(1),J=t((({modalId:o})=>{const t=r(null),{modal:i}=useModal(o);useSubscribeModal(i);const a=h((()=>{t.current&&(t.current.style.zIndex=`${U()}`)}));return n("div",{ref:t,className:Y,children:[e(BackgroundFrame,{modalId:o,onChangeOrder:a}),e(ForegroundFrame,{modalId:o,onChangeOrder:a})]})})),K=y("production"===process.env.NODE_ENV?{name:"2hpasy",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out"}:{name:"lhj8co-anchor",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out;label:anchor;",toString:function _EMOTION_STRINGIFIED_CSS_ERROR__(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),validateDimmable=e=>e?.visible&&e.dimmed,Q=t(x((()=>{const[n,o]=g(),{modalIds:t,setUpdater:r}=useModalManagerContext();useEffect((()=>{r(o)}),[r,o]);const i=useConfigurationOptions(),a=useActiveModalCount(validateDimmable,n);return e("div",{className:K,style:{transitionDuration:i.duration,backgroundColor:a?i.backdrop:"transparent"},children:_(t,(n=>e(J,{modalId:n},n)))})}))),bootstrap=({ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:i,FooterComponent:a,usePathname:l,options:s,context:c,anchor:d})=>O(e(UserDefinedContextProvider,{context:c,children:e(w,{ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:i,FooterComponent:a,options:s,children:e(E,{usePathname:l,children:e(Q,{})})})}),d),useInitialize=()=>{const e=r(ModalManager.activate()),n=r(null),[,o]=g(),t=l((t=>{e.current?(n.current=ModalManager.anchor({root:t}),o()):D("ModalProvider is already initialized",["ModalProvider can only be initialized once.","Nesting ModalProvider will be ignored..."],{info:"Something is wrong with the ModalProvider initialization..."})}),[o]);return{anchorRef:n,handleInitialize:t}},W=c((({usePathname:e,ForegroundComponent:o,BackgroundComponent:t,TitleComponent:r,SubtitleComponent:a,ContentComponent:l,FooterComponent:s,options:c,context:m,children:p},C)=>{const h=i((()=>e||usePathname),[e]),{anchorRef:g,handleInitialize:b}=useInitialize();return u(C,(()=>({initialize:b})),[b]),f((()=>(null===C&&b(),()=>{g.current&&g.current.remove()}))),n(d,{children:[p,g.current&&bootstrap({ForegroundComponent:o,BackgroundComponent:t,TitleComponent:r,SubtitleComponent:a,ContentComponent:l,FooterComponent:s,usePathname:h,options:c,context:m,anchor:g.current})]})})),useBootstrap=({usePathname:e,ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:a,FooterComponent:s,options:c,context:d,mode:u="auto"}={})=>{const m=i((()=>e||usePathname),[e]),{anchorRef:p,handleInitialize:C}=useInitialize();f((()=>("auto"===u&&C(),()=>{p.current&&p.current.remove()})));const h=l((e=>{"manual"===u&&C(e)}),[u,C]);return{portal:p.current&&bootstrap({usePathname:m,ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:a,FooterComponent:s,options:c,context:d,anchor:p.current}),initialize:h}},useDestroyAfter=(e,n)=>{const{modal:o,onDestroy:t}=useModal(e),i=useSubscribeModal(o),a=r({modal:o,onDestroy:t,milliseconds:I(n)?m(n):n});useEffect((()=>{const{modal:e,onDestroy:n,milliseconds:o}=a.current;if(!e||e.visible||!e.alive)return;const t=setTimeout((()=>{n()}),o);return()=>{t&&clearTimeout(t)}}),[i])},useModalAnimation=(e,n)=>{const o=r(n);o.current=n,a((()=>{if(!o.current)return;let n;return n=e?requestAnimationFrame((()=>o.current.onVisible?.())):requestAnimationFrame((()=>o.current.onHidden?.())),()=>{n&&cancelAnimationFrame(n)}}),[e])};export{W as ModalProvider,alert,confirm,prompt,useActiveModalCount,useDestroyAfter,useBootstrap as useInitializeModal,useModalAnimation,useConfigurationBackdrop as useModalBackdrop,useConfigurationDuration as useModalDuration,useConfigurationOptions as useModalOptions,useSubscribeModal};
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/app/ModalManager.ts","../src/core/handle/alert.ts","../src/core/handle/confirm.ts","../src/core/handle/prompt.ts","../src/core/node/ModalNode/AbstractNode.ts","../src/core/node/ModalNode/AlertNode.ts","../src/core/node/ModalNode/ConfirmNode.ts","../src/core/node/ModalNode/PromptNode.ts","../src/core/node/nodeFactory.ts","../src/providers/ModalManagerContext/ModalManagerContext.ts","../src/providers/ModalManagerContext/ModalManagerContextProvider.tsx","../src/providers/ModalManagerContext/useModalManagerContext.ts","../src/components/FallbackComponents/classNames.emotion.ts","../src/components/FallbackComponents/FallbackTitle.tsx","../src/components/FallbackComponents/FallbackSubtitle.tsx","../src/components/FallbackComponents/FallbackContent.tsx","../src/components/FallbackComponents/FallbackFooter.tsx","../src/hooks/useActiveModalCount.ts","../src/components/FallbackComponents/FallbackForegroundFrame.tsx","../src/providers/ConfigurationContext/ConfigurationContext.ts","../src/providers/ConfigurationContext/ConfigurationContextProvider.tsx","../src/app/constant.ts","../src/providers/ConfigurationContext/useConfigurationContext.ts","../src/providers/UserDefinedContext/UserDefinedContext.ts","../src/providers/UserDefinedContext/UserDefinedContextProvider.tsx","../src/providers/UserDefinedContext/useUserDefinedContext.ts","../src/hooks/useDefaultPathname.ts","../src/components/Background/classNames.emotion.ts","../src/components/Background/Background.tsx","../src/components/Foreground/classNames.emotion.ts","../src/components/Foreground/components/AlertInner.tsx","../src/components/Foreground/components/ConfirmInner.tsx","../src/components/Foreground/components/PromptInner.tsx","../src/components/Foreground/Foreground.tsx","../src/hooks/useSubscribeModal.ts","../src/components/Presenter/classNames.emotion.ts","../src/components/Presenter/Presenter.tsx","../src/components/Anchor/classNames.emotion.ts","../src/components/Anchor/Anchor.tsx","../src/bootstrap/BootstrapProvider/helpers/bootstrap.tsx","../src/bootstrap/BootstrapProvider/hooks/useInitialize.ts","../src/bootstrap/BootstrapProvider/BootstrapProvider.tsx","../src/bootstrap/BootstrapProvider/useBootstrap.tsx","../src/hooks/useDestroyAfter.ts","../src/hooks/useModalAnimation.ts"],"sourcesContent":["import { getRandomString } from '@winglet/common-utils/lib';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { Modal } from '@/promise-modal/types';\n\nexport class ModalManager {\n static #active = false;\n static activate() {\n if (ModalManager.#active) return false;\n return (ModalManager.#active = true);\n }\n\n static #anchor: HTMLElement | null = null;\n static anchor(options?: {\n tag?: string;\n prefix?: string;\n root?: HTMLElement;\n }): HTMLElement {\n if (ModalManager.#anchor) {\n const anchor = document.getElementById(ModalManager.#anchor.id);\n if (anchor) return anchor;\n }\n const {\n tag = 'div',\n prefix = 'promise-modal',\n root = document.body,\n } = options || {};\n const node = document.createElement(tag);\n node.setAttribute('id', `${prefix}-${getRandomString(36)}`);\n root.appendChild(node);\n ModalManager.#anchor = node;\n return node;\n }\n\n static #prerenderList: Modal[] = [];\n static get prerender() {\n return ModalManager.#prerenderList;\n }\n\n static #openHandler: Fn<[Modal], void> = (modal: Modal) =>\n ModalManager.#prerenderList.push(modal);\n static set openHandler(handler: Fn<[Modal], void>) {\n ModalManager.#openHandler = handler;\n ModalManager.#prerenderList = [];\n }\n\n static get unanchored() {\n return !ModalManager.#anchor;\n }\n\n static reset() {\n ModalManager.#active = false;\n ModalManager.#anchor = null;\n ModalManager.#prerenderList = [];\n ModalManager.#openHandler = (modal: Modal) =>\n ModalManager.#prerenderList.push(modal);\n }\n\n static open(modal: Modal) {\n ModalManager.#openHandler(modal);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n AlertContentProps,\n AlertFooterRender,\n BackgroundComponent,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface AlertProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<AlertContentProps>;\n background?: ModalBackground<B>;\n footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const alert = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: AlertProps<B>) => {\n return new Promise<void>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'alert',\n subtype,\n resolve: () => resolve(),\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n BackgroundComponent,\n ConfirmContentProps,\n ConfirmFooterRender,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface ConfirmProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<ConfirmContentProps>;\n background?: ModalBackground<B>;\n footer?: ConfirmFooterRender | FooterOptions | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const confirm = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: ConfirmProps<B>) => {\n return new Promise<boolean>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'confirm',\n subtype,\n resolve: (result) => resolve(result ?? false),\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n BackgroundComponent,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n} from '@/promise-modal/types';\n\ninterface PromptProps<T, B = any> {\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<PromptContentProps>;\n Input: (props: PromptInputProps<T>) => ReactNode;\n defaultValue?: T;\n disabled?: (value: T) => boolean;\n returnOnCancel?: boolean;\n background?: ModalBackground<B>;\n footer?: PromptFooterRender<T> | FooterOptions | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const prompt = <T, B = any>({\n defaultValue,\n title,\n subtitle,\n content,\n Input,\n disabled,\n returnOnCancel,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: PromptProps<T, B>) => {\n return new Promise<T>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'prompt',\n resolve: (result) => resolve(result as T),\n title,\n subtitle,\n content,\n Input,\n defaultValue,\n disabled,\n returnOnCancel,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ReactNode } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type {\n BackgroundComponent,\n BaseModal,\n ForegroundComponent,\n ManagedEntity,\n ModalBackground,\n} from '@/promise-modal/types';\n\ntype AbstractNodeProps<T, B> = BaseModal<T, B> & ManagedEntity;\n\nexport abstract class AbstractNode<T, B> {\n readonly id: number;\n readonly initiator: string;\n\n readonly title?: ReactNode;\n readonly subtitle?: ReactNode;\n readonly background?: ModalBackground<B>;\n\n readonly manualDestroy: boolean;\n readonly closeOnBackdropClick: boolean;\n readonly dimmed: boolean;\n\n readonly ForegroundComponent?: ForegroundComponent;\n readonly BackgroundComponent?: BackgroundComponent;\n\n #alive: boolean;\n get alive() {\n return this.#alive;\n }\n #visible: boolean;\n get visible() {\n return this.#visible;\n }\n\n #resolve: (result: T | null) => void;\n #listeners: Set<Fn> = new Set();\n\n constructor({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed = true,\n manualDestroy = false,\n closeOnBackdropClick = true,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: AbstractNodeProps<T, B>) {\n this.id = id;\n this.initiator = initiator;\n this.title = title;\n this.subtitle = subtitle;\n this.background = background;\n\n this.dimmed = dimmed;\n this.manualDestroy = manualDestroy;\n this.closeOnBackdropClick = closeOnBackdropClick;\n\n this.ForegroundComponent = ForegroundComponent;\n this.BackgroundComponent = BackgroundComponent;\n\n this.#alive = true;\n this.#visible = true;\n this.#resolve = resolve;\n }\n\n subscribe(listener: Fn) {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n }\n publish() {\n for (const listener of this.#listeners) listener();\n }\n protected resolve(result: T | null) {\n this.#resolve(result);\n }\n onDestroy() {\n const needPublish = this.#alive === true;\n this.#alive = false;\n if (this.manualDestroy && needPublish) this.publish();\n }\n onShow() {\n const needPublish = this.#visible === false;\n this.#visible = true;\n if (needPublish) this.publish();\n }\n onHide() {\n const needPublish = this.#visible === true;\n this.#visible = false;\n if (needPublish) this.publish();\n }\n abstract onClose(): void;\n abstract onConfirm(): void;\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n AlertContentProps,\n AlertFooterRender,\n AlertModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype AlertNodeProps<B> = AlertModal<B> & ManagedEntity;\n\nexport class AlertNode<B> extends AbstractNode<null, B> {\n readonly type: 'alert';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<AlertContentProps>;\n readonly footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: AlertNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(null);\n }\n onConfirm() {\n this.resolve(null);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n ConfirmModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype ConfirmNodeProps<B> = ConfirmModal<B> & ManagedEntity;\n\nexport class ConfirmNode<B> extends AbstractNode<boolean, B> {\n readonly type: 'confirm';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<ConfirmContentProps>;\n readonly footer?: ConfirmFooterRender | FooterOptions | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: ConfirmNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(false);\n }\n onConfirm() {\n this.resolve(true);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ManagedEntity,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n PromptModal,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype PromptNodeProps<T, B> = PromptModal<T, B> & ManagedEntity;\n\nexport class PromptNode<T, B> extends AbstractNode<T, B> {\n readonly type: 'prompt';\n readonly content?: ReactNode | ComponentType<PromptContentProps>;\n readonly defaultValue: T | undefined;\n readonly Input: (props: PromptInputProps<T>) => ReactNode;\n readonly disabled?: (value: T) => boolean;\n readonly returnOnCancel?: boolean;\n readonly footer?: PromptFooterRender<T> | FooterOptions | false;\n\n #value: T | undefined;\n\n constructor({\n id,\n initiator,\n type,\n title,\n subtitle,\n content,\n defaultValue,\n Input,\n disabled,\n returnOnCancel,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: PromptNodeProps<T, B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.content = content;\n this.Input = Input;\n this.defaultValue = defaultValue;\n this.#value = defaultValue;\n this.disabled = disabled;\n this.returnOnCancel = returnOnCancel;\n this.footer = footer;\n }\n\n onChange(value: T) {\n this.#value = value;\n }\n onConfirm() {\n this.resolve(this.#value ?? null);\n }\n onClose() {\n if (this.returnOnCancel) this.resolve(this.#value ?? null);\n else this.resolve(null);\n }\n}\n","import type { ManagedModal } from '@/promise-modal/types';\n\nimport { AlertNode, ConfirmNode, PromptNode } from './ModalNode';\n\nexport const nodeFactory = <T, B>(modal: ManagedModal<T, B>) => {\n switch (modal.type) {\n case 'alert':\n return new AlertNode<B>(modal);\n case 'confirm':\n return new ConfirmNode<B>(modal);\n case 'prompt':\n return new PromptNode<T, B>(modal);\n }\n // @ts-expect-error: This state is unreachable by design and should NEVER occur.\n throw new Error(`Unknown modal: ${modal.type}`, { modal });\n};\n","import { createContext } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport type { ModalActions, ModalHandlersWithId } from '@/promise-modal/types';\n\nexport interface ModalManagerContextProps extends ModalHandlersWithId {\n modalIds: ModalNode['id'][];\n getModal: Fn<[id: ModalNode['id']], ModalActions>;\n getModalNode: Fn<[id: ModalNode['id']], ModalNode | undefined>;\n setUpdater: Fn<[updater: Fn]>;\n}\n\nexport const ModalManagerContext = createContext<ModalManagerContextProps>(\n {} as ModalManagerContextProps,\n);\n","import {\n type PropsWithChildren,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils/convert';\nimport { useOnMountLayout, useReference } from '@winglet/react-utils/hook';\n\nimport type { Fn } from '@aileron/declare';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport { type ModalNode, nodeFactory } from '@/promise-modal/core';\nimport { useConfigurationOptions } from '@/promise-modal/providers';\nimport type { Modal } from '@/promise-modal/types';\n\nimport { ModalManagerContext } from './ModalManagerContext';\n\ninterface ModalManagerContextProviderProps {\n usePathname: Fn<[], { pathname: string }>;\n}\n\nexport const ModalManagerContextProvider = memo(\n ({\n usePathname,\n children,\n }: PropsWithChildren<ModalManagerContextProviderProps>) => {\n const modalDictionary = useRef<Map<ModalNode['id'], ModalNode>>(new Map());\n\n const [modalIds, setModalIds] = useState<ModalNode['id'][]>([]);\n const modalIdsRef = useReference(modalIds);\n const { pathname } = usePathname();\n\n const initiator = useRef(pathname);\n const modalIdSequence = useRef(0);\n\n const options = useConfigurationOptions();\n\n const duration = useMemo(\n () => convertMsFromDuration(options.duration),\n [options],\n );\n\n useOnMountLayout(() => {\n const { manualDestroy, closeOnBackdropClick } = options;\n\n for (const data of ModalManager.prerender) {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => [...ids, modal.id]);\n }\n\n ModalManager.openHandler = (data: Modal) => {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => {\n const aliveIds: number[] = [];\n for (let index = 0; index < ids.length; index++) {\n const id = ids[index];\n const destroyed = !modalDictionary.current.get(id)?.alive;\n if (destroyed) modalDictionary.current.delete(id);\n else aliveIds.push(id);\n }\n return [...aliveIds, modal.id];\n });\n };\n return () => {\n ModalManager.reset();\n };\n });\n\n useLayoutEffect(() => {\n for (const id of modalIdsRef.current) {\n const modal = modalDictionary.current.get(id);\n if (!modal?.alive) continue;\n if (modal.initiator === pathname) modal.onShow();\n else modal.onHide();\n }\n initiator.current = pathname;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname]);\n\n const getModalNode = useCallback((modalId: ModalNode['id']) => {\n return modalDictionary.current.get(modalId);\n }, []);\n\n const onDestroy = useCallback((modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onDestroy();\n updaterRef.current?.();\n }, []);\n\n const updaterRef = useRef<Fn>(undefined);\n const hideModal = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onHide();\n updaterRef.current?.();\n if (!modal.manualDestroy)\n setTimeout(() => {\n modal.onDestroy();\n }, duration);\n },\n [duration],\n );\n\n const onChange = useCallback((modalId: ModalNode['id'], value: any) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n if (modal.type === 'prompt') modal.onChange(value);\n }, []);\n\n const onConfirm = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onConfirm();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const onClose = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onClose();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const getModal = useCallback(\n (modalId: ModalNode['id']) => ({\n modal: getModalNode(modalId),\n onConfirm: () => onConfirm(modalId),\n onClose: () => onClose(modalId),\n onChange: (value: any) => onChange(modalId, value),\n onDestroy: () => onDestroy(modalId),\n }),\n [getModalNode, onConfirm, onClose, onChange, onDestroy],\n );\n\n const value = useMemo(() => {\n return {\n modalIds,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n getModal,\n setUpdater: (updater: Fn) => {\n updaterRef.current = updater;\n },\n };\n }, [\n modalIds,\n getModal,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n ]);\n\n return (\n <ModalManagerContext.Provider value={value}>\n {children}\n </ModalManagerContext.Provider>\n );\n },\n);\n","import { useContext, useMemo } from 'react';\n\nimport type { ManagedModal } from '@/promise-modal/types';\n\nimport { ModalManagerContext } from './ModalManagerContext';\n\nexport const useModalManagerContext = () => useContext(ModalManagerContext);\n\nexport const useModal = (id: ManagedModal['id']) => {\n const { getModal } = useModalManagerContext();\n return useMemo(() => getModal(id), [id, getModal]);\n};\n","import { css } from '@emotion/css';\n\nexport const fallback = css`\n margin: unset;\n`;\n\nexport const frame = css`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: white;\n padding: 20px 80px;\n gap: 10px;\n border: 1px solid black;\n`;\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackTitle = ({ children }: PropsWithChildren) => {\n return <h2 className={fallback}>{children}</h2>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackSubtitle = ({ children }: PropsWithChildren) => {\n return <h3 className={fallback}>{children}</h3>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackContent = ({ children }: PropsWithChildren) => {\n return <div className={fallback}>{children}</div>;\n};\n","import type { FooterComponentProps } from '@/promise-modal/types';\n\nexport const FallbackFooter = ({\n confirmLabel,\n hideConfirm = false,\n cancelLabel,\n hideCancel = false,\n disabled,\n onConfirm,\n onCancel,\n}: FooterComponentProps) => {\n return (\n <div>\n {!hideConfirm && (\n <button onClick={onConfirm} disabled={disabled}>\n {confirmLabel || 'Confirm'}\n </button>\n )}\n\n {!hideCancel && typeof onCancel === 'function' && (\n <button onClick={onCancel}>{cancelLabel || 'Cancel'}</button>\n )}\n </div>\n );\n};\n","import { useMemo } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useModalManagerContext } from '@/promise-modal/providers';\n\nconst defaultValidate = (modal?: ModalNode) => modal?.visible;\n\nexport const useActiveModalCount = (\n validate: Fn<[ModalNode?], boolean | undefined> = defaultValidate,\n refreshKey: string | number = 0,\n) => {\n const { modalIds, getModalNode } = useModalManagerContext();\n return useMemo(() => {\n let count = 0;\n for (const id of modalIds) {\n if (validate(getModalNode(id))) count++;\n }\n return count;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getModalNode, modalIds, refreshKey]);\n};\n","import {\n type ForwardedRef,\n type PropsWithChildren,\n forwardRef,\n useMemo,\n} from 'react';\n\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport type { ModalFrameProps } from '@/promise-modal/types';\n\nimport { frame } from './classNames.emotion';\n\nconst MAX_MODAL_COUNT = 5;\nconst MAX_MODAL_LEVEL = 3;\n\nexport const FallbackForegroundFrame = forwardRef(\n (\n { id, onChangeOrder, children }: PropsWithChildren<ModalFrameProps>,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const activeCount = useActiveModalCount();\n const [level, offset] = useMemo(() => {\n const stacked = activeCount > 1;\n const level = stacked\n ? (Math.floor(id / MAX_MODAL_COUNT) % MAX_MODAL_LEVEL) * 100\n : 0;\n const offset = stacked ? (id % MAX_MODAL_COUNT) * 35 : 0;\n return [level, offset];\n }, [activeCount, id]);\n\n return (\n <div\n ref={ref}\n className={frame}\n onClick={onChangeOrder}\n style={{\n marginBottom: `calc(25vh + ${level}px)`,\n marginLeft: `${level}px`,\n transform: `translate(${offset}px, ${offset}px)`,\n }}\n >\n {children}\n </div>\n );\n },\n);\n","import { type ComponentType, createContext } from 'react';\n\nimport type { Color, Duration } from '@aileron/declare';\n\nimport type {\n BackgroundComponent,\n FooterComponentProps,\n ForegroundComponent,\n WrapperComponentProps,\n} from '@/promise-modal/types';\n\nexport interface ConfigurationContextProps {\n ForegroundComponent: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n TitleComponent: ComponentType<WrapperComponentProps>;\n SubtitleComponent: ComponentType<WrapperComponentProps>;\n ContentComponent: ComponentType<WrapperComponentProps>;\n FooterComponent: ComponentType<FooterComponentProps>;\n options: {\n duration: Duration;\n backdrop: Color;\n manualDestroy: boolean;\n closeOnBackdropClick: boolean;\n };\n}\n\nexport const ConfigurationContext = createContext<ConfigurationContextProps>(\n {} as ConfigurationContextProps,\n);\n","import {\n type ComponentType,\n type PropsWithChildren,\n memo,\n useMemo,\n} from 'react';\n\nimport type { Color, Duration } from '@aileron/declare';\n\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n WrapperComponentProps,\n} from '@/promise-modal/types';\n\nimport { ConfigurationContext } from './ConfigurationContext';\n\nexport interface ConfigurationContextProviderProps {\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n ForegroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent?: ComponentType<WrapperComponentProps>;\n SubtitleComponent?: ComponentType<WrapperComponentProps>;\n ContentComponent?: ComponentType<WrapperComponentProps>;\n FooterComponent?: ComponentType<FooterComponentProps>;\n options?: {\n /** Modal transition time(ms, s) */\n duration?: Duration;\n /** Modal backdrop color */\n backdrop?: Color;\n /** Whether to destroy the modal manually */\n manualDestroy?: boolean;\n /** Whether to close the modal when the backdrop is clicked */\n closeOnBackdropClick?: boolean;\n };\n}\n\nexport const ConfigurationContextProvider = memo(\n ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n children,\n }: PropsWithChildren<ConfigurationContextProviderProps>) => {\n const value = useMemo(\n () => ({\n BackgroundComponent,\n ForegroundComponent: ForegroundComponent || FallbackForegroundFrame,\n TitleComponent: TitleComponent || FallbackTitle,\n SubtitleComponent: SubtitleComponent || FallbackSubtitle,\n ContentComponent: memo(ContentComponent || FallbackContent),\n FooterComponent: memo(FooterComponent || FallbackFooter),\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n closeOnBackdropClick: true,\n manualDestroy: false,\n ...options,\n } satisfies ConfigurationContextProviderProps['options'],\n }),\n [\n ForegroundComponent,\n BackgroundComponent,\n ContentComponent,\n FooterComponent,\n SubtitleComponent,\n TitleComponent,\n options,\n ],\n );\n return (\n <ConfigurationContext.Provider value={value}>\n {children}\n </ConfigurationContext.Provider>\n );\n },\n);\n","import type { Color, Duration } from '@aileron/declare';\n\nexport const DEFAULT_ANIMATION_DURATION: Duration = '300ms';\n\nexport const DEFAULT_BACKDROP_COLOR: Color = 'rgba(0, 0, 0, 0.5)';\n","import { useContext } from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils/convert';\n\nimport { ConfigurationContext } from './ConfigurationContext';\n\nexport const useConfigurationContext = () => useContext(ConfigurationContext);\n\nexport const useConfigurationOptions = () => {\n const context = useContext(ConfigurationContext);\n return context.options;\n};\n\nexport const useConfigurationDuration = () => {\n const context = useConfigurationOptions();\n return {\n duration: context.duration,\n milliseconds: convertMsFromDuration(context.duration),\n };\n};\n\nexport const useConfigurationBackdrop = () => {\n const context = useConfigurationOptions();\n return context.backdrop;\n};\n","import { createContext } from 'react';\n\nimport type { Dictionary } from '@aileron/declare';\n\nexport interface UserDefinedContext {\n context: Dictionary;\n}\n\nexport const UserDefinedContext = createContext<UserDefinedContext>(\n {} as UserDefinedContext,\n);\n","import { PropsWithChildren, useMemo } from 'react';\n\nimport type { Dictionary } from '@aileron/declare';\n\nimport { UserDefinedContext } from './UserDefinedContext';\n\ninterface UserDefinedContextProviderProps {\n /** User defined context */\n context?: Dictionary;\n}\n\nexport const UserDefinedContextProvider = ({\n context,\n children,\n}: PropsWithChildren<UserDefinedContextProviderProps>) => {\n const contextValue = useMemo(() => ({ context: context || {} }), [context]);\n return (\n <UserDefinedContext.Provider value={contextValue}>\n {children}\n </UserDefinedContext.Provider>\n );\n};\n","import { useContext } from 'react';\n\nimport { UserDefinedContext } from './UserDefinedContext';\n\nexport const useUserDefinedContext = () => {\n return useContext(UserDefinedContext);\n};\n","import { useLayoutEffect, useState } from 'react';\n\nexport const usePathname = () => {\n const [pathname, setPathname] = useState(window.location.pathname);\n useLayoutEffect(() => {\n let requestId: number;\n const checkPathname = () => {\n if (requestId) cancelAnimationFrame(requestId);\n if (pathname !== window.location.pathname) {\n setPathname(window.location.pathname);\n } else {\n requestId = requestAnimationFrame(checkPathname);\n }\n };\n requestId = requestAnimationFrame(checkPathname);\n return () => {\n if (requestId) cancelAnimationFrame(requestId);\n };\n }, [pathname]);\n return { pathname };\n};\n","import { css } from '@emotion/css';\n\nexport const background = css`\n display: none;\n position: fixed;\n inset: 0;\n z-index: -999;\n pointer-events: none;\n > * {\n pointer-events: none;\n }\n`;\n\nexport const active = css`\n pointer-events: all;\n`;\n\nexport const visible = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","import { type MouseEvent, useCallback, useMemo } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport {\n useConfigurationContext,\n useModal,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, background, visible } from './classNames.emotion';\n\nexport const BackgroundFrame = ({\n modalId,\n onChangeOrder,\n}: ModalLayerProps) => {\n const { BackgroundComponent } = useConfigurationContext();\n const { context: userDefinedContext } = useUserDefinedContext();\n const { modal, onClose, onChange, onConfirm, onDestroy } = useModal(modalId);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n if (modal && modal.closeOnBackdropClick && modal.visible) onClose();\n event.stopPropagation();\n },\n [modal, onClose],\n );\n\n const Background = useMemo(\n () => modal?.BackgroundComponent || BackgroundComponent,\n [BackgroundComponent, modal],\n );\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(background, {\n [visible]: modal.manualDestroy ? modal.alive : modal.visible,\n [active]: modal.closeOnBackdropClick && modal.visible,\n })}\n onClick={handleClose}\n >\n {Background && (\n <Background\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n context={userDefinedContext}\n />\n )}\n </div>\n );\n};\n","import { css } from '@emotion/css';\n\nexport const foreground = css`\n pointer-events: none;\n display: none;\n position: fixed;\n inset: 0;\n z-index: 1;\n`;\n\nexport const active = css`\n > * {\n pointer-events: all;\n }\n`;\n\nexport const visible = css`\n display: flex !important;\n justify-content: center;\n align-items: center;\n`;\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils/filter';\nimport { useHandle } from '@winglet/react-utils/hook';\nimport { renderComponent } from '@winglet/react-utils/render';\n\nimport type { AlertNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface AlertInnerProps<B> {\n modal: AlertNode<B>;\n handlers: Pick<ModalActions, 'onConfirm'>;\n}\n\nexport const AlertInner = memo(\n <B,>({ modal, handlers }: AlertInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { context: userDefinedContext } = useUserDefinedContext();\n const { onConfirm } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n confirmLabel={footer?.confirm}\n hideConfirm={footer?.hideConfirm}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils/filter';\nimport { useHandle } from '@winglet/react-utils/hook';\nimport { renderComponent } from '@winglet/react-utils/render';\n\nimport type { ConfirmNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface ConfirmInnerProps<B> {\n modal: ConfirmNode<B>;\n handlers: Pick<ModalActions, 'onConfirm' | 'onClose'>;\n}\n\nexport const ConfirmInner = memo(\n <B,>({ modal, handlers }: ConfirmInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { context: userDefinedContext } = useUserDefinedContext();\n const { onConfirm, onClose } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n const handleClose = useHandle(onClose);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useCallback, useMemo, useState } from 'react';\n\nimport { isFunction, isString } from '@winglet/common-utils/filter';\nimport { withErrorBoundary } from '@winglet/react-utils/hoc';\nimport { useHandle } from '@winglet/react-utils/hook';\nimport { renderComponent } from '@winglet/react-utils/render';\n\nimport type { PromptNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface PromptInnerProps<T, B> {\n modal: PromptNode<T, B>;\n handlers: Pick<ModalActions, 'onChange' | 'onClose' | 'onConfirm'>;\n}\n\nexport const PromptInner = memo(\n <T, B>({ modal, handlers }: PromptInnerProps<T, B>) => {\n const {\n Input,\n defaultValue,\n disabled: checkDisabled,\n title,\n subtitle,\n content,\n footer,\n } = useMemo(\n () => ({\n ...modal,\n Input: memo(withErrorBoundary(modal.Input)),\n }),\n [modal],\n );\n\n const { context: userDefinedContext } = useUserDefinedContext();\n\n const [value, setValue] = useState<T | undefined>(defaultValue);\n\n const { onChange, onClose, onConfirm } = useMemo(\n () => handlers,\n [handlers],\n );\n\n const handleClose = useHandle(onClose);\n const handleChange = useHandle(\n (inputValue?: T | ((prevState: T | undefined) => T | undefined)) => {\n const input = isFunction(inputValue) ? inputValue(value) : inputValue;\n setValue(input);\n onChange(input);\n },\n );\n\n const handleConfirm = useCallback(() => {\n // NOTE: wait for the next tick to ensure the value is updated\n requestAnimationFrame(onConfirm);\n }, [onConfirm]);\n\n const disabled = useMemo(\n () => (value ? !!checkDisabled?.(value) : false),\n [checkDisabled, value],\n );\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ))}\n\n {Input && (\n <Input\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n onConfirm={handleConfirm}\n onCancel={handleClose}\n context={userDefinedContext}\n />\n )}\n\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n value,\n disabled,\n onChange: handleChange,\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n disabled={disabled}\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { useMemo } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport {\n useConfigurationContext,\n useModal,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, foreground, visible } from './classNames.emotion';\nimport { AlertInner, ConfirmInner, PromptInner } from './components';\n\nexport const ForegroundFrame = ({\n modalId,\n onChangeOrder,\n}: ModalLayerProps) => {\n const { ForegroundComponent } = useConfigurationContext();\n const { context: userDefinedContext } = useUserDefinedContext();\n\n const { modal, onChange, onConfirm, onClose, onDestroy } = useModal(modalId);\n\n const Foreground = useMemo(\n () => modal?.ForegroundComponent || ForegroundComponent,\n [ForegroundComponent, modal],\n );\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(foreground, {\n [visible]: modal.manualDestroy ? modal.alive : modal.visible,\n [active]: modal.visible,\n })}\n >\n <Foreground\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n context={userDefinedContext}\n >\n {modal.type === 'alert' && (\n <AlertInner modal={modal} handlers={{ onConfirm }} />\n )}\n {modal.type === 'confirm' && (\n <ConfirmInner modal={modal} handlers={{ onConfirm, onClose }} />\n )}\n {modal.type === 'prompt' && (\n <PromptInner\n modal={modal}\n handlers={{ onChange, onConfirm, onClose }}\n />\n )}\n </Foreground>\n </div>\n );\n};\n","import { useEffect } from 'react';\n\nimport { useVersion } from '@winglet/react-utils/hook';\n\nimport type { ModalNode } from '@/promise-modal/core';\n\nexport const useSubscribeModal = (modal?: ModalNode) => {\n const [version, update] = useVersion();\n useEffect(() => {\n if (!modal) return;\n const unsubscribe = modal.subscribe(update);\n return unsubscribe;\n }, [modal, update]);\n return version;\n};\n","import { css } from '@emotion/css';\n\nexport const presenter = css`\n position: fixed;\n inset: 0;\n pointer-events: none;\n overflow: hidden;\n`;\n","import { memo, useRef } from 'react';\n\nimport { counterFactory } from '@winglet/common-utils/lib';\nimport { useHandle } from '@winglet/react-utils/hook';\n\nimport { Background } from '@/promise-modal/components/Background';\nimport { Foreground } from '@/promise-modal/components/Foreground';\nimport { useSubscribeModal } from '@/promise-modal/hooks/useSubscribeModal';\nimport { useModal } from '@/promise-modal/providers';\nimport type { ModalIdProps } from '@/promise-modal/types';\n\nimport { presenter } from './classNames.emotion';\n\nconst { increment } = counterFactory(1);\n\nexport const Presenter = memo(({ modalId }: ModalIdProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { modal } = useModal(modalId);\n useSubscribeModal(modal);\n const handleChangeOrder = useHandle(() => {\n if (ref.current) {\n ref.current.style.zIndex = `${increment()}`;\n }\n });\n return (\n <div ref={ref} className={presenter}>\n <Background modalId={modalId} onChangeOrder={handleChangeOrder} />\n <Foreground modalId={modalId} onChangeOrder={handleChangeOrder} />\n </div>\n );\n});\n","import { css } from '@emotion/css';\n\nexport const anchor = css`\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 1000;\n transition: background-color ease-in-out;\n`;\n","import { memo, useEffect } from 'react';\n\nimport { map } from '@winglet/common-utils/array';\nimport { withErrorBoundary } from '@winglet/react-utils/hoc';\nimport { useVersion } from '@winglet/react-utils/hook';\n\nimport { Presenter } from '@/promise-modal/components/Presenter';\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport {\n useConfigurationOptions,\n useModalManagerContext,\n} from '@/promise-modal/providers';\n\nimport { anchor } from './classNames.emotion';\n\nconst AnchorInner = () => {\n const [version, update] = useVersion();\n\n const { modalIds, setUpdater } = useModalManagerContext();\n\n useEffect(() => {\n setUpdater(update);\n }, [setUpdater, update]);\n\n const options = useConfigurationOptions();\n\n const dimmed = useActiveModalCount(validateDimmable, version);\n\n return (\n <div\n className={anchor}\n style={{\n transitionDuration: options.duration,\n backgroundColor: dimmed ? options.backdrop : 'transparent',\n }}\n >\n {map(modalIds, (id) => (\n <Presenter key={id} modalId={id} />\n ))}\n </div>\n );\n};\n\nconst validateDimmable = (modal?: ModalNode) => modal?.visible && modal.dimmed;\n\nexport const Anchor = memo(withErrorBoundary(AnchorInner));\n","import { createPortal } from 'react-dom';\n\nimport type { Dictionary, Fn } from '@aileron/declare';\n\nimport { Anchor } from '@/promise-modal/components/Anchor';\nimport {\n ConfigurationContextProvider,\n type ConfigurationContextProviderProps,\n} from '@/promise-modal/providers/ConfigurationContext';\nimport { ModalManagerContextProvider } from '@/promise-modal/providers/ModalManagerContext';\nimport { UserDefinedContextProvider } from '@/promise-modal/providers/UserDefinedContext';\n\ninterface BootstrapProps extends ConfigurationContextProviderProps {\n usePathname: Fn<[], { pathname: string }>;\n context?: Dictionary;\n anchor: HTMLElement;\n}\n\nexport const bootstrap = ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n usePathname,\n options,\n context,\n anchor,\n}: BootstrapProps) =>\n createPortal(\n <UserDefinedContextProvider context={context}>\n <ConfigurationContextProvider\n ForegroundComponent={ForegroundComponent}\n BackgroundComponent={BackgroundComponent}\n TitleComponent={TitleComponent}\n SubtitleComponent={SubtitleComponent}\n ContentComponent={ContentComponent}\n FooterComponent={FooterComponent}\n options={options}\n >\n <ModalManagerContextProvider usePathname={usePathname}>\n <Anchor />\n </ModalManagerContextProvider>\n </ConfigurationContextProvider>\n </UserDefinedContextProvider>,\n anchor,\n );\n","import { useCallback, useRef } from 'react';\n\nimport { printError } from '@winglet/common-utils/console';\nimport { useVersion } from '@winglet/react-utils/hook';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\n\nexport const useInitialize = () => {\n const permitted = useRef(ModalManager.activate());\n const anchorRef = useRef<HTMLElement | null>(null);\n const [, update] = useVersion();\n\n const handleInitialize = useCallback(\n (root?: HTMLElement) => {\n if (permitted.current) {\n anchorRef.current = ModalManager.anchor({ root });\n update();\n } else\n printError(\n 'ModalProvider is already initialized',\n [\n 'ModalProvider can only be initialized once.',\n 'Nesting ModalProvider will be ignored...',\n ],\n {\n info: 'Something is wrong with the ModalProvider initialization...',\n },\n );\n },\n [update],\n );\n\n return {\n anchorRef,\n handleInitialize,\n } as const;\n};\n","import {\n Fragment,\n type PropsWithChildren,\n forwardRef,\n useImperativeHandle,\n useMemo,\n} from 'react';\n\nimport { useOnMount } from '@winglet/react-utils/hook';\n\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\n\nimport { bootstrap } from './helpers/bootstrap';\nimport { useInitialize } from './hooks/useInitialize';\nimport type { BootstrapProviderHandle, BootstrapProviderProps } from './type';\n\nexport const BootstrapProvider = forwardRef<\n BootstrapProviderHandle,\n PropsWithChildren<BootstrapProviderProps>\n>(\n (\n {\n usePathname: useExternalPathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n children,\n },\n handleRef,\n ) => {\n const usePathname = useMemo(\n () => useExternalPathname || useDefaultPathname,\n [useExternalPathname],\n );\n\n const { anchorRef, handleInitialize } = useInitialize();\n\n useImperativeHandle(\n handleRef,\n () => ({\n initialize: handleInitialize,\n }),\n [handleInitialize],\n );\n\n useOnMount(() => {\n /**\n * NOTE: `handleRef` being null indicates that no `ref` was provided.\n * In this case, the `ModalProvider`(=`BootstrapProvider`) is not receiving the `ref`,\n * so it should be initialized automatically.\n */\n if (handleRef === null) handleInitialize();\n return () => {\n if (anchorRef.current) anchorRef.current.remove();\n };\n });\n\n return (\n <Fragment>\n {children}\n {anchorRef.current &&\n bootstrap({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n usePathname,\n options,\n context,\n anchor: anchorRef.current,\n })}\n </Fragment>\n );\n },\n);\n","import { useCallback, useMemo } from 'react';\n\nimport { useOnMount } from '@winglet/react-utils/hook';\n\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\n\nimport { bootstrap } from './helpers/bootstrap';\nimport { useInitialize } from './hooks/useInitialize';\nimport type { BootstrapProviderProps } from './type';\n\nexport const useBootstrap = ({\n usePathname: useExternalPathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n mode = 'auto',\n}: BootstrapProviderProps & { mode?: 'manual' | 'auto' } = {}) => {\n const usePathname = useMemo(\n () => useExternalPathname || useDefaultPathname,\n [useExternalPathname],\n );\n\n const { anchorRef, handleInitialize } = useInitialize();\n\n useOnMount(() => {\n if (mode === 'auto') handleInitialize();\n return () => {\n if (anchorRef.current) anchorRef.current.remove();\n };\n });\n\n const initialize = useCallback(\n (element: HTMLElement) => {\n if (mode === 'manual') handleInitialize(element);\n },\n [mode, handleInitialize],\n );\n\n const portal =\n anchorRef.current &&\n bootstrap({\n usePathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n anchor: anchorRef.current,\n });\n\n return { portal, initialize };\n};\n","import { useEffect, useRef } from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils/convert';\nimport { isString } from '@winglet/common-utils/filter';\n\nimport type { Duration } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useModal } from '@/promise-modal/providers';\n\nimport { useSubscribeModal } from './useSubscribeModal';\n\nexport const useDestroyAfter = (\n modalId: ModalNode['id'],\n duration: Duration | number,\n) => {\n const { modal, onDestroy } = useModal(modalId);\n const tick = useSubscribeModal(modal);\n\n const reference = useRef({\n modal,\n onDestroy,\n milliseconds: isString(duration)\n ? convertMsFromDuration(duration)\n : duration,\n });\n\n useEffect(() => {\n const { modal, onDestroy, milliseconds } = reference.current;\n if (!modal || modal.visible || !modal.alive) return;\n const timer = setTimeout(() => {\n onDestroy();\n }, milliseconds);\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [tick]);\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\ninterface ModalAnimationHandler {\n onVisible?: Fn;\n onHidden?: Fn;\n}\n\nexport const useModalAnimation = (\n visible: boolean,\n handler: ModalAnimationHandler,\n) => {\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n useLayoutEffect(() => {\n if (!handlerRef.current) return;\n let frame: ReturnType<typeof requestAnimationFrame>;\n if (visible)\n frame = requestAnimationFrame(() => handlerRef.current.onVisible?.());\n else frame = requestAnimationFrame(() => handlerRef.current.onHidden?.());\n return () => {\n if (frame) cancelAnimationFrame(frame);\n };\n }, [visible]);\n};\n"],"names":["ModalManager","static","activate","active","anchor","options","document","getElementById","id","tag","prefix","root","body","node","createElement","setAttribute","getRandomString","appendChild","prerender","prerenderList","modal","push","openHandler","handler","unanchored","reset","open","alert","subtype","title","subtitle","content","background","footer","dimmed","manualDestroy","closeOnBackdropClick","ForegroundComponent","BackgroundComponent","Promise","resolve","reject","type","error","confirm","result","prompt","defaultValue","Input","disabled","returnOnCancel","AbstractNode","initiator","alive","this","visible","listeners","Set","constructor","subscribe","listener","add","delete","publish","onDestroy","needPublish","onShow","onHide","AlertNode","super","onClose","onConfirm","ConfirmNode","PromptNode","value","onChange","nodeFactory","Error","ModalManagerContext","createContext","ModalManagerContextProvider","memo","usePathname","children","modalDictionary","useRef","Map","modalIds","setModalIds","useState","modalIdsRef","useReference","pathname","modalIdSequence","useConfigurationOptions","duration","useMemo","convertMsFromDuration","useOnMountLayout","data","current","undefined","set","ids","aliveIds","index","length","get","useLayoutEffect","getModalNode","useCallback","modalId","updaterRef","hideModal","setTimeout","getModal","setUpdater","updater","_jsx","Provider","useModalManagerContext","useContext","useModal","fallback","css","process","env","NODE_ENV","name","styles","toString","_EMOTION_STRINGIFIED_CSS_ERROR__","frame","FallbackTitle","className","FallbackSubtitle","FallbackContent","FallbackFooter","confirmLabel","hideConfirm","cancelLabel","hideCancel","onCancel","_jsxs","onClick","defaultValidate","useActiveModalCount","validate","refreshKey","count","FallbackForegroundFrame","forwardRef","onChangeOrder","ref","activeCount","level","offset","stacked","Math","floor","style","marginBottom","marginLeft","transform","ConfigurationContext","ConfigurationContextProvider","TitleComponent","SubtitleComponent","ContentComponent","FooterComponent","backdrop","useConfigurationContext","useConfigurationDuration","context","milliseconds","useConfigurationBackdrop","UserDefinedContext","UserDefinedContextProvider","contextValue","useUserDefinedContext","setPathname","window","location","requestId","checkPathname","cancelAnimationFrame","requestAnimationFrame","BackgroundFrame","userDefinedContext","handleClose","event","stopPropagation","Background","cx","visible$1","active$1","foreground","AlertInner","handlers","handleConfirm","useHandle","Fragment","isString","renderComponent","ConfirmInner","cancel","PromptInner","checkDisabled","withErrorBoundary","setValue","handleChange","inputValue","input","isFunction","ForegroundFrame","Foreground","useSubscribeModal","version","update","useVersion","useEffect","presenter","increment","counterFactory","Presenter","handleChangeOrder","zIndex","validateDimmable","Anchor","transitionDuration","backgroundColor","map","bootstrap","createPortal","useInitialize","permitted","anchorRef","handleInitialize","printError","info","BootstrapProvider","useExternalPathname","handleRef","useDefaultPathname","useImperativeHandle","initialize","useOnMount","remove","useBootstrap","mode","element","portal","useDestroyAfter","tick","reference","timer","clearTimeout","useModalAnimation","handlerRef","onVisible","onHidden"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lerx/promise-modal",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/vincent-kk/albatrion.git",
|
|
7
|
-
"directory": "packages/promise-modal"
|
|
7
|
+
"directory": "packages/lerx/promise-modal"
|
|
8
8
|
},
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"author": {
|
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
18
18
|
"types": "./dist/index.d.ts",
|
|
19
|
-
"import": "./dist/index.
|
|
20
|
-
"require": "./dist/index.cjs
|
|
19
|
+
"import": "./dist/index.mjs",
|
|
20
|
+
"require": "./dist/index.cjs"
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
|
-
"main": "dist/index.cjs
|
|
24
|
-
"module": "dist/index.
|
|
23
|
+
"main": "dist/index.cjs",
|
|
24
|
+
"module": "dist/index.mjs",
|
|
25
25
|
"types": "dist/index.d.ts",
|
|
26
26
|
"files": [
|
|
27
27
|
"dist",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@emotion/css": "^11.0.0",
|
|
51
|
-
"@winglet/common-utils": "^0.1.
|
|
52
|
-
"@winglet/react-utils": "^0.1.
|
|
51
|
+
"@winglet/common-utils": "^0.1.1",
|
|
52
|
+
"@winglet/react-utils": "^0.1.1"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@babel/core": "^7.26.0",
|
package/dist/index.cjs.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),n=require("react"),o=require("@winglet/common-utils"),t=require("@winglet/react-utils"),r=require("@emotion/css"),i=require("react-dom");class s{static#e=!1;static activate(){return!s.#e&&(s.#e=!0)}static#n=null;static anchor(e){if(s.#n){const e=document.getElementById(s.#n.id);if(e)return e}const{tag:n="div",prefix:t="promise-modal",root:r=document.body}=e||{},i=document.createElement(n);return i.setAttribute("id",`${t}-${o.getRandomString(36)}`),r.appendChild(i),s.#n=i,i}static#o=[];static get prerender(){return s.#o}static#t=e=>s.#o.push(e);static set openHandler(e){s.#t=e,s.#o=[]}static get unanchored(){return!s.#n}static reset(){s.#e=!1,s.#n=null,s.#o=[],s.#t=e=>s.#o.push(e)}static open(e){s.#t(e)}}class a{id;initiator;title;subtitle;background;manualDestroy;closeOnBackdropClick;dimmed;ForegroundComponent;BackgroundComponent;#r;get alive(){return this.#r}#i;get visible(){return this.#i}#s;#a=new Set;constructor({id:e,initiator:n,title:o,subtitle:t,background:r,dimmed:i=!0,manualDestroy:s=!1,closeOnBackdropClick:a=!0,resolve:l,ForegroundComponent:c,BackgroundComponent:u}){this.id=e,this.initiator=n,this.title=o,this.subtitle=t,this.background=r,this.dimmed=i,this.manualDestroy=s,this.closeOnBackdropClick=a,this.ForegroundComponent=c,this.BackgroundComponent=u,this.#r=!0,this.#i=!0,this.#s=l}subscribe(e){return this.#a.add(e),()=>{this.#a.delete(e)}}publish(){for(const e of this.#a)e()}resolve(e){this.#s(e)}onDestroy(){const e=!0===this.#r;this.#r=!1,this.manualDestroy&&e&&this.publish()}onShow(){const e=!1===this.#i;this.#i=!0,e&&this.publish()}onHide(){const e=!0===this.#i;this.#i=!1,e&&this.publish()}}class l extends a{type;subtype;content;footer;constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:s,footer:a,background:l,dimmed:c,manualDestroy:u,closeOnBackdropClick:d,resolve:m,ForegroundComponent:p,BackgroundComponent:C}){super({id:e,initiator:n,title:r,subtitle:i,background:l,dimmed:c,manualDestroy:u,closeOnBackdropClick:d,resolve:m,ForegroundComponent:p,BackgroundComponent:C}),this.type=o,this.subtype=t,this.content=s,this.footer=a}onClose(){this.resolve(null)}onConfirm(){this.resolve(null)}}class c extends a{type;subtype;content;footer;constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:s,footer:a,background:l,dimmed:c,manualDestroy:u,closeOnBackdropClick:d,resolve:m,ForegroundComponent:p,BackgroundComponent:C}){super({id:e,initiator:n,title:r,subtitle:i,background:l,dimmed:c,manualDestroy:u,closeOnBackdropClick:d,resolve:m,ForegroundComponent:p,BackgroundComponent:C}),this.type=o,this.subtype=t,this.content=s,this.footer=a}onClose(){this.resolve(!1)}onConfirm(){this.resolve(!0)}}class u extends a{type;content;defaultValue;Input;disabled;returnOnCancel;footer;#l;constructor({id:e,initiator:n,type:o,title:t,subtitle:r,content:i,defaultValue:s,Input:a,disabled:l,returnOnCancel:c,footer:u,background:d,dimmed:m,manualDestroy:p,closeOnBackdropClick:C,resolve:h,ForegroundComponent:f,BackgroundComponent:g}){super({id:e,initiator:n,title:t,subtitle:r,background:d,dimmed:m,manualDestroy:p,closeOnBackdropClick:C,resolve:h,ForegroundComponent:f,BackgroundComponent:g}),this.type=o,this.content=i,this.Input=a,this.defaultValue=s,this.#l=s,this.disabled=l,this.returnOnCancel=c,this.footer=u}onChange(e){this.#l=e}onConfirm(){this.resolve(this.#l??null)}onClose(){this.returnOnCancel?this.resolve(this.#l??null):this.resolve(null)}}const d=e=>{switch(e.type){case"alert":return new l(e);case"confirm":return new c(e);case"prompt":return new u(e)}throw new Error(`Unknown modal: ${e.type}`,{modal:e})},m=n.createContext({}),p=n.memo((({usePathname:r,children:i})=>{const a=n.useRef(new Map),[l,c]=n.useState([]),u=t.useReference(l),{pathname:p}=r(),C=n.useRef(p),h=n.useRef(0),f=S(),g=n.useMemo((()=>o.convertMsFromDuration(f.duration)),[f]);t.useOnMountLayout((()=>{const{manualDestroy:e,closeOnBackdropClick:n}=f;for(const o of s.prerender){const t=d({...o,id:h.current++,initiator:C.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});a.current.set(t.id,t),c((e=>[...e,t.id]))}return s.openHandler=o=>{const t=d({...o,id:h.current++,initiator:C.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});a.current.set(t.id,t),c((e=>{const n=[];for(let o=0;o<e.length;o++){const t=e[o];a.current.get(t)?.alive?n.push(t):a.current.delete(t)}return[...n,t.id]}))},()=>{s.reset()}})),n.useLayoutEffect((()=>{for(const e of u.current){const n=a.current.get(e);n?.alive&&(n.initiator===p?n.onShow():n.onHide())}C.current=p}),[p]);const b=n.useCallback((e=>a.current.get(e)),[]),v=n.useCallback((e=>{const n=a.current.get(e);n&&(n.onDestroy(),y.current?.())}),[]),y=n.useRef(void 0),x=n.useCallback((e=>{const n=a.current.get(e);n&&(n.onHide(),y.current?.(),n.manualDestroy||setTimeout((()=>{n.onDestroy()}),g))}),[g]),k=n.useCallback(((e,n)=>{const o=a.current.get(e);o&&"prompt"===o.type&&o.onChange(n)}),[]),j=n.useCallback((e=>{const n=a.current.get(e);n&&(n.onConfirm(),x(e))}),[x]),B=n.useCallback((e=>{const n=a.current.get(e);n&&(n.onClose(),x(e))}),[x]),D=n.useCallback((e=>({modal:b(e),onConfirm:()=>j(e),onClose:()=>B(e),onChange:n=>k(e,n),onDestroy:()=>v(e)})),[b,j,B,k,v]),O=n.useMemo((()=>({modalIds:l,getModalNode:b,onChange:k,onConfirm:j,onClose:B,onDestroy:v,getModal:D,setUpdater:e=>{y.current=e}})),[l,D,b,k,j,B,v]);return e.jsx(m.Provider,{value:O,children:i})})),C=()=>n.useContext(m),h=e=>{const{getModal:o}=C();return n.useMemo((()=>o(e)),[e,o])};function f(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const g=r.css("production"===process.env.NODE_ENV?{name:"131j9g2",styles:"margin:unset"}:{name:"1w3kbco-fallback",styles:"margin:unset;label:fallback;",toString:f}),b=r.css("production"===process.env.NODE_ENV?{name:"1kuk3a3",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black"}:{name:"16dbbea-frame",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black;label:frame;",toString:f}),v=({children:n})=>e.jsx("h2",{className:g,children:n}),y=({children:n})=>e.jsx("h3",{className:g,children:n}),x=({children:n})=>e.jsx("div",{className:g,children:n}),k=({confirmLabel:n,hideConfirm:o=!1,cancelLabel:t,hideCancel:r=!1,disabled:i,onConfirm:s,onCancel:a})=>e.jsxs("div",{children:[!o&&e.jsx("button",{onClick:s,disabled:i,children:n||"Confirm"}),!r&&"function"==typeof a&&e.jsx("button",{onClick:a,children:t||"Cancel"})]}),j=e=>e?.visible,B=(e=j,o=0)=>{const{modalIds:t,getModalNode:r}=C();return n.useMemo((()=>{let n=0;for(const o of t)e(r(o))&&n++;return n}),[r,t,o])},D=n.forwardRef((({id:o,onChangeOrder:t,children:r},i)=>{const s=B(),[a,l]=n.useMemo((()=>{const e=s>1;return[e?Math.floor(o/5)%3*100:0,e?o%5*35:0]}),[s,o]);return e.jsx("div",{ref:i,className:b,onClick:t,style:{marginBottom:`calc(25vh + ${a}px)`,marginLeft:`${a}px`,transform:`translate(${l}px, ${l}px)`},children:r})})),O=n.createContext({}),F=n.memo((({ForegroundComponent:o,BackgroundComponent:t,TitleComponent:r,SubtitleComponent:i,ContentComponent:s,FooterComponent:a,options:l,children:c})=>{const u=n.useMemo((()=>({BackgroundComponent:t,ForegroundComponent:o||D,TitleComponent:r||v,SubtitleComponent:i||y,ContentComponent:n.memo(s||x),FooterComponent:n.memo(a||k),options:{duration:"300ms",backdrop:"rgba(0, 0, 0, 0.5)",closeOnBackdropClick:!0,manualDestroy:!1,...l}})),[o,t,s,a,i,r,l]);return e.jsx(O.Provider,{value:u,children:c})})),M=()=>n.useContext(O),S=()=>n.useContext(O).options,w=n.createContext({}),N=({context:o,children:t})=>{const r=n.useMemo((()=>({context:o||{}})),[o]);return e.jsx(w.Provider,{value:r,children:t})},E=()=>n.useContext(w),I=()=>{const[e,o]=n.useState(window.location.pathname);return n.useLayoutEffect((()=>{let n;const t=()=>{n&&cancelAnimationFrame(n),e!==window.location.pathname?o(window.location.pathname):n=requestAnimationFrame(t)};return n=requestAnimationFrame(t),()=>{n&&cancelAnimationFrame(n)}}),[e]),{pathname:e}};function V(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const P=r.css("production"===process.env.NODE_ENV?{name:"u7uu4v",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;}"}:{name:"coymdj-background",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;};label:background;",toString:V}),L=r.css("production"===process.env.NODE_ENV?{name:"n07k1x",styles:"pointer-events:all"}:{name:"1hektcs-active",styles:"pointer-events:all;label:active;",toString:V}),z=r.css("production"===process.env.NODE_ENV?{name:"1wnowod",styles:"display:flex;align-items:center;justify-content:center"}:{name:"xppew7-visible",styles:"display:flex;align-items:center;justify-content:center;label:visible;",toString:V}),H=({modalId:o,onChangeOrder:t})=>{const{BackgroundComponent:i}=M(),{context:s}=E(),{modal:a,onClose:l,onChange:c,onConfirm:u,onDestroy:d}=h(o),m=n.useCallback((e=>{a&&a.closeOnBackdropClick&&a.visible&&l(),e.stopPropagation()}),[a,l]),p=n.useMemo((()=>a?.BackgroundComponent||i),[i,a]);return a?e.jsx("div",{className:r.cx(P,{[z]:a.manualDestroy?a.alive:a.visible,[L]:a.closeOnBackdropClick&&a.visible}),onClick:m,children:p&&e.jsx(p,{id:a.id,type:a.type,alive:a.alive,visible:a.visible,initiator:a.initiator,manualDestroy:a.manualDestroy,closeOnBackdropClick:a.closeOnBackdropClick,background:a.background,onChange:c,onConfirm:u,onClose:l,onDestroy:d,onChangeOrder:t,context:s})}):null};function R(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const T=r.css("production"===process.env.NODE_ENV?{name:"12g0hx0",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1"}:{name:"1hcczik-foreground",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1;label:foreground;",toString:R}),q=r.css("production"===process.env.NODE_ENV?{name:"1g95xyq",styles:">*{pointer-events:all;}"}:{name:"123csva-active",styles:">*{pointer-events:all;};label:active;",toString:R}),A=r.css("production"===process.env.NODE_ENV?{name:"1fmljv2",styles:"display:flex!important;justify-content:center;align-items:center"}:{name:"1p4unab-visible",styles:"display:flex!important;justify-content:center;align-items:center;label:visible;",toString:R}),_=n.memo((({modal:r,handlers:i})=>{const{title:s,subtitle:a,content:l,footer:c}=n.useMemo((()=>r),[r]),{context:u}=E(),{onConfirm:d}=n.useMemo((()=>i),[i]),m=t.useHandle(d),{TitleComponent:p,SubtitleComponent:C,ContentComponent:h,FooterComponent:f}=M();return e.jsxs(n.Fragment,{children:[s&&(o.isString(s)?e.jsx(p,{context:u,children:s}):s),a&&(o.isString(a)?e.jsx(C,{context:u,children:a}):a),l&&(o.isString(l)?e.jsx(h,{context:u,children:l}):t.renderComponent(l,{onConfirm:m})),!1!==c&&("function"==typeof c?c({onConfirm:m,context:u}):e.jsx(f,{onConfirm:m,confirmLabel:c?.confirm,hideConfirm:c?.hideConfirm,context:u}))]})})),$=n.memo((({modal:r,handlers:i})=>{const{title:s,subtitle:a,content:l,footer:c}=n.useMemo((()=>r),[r]),{context:u}=E(),{onConfirm:d,onClose:m}=n.useMemo((()=>i),[i]),p=t.useHandle(d),C=t.useHandle(m),{TitleComponent:h,SubtitleComponent:f,ContentComponent:g,FooterComponent:b}=M();return e.jsxs(n.Fragment,{children:[s&&(o.isString(s)?e.jsx(h,{context:u,children:s}):s),a&&(o.isString(a)?e.jsx(f,{context:u,children:a}):a),l&&(o.isString(l)?e.jsx(g,{context:u,children:l}):t.renderComponent(l,{onConfirm:p,onCancel:C,context:u})),!1!==c&&("function"==typeof c?c({onConfirm:p,onCancel:C,context:u}):e.jsx(b,{onConfirm:p,onCancel:C,confirmLabel:c?.confirm,cancelLabel:c?.cancel,hideConfirm:c?.hideConfirm,hideCancel:c?.hideCancel,context:u}))]})})),Y=n.memo((({modal:r,handlers:i})=>{const{Input:s,defaultValue:a,disabled:l,title:c,subtitle:u,content:d,footer:m}=n.useMemo((()=>({...r,Input:n.memo(t.withErrorBoundary(r.Input))})),[r]),{context:p}=E(),[C,h]=n.useState(a),{onChange:f,onClose:g,onConfirm:b}=n.useMemo((()=>i),[i]),v=t.useHandle(g),y=t.useHandle((e=>{const n=o.isFunction(e)?e(C):e;h(n),f(n)})),x=n.useCallback((()=>{requestAnimationFrame(b)}),[b]),k=n.useMemo((()=>!!C&&!!l?.(C)),[l,C]),{TitleComponent:j,SubtitleComponent:B,ContentComponent:D,FooterComponent:O}=M();return e.jsxs(n.Fragment,{children:[c&&(o.isString(c)?e.jsx(j,{context:p,children:c}):c),u&&(o.isString(u)?e.jsx(B,{context:p,children:u}):u),d&&(o.isString(d)?e.jsx(D,{context:p,children:d}):t.renderComponent(d,{onConfirm:x,onCancel:v,context:p})),s&&e.jsx(s,{defaultValue:a,value:C,onChange:y,onConfirm:x,onCancel:v,context:p}),!1!==m&&("function"==typeof m?m({value:C,disabled:k,onChange:y,onConfirm:x,onCancel:v,context:p}):e.jsx(O,{disabled:k,onConfirm:x,onCancel:v,confirmLabel:m?.confirm,cancelLabel:m?.cancel,hideConfirm:m?.hideConfirm,hideCancel:m?.hideCancel,context:p}))]})})),U=({modalId:o,onChangeOrder:t})=>{const{ForegroundComponent:i}=M(),{context:s}=E(),{modal:a,onChange:l,onConfirm:c,onClose:u,onDestroy:d}=h(o),m=n.useMemo((()=>a?.ForegroundComponent||i),[i,a]);return a?e.jsx("div",{className:r.cx(T,{[A]:a.manualDestroy?a.alive:a.visible,[q]:a.visible}),children:e.jsxs(m,{id:a.id,type:a.type,alive:a.alive,visible:a.visible,initiator:a.initiator,manualDestroy:a.manualDestroy,closeOnBackdropClick:a.closeOnBackdropClick,background:a.background,onChange:l,onConfirm:c,onClose:u,onDestroy:d,onChangeOrder:t,context:s,children:["alert"===a.type&&e.jsx(_,{modal:a,handlers:{onConfirm:c}}),"confirm"===a.type&&e.jsx($,{modal:a,handlers:{onConfirm:c,onClose:u}}),"prompt"===a.type&&e.jsx(Y,{modal:a,handlers:{onChange:l,onConfirm:c,onClose:u}})]})}):null},G=e=>{const[o,r]=t.useVersion();return n.useEffect((()=>{if(e)return e.subscribe(r)}),[e,r]),o},J=r.css("production"===process.env.NODE_ENV?{name:"13dmkf4",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden"}:{name:"yjeu12-presenter",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden;label:presenter;",toString:function(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),{increment:K}=o.counterFactory(1),Q=n.memo((({modalId:o})=>{const r=n.useRef(null),{modal:i}=h(o);G(i);const s=t.useHandle((()=>{r.current&&(r.current.style.zIndex=`${K()}`)}));return e.jsxs("div",{ref:r,className:J,children:[e.jsx(H,{modalId:o,onChangeOrder:s}),e.jsx(U,{modalId:o,onChangeOrder:s})]})})),W=r.css("production"===process.env.NODE_ENV?{name:"2hpasy",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out"}:{name:"lhj8co-anchor",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out;label:anchor;",toString:function(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),X=e=>e?.visible&&e.dimmed,Z=n.memo(t.withErrorBoundary((()=>{const[r,i]=t.useVersion(),{modalIds:s,setUpdater:a}=C();n.useEffect((()=>{a(i)}),[a,i]);const l=S(),c=B(X,r);return e.jsx("div",{className:W,style:{transitionDuration:l.duration,backgroundColor:c?l.backdrop:"transparent"},children:o.map(s,(n=>e.jsx(Q,{modalId:n},n)))})}))),ee=({ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:s,FooterComponent:a,usePathname:l,options:c,context:u,anchor:d})=>i.createPortal(e.jsx(N,{context:u,children:e.jsx(F,{ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:s,FooterComponent:a,options:c,children:e.jsx(p,{usePathname:l,children:e.jsx(Z,{})})})}),d),ne=()=>{const e=n.useRef(s.activate()),r=n.useRef(null),[,i]=t.useVersion(),a=n.useCallback((n=>{e.current?(r.current=s.anchor({root:n}),i()):o.printError("ModalProvider is already initialized",["ModalProvider can only be initialized once.","Nesting ModalProvider will be ignored..."],{info:"Something is wrong with the ModalProvider initialization..."})}),[i]);return{anchorRef:r,handleInitialize:a}},oe=n.forwardRef((({usePathname:o,ForegroundComponent:r,BackgroundComponent:i,TitleComponent:s,SubtitleComponent:a,ContentComponent:l,FooterComponent:c,options:u,context:d,children:m},p)=>{const C=n.useMemo((()=>o||I),[o]),{anchorRef:h,handleInitialize:f}=ne();return n.useImperativeHandle(p,(()=>({initialize:f})),[f]),t.useOnMount((()=>(null===p&&f(),()=>{h.current&&h.current.remove()}))),e.jsxs(n.Fragment,{children:[m,h.current&&ee({ForegroundComponent:r,BackgroundComponent:i,TitleComponent:s,SubtitleComponent:a,ContentComponent:l,FooterComponent:c,usePathname:C,options:u,context:d,anchor:h.current})]})}));exports.ModalProvider=oe,exports.alert=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,dimmed:a,manualDestroy:l,closeOnBackdropClick:c,ForegroundComponent:u,BackgroundComponent:d})=>new Promise(((m,p)=>{try{s.open({type:"alert",subtype:e,resolve:()=>m(),title:n,subtitle:o,content:t,background:r,footer:i,dimmed:a,manualDestroy:l,closeOnBackdropClick:c,ForegroundComponent:u,BackgroundComponent:d})}catch(e){p(e)}})),exports.confirm=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,dimmed:a,manualDestroy:l,closeOnBackdropClick:c,ForegroundComponent:u,BackgroundComponent:d})=>new Promise(((m,p)=>{try{s.open({type:"confirm",subtype:e,resolve:e=>m(e??!1),title:n,subtitle:o,content:t,background:r,footer:i,dimmed:a,manualDestroy:l,closeOnBackdropClick:c,ForegroundComponent:u,BackgroundComponent:d})}catch(e){p(e)}})),exports.prompt=({defaultValue:e,title:n,subtitle:o,content:t,Input:r,disabled:i,returnOnCancel:a,background:l,footer:c,dimmed:u,manualDestroy:d,closeOnBackdropClick:m,ForegroundComponent:p,BackgroundComponent:C})=>new Promise(((h,f)=>{try{s.open({type:"prompt",resolve:e=>h(e),title:n,subtitle:o,content:t,Input:r,defaultValue:e,disabled:i,returnOnCancel:a,background:l,footer:c,dimmed:u,manualDestroy:d,closeOnBackdropClick:m,ForegroundComponent:p,BackgroundComponent:C})}catch(e){f(e)}})),exports.useActiveModalCount=B,exports.useDestroyAfter=(e,t)=>{const{modal:r,onDestroy:i}=h(e),s=G(r),a=n.useRef({modal:r,onDestroy:i,milliseconds:o.isString(t)?o.convertMsFromDuration(t):t});n.useEffect((()=>{const{modal:e,onDestroy:n,milliseconds:o}=a.current;if(!e||e.visible||!e.alive)return;const t=setTimeout((()=>{n()}),o);return()=>{t&&clearTimeout(t)}}),[s])},exports.useInitializeModal=({usePathname:e,ForegroundComponent:o,BackgroundComponent:r,TitleComponent:i,SubtitleComponent:s,ContentComponent:a,FooterComponent:l,options:c,context:u,mode:d="auto"}={})=>{const m=n.useMemo((()=>e||I),[e]),{anchorRef:p,handleInitialize:C}=ne();t.useOnMount((()=>("auto"===d&&C(),()=>{p.current&&p.current.remove()})));const h=n.useCallback((e=>{"manual"===d&&C(e)}),[d,C]);return{portal:p.current&&ee({usePathname:m,ForegroundComponent:o,BackgroundComponent:r,TitleComponent:i,SubtitleComponent:s,ContentComponent:a,FooterComponent:l,options:c,context:u,anchor:p.current}),initialize:h}},exports.useModalAnimation=(e,o)=>{const t=n.useRef(o);t.current=o,n.useLayoutEffect((()=>{if(!t.current)return;let n;return n=e?requestAnimationFrame((()=>t.current.onVisible?.())):requestAnimationFrame((()=>t.current.onHidden?.())),()=>{n&&cancelAnimationFrame(n)}}),[e])},exports.useModalBackdrop=()=>S().backdrop,exports.useModalDuration=()=>{const e=S();return{duration:e.duration,milliseconds:o.convertMsFromDuration(e.duration)}},exports.useModalOptions=S,exports.useSubscribeModal=G;
|
|
2
|
-
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/app/ModalManager.ts","../src/core/node/ModalNode/AbstractNode.ts","../src/core/node/ModalNode/AlertNode.ts","../src/core/node/ModalNode/ConfirmNode.ts","../src/core/node/ModalNode/PromptNode.ts","../src/core/node/nodeFactory.ts","../src/providers/ModalManagerContext/ModalManagerContext.ts","../src/providers/ModalManagerContext/ModalManagerContextProvider.tsx","../src/providers/ModalManagerContext/useModalManagerContext.ts","../src/components/FallbackComponents/classNames.emotion.ts","../src/components/FallbackComponents/FallbackTitle.tsx","../src/components/FallbackComponents/FallbackSubtitle.tsx","../src/components/FallbackComponents/FallbackContent.tsx","../src/components/FallbackComponents/FallbackFooter.tsx","../src/hooks/useActiveModalCount.ts","../src/components/FallbackComponents/FallbackForegroundFrame.tsx","../src/providers/ConfigurationContext/ConfigurationContext.ts","../src/providers/ConfigurationContext/ConfigurationContextProvider.tsx","../src/app/constant.ts","../src/providers/ConfigurationContext/useConfigurationContext.ts","../src/providers/UserDefinedContext/UserDefinedContext.ts","../src/providers/UserDefinedContext/UserDefinedContextProvider.tsx","../src/providers/UserDefinedContext/useUserDefinedContext.ts","../src/hooks/useDefaultPathname.ts","../src/components/Background/classNames.emotion.ts","../src/components/Background/Background.tsx","../src/components/Foreground/classNames.emotion.ts","../src/components/Foreground/components/AlertInner.tsx","../src/components/Foreground/components/ConfirmInner.tsx","../src/components/Foreground/components/PromptInner.tsx","../src/components/Foreground/Foreground.tsx","../src/hooks/useSubscribeModal.ts","../src/components/Presenter/classNames.emotion.ts","../src/components/Presenter/Presenter.tsx","../src/components/Anchor/classNames.emotion.ts","../src/components/Anchor/Anchor.tsx","../src/bootstrap/BootstrapProvider/helpers/bootstrap.tsx","../src/bootstrap/BootstrapProvider/hooks/useInitialize.ts","../src/bootstrap/BootstrapProvider/BootstrapProvider.tsx","../src/core/handle/alert.ts","../src/core/handle/confirm.ts","../src/core/handle/prompt.ts","../src/hooks/useDestroyAfter.ts","../src/bootstrap/BootstrapProvider/useBootstrap.tsx","../src/hooks/useModalAnimation.ts"],"sourcesContent":["import { getRandomString } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { Modal } from '@/promise-modal/types';\n\nexport class ModalManager {\n static #active = false;\n static activate() {\n if (ModalManager.#active) return false;\n return (ModalManager.#active = true);\n }\n\n static #anchor: HTMLElement | null = null;\n static anchor(options?: {\n tag?: string;\n prefix?: string;\n root?: HTMLElement;\n }): HTMLElement {\n if (ModalManager.#anchor) {\n const anchor = document.getElementById(ModalManager.#anchor.id);\n if (anchor) return anchor;\n }\n const {\n tag = 'div',\n prefix = 'promise-modal',\n root = document.body,\n } = options || {};\n const node = document.createElement(tag);\n node.setAttribute('id', `${prefix}-${getRandomString(36)}`);\n root.appendChild(node);\n ModalManager.#anchor = node;\n return node;\n }\n\n static #prerenderList: Modal[] = [];\n static get prerender() {\n return ModalManager.#prerenderList;\n }\n\n static #openHandler: Fn<[Modal], void> = (modal: Modal) =>\n ModalManager.#prerenderList.push(modal);\n static set openHandler(handler: Fn<[Modal], void>) {\n ModalManager.#openHandler = handler;\n ModalManager.#prerenderList = [];\n }\n\n static get unanchored() {\n return !ModalManager.#anchor;\n }\n\n static reset() {\n ModalManager.#active = false;\n ModalManager.#anchor = null;\n ModalManager.#prerenderList = [];\n ModalManager.#openHandler = (modal: Modal) =>\n ModalManager.#prerenderList.push(modal);\n }\n\n static open(modal: Modal) {\n ModalManager.#openHandler(modal);\n }\n}\n","import type { ReactNode } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type {\n BackgroundComponent,\n BaseModal,\n ForegroundComponent,\n ManagedEntity,\n ModalBackground,\n} from '@/promise-modal/types';\n\ntype AbstractNodeProps<T, B> = BaseModal<T, B> & ManagedEntity;\n\nexport abstract class AbstractNode<T, B> {\n readonly id: number;\n readonly initiator: string;\n\n readonly title?: ReactNode;\n readonly subtitle?: ReactNode;\n readonly background?: ModalBackground<B>;\n\n readonly manualDestroy: boolean;\n readonly closeOnBackdropClick: boolean;\n readonly dimmed: boolean;\n\n readonly ForegroundComponent?: ForegroundComponent;\n readonly BackgroundComponent?: BackgroundComponent;\n\n #alive: boolean;\n get alive() {\n return this.#alive;\n }\n #visible: boolean;\n get visible() {\n return this.#visible;\n }\n\n #resolve: (result: T | null) => void;\n #listeners: Set<Fn> = new Set();\n\n constructor({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed = true,\n manualDestroy = false,\n closeOnBackdropClick = true,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: AbstractNodeProps<T, B>) {\n this.id = id;\n this.initiator = initiator;\n this.title = title;\n this.subtitle = subtitle;\n this.background = background;\n\n this.dimmed = dimmed;\n this.manualDestroy = manualDestroy;\n this.closeOnBackdropClick = closeOnBackdropClick;\n\n this.ForegroundComponent = ForegroundComponent;\n this.BackgroundComponent = BackgroundComponent;\n\n this.#alive = true;\n this.#visible = true;\n this.#resolve = resolve;\n }\n\n subscribe(listener: Fn) {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n }\n publish() {\n for (const listener of this.#listeners) listener();\n }\n protected resolve(result: T | null) {\n this.#resolve(result);\n }\n onDestroy() {\n const needPublish = this.#alive === true;\n this.#alive = false;\n if (this.manualDestroy && needPublish) this.publish();\n }\n onShow() {\n const needPublish = this.#visible === false;\n this.#visible = true;\n if (needPublish) this.publish();\n }\n onHide() {\n const needPublish = this.#visible === true;\n this.#visible = false;\n if (needPublish) this.publish();\n }\n abstract onClose(): void;\n abstract onConfirm(): void;\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n AlertContentProps,\n AlertFooterRender,\n AlertModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype AlertNodeProps<B> = AlertModal<B> & ManagedEntity;\n\nexport class AlertNode<B> extends AbstractNode<null, B> {\n readonly type: 'alert';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<AlertContentProps>;\n readonly footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: AlertNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(null);\n }\n onConfirm() {\n this.resolve(null);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n ConfirmModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype ConfirmNodeProps<B> = ConfirmModal<B> & ManagedEntity;\n\nexport class ConfirmNode<B> extends AbstractNode<boolean, B> {\n readonly type: 'confirm';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<ConfirmContentProps>;\n readonly footer?: ConfirmFooterRender | FooterOptions | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: ConfirmNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(false);\n }\n onConfirm() {\n this.resolve(true);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ManagedEntity,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n PromptModal,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype PromptNodeProps<T, B> = PromptModal<T, B> & ManagedEntity;\n\nexport class PromptNode<T, B> extends AbstractNode<T, B> {\n readonly type: 'prompt';\n readonly content?: ReactNode | ComponentType<PromptContentProps>;\n readonly defaultValue: T | undefined;\n readonly Input: (props: PromptInputProps<T>) => ReactNode;\n readonly disabled?: (value: T) => boolean;\n readonly returnOnCancel?: boolean;\n readonly footer?: PromptFooterRender<T> | FooterOptions | false;\n\n #value: T | undefined;\n\n constructor({\n id,\n initiator,\n type,\n title,\n subtitle,\n content,\n defaultValue,\n Input,\n disabled,\n returnOnCancel,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: PromptNodeProps<T, B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.content = content;\n this.Input = Input;\n this.defaultValue = defaultValue;\n this.#value = defaultValue;\n this.disabled = disabled;\n this.returnOnCancel = returnOnCancel;\n this.footer = footer;\n }\n\n onChange(value: T) {\n this.#value = value;\n }\n onConfirm() {\n this.resolve(this.#value ?? null);\n }\n onClose() {\n if (this.returnOnCancel) this.resolve(this.#value ?? null);\n else this.resolve(null);\n }\n}\n","import type { ManagedModal } from '@/promise-modal/types';\n\nimport { AlertNode, ConfirmNode, PromptNode } from './ModalNode';\n\nexport const nodeFactory = <T, B>(modal: ManagedModal<T, B>) => {\n switch (modal.type) {\n case 'alert':\n return new AlertNode<B>(modal);\n case 'confirm':\n return new ConfirmNode<B>(modal);\n case 'prompt':\n return new PromptNode<T, B>(modal);\n }\n // @ts-expect-error: This state is unreachable by design and should NEVER occur.\n throw new Error(`Unknown modal: ${modal.type}`, { modal });\n};\n","import { createContext } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport type { ModalActions, ModalHandlersWithId } from '@/promise-modal/types';\n\nexport interface ModalManagerContextProps extends ModalHandlersWithId {\n modalIds: ModalNode['id'][];\n getModal: Fn<[id: ModalNode['id']], ModalActions>;\n getModalNode: Fn<[id: ModalNode['id']], ModalNode | undefined>;\n setUpdater: Fn<[updater: Fn]>;\n}\n\nexport const ModalManagerContext = createContext<ModalManagerContextProps>(\n {} as ModalManagerContextProps,\n);\n","import {\n type PropsWithChildren,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils';\nimport { useOnMountLayout, useReference } from '@winglet/react-utils';\n\nimport type { Fn } from '@aileron/declare';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport { type ModalNode, nodeFactory } from '@/promise-modal/core';\nimport { useConfigurationOptions } from '@/promise-modal/providers';\nimport type { Modal } from '@/promise-modal/types';\n\nimport { ModalManagerContext } from './ModalManagerContext';\n\ninterface ModalManagerContextProviderProps {\n usePathname: Fn<[], { pathname: string }>;\n}\n\nexport const ModalManagerContextProvider = memo(\n ({\n usePathname,\n children,\n }: PropsWithChildren<ModalManagerContextProviderProps>) => {\n const modalDictionary = useRef<Map<ModalNode['id'], ModalNode>>(new Map());\n\n const [modalIds, setModalIds] = useState<ModalNode['id'][]>([]);\n const modalIdsRef = useReference(modalIds);\n const { pathname } = usePathname();\n\n const initiator = useRef(pathname);\n const modalIdSequence = useRef(0);\n\n const options = useConfigurationOptions();\n\n const duration = useMemo(\n () => convertMsFromDuration(options.duration),\n [options],\n );\n\n useOnMountLayout(() => {\n const { manualDestroy, closeOnBackdropClick } = options;\n\n for (const data of ModalManager.prerender) {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => [...ids, modal.id]);\n }\n\n ModalManager.openHandler = (data: Modal) => {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => {\n const aliveIds: number[] = [];\n for (let index = 0; index < ids.length; index++) {\n const id = ids[index];\n const destroyed = !modalDictionary.current.get(id)?.alive;\n if (destroyed) modalDictionary.current.delete(id);\n else aliveIds.push(id);\n }\n return [...aliveIds, modal.id];\n });\n };\n return () => {\n ModalManager.reset();\n };\n });\n\n useLayoutEffect(() => {\n for (const id of modalIdsRef.current) {\n const modal = modalDictionary.current.get(id);\n if (!modal?.alive) continue;\n if (modal.initiator === pathname) modal.onShow();\n else modal.onHide();\n }\n initiator.current = pathname;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname]);\n\n const getModalNode = useCallback((modalId: ModalNode['id']) => {\n return modalDictionary.current.get(modalId);\n }, []);\n\n const onDestroy = useCallback((modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onDestroy();\n updaterRef.current?.();\n }, []);\n\n const updaterRef = useRef<Fn>(undefined);\n const hideModal = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onHide();\n updaterRef.current?.();\n if (!modal.manualDestroy)\n setTimeout(() => {\n modal.onDestroy();\n }, duration);\n },\n [duration],\n );\n\n const onChange = useCallback((modalId: ModalNode['id'], value: any) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n if (modal.type === 'prompt') modal.onChange(value);\n }, []);\n\n const onConfirm = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onConfirm();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const onClose = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onClose();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const getModal = useCallback(\n (modalId: ModalNode['id']) => ({\n modal: getModalNode(modalId),\n onConfirm: () => onConfirm(modalId),\n onClose: () => onClose(modalId),\n onChange: (value: any) => onChange(modalId, value),\n onDestroy: () => onDestroy(modalId),\n }),\n [getModalNode, onConfirm, onClose, onChange, onDestroy],\n );\n\n const value = useMemo(() => {\n return {\n modalIds,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n getModal,\n setUpdater: (updater: Fn) => {\n updaterRef.current = updater;\n },\n };\n }, [\n modalIds,\n getModal,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n ]);\n\n return (\n <ModalManagerContext.Provider value={value}>\n {children}\n </ModalManagerContext.Provider>\n );\n },\n);\n","import { useContext, useMemo } from 'react';\n\nimport type { ManagedModal } from '@/promise-modal/types';\n\nimport { ModalManagerContext } from './ModalManagerContext';\n\nexport const useModalManagerContext = () => useContext(ModalManagerContext);\n\nexport const useModal = (id: ManagedModal['id']) => {\n const { getModal } = useModalManagerContext();\n return useMemo(() => getModal(id), [id, getModal]);\n};\n","import { css } from '@emotion/css';\n\nexport const fallback = css`\n margin: unset;\n`;\n\nexport const frame = css`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: white;\n padding: 20px 80px;\n gap: 10px;\n border: 1px solid black;\n`;\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackTitle = ({ children }: PropsWithChildren) => {\n return <h2 className={fallback}>{children}</h2>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackSubtitle = ({ children }: PropsWithChildren) => {\n return <h3 className={fallback}>{children}</h3>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackContent = ({ children }: PropsWithChildren) => {\n return <div className={fallback}>{children}</div>;\n};\n","import type { FooterComponentProps } from '@/promise-modal/types';\n\nexport const FallbackFooter = ({\n confirmLabel,\n hideConfirm = false,\n cancelLabel,\n hideCancel = false,\n disabled,\n onConfirm,\n onCancel,\n}: FooterComponentProps) => {\n return (\n <div>\n {!hideConfirm && (\n <button onClick={onConfirm} disabled={disabled}>\n {confirmLabel || 'Confirm'}\n </button>\n )}\n\n {!hideCancel && typeof onCancel === 'function' && (\n <button onClick={onCancel}>{cancelLabel || 'Cancel'}</button>\n )}\n </div>\n );\n};\n","import { useMemo } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useModalManagerContext } from '@/promise-modal/providers';\n\nconst defaultValidate = (modal?: ModalNode) => modal?.visible;\n\nexport const useActiveModalCount = (\n validate: Fn<[ModalNode?], boolean | undefined> = defaultValidate,\n refreshKey: string | number = 0,\n) => {\n const { modalIds, getModalNode } = useModalManagerContext();\n return useMemo(() => {\n let count = 0;\n for (const id of modalIds) {\n if (validate(getModalNode(id))) count++;\n }\n return count;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getModalNode, modalIds, refreshKey]);\n};\n","import {\n type ForwardedRef,\n type PropsWithChildren,\n forwardRef,\n useMemo,\n} from 'react';\n\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport type { ModalFrameProps } from '@/promise-modal/types';\n\nimport { frame } from './classNames.emotion';\n\nconst MAX_MODAL_COUNT = 5;\nconst MAX_MODAL_LEVEL = 3;\n\nexport const FallbackForegroundFrame = forwardRef(\n (\n { id, onChangeOrder, children }: PropsWithChildren<ModalFrameProps>,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const activeCount = useActiveModalCount();\n const [level, offset] = useMemo(() => {\n const stacked = activeCount > 1;\n const level = stacked\n ? (Math.floor(id / MAX_MODAL_COUNT) % MAX_MODAL_LEVEL) * 100\n : 0;\n const offset = stacked ? (id % MAX_MODAL_COUNT) * 35 : 0;\n return [level, offset];\n }, [activeCount, id]);\n\n return (\n <div\n ref={ref}\n className={frame}\n onClick={onChangeOrder}\n style={{\n marginBottom: `calc(25vh + ${level}px)`,\n marginLeft: `${level}px`,\n transform: `translate(${offset}px, ${offset}px)`,\n }}\n >\n {children}\n </div>\n );\n },\n);\n","import { type ComponentType, createContext } from 'react';\n\nimport type { Color, Duration } from '@aileron/declare';\n\nimport type {\n BackgroundComponent,\n FooterComponentProps,\n ForegroundComponent,\n WrapperComponentProps,\n} from '@/promise-modal/types';\n\nexport interface ConfigurationContextProps {\n ForegroundComponent: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n TitleComponent: ComponentType<WrapperComponentProps>;\n SubtitleComponent: ComponentType<WrapperComponentProps>;\n ContentComponent: ComponentType<WrapperComponentProps>;\n FooterComponent: ComponentType<FooterComponentProps>;\n options: {\n duration: Duration;\n backdrop: Color;\n manualDestroy: boolean;\n closeOnBackdropClick: boolean;\n };\n}\n\nexport const ConfigurationContext = createContext<ConfigurationContextProps>(\n {} as ConfigurationContextProps,\n);\n","import {\n type ComponentType,\n type PropsWithChildren,\n memo,\n useMemo,\n} from 'react';\n\nimport type { Color, Duration } from '@aileron/declare';\n\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n WrapperComponentProps,\n} from '@/promise-modal/types';\n\nimport { ConfigurationContext } from './ConfigurationContext';\n\nexport interface ConfigurationContextProviderProps {\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n ForegroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent?: ComponentType<WrapperComponentProps>;\n SubtitleComponent?: ComponentType<WrapperComponentProps>;\n ContentComponent?: ComponentType<WrapperComponentProps>;\n FooterComponent?: ComponentType<FooterComponentProps>;\n options?: {\n /** Modal transition time(ms, s) */\n duration?: Duration;\n /** Modal backdrop color */\n backdrop?: Color;\n /** Whether to destroy the modal manually */\n manualDestroy?: boolean;\n /** Whether to close the modal when the backdrop is clicked */\n closeOnBackdropClick?: boolean;\n };\n}\n\nexport const ConfigurationContextProvider = memo(\n ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n children,\n }: PropsWithChildren<ConfigurationContextProviderProps>) => {\n const value = useMemo(\n () => ({\n BackgroundComponent,\n ForegroundComponent: ForegroundComponent || FallbackForegroundFrame,\n TitleComponent: TitleComponent || FallbackTitle,\n SubtitleComponent: SubtitleComponent || FallbackSubtitle,\n ContentComponent: memo(ContentComponent || FallbackContent),\n FooterComponent: memo(FooterComponent || FallbackFooter),\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n closeOnBackdropClick: true,\n manualDestroy: false,\n ...options,\n } satisfies ConfigurationContextProviderProps['options'],\n }),\n [\n ForegroundComponent,\n BackgroundComponent,\n ContentComponent,\n FooterComponent,\n SubtitleComponent,\n TitleComponent,\n options,\n ],\n );\n return (\n <ConfigurationContext.Provider value={value}>\n {children}\n </ConfigurationContext.Provider>\n );\n },\n);\n","import type { Color, Duration } from '@aileron/declare';\n\nexport const DEFAULT_ANIMATION_DURATION: Duration = '300ms';\n\nexport const DEFAULT_BACKDROP_COLOR: Color = 'rgba(0, 0, 0, 0.5)';\n","import { useContext } from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils';\n\nimport { ConfigurationContext } from './ConfigurationContext';\n\nexport const useConfigurationContext = () => useContext(ConfigurationContext);\n\nexport const useConfigurationOptions = () => {\n const context = useContext(ConfigurationContext);\n return context.options;\n};\n\nexport const useConfigurationDuration = () => {\n const context = useConfigurationOptions();\n return {\n duration: context.duration,\n milliseconds: convertMsFromDuration(context.duration),\n };\n};\n\nexport const useConfigurationBackdrop = () => {\n const context = useConfigurationOptions();\n return context.backdrop;\n};\n","import { createContext } from 'react';\n\nimport type { Dictionary } from '@aileron/declare';\n\nexport interface UserDefinedContext {\n context: Dictionary;\n}\n\nexport const UserDefinedContext = createContext<UserDefinedContext>(\n {} as UserDefinedContext,\n);\n","import { PropsWithChildren, useMemo } from 'react';\n\nimport type { Dictionary } from '@aileron/declare';\n\nimport { UserDefinedContext } from './UserDefinedContext';\n\ninterface UserDefinedContextProviderProps {\n /** User defined context */\n context?: Dictionary;\n}\n\nexport const UserDefinedContextProvider = ({\n context,\n children,\n}: PropsWithChildren<UserDefinedContextProviderProps>) => {\n const contextValue = useMemo(() => ({ context: context || {} }), [context]);\n return (\n <UserDefinedContext.Provider value={contextValue}>\n {children}\n </UserDefinedContext.Provider>\n );\n};\n","import { useContext } from 'react';\n\nimport { UserDefinedContext } from './UserDefinedContext';\n\nexport const useUserDefinedContext = () => {\n return useContext(UserDefinedContext);\n};\n","import { useLayoutEffect, useState } from 'react';\n\nexport const usePathname = () => {\n const [pathname, setPathname] = useState(window.location.pathname);\n useLayoutEffect(() => {\n let requestId: number;\n const checkPathname = () => {\n if (requestId) cancelAnimationFrame(requestId);\n if (pathname !== window.location.pathname) {\n setPathname(window.location.pathname);\n } else {\n requestId = requestAnimationFrame(checkPathname);\n }\n };\n requestId = requestAnimationFrame(checkPathname);\n return () => {\n if (requestId) cancelAnimationFrame(requestId);\n };\n }, [pathname]);\n return { pathname };\n};\n","import { css } from '@emotion/css';\n\nexport const background = css`\n display: none;\n position: fixed;\n inset: 0;\n z-index: -999;\n pointer-events: none;\n > * {\n pointer-events: none;\n }\n`;\n\nexport const active = css`\n pointer-events: all;\n`;\n\nexport const visible = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","import { type MouseEvent, useCallback, useMemo } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport {\n useConfigurationContext,\n useModal,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, background, visible } from './classNames.emotion';\n\nexport const BackgroundFrame = ({\n modalId,\n onChangeOrder,\n}: ModalLayerProps) => {\n const { BackgroundComponent } = useConfigurationContext();\n const { context: userDefinedContext } = useUserDefinedContext();\n const { modal, onClose, onChange, onConfirm, onDestroy } = useModal(modalId);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n if (modal && modal.closeOnBackdropClick && modal.visible) onClose();\n event.stopPropagation();\n },\n [modal, onClose],\n );\n\n const Background = useMemo(\n () => modal?.BackgroundComponent || BackgroundComponent,\n [BackgroundComponent, modal],\n );\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(background, {\n [visible]: modal.manualDestroy ? modal.alive : modal.visible,\n [active]: modal.closeOnBackdropClick && modal.visible,\n })}\n onClick={handleClose}\n >\n {Background && (\n <Background\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n context={userDefinedContext}\n />\n )}\n </div>\n );\n};\n","import { css } from '@emotion/css';\n\nexport const foreground = css`\n pointer-events: none;\n display: none;\n position: fixed;\n inset: 0;\n z-index: 1;\n`;\n\nexport const active = css`\n > * {\n pointer-events: all;\n }\n`;\n\nexport const visible = css`\n display: flex !important;\n justify-content: center;\n align-items: center;\n`;\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { AlertNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface AlertInnerProps<B> {\n modal: AlertNode<B>;\n handlers: Pick<ModalActions, 'onConfirm'>;\n}\n\nexport const AlertInner = memo(\n <B,>({ modal, handlers }: AlertInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { context: userDefinedContext } = useUserDefinedContext();\n const { onConfirm } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n confirmLabel={footer?.confirm}\n hideConfirm={footer?.hideConfirm}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { ConfirmNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface ConfirmInnerProps<B> {\n modal: ConfirmNode<B>;\n handlers: Pick<ModalActions, 'onConfirm' | 'onClose'>;\n}\n\nexport const ConfirmInner = memo(\n <B,>({ modal, handlers }: ConfirmInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { context: userDefinedContext } = useUserDefinedContext();\n const { onConfirm, onClose } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n const handleClose = useHandle(onClose);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useCallback, useMemo, useState } from 'react';\n\nimport { isFunction, isString } from '@winglet/common-utils';\nimport {\n renderComponent,\n useHandle,\n withErrorBoundary,\n} from '@winglet/react-utils';\n\nimport type { PromptNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface PromptInnerProps<T, B> {\n modal: PromptNode<T, B>;\n handlers: Pick<ModalActions, 'onChange' | 'onClose' | 'onConfirm'>;\n}\n\nexport const PromptInner = memo(\n <T, B>({ modal, handlers }: PromptInnerProps<T, B>) => {\n const {\n Input,\n defaultValue,\n disabled: checkDisabled,\n title,\n subtitle,\n content,\n footer,\n } = useMemo(\n () => ({\n ...modal,\n Input: memo(withErrorBoundary(modal.Input)),\n }),\n [modal],\n );\n\n const { context: userDefinedContext } = useUserDefinedContext();\n\n const [value, setValue] = useState<T | undefined>(defaultValue);\n\n const { onChange, onClose, onConfirm } = useMemo(\n () => handlers,\n [handlers],\n );\n\n const handleClose = useHandle(onClose);\n const handleChange = useHandle(\n (inputValue?: T | ((prevState: T | undefined) => T | undefined)) => {\n const input = isFunction(inputValue) ? inputValue(value) : inputValue;\n setValue(input);\n onChange(input);\n },\n );\n\n const handleConfirm = useCallback(() => {\n // NOTE: wait for the next tick to ensure the value is updated\n requestAnimationFrame(onConfirm);\n }, [onConfirm]);\n\n const disabled = useMemo(\n () => (value ? !!checkDisabled?.(value) : false),\n [checkDisabled, value],\n );\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ))}\n\n {Input && (\n <Input\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n onConfirm={handleConfirm}\n onCancel={handleClose}\n context={userDefinedContext}\n />\n )}\n\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n value,\n disabled,\n onChange: handleChange,\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n disabled={disabled}\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { useMemo } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport {\n useConfigurationContext,\n useModal,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, foreground, visible } from './classNames.emotion';\nimport { AlertInner, ConfirmInner, PromptInner } from './components';\n\nexport const ForegroundFrame = ({\n modalId,\n onChangeOrder,\n}: ModalLayerProps) => {\n const { ForegroundComponent } = useConfigurationContext();\n const { context: userDefinedContext } = useUserDefinedContext();\n\n const { modal, onChange, onConfirm, onClose, onDestroy } = useModal(modalId);\n\n const Foreground = useMemo(\n () => modal?.ForegroundComponent || ForegroundComponent,\n [ForegroundComponent, modal],\n );\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(foreground, {\n [visible]: modal.manualDestroy ? modal.alive : modal.visible,\n [active]: modal.visible,\n })}\n >\n <Foreground\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n context={userDefinedContext}\n >\n {modal.type === 'alert' && (\n <AlertInner modal={modal} handlers={{ onConfirm }} />\n )}\n {modal.type === 'confirm' && (\n <ConfirmInner modal={modal} handlers={{ onConfirm, onClose }} />\n )}\n {modal.type === 'prompt' && (\n <PromptInner\n modal={modal}\n handlers={{ onChange, onConfirm, onClose }}\n />\n )}\n </Foreground>\n </div>\n );\n};\n","import { useEffect } from 'react';\n\nimport { useVersion } from '@winglet/react-utils';\n\nimport type { ModalNode } from '@/promise-modal/core';\n\nexport const useSubscribeModal = (modal?: ModalNode) => {\n const [version, update] = useVersion();\n useEffect(() => {\n if (!modal) return;\n const unsubscribe = modal.subscribe(update);\n return unsubscribe;\n }, [modal, update]);\n return version;\n};\n","import { css } from '@emotion/css';\n\nexport const presenter = css`\n position: fixed;\n inset: 0;\n pointer-events: none;\n overflow: hidden;\n`;\n","import { memo, useRef } from 'react';\n\nimport { counterFactory } from '@winglet/common-utils';\nimport { useHandle } from '@winglet/react-utils';\n\nimport { Background } from '@/promise-modal/components/Background';\nimport { Foreground } from '@/promise-modal/components/Foreground';\nimport { useSubscribeModal } from '@/promise-modal/hooks/useSubscribeModal';\nimport { useModal } from '@/promise-modal/providers';\nimport type { ModalIdProps } from '@/promise-modal/types';\n\nimport { presenter } from './classNames.emotion';\n\nconst { increment } = counterFactory(1);\n\nexport const Presenter = memo(({ modalId }: ModalIdProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { modal } = useModal(modalId);\n useSubscribeModal(modal);\n const handleChangeOrder = useHandle(() => {\n if (ref.current) {\n ref.current.style.zIndex = `${increment()}`;\n }\n });\n return (\n <div ref={ref} className={presenter}>\n <Background modalId={modalId} onChangeOrder={handleChangeOrder} />\n <Foreground modalId={modalId} onChangeOrder={handleChangeOrder} />\n </div>\n );\n});\n","import { css } from '@emotion/css';\n\nexport const anchor = css`\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 1000;\n transition: background-color ease-in-out;\n`;\n","import { memo, useEffect } from 'react';\n\nimport { map } from '@winglet/common-utils';\nimport { useVersion, withErrorBoundary } from '@winglet/react-utils';\n\nimport { Presenter } from '@/promise-modal/components/Presenter';\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport {\n useConfigurationOptions,\n useModalManagerContext,\n} from '@/promise-modal/providers';\n\nimport { anchor } from './classNames.emotion';\n\nconst AnchorInner = () => {\n const [version, update] = useVersion();\n\n const { modalIds, setUpdater } = useModalManagerContext();\n\n useEffect(() => {\n setUpdater(update);\n }, [setUpdater, update]);\n\n const options = useConfigurationOptions();\n\n const dimmed = useActiveModalCount(validateDimmable, version);\n\n return (\n <div\n className={anchor}\n style={{\n transitionDuration: options.duration,\n backgroundColor: dimmed ? options.backdrop : 'transparent',\n }}\n >\n {map(modalIds, (id) => (\n <Presenter key={id} modalId={id} />\n ))}\n </div>\n );\n};\n\nconst validateDimmable = (modal?: ModalNode) => modal?.visible && modal.dimmed;\n\nexport const Anchor = memo(withErrorBoundary(AnchorInner));\n","import { createPortal } from 'react-dom';\n\nimport type { Dictionary, Fn } from '@aileron/declare';\n\nimport { Anchor } from '@/promise-modal/components/Anchor';\nimport {\n ConfigurationContextProvider,\n type ConfigurationContextProviderProps,\n} from '@/promise-modal/providers/ConfigurationContext';\nimport { ModalManagerContextProvider } from '@/promise-modal/providers/ModalManagerContext';\nimport { UserDefinedContextProvider } from '@/promise-modal/providers/UserDefinedContext';\n\ninterface BootstrapProps extends ConfigurationContextProviderProps {\n usePathname: Fn<[], { pathname: string }>;\n context?: Dictionary;\n anchor: HTMLElement;\n}\n\nexport const bootstrap = ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n usePathname,\n options,\n context,\n anchor,\n}: BootstrapProps) =>\n createPortal(\n <UserDefinedContextProvider context={context}>\n <ConfigurationContextProvider\n ForegroundComponent={ForegroundComponent}\n BackgroundComponent={BackgroundComponent}\n TitleComponent={TitleComponent}\n SubtitleComponent={SubtitleComponent}\n ContentComponent={ContentComponent}\n FooterComponent={FooterComponent}\n options={options}\n >\n <ModalManagerContextProvider usePathname={usePathname}>\n <Anchor />\n </ModalManagerContextProvider>\n </ConfigurationContextProvider>\n </UserDefinedContextProvider>,\n anchor,\n );\n","import { useCallback, useRef } from 'react';\n\nimport { printError } from '@winglet/common-utils';\nimport { useVersion } from '@winglet/react-utils';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\n\nexport const useInitialize = () => {\n const permitted = useRef(ModalManager.activate());\n const anchorRef = useRef<HTMLElement | null>(null);\n const [, update] = useVersion();\n\n const handleInitialize = useCallback(\n (root?: HTMLElement) => {\n if (permitted.current) {\n anchorRef.current = ModalManager.anchor({ root });\n update();\n } else\n printError(\n 'ModalProvider is already initialized',\n [\n 'ModalProvider can only be initialized once.',\n 'Nesting ModalProvider will be ignored...',\n ],\n {\n info: 'Something is wrong with the ModalProvider initialization...',\n },\n );\n },\n [update],\n );\n\n return {\n anchorRef,\n handleInitialize,\n } as const;\n};\n","import {\n Fragment,\n type PropsWithChildren,\n forwardRef,\n useImperativeHandle,\n useMemo,\n} from 'react';\n\nimport { useOnMount } from '@winglet/react-utils';\n\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\n\nimport { bootstrap } from './helpers/bootstrap';\nimport { useInitialize } from './hooks/useInitialize';\nimport type { BootstrapProviderHandle, BootstrapProviderProps } from './type';\n\nexport const BootstrapProvider = forwardRef<\n BootstrapProviderHandle,\n PropsWithChildren<BootstrapProviderProps>\n>(\n (\n {\n usePathname: useExternalPathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n children,\n },\n handleRef,\n ) => {\n const usePathname = useMemo(\n () => useExternalPathname || useDefaultPathname,\n [useExternalPathname],\n );\n\n const { anchorRef, handleInitialize } = useInitialize();\n\n useImperativeHandle(\n handleRef,\n () => ({\n initialize: handleInitialize,\n }),\n [handleInitialize],\n );\n\n useOnMount(() => {\n /**\n * NOTE: `handleRef` being null indicates that no `ref` was provided.\n * In this case, the `ModalProvider`(=`BootstrapProvider`) is not receiving the `ref`,\n * so it should be initialized automatically.\n */\n if (handleRef === null) handleInitialize();\n return () => {\n if (anchorRef.current) anchorRef.current.remove();\n };\n });\n\n return (\n <Fragment>\n {children}\n {anchorRef.current &&\n bootstrap({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n usePathname,\n options,\n context,\n anchor: anchorRef.current,\n })}\n </Fragment>\n );\n },\n);\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n AlertContentProps,\n AlertFooterRender,\n BackgroundComponent,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface AlertProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<AlertContentProps>;\n background?: ModalBackground<B>;\n footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const alert = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: AlertProps<B>) => {\n return new Promise<void>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'alert',\n subtype,\n resolve: () => resolve(),\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n BackgroundComponent,\n ConfirmContentProps,\n ConfirmFooterRender,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface ConfirmProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<ConfirmContentProps>;\n background?: ModalBackground<B>;\n footer?: ConfirmFooterRender | FooterOptions | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const confirm = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: ConfirmProps<B>) => {\n return new Promise<boolean>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'confirm',\n subtype,\n resolve: (result) => resolve(result ?? false),\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n BackgroundComponent,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n} from '@/promise-modal/types';\n\ninterface PromptProps<T, B = any> {\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<PromptContentProps>;\n Input: (props: PromptInputProps<T>) => ReactNode;\n defaultValue?: T;\n disabled?: (value: T) => boolean;\n returnOnCancel?: boolean;\n background?: ModalBackground<B>;\n footer?: PromptFooterRender<T> | FooterOptions | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const prompt = <T, B = any>({\n defaultValue,\n title,\n subtitle,\n content,\n Input,\n disabled,\n returnOnCancel,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: PromptProps<T, B>) => {\n return new Promise<T>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'prompt',\n resolve: (result) => resolve(result as T),\n title,\n subtitle,\n content,\n Input,\n defaultValue,\n disabled,\n returnOnCancel,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import { useEffect, useRef } from 'react';\n\nimport { convertMsFromDuration, isString } from '@winglet/common-utils';\n\nimport type { Duration } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useModal } from '@/promise-modal/providers';\n\nimport { useSubscribeModal } from './useSubscribeModal';\n\nexport const useDestroyAfter = (\n modalId: ModalNode['id'],\n duration: Duration | number,\n) => {\n const { modal, onDestroy } = useModal(modalId);\n const tick = useSubscribeModal(modal);\n\n const reference = useRef({\n modal,\n onDestroy,\n milliseconds: isString(duration)\n ? convertMsFromDuration(duration)\n : duration,\n });\n\n useEffect(() => {\n const { modal, onDestroy, milliseconds } = reference.current;\n if (!modal || modal.visible || !modal.alive) return;\n const timer = setTimeout(() => {\n onDestroy();\n }, milliseconds);\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [tick]);\n};\n","import { useCallback, useMemo } from 'react';\n\nimport { useOnMount } from '@winglet/react-utils';\n\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\n\nimport { bootstrap } from './helpers/bootstrap';\nimport { useInitialize } from './hooks/useInitialize';\nimport type { BootstrapProviderProps } from './type';\n\nexport const useBootstrap = ({\n usePathname: useExternalPathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n mode = 'auto',\n}: BootstrapProviderProps & { mode?: 'manual' | 'auto' } = {}) => {\n const usePathname = useMemo(\n () => useExternalPathname || useDefaultPathname,\n [useExternalPathname],\n );\n\n const { anchorRef, handleInitialize } = useInitialize();\n\n useOnMount(() => {\n if (mode === 'auto') handleInitialize();\n return () => {\n if (anchorRef.current) anchorRef.current.remove();\n };\n });\n\n const initialize = useCallback(\n (element: HTMLElement) => {\n if (mode === 'manual') handleInitialize(element);\n },\n [mode, handleInitialize],\n );\n\n const portal =\n anchorRef.current &&\n bootstrap({\n usePathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n anchor: anchorRef.current,\n });\n\n return { portal, initialize };\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\ninterface ModalAnimationHandler {\n onVisible?: Fn;\n onHidden?: Fn;\n}\n\nexport const useModalAnimation = (\n visible: boolean,\n handler: ModalAnimationHandler,\n) => {\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n useLayoutEffect(() => {\n if (!handlerRef.current) return;\n let frame: ReturnType<typeof requestAnimationFrame>;\n if (visible)\n frame = requestAnimationFrame(() => handlerRef.current.onVisible?.());\n else frame = requestAnimationFrame(() => handlerRef.current.onHidden?.());\n return () => {\n if (frame) cancelAnimationFrame(frame);\n };\n }, [visible]);\n};\n"],"names":["ModalManager","static","activate","active","anchor","options","document","getElementById","id","tag","prefix","root","body","node","createElement","setAttribute","getRandomString","appendChild","prerender","prerenderList","modal","push","openHandler","handler","unanchored","reset","open","AbstractNode","initiator","title","subtitle","background","manualDestroy","closeOnBackdropClick","dimmed","ForegroundComponent","BackgroundComponent","alive","this","visible","resolve","listeners","Set","constructor","subscribe","listener","add","delete","publish","result","onDestroy","needPublish","onShow","onHide","AlertNode","type","subtype","content","footer","super","onClose","onConfirm","ConfirmNode","PromptNode","defaultValue","Input","disabled","returnOnCancel","value","onChange","nodeFactory","Error","ModalManagerContext","createContext","ModalManagerContextProvider","memo","usePathname","children","modalDictionary","useRef","Map","modalIds","setModalIds","useState","modalIdsRef","useReference","pathname","modalIdSequence","useConfigurationOptions","duration","useMemo","convertMsFromDuration","useOnMountLayout","data","current","undefined","set","ids","aliveIds","index","length","get","useLayoutEffect","getModalNode","useCallback","modalId","updaterRef","hideModal","setTimeout","getModal","setUpdater","updater","_jsx","jsx","Provider","useModalManagerContext","useContext","useModal","fallback","css","process","env","NODE_ENV","name","styles","toString","_EMOTION_STRINGIFIED_CSS_ERROR__","frame","FallbackTitle","className","FallbackSubtitle","FallbackContent","FallbackFooter","confirmLabel","hideConfirm","cancelLabel","hideCancel","onCancel","_jsxs","onClick","defaultValidate","useActiveModalCount","validate","refreshKey","count","FallbackForegroundFrame","forwardRef","onChangeOrder","ref","activeCount","level","offset","stacked","Math","floor","style","marginBottom","marginLeft","transform","ConfigurationContext","ConfigurationContextProvider","TitleComponent","SubtitleComponent","ContentComponent","FooterComponent","backdrop","useConfigurationContext","UserDefinedContext","UserDefinedContextProvider","context","contextValue","useUserDefinedContext","setPathname","window","location","requestId","checkPathname","cancelAnimationFrame","requestAnimationFrame","BackgroundFrame","userDefinedContext","handleClose","event","stopPropagation","Background","cx","visible$1","active$1","foreground","AlertInner","handlers","handleConfirm","useHandle","Fragment","isString","renderComponent","confirm","ConfirmInner","cancel","PromptInner","checkDisabled","withErrorBoundary","setValue","handleChange","inputValue","input","isFunction","ForegroundFrame","Foreground","useSubscribeModal","version","update","useVersion","useEffect","presenter","increment","counterFactory","Presenter","handleChangeOrder","zIndex","validateDimmable","Anchor","transitionDuration","backgroundColor","map","bootstrap","createPortal","useInitialize","permitted","anchorRef","handleInitialize","printError","info","BootstrapProvider","useExternalPathname","handleRef","useDefaultPathname","useImperativeHandle","initialize","useOnMount","remove","Promise","reject","error","tick","reference","milliseconds","timer","clearTimeout","mode","element","portal","handlerRef","onVisible","onHidden"],"mappings":"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"}
|
package/dist/index.esm.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{jsx as e,jsxs as n}from"react/jsx-runtime";import{createContext as o,memo as t,useRef as r,useState as i,useMemo as s,useLayoutEffect as a,useCallback as l,useContext as c,forwardRef as d,Fragment as u,useEffect as m,useImperativeHandle as p}from"react";import{getRandomString as C,convertMsFromDuration as h,isString as f,isFunction as g,counterFactory as b,map as v,printError as y}from"@winglet/common-utils";import{useReference as k,useOnMountLayout as x,useHandle as B,renderComponent as D,withErrorBoundary as O,useVersion as F,useOnMount as N}from"@winglet/react-utils";import{css as w,cx as I}from"@emotion/css";import{createPortal as S}from"react-dom";class E{static#e=!1;static activate(){return!E.#e&&(E.#e=!0)}static#n=null;static anchor(e){if(E.#n){const e=document.getElementById(E.#n.id);if(e)return e}const{tag:n="div",prefix:o="promise-modal",root:t=document.body}=e||{},r=document.createElement(n);return r.setAttribute("id",`${o}-${C(36)}`),t.appendChild(r),E.#n=r,r}static#o=[];static get prerender(){return E.#o}static#t=e=>E.#o.push(e);static set openHandler(e){E.#t=e,E.#o=[]}static get unanchored(){return!E.#n}static reset(){E.#e=!1,E.#n=null,E.#o=[],E.#t=e=>E.#o.push(e)}static open(e){E.#t(e)}}const j=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,dimmed:s,manualDestroy:a,closeOnBackdropClick:l,ForegroundComponent:c,BackgroundComponent:d})=>new Promise(((u,m)=>{try{E.open({type:"alert",subtype:e,resolve:()=>u(),title:n,subtitle:o,content:t,background:r,footer:i,dimmed:s,manualDestroy:a,closeOnBackdropClick:l,ForegroundComponent:c,BackgroundComponent:d})}catch(e){m(e)}})),P=({subtype:e,title:n,subtitle:o,content:t,background:r,footer:i,dimmed:s,manualDestroy:a,closeOnBackdropClick:l,ForegroundComponent:c,BackgroundComponent:d})=>new Promise(((u,m)=>{try{E.open({type:"confirm",subtype:e,resolve:e=>u(e??!1),title:n,subtitle:o,content:t,background:r,footer:i,dimmed:s,manualDestroy:a,closeOnBackdropClick:l,ForegroundComponent:c,BackgroundComponent:d})}catch(e){m(e)}})),V=({defaultValue:e,title:n,subtitle:o,content:t,Input:r,disabled:i,returnOnCancel:s,background:a,footer:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,ForegroundComponent:m,BackgroundComponent:p})=>new Promise(((C,h)=>{try{E.open({type:"prompt",resolve:e=>C(e),title:n,subtitle:o,content:t,Input:r,defaultValue:e,disabled:i,returnOnCancel:s,background:a,footer:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,ForegroundComponent:m,BackgroundComponent:p})}catch(e){h(e)}}));class z{id;initiator;title;subtitle;background;manualDestroy;closeOnBackdropClick;dimmed;ForegroundComponent;BackgroundComponent;#r;get alive(){return this.#r}#i;get visible(){return this.#i}#s;#a=new Set;constructor({id:e,initiator:n,title:o,subtitle:t,background:r,dimmed:i=!0,manualDestroy:s=!1,closeOnBackdropClick:a=!0,resolve:l,ForegroundComponent:c,BackgroundComponent:d}){this.id=e,this.initiator=n,this.title=o,this.subtitle=t,this.background=r,this.dimmed=i,this.manualDestroy=s,this.closeOnBackdropClick=a,this.ForegroundComponent=c,this.BackgroundComponent=d,this.#r=!0,this.#i=!0,this.#s=l}subscribe(e){return this.#a.add(e),()=>{this.#a.delete(e)}}publish(){for(const e of this.#a)e()}resolve(e){this.#s(e)}onDestroy(){const e=!0===this.#r;this.#r=!1,this.manualDestroy&&e&&this.publish()}onShow(){const e=!1===this.#i;this.#i=!0,e&&this.publish()}onHide(){const e=!0===this.#i;this.#i=!1,e&&this.publish()}}class M extends z{type;subtype;content;footer;constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:s,footer:a,background:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}){super({id:e,initiator:n,title:r,subtitle:i,background:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}),this.type=o,this.subtype=t,this.content=s,this.footer=a}onClose(){this.resolve(null)}onConfirm(){this.resolve(null)}}class L extends z{type;subtype;content;footer;constructor({id:e,initiator:n,type:o,subtype:t,title:r,subtitle:i,content:s,footer:a,background:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}){super({id:e,initiator:n,title:r,subtitle:i,background:l,dimmed:c,manualDestroy:d,closeOnBackdropClick:u,resolve:m,ForegroundComponent:p,BackgroundComponent:C}),this.type=o,this.subtype=t,this.content=s,this.footer=a}onClose(){this.resolve(!1)}onConfirm(){this.resolve(!0)}}class T extends z{type;content;defaultValue;Input;disabled;returnOnCancel;footer;#l;constructor({id:e,initiator:n,type:o,title:t,subtitle:r,content:i,defaultValue:s,Input:a,disabled:l,returnOnCancel:c,footer:d,background:u,dimmed:m,manualDestroy:p,closeOnBackdropClick:C,resolve:h,ForegroundComponent:f,BackgroundComponent:g}){super({id:e,initiator:n,title:t,subtitle:r,background:u,dimmed:m,manualDestroy:p,closeOnBackdropClick:C,resolve:h,ForegroundComponent:f,BackgroundComponent:g}),this.type=o,this.content=i,this.Input=a,this.defaultValue=s,this.#l=s,this.disabled=l,this.returnOnCancel=c,this.footer=d}onChange(e){this.#l=e}onConfirm(){this.resolve(this.#l??null)}onClose(){this.returnOnCancel?this.resolve(this.#l??null):this.resolve(null)}}const H=e=>{switch(e.type){case"alert":return new M(e);case"confirm":return new L(e);case"prompt":return new T(e)}throw new Error(`Unknown modal: ${e.type}`,{modal:e})},_=o({}),A=t((({usePathname:n,children:o})=>{const t=r(new Map),[c,d]=i([]),u=k(c),{pathname:m}=n(),p=r(m),C=r(0),f=te(),g=s((()=>h(f.duration)),[f]);x((()=>{const{manualDestroy:e,closeOnBackdropClick:n}=f;for(const o of E.prerender){const r=H({...o,id:C.current++,initiator:p.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});t.current.set(r.id,r),d((e=>[...e,r.id]))}return E.openHandler=o=>{const r=H({...o,id:C.current++,initiator:p.current,manualDestroy:void 0!==o.manualDestroy?o.manualDestroy:e,closeOnBackdropClick:void 0!==o.closeOnBackdropClick?o.closeOnBackdropClick:n});t.current.set(r.id,r),d((e=>{const n=[];for(let o=0;o<e.length;o++){const r=e[o];t.current.get(r)?.alive?n.push(r):t.current.delete(r)}return[...n,r.id]}))},()=>{E.reset()}})),a((()=>{for(const e of u.current){const n=t.current.get(e);n?.alive&&(n.initiator===m?n.onShow():n.onHide())}p.current=m}),[m]);const b=l((e=>t.current.get(e)),[]),v=l((e=>{const n=t.current.get(e);n&&(n.onDestroy(),y.current?.())}),[]),y=r(void 0),B=l((e=>{const n=t.current.get(e);n&&(n.onHide(),y.current?.(),n.manualDestroy||setTimeout((()=>{n.onDestroy()}),g))}),[g]),D=l(((e,n)=>{const o=t.current.get(e);o&&"prompt"===o.type&&o.onChange(n)}),[]),O=l((e=>{const n=t.current.get(e);n&&(n.onConfirm(),B(e))}),[B]),F=l((e=>{const n=t.current.get(e);n&&(n.onClose(),B(e))}),[B]),N=l((e=>({modal:b(e),onConfirm:()=>O(e),onClose:()=>F(e),onChange:n=>D(e,n),onDestroy:()=>v(e)})),[b,O,F,D,v]),w=s((()=>({modalIds:c,getModalNode:b,onChange:D,onConfirm:O,onClose:F,onDestroy:v,getModal:N,setUpdater:e=>{y.current=e}})),[c,N,b,D,O,F,v]);return e(_.Provider,{value:w,children:o})})),$=()=>c(_),q=e=>{const{getModal:n}=$();return s((()=>n(e)),[e,n])};function Y(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const R=w("production"===process.env.NODE_ENV?{name:"131j9g2",styles:"margin:unset"}:{name:"1w3kbco-fallback",styles:"margin:unset;label:fallback;",toString:Y}),U=w("production"===process.env.NODE_ENV?{name:"1kuk3a3",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black"}:{name:"16dbbea-frame",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:white;padding:20px 80px;gap:10px;border:1px solid black;label:frame;",toString:Y}),G=({children:n})=>e("h2",{className:R,children:n}),J=({children:n})=>e("h3",{className:R,children:n}),K=({children:n})=>e("div",{className:R,children:n}),Q=({confirmLabel:o,hideConfirm:t=!1,cancelLabel:r,hideCancel:i=!1,disabled:s,onConfirm:a,onCancel:l})=>n("div",{children:[!t&&e("button",{onClick:a,disabled:s,children:o||"Confirm"}),!i&&"function"==typeof l&&e("button",{onClick:l,children:r||"Cancel"})]}),W=e=>e?.visible,X=(e=W,n=0)=>{const{modalIds:o,getModalNode:t}=$();return s((()=>{let n=0;for(const r of o)e(t(r))&&n++;return n}),[t,o,n])},Z=d((({id:n,onChangeOrder:o,children:t},r)=>{const i=X(),[a,l]=s((()=>{const e=i>1;return[e?Math.floor(n/5)%3*100:0,e?n%5*35:0]}),[i,n]);return e("div",{ref:r,className:U,onClick:o,style:{marginBottom:`calc(25vh + ${a}px)`,marginLeft:`${a}px`,transform:`translate(${l}px, ${l}px)`},children:t})})),ee=o({}),ne=t((({ForegroundComponent:n,BackgroundComponent:o,TitleComponent:r,SubtitleComponent:i,ContentComponent:a,FooterComponent:l,options:c,children:d})=>{const u=s((()=>({BackgroundComponent:o,ForegroundComponent:n||Z,TitleComponent:r||G,SubtitleComponent:i||J,ContentComponent:t(a||K),FooterComponent:t(l||Q),options:{duration:"300ms",backdrop:"rgba(0, 0, 0, 0.5)",closeOnBackdropClick:!0,manualDestroy:!1,...c}})),[n,o,a,l,i,r,c]);return e(ee.Provider,{value:u,children:d})})),oe=()=>c(ee),te=()=>c(ee).options,re=()=>{const e=te();return{duration:e.duration,milliseconds:h(e.duration)}},ie=()=>te().backdrop,se=o({}),ae=({context:n,children:o})=>{const t=s((()=>({context:n||{}})),[n]);return e(se.Provider,{value:t,children:o})},le=()=>c(se),ce=()=>{const[e,n]=i(window.location.pathname);return a((()=>{let o;const t=()=>{o&&cancelAnimationFrame(o),e!==window.location.pathname?n(window.location.pathname):o=requestAnimationFrame(t)};return o=requestAnimationFrame(t),()=>{o&&cancelAnimationFrame(o)}}),[e]),{pathname:e}};function de(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const ue=w("production"===process.env.NODE_ENV?{name:"u7uu4v",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;}"}:{name:"coymdj-background",styles:"display:none;position:fixed;inset:0;z-index:-999;pointer-events:none;>*{pointer-events:none;};label:background;",toString:de}),me=w("production"===process.env.NODE_ENV?{name:"n07k1x",styles:"pointer-events:all"}:{name:"1hektcs-active",styles:"pointer-events:all;label:active;",toString:de}),pe=w("production"===process.env.NODE_ENV?{name:"1wnowod",styles:"display:flex;align-items:center;justify-content:center"}:{name:"xppew7-visible",styles:"display:flex;align-items:center;justify-content:center;label:visible;",toString:de}),Ce=({modalId:n,onChangeOrder:o})=>{const{BackgroundComponent:t}=oe(),{context:r}=le(),{modal:i,onClose:a,onChange:c,onConfirm:d,onDestroy:u}=q(n),m=l((e=>{i&&i.closeOnBackdropClick&&i.visible&&a(),e.stopPropagation()}),[i,a]),p=s((()=>i?.BackgroundComponent||t),[t,i]);return i?e("div",{className:I(ue,{[pe]:i.manualDestroy?i.alive:i.visible,[me]:i.closeOnBackdropClick&&i.visible}),onClick:m,children:p&&e(p,{id:i.id,type:i.type,alive:i.alive,visible:i.visible,initiator:i.initiator,manualDestroy:i.manualDestroy,closeOnBackdropClick:i.closeOnBackdropClick,background:i.background,onChange:c,onConfirm:d,onClose:a,onDestroy:u,onChangeOrder:o,context:r})}):null};function he(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const fe=w("production"===process.env.NODE_ENV?{name:"12g0hx0",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1"}:{name:"1hcczik-foreground",styles:"pointer-events:none;display:none;position:fixed;inset:0;z-index:1;label:foreground;",toString:he}),ge=w("production"===process.env.NODE_ENV?{name:"1g95xyq",styles:">*{pointer-events:all;}"}:{name:"123csva-active",styles:">*{pointer-events:all;};label:active;",toString:he}),be=w("production"===process.env.NODE_ENV?{name:"1fmljv2",styles:"display:flex!important;justify-content:center;align-items:center"}:{name:"1p4unab-visible",styles:"display:flex!important;justify-content:center;align-items:center;label:visible;",toString:he}),ve=t((({modal:o,handlers:t})=>{const{title:r,subtitle:i,content:a,footer:l}=s((()=>o),[o]),{context:c}=le(),{onConfirm:d}=s((()=>t),[t]),m=B(d),{TitleComponent:p,SubtitleComponent:C,ContentComponent:h,FooterComponent:g}=oe();return n(u,{children:[r&&(f(r)?e(p,{context:c,children:r}):r),i&&(f(i)?e(C,{context:c,children:i}):i),a&&(f(a)?e(h,{context:c,children:a}):D(a,{onConfirm:m})),!1!==l&&("function"==typeof l?l({onConfirm:m,context:c}):e(g,{onConfirm:m,confirmLabel:l?.confirm,hideConfirm:l?.hideConfirm,context:c}))]})})),ye=t((({modal:o,handlers:t})=>{const{title:r,subtitle:i,content:a,footer:l}=s((()=>o),[o]),{context:c}=le(),{onConfirm:d,onClose:m}=s((()=>t),[t]),p=B(d),C=B(m),{TitleComponent:h,SubtitleComponent:g,ContentComponent:b,FooterComponent:v}=oe();return n(u,{children:[r&&(f(r)?e(h,{context:c,children:r}):r),i&&(f(i)?e(g,{context:c,children:i}):i),a&&(f(a)?e(b,{context:c,children:a}):D(a,{onConfirm:p,onCancel:C,context:c})),!1!==l&&("function"==typeof l?l({onConfirm:p,onCancel:C,context:c}):e(v,{onConfirm:p,onCancel:C,confirmLabel:l?.confirm,cancelLabel:l?.cancel,hideConfirm:l?.hideConfirm,hideCancel:l?.hideCancel,context:c}))]})})),ke=t((({modal:o,handlers:r})=>{const{Input:a,defaultValue:c,disabled:d,title:m,subtitle:p,content:C,footer:h}=s((()=>({...o,Input:t(O(o.Input))})),[o]),{context:b}=le(),[v,y]=i(c),{onChange:k,onClose:x,onConfirm:F}=s((()=>r),[r]),N=B(x),w=B((e=>{const n=g(e)?e(v):e;y(n),k(n)})),I=l((()=>{requestAnimationFrame(F)}),[F]),S=s((()=>!!v&&!!d?.(v)),[d,v]),{TitleComponent:E,SubtitleComponent:j,ContentComponent:P,FooterComponent:V}=oe();return n(u,{children:[m&&(f(m)?e(E,{context:b,children:m}):m),p&&(f(p)?e(j,{context:b,children:p}):p),C&&(f(C)?e(P,{context:b,children:C}):D(C,{onConfirm:I,onCancel:N,context:b})),a&&e(a,{defaultValue:c,value:v,onChange:w,onConfirm:I,onCancel:N,context:b}),!1!==h&&("function"==typeof h?h({value:v,disabled:S,onChange:w,onConfirm:I,onCancel:N,context:b}):e(V,{disabled:S,onConfirm:I,onCancel:N,confirmLabel:h?.confirm,cancelLabel:h?.cancel,hideConfirm:h?.hideConfirm,hideCancel:h?.hideCancel,context:b}))]})})),xe=({modalId:o,onChangeOrder:t})=>{const{ForegroundComponent:r}=oe(),{context:i}=le(),{modal:a,onChange:l,onConfirm:c,onClose:d,onDestroy:u}=q(o),m=s((()=>a?.ForegroundComponent||r),[r,a]);return a?e("div",{className:I(fe,{[be]:a.manualDestroy?a.alive:a.visible,[ge]:a.visible}),children:n(m,{id:a.id,type:a.type,alive:a.alive,visible:a.visible,initiator:a.initiator,manualDestroy:a.manualDestroy,closeOnBackdropClick:a.closeOnBackdropClick,background:a.background,onChange:l,onConfirm:c,onClose:d,onDestroy:u,onChangeOrder:t,context:i,children:["alert"===a.type&&e(ve,{modal:a,handlers:{onConfirm:c}}),"confirm"===a.type&&e(ye,{modal:a,handlers:{onConfirm:c,onClose:d}}),"prompt"===a.type&&e(ke,{modal:a,handlers:{onChange:l,onConfirm:c,onClose:d}})]})}):null},Be=e=>{const[n,o]=F();return m((()=>{if(e)return e.subscribe(o)}),[e,o]),n},De=w("production"===process.env.NODE_ENV?{name:"13dmkf4",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden"}:{name:"yjeu12-presenter",styles:"position:fixed;inset:0;pointer-events:none;overflow:hidden;label:presenter;",toString:function(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),{increment:Oe}=b(1),Fe=t((({modalId:o})=>{const t=r(null),{modal:i}=q(o);Be(i);const s=B((()=>{t.current&&(t.current.style.zIndex=`${Oe()}`)}));return n("div",{ref:t,className:De,children:[e(Ce,{modalId:o,onChangeOrder:s}),e(xe,{modalId:o,onChangeOrder:s})]})})),Ne=w("production"===process.env.NODE_ENV?{name:"2hpasy",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out"}:{name:"lhj8co-anchor",styles:"display:flex;align-items:center;justify-content:center;position:fixed;inset:0;pointer-events:none;z-index:1000;transition:background-color ease-in-out;label:anchor;",toString:function(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}}),we=e=>e?.visible&&e.dimmed,Ie=t(O((()=>{const[n,o]=F(),{modalIds:t,setUpdater:r}=$();m((()=>{r(o)}),[r,o]);const i=te(),s=X(we,n);return e("div",{className:Ne,style:{transitionDuration:i.duration,backgroundColor:s?i.backdrop:"transparent"},children:v(t,(n=>e(Fe,{modalId:n},n)))})}))),Se=({ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:i,FooterComponent:s,usePathname:a,options:l,context:c,anchor:d})=>S(e(ae,{context:c,children:e(ne,{ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:i,FooterComponent:s,options:l,children:e(A,{usePathname:a,children:e(Ie,{})})})}),d),Ee=()=>{const e=r(E.activate()),n=r(null),[,o]=F(),t=l((t=>{e.current?(n.current=E.anchor({root:t}),o()):y("ModalProvider is already initialized",["ModalProvider can only be initialized once.","Nesting ModalProvider will be ignored..."],{info:"Something is wrong with the ModalProvider initialization..."})}),[o]);return{anchorRef:n,handleInitialize:t}},je=d((({usePathname:e,ForegroundComponent:o,BackgroundComponent:t,TitleComponent:r,SubtitleComponent:i,ContentComponent:a,FooterComponent:l,options:c,context:d,children:m},C)=>{const h=s((()=>e||ce),[e]),{anchorRef:f,handleInitialize:g}=Ee();return p(C,(()=>({initialize:g})),[g]),N((()=>(null===C&&g(),()=>{f.current&&f.current.remove()}))),n(u,{children:[m,f.current&&Se({ForegroundComponent:o,BackgroundComponent:t,TitleComponent:r,SubtitleComponent:i,ContentComponent:a,FooterComponent:l,usePathname:h,options:c,context:d,anchor:f.current})]})})),Pe=({usePathname:e,ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:i,FooterComponent:a,options:c,context:d,mode:u="auto"}={})=>{const m=s((()=>e||ce),[e]),{anchorRef:p,handleInitialize:C}=Ee();N((()=>("auto"===u&&C(),()=>{p.current&&p.current.remove()})));const h=l((e=>{"manual"===u&&C(e)}),[u,C]);return{portal:p.current&&Se({usePathname:m,ForegroundComponent:n,BackgroundComponent:o,TitleComponent:t,SubtitleComponent:r,ContentComponent:i,FooterComponent:a,options:c,context:d,anchor:p.current}),initialize:h}},Ve=(e,n)=>{const{modal:o,onDestroy:t}=q(e),i=Be(o),s=r({modal:o,onDestroy:t,milliseconds:f(n)?h(n):n});m((()=>{const{modal:e,onDestroy:n,milliseconds:o}=s.current;if(!e||e.visible||!e.alive)return;const t=setTimeout((()=>{n()}),o);return()=>{t&&clearTimeout(t)}}),[i])},ze=(e,n)=>{const o=r(n);o.current=n,a((()=>{if(!o.current)return;let n;return n=e?requestAnimationFrame((()=>o.current.onVisible?.())):requestAnimationFrame((()=>o.current.onHidden?.())),()=>{n&&cancelAnimationFrame(n)}}),[e])};export{je as ModalProvider,j as alert,P as confirm,V as prompt,X as useActiveModalCount,Ve as useDestroyAfter,Pe as useInitializeModal,ze as useModalAnimation,ie as useModalBackdrop,re as useModalDuration,te as useModalOptions,Be as useSubscribeModal};
|
|
2
|
-
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/app/ModalManager.ts","../src/core/handle/alert.ts","../src/core/handle/confirm.ts","../src/core/handle/prompt.ts","../src/core/node/ModalNode/AbstractNode.ts","../src/core/node/ModalNode/AlertNode.ts","../src/core/node/ModalNode/ConfirmNode.ts","../src/core/node/ModalNode/PromptNode.ts","../src/core/node/nodeFactory.ts","../src/providers/ModalManagerContext/ModalManagerContext.ts","../src/providers/ModalManagerContext/ModalManagerContextProvider.tsx","../src/providers/ModalManagerContext/useModalManagerContext.ts","../src/components/FallbackComponents/classNames.emotion.ts","../src/components/FallbackComponents/FallbackTitle.tsx","../src/components/FallbackComponents/FallbackSubtitle.tsx","../src/components/FallbackComponents/FallbackContent.tsx","../src/components/FallbackComponents/FallbackFooter.tsx","../src/hooks/useActiveModalCount.ts","../src/components/FallbackComponents/FallbackForegroundFrame.tsx","../src/providers/ConfigurationContext/ConfigurationContext.ts","../src/providers/ConfigurationContext/ConfigurationContextProvider.tsx","../src/app/constant.ts","../src/providers/ConfigurationContext/useConfigurationContext.ts","../src/providers/UserDefinedContext/UserDefinedContext.ts","../src/providers/UserDefinedContext/UserDefinedContextProvider.tsx","../src/providers/UserDefinedContext/useUserDefinedContext.ts","../src/hooks/useDefaultPathname.ts","../src/components/Background/classNames.emotion.ts","../src/components/Background/Background.tsx","../src/components/Foreground/classNames.emotion.ts","../src/components/Foreground/components/AlertInner.tsx","../src/components/Foreground/components/ConfirmInner.tsx","../src/components/Foreground/components/PromptInner.tsx","../src/components/Foreground/Foreground.tsx","../src/hooks/useSubscribeModal.ts","../src/components/Presenter/classNames.emotion.ts","../src/components/Presenter/Presenter.tsx","../src/components/Anchor/classNames.emotion.ts","../src/components/Anchor/Anchor.tsx","../src/bootstrap/BootstrapProvider/helpers/bootstrap.tsx","../src/bootstrap/BootstrapProvider/hooks/useInitialize.ts","../src/bootstrap/BootstrapProvider/BootstrapProvider.tsx","../src/bootstrap/BootstrapProvider/useBootstrap.tsx","../src/hooks/useDestroyAfter.ts","../src/hooks/useModalAnimation.ts"],"sourcesContent":["import { getRandomString } from '@winglet/common-utils';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { Modal } from '@/promise-modal/types';\n\nexport class ModalManager {\n static #active = false;\n static activate() {\n if (ModalManager.#active) return false;\n return (ModalManager.#active = true);\n }\n\n static #anchor: HTMLElement | null = null;\n static anchor(options?: {\n tag?: string;\n prefix?: string;\n root?: HTMLElement;\n }): HTMLElement {\n if (ModalManager.#anchor) {\n const anchor = document.getElementById(ModalManager.#anchor.id);\n if (anchor) return anchor;\n }\n const {\n tag = 'div',\n prefix = 'promise-modal',\n root = document.body,\n } = options || {};\n const node = document.createElement(tag);\n node.setAttribute('id', `${prefix}-${getRandomString(36)}`);\n root.appendChild(node);\n ModalManager.#anchor = node;\n return node;\n }\n\n static #prerenderList: Modal[] = [];\n static get prerender() {\n return ModalManager.#prerenderList;\n }\n\n static #openHandler: Fn<[Modal], void> = (modal: Modal) =>\n ModalManager.#prerenderList.push(modal);\n static set openHandler(handler: Fn<[Modal], void>) {\n ModalManager.#openHandler = handler;\n ModalManager.#prerenderList = [];\n }\n\n static get unanchored() {\n return !ModalManager.#anchor;\n }\n\n static reset() {\n ModalManager.#active = false;\n ModalManager.#anchor = null;\n ModalManager.#prerenderList = [];\n ModalManager.#openHandler = (modal: Modal) =>\n ModalManager.#prerenderList.push(modal);\n }\n\n static open(modal: Modal) {\n ModalManager.#openHandler(modal);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n AlertContentProps,\n AlertFooterRender,\n BackgroundComponent,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface AlertProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<AlertContentProps>;\n background?: ModalBackground<B>;\n footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const alert = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: AlertProps<B>) => {\n return new Promise<void>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'alert',\n subtype,\n resolve: () => resolve(),\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n BackgroundComponent,\n ConfirmContentProps,\n ConfirmFooterRender,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n} from '@/promise-modal/types';\n\ninterface ConfirmProps<B> {\n subtype?: 'info' | 'success' | 'warning' | 'error';\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<ConfirmContentProps>;\n background?: ModalBackground<B>;\n footer?: ConfirmFooterRender | FooterOptions | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const confirm = <B = any>({\n subtype,\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: ConfirmProps<B>) => {\n return new Promise<boolean>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'confirm',\n subtype,\n resolve: (result) => resolve(result ?? false),\n title,\n subtitle,\n content,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ComponentType, ReactNode } from 'react';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport type {\n BackgroundComponent,\n FooterOptions,\n ForegroundComponent,\n ModalBackground,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n} from '@/promise-modal/types';\n\ninterface PromptProps<T, B = any> {\n title?: ReactNode;\n subtitle?: ReactNode;\n content?: ReactNode | ComponentType<PromptContentProps>;\n Input: (props: PromptInputProps<T>) => ReactNode;\n defaultValue?: T;\n disabled?: (value: T) => boolean;\n returnOnCancel?: boolean;\n background?: ModalBackground<B>;\n footer?: PromptFooterRender<T> | FooterOptions | false;\n dimmed?: boolean;\n manualDestroy?: boolean;\n closeOnBackdropClick?: boolean;\n ForegroundComponent?: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n}\n\nexport const prompt = <T, B = any>({\n defaultValue,\n title,\n subtitle,\n content,\n Input,\n disabled,\n returnOnCancel,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n}: PromptProps<T, B>) => {\n return new Promise<T>((resolve, reject) => {\n try {\n ModalManager.open({\n type: 'prompt',\n resolve: (result) => resolve(result as T),\n title,\n subtitle,\n content,\n Input,\n defaultValue,\n disabled,\n returnOnCancel,\n background,\n footer,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n ForegroundComponent,\n BackgroundComponent,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n","import type { ReactNode } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type {\n BackgroundComponent,\n BaseModal,\n ForegroundComponent,\n ManagedEntity,\n ModalBackground,\n} from '@/promise-modal/types';\n\ntype AbstractNodeProps<T, B> = BaseModal<T, B> & ManagedEntity;\n\nexport abstract class AbstractNode<T, B> {\n readonly id: number;\n readonly initiator: string;\n\n readonly title?: ReactNode;\n readonly subtitle?: ReactNode;\n readonly background?: ModalBackground<B>;\n\n readonly manualDestroy: boolean;\n readonly closeOnBackdropClick: boolean;\n readonly dimmed: boolean;\n\n readonly ForegroundComponent?: ForegroundComponent;\n readonly BackgroundComponent?: BackgroundComponent;\n\n #alive: boolean;\n get alive() {\n return this.#alive;\n }\n #visible: boolean;\n get visible() {\n return this.#visible;\n }\n\n #resolve: (result: T | null) => void;\n #listeners: Set<Fn> = new Set();\n\n constructor({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed = true,\n manualDestroy = false,\n closeOnBackdropClick = true,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: AbstractNodeProps<T, B>) {\n this.id = id;\n this.initiator = initiator;\n this.title = title;\n this.subtitle = subtitle;\n this.background = background;\n\n this.dimmed = dimmed;\n this.manualDestroy = manualDestroy;\n this.closeOnBackdropClick = closeOnBackdropClick;\n\n this.ForegroundComponent = ForegroundComponent;\n this.BackgroundComponent = BackgroundComponent;\n\n this.#alive = true;\n this.#visible = true;\n this.#resolve = resolve;\n }\n\n subscribe(listener: Fn) {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n }\n publish() {\n for (const listener of this.#listeners) listener();\n }\n protected resolve(result: T | null) {\n this.#resolve(result);\n }\n onDestroy() {\n const needPublish = this.#alive === true;\n this.#alive = false;\n if (this.manualDestroy && needPublish) this.publish();\n }\n onShow() {\n const needPublish = this.#visible === false;\n this.#visible = true;\n if (needPublish) this.publish();\n }\n onHide() {\n const needPublish = this.#visible === true;\n this.#visible = false;\n if (needPublish) this.publish();\n }\n abstract onClose(): void;\n abstract onConfirm(): void;\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n AlertContentProps,\n AlertFooterRender,\n AlertModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype AlertNodeProps<B> = AlertModal<B> & ManagedEntity;\n\nexport class AlertNode<B> extends AbstractNode<null, B> {\n readonly type: 'alert';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<AlertContentProps>;\n readonly footer?:\n | AlertFooterRender\n | Pick<FooterOptions, 'confirm' | 'hideConfirm'>\n | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: AlertNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(null);\n }\n onConfirm() {\n this.resolve(null);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n ConfirmContentProps,\n ConfirmFooterRender,\n ConfirmModal,\n FooterOptions,\n ManagedEntity,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype ConfirmNodeProps<B> = ConfirmModal<B> & ManagedEntity;\n\nexport class ConfirmNode<B> extends AbstractNode<boolean, B> {\n readonly type: 'confirm';\n readonly subtype?: 'info' | 'success' | 'warning' | 'error';\n readonly content?: ReactNode | ComponentType<ConfirmContentProps>;\n readonly footer?: ConfirmFooterRender | FooterOptions | false;\n\n constructor({\n id,\n initiator,\n type,\n subtype,\n title,\n subtitle,\n content,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: ConfirmNodeProps<B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.subtype = subtype;\n this.content = content;\n this.footer = footer;\n }\n onClose() {\n this.resolve(false);\n }\n onConfirm() {\n this.resolve(true);\n }\n}\n","import type { ComponentType, ReactNode } from 'react';\n\nimport type {\n FooterOptions,\n ManagedEntity,\n PromptContentProps,\n PromptFooterRender,\n PromptInputProps,\n PromptModal,\n} from '@/promise-modal/types';\n\nimport { AbstractNode } from './AbstractNode';\n\ntype PromptNodeProps<T, B> = PromptModal<T, B> & ManagedEntity;\n\nexport class PromptNode<T, B> extends AbstractNode<T, B> {\n readonly type: 'prompt';\n readonly content?: ReactNode | ComponentType<PromptContentProps>;\n readonly defaultValue: T | undefined;\n readonly Input: (props: PromptInputProps<T>) => ReactNode;\n readonly disabled?: (value: T) => boolean;\n readonly returnOnCancel?: boolean;\n readonly footer?: PromptFooterRender<T> | FooterOptions | false;\n\n #value: T | undefined;\n\n constructor({\n id,\n initiator,\n type,\n title,\n subtitle,\n content,\n defaultValue,\n Input,\n disabled,\n returnOnCancel,\n footer,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n }: PromptNodeProps<T, B>) {\n super({\n id,\n initiator,\n title,\n subtitle,\n background,\n dimmed,\n manualDestroy,\n closeOnBackdropClick,\n resolve,\n ForegroundComponent,\n BackgroundComponent,\n });\n this.type = type;\n this.content = content;\n this.Input = Input;\n this.defaultValue = defaultValue;\n this.#value = defaultValue;\n this.disabled = disabled;\n this.returnOnCancel = returnOnCancel;\n this.footer = footer;\n }\n\n onChange(value: T) {\n this.#value = value;\n }\n onConfirm() {\n this.resolve(this.#value ?? null);\n }\n onClose() {\n if (this.returnOnCancel) this.resolve(this.#value ?? null);\n else this.resolve(null);\n }\n}\n","import type { ManagedModal } from '@/promise-modal/types';\n\nimport { AlertNode, ConfirmNode, PromptNode } from './ModalNode';\n\nexport const nodeFactory = <T, B>(modal: ManagedModal<T, B>) => {\n switch (modal.type) {\n case 'alert':\n return new AlertNode<B>(modal);\n case 'confirm':\n return new ConfirmNode<B>(modal);\n case 'prompt':\n return new PromptNode<T, B>(modal);\n }\n // @ts-expect-error: This state is unreachable by design and should NEVER occur.\n throw new Error(`Unknown modal: ${modal.type}`, { modal });\n};\n","import { createContext } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport type { ModalActions, ModalHandlersWithId } from '@/promise-modal/types';\n\nexport interface ModalManagerContextProps extends ModalHandlersWithId {\n modalIds: ModalNode['id'][];\n getModal: Fn<[id: ModalNode['id']], ModalActions>;\n getModalNode: Fn<[id: ModalNode['id']], ModalNode | undefined>;\n setUpdater: Fn<[updater: Fn]>;\n}\n\nexport const ModalManagerContext = createContext<ModalManagerContextProps>(\n {} as ModalManagerContextProps,\n);\n","import {\n type PropsWithChildren,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils';\nimport { useOnMountLayout, useReference } from '@winglet/react-utils';\n\nimport type { Fn } from '@aileron/declare';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\nimport { type ModalNode, nodeFactory } from '@/promise-modal/core';\nimport { useConfigurationOptions } from '@/promise-modal/providers';\nimport type { Modal } from '@/promise-modal/types';\n\nimport { ModalManagerContext } from './ModalManagerContext';\n\ninterface ModalManagerContextProviderProps {\n usePathname: Fn<[], { pathname: string }>;\n}\n\nexport const ModalManagerContextProvider = memo(\n ({\n usePathname,\n children,\n }: PropsWithChildren<ModalManagerContextProviderProps>) => {\n const modalDictionary = useRef<Map<ModalNode['id'], ModalNode>>(new Map());\n\n const [modalIds, setModalIds] = useState<ModalNode['id'][]>([]);\n const modalIdsRef = useReference(modalIds);\n const { pathname } = usePathname();\n\n const initiator = useRef(pathname);\n const modalIdSequence = useRef(0);\n\n const options = useConfigurationOptions();\n\n const duration = useMemo(\n () => convertMsFromDuration(options.duration),\n [options],\n );\n\n useOnMountLayout(() => {\n const { manualDestroy, closeOnBackdropClick } = options;\n\n for (const data of ModalManager.prerender) {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => [...ids, modal.id]);\n }\n\n ModalManager.openHandler = (data: Modal) => {\n const modal = nodeFactory({\n ...data,\n id: modalIdSequence.current++,\n initiator: initiator.current,\n manualDestroy:\n data.manualDestroy !== undefined\n ? data.manualDestroy\n : manualDestroy,\n closeOnBackdropClick:\n data.closeOnBackdropClick !== undefined\n ? data.closeOnBackdropClick\n : closeOnBackdropClick,\n });\n modalDictionary.current.set(modal.id, modal);\n setModalIds((ids) => {\n const aliveIds: number[] = [];\n for (let index = 0; index < ids.length; index++) {\n const id = ids[index];\n const destroyed = !modalDictionary.current.get(id)?.alive;\n if (destroyed) modalDictionary.current.delete(id);\n else aliveIds.push(id);\n }\n return [...aliveIds, modal.id];\n });\n };\n return () => {\n ModalManager.reset();\n };\n });\n\n useLayoutEffect(() => {\n for (const id of modalIdsRef.current) {\n const modal = modalDictionary.current.get(id);\n if (!modal?.alive) continue;\n if (modal.initiator === pathname) modal.onShow();\n else modal.onHide();\n }\n initiator.current = pathname;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname]);\n\n const getModalNode = useCallback((modalId: ModalNode['id']) => {\n return modalDictionary.current.get(modalId);\n }, []);\n\n const onDestroy = useCallback((modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onDestroy();\n updaterRef.current?.();\n }, []);\n\n const updaterRef = useRef<Fn>(undefined);\n const hideModal = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onHide();\n updaterRef.current?.();\n if (!modal.manualDestroy)\n setTimeout(() => {\n modal.onDestroy();\n }, duration);\n },\n [duration],\n );\n\n const onChange = useCallback((modalId: ModalNode['id'], value: any) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n if (modal.type === 'prompt') modal.onChange(value);\n }, []);\n\n const onConfirm = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onConfirm();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const onClose = useCallback(\n (modalId: ModalNode['id']) => {\n const modal = modalDictionary.current.get(modalId);\n if (!modal) return;\n modal.onClose();\n hideModal(modalId);\n },\n [hideModal],\n );\n\n const getModal = useCallback(\n (modalId: ModalNode['id']) => ({\n modal: getModalNode(modalId),\n onConfirm: () => onConfirm(modalId),\n onClose: () => onClose(modalId),\n onChange: (value: any) => onChange(modalId, value),\n onDestroy: () => onDestroy(modalId),\n }),\n [getModalNode, onConfirm, onClose, onChange, onDestroy],\n );\n\n const value = useMemo(() => {\n return {\n modalIds,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n getModal,\n setUpdater: (updater: Fn) => {\n updaterRef.current = updater;\n },\n };\n }, [\n modalIds,\n getModal,\n getModalNode,\n onChange,\n onConfirm,\n onClose,\n onDestroy,\n ]);\n\n return (\n <ModalManagerContext.Provider value={value}>\n {children}\n </ModalManagerContext.Provider>\n );\n },\n);\n","import { useContext, useMemo } from 'react';\n\nimport type { ManagedModal } from '@/promise-modal/types';\n\nimport { ModalManagerContext } from './ModalManagerContext';\n\nexport const useModalManagerContext = () => useContext(ModalManagerContext);\n\nexport const useModal = (id: ManagedModal['id']) => {\n const { getModal } = useModalManagerContext();\n return useMemo(() => getModal(id), [id, getModal]);\n};\n","import { css } from '@emotion/css';\n\nexport const fallback = css`\n margin: unset;\n`;\n\nexport const frame = css`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: white;\n padding: 20px 80px;\n gap: 10px;\n border: 1px solid black;\n`;\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackTitle = ({ children }: PropsWithChildren) => {\n return <h2 className={fallback}>{children}</h2>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackSubtitle = ({ children }: PropsWithChildren) => {\n return <h3 className={fallback}>{children}</h3>;\n};\n","import type { PropsWithChildren } from 'react';\n\nimport { fallback } from './classNames.emotion';\n\nexport const FallbackContent = ({ children }: PropsWithChildren) => {\n return <div className={fallback}>{children}</div>;\n};\n","import type { FooterComponentProps } from '@/promise-modal/types';\n\nexport const FallbackFooter = ({\n confirmLabel,\n hideConfirm = false,\n cancelLabel,\n hideCancel = false,\n disabled,\n onConfirm,\n onCancel,\n}: FooterComponentProps) => {\n return (\n <div>\n {!hideConfirm && (\n <button onClick={onConfirm} disabled={disabled}>\n {confirmLabel || 'Confirm'}\n </button>\n )}\n\n {!hideCancel && typeof onCancel === 'function' && (\n <button onClick={onCancel}>{cancelLabel || 'Cancel'}</button>\n )}\n </div>\n );\n};\n","import { useMemo } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useModalManagerContext } from '@/promise-modal/providers';\n\nconst defaultValidate = (modal?: ModalNode) => modal?.visible;\n\nexport const useActiveModalCount = (\n validate: Fn<[ModalNode?], boolean | undefined> = defaultValidate,\n refreshKey: string | number = 0,\n) => {\n const { modalIds, getModalNode } = useModalManagerContext();\n return useMemo(() => {\n let count = 0;\n for (const id of modalIds) {\n if (validate(getModalNode(id))) count++;\n }\n return count;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getModalNode, modalIds, refreshKey]);\n};\n","import {\n type ForwardedRef,\n type PropsWithChildren,\n forwardRef,\n useMemo,\n} from 'react';\n\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport type { ModalFrameProps } from '@/promise-modal/types';\n\nimport { frame } from './classNames.emotion';\n\nconst MAX_MODAL_COUNT = 5;\nconst MAX_MODAL_LEVEL = 3;\n\nexport const FallbackForegroundFrame = forwardRef(\n (\n { id, onChangeOrder, children }: PropsWithChildren<ModalFrameProps>,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const activeCount = useActiveModalCount();\n const [level, offset] = useMemo(() => {\n const stacked = activeCount > 1;\n const level = stacked\n ? (Math.floor(id / MAX_MODAL_COUNT) % MAX_MODAL_LEVEL) * 100\n : 0;\n const offset = stacked ? (id % MAX_MODAL_COUNT) * 35 : 0;\n return [level, offset];\n }, [activeCount, id]);\n\n return (\n <div\n ref={ref}\n className={frame}\n onClick={onChangeOrder}\n style={{\n marginBottom: `calc(25vh + ${level}px)`,\n marginLeft: `${level}px`,\n transform: `translate(${offset}px, ${offset}px)`,\n }}\n >\n {children}\n </div>\n );\n },\n);\n","import { type ComponentType, createContext } from 'react';\n\nimport type { Color, Duration } from '@aileron/declare';\n\nimport type {\n BackgroundComponent,\n FooterComponentProps,\n ForegroundComponent,\n WrapperComponentProps,\n} from '@/promise-modal/types';\n\nexport interface ConfigurationContextProps {\n ForegroundComponent: ForegroundComponent;\n BackgroundComponent?: BackgroundComponent;\n TitleComponent: ComponentType<WrapperComponentProps>;\n SubtitleComponent: ComponentType<WrapperComponentProps>;\n ContentComponent: ComponentType<WrapperComponentProps>;\n FooterComponent: ComponentType<FooterComponentProps>;\n options: {\n duration: Duration;\n backdrop: Color;\n manualDestroy: boolean;\n closeOnBackdropClick: boolean;\n };\n}\n\nexport const ConfigurationContext = createContext<ConfigurationContextProps>(\n {} as ConfigurationContextProps,\n);\n","import {\n type ComponentType,\n type PropsWithChildren,\n memo,\n useMemo,\n} from 'react';\n\nimport type { Color, Duration } from '@aileron/declare';\n\nimport {\n DEFAULT_ANIMATION_DURATION,\n DEFAULT_BACKDROP_COLOR,\n} from '@/promise-modal/app/constant';\nimport {\n FallbackContent,\n FallbackFooter,\n FallbackForegroundFrame,\n FallbackSubtitle,\n FallbackTitle,\n} from '@/promise-modal/components/FallbackComponents';\nimport type {\n FooterComponentProps,\n ModalFrameProps,\n WrapperComponentProps,\n} from '@/promise-modal/types';\n\nimport { ConfigurationContext } from './ConfigurationContext';\n\nexport interface ConfigurationContextProviderProps {\n BackgroundComponent?: ComponentType<ModalFrameProps>;\n ForegroundComponent?: ComponentType<ModalFrameProps>;\n TitleComponent?: ComponentType<WrapperComponentProps>;\n SubtitleComponent?: ComponentType<WrapperComponentProps>;\n ContentComponent?: ComponentType<WrapperComponentProps>;\n FooterComponent?: ComponentType<FooterComponentProps>;\n options?: {\n /** Modal transition time(ms, s) */\n duration?: Duration;\n /** Modal backdrop color */\n backdrop?: Color;\n /** Whether to destroy the modal manually */\n manualDestroy?: boolean;\n /** Whether to close the modal when the backdrop is clicked */\n closeOnBackdropClick?: boolean;\n };\n}\n\nexport const ConfigurationContextProvider = memo(\n ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n children,\n }: PropsWithChildren<ConfigurationContextProviderProps>) => {\n const value = useMemo(\n () => ({\n BackgroundComponent,\n ForegroundComponent: ForegroundComponent || FallbackForegroundFrame,\n TitleComponent: TitleComponent || FallbackTitle,\n SubtitleComponent: SubtitleComponent || FallbackSubtitle,\n ContentComponent: memo(ContentComponent || FallbackContent),\n FooterComponent: memo(FooterComponent || FallbackFooter),\n options: {\n duration: DEFAULT_ANIMATION_DURATION,\n backdrop: DEFAULT_BACKDROP_COLOR,\n closeOnBackdropClick: true,\n manualDestroy: false,\n ...options,\n } satisfies ConfigurationContextProviderProps['options'],\n }),\n [\n ForegroundComponent,\n BackgroundComponent,\n ContentComponent,\n FooterComponent,\n SubtitleComponent,\n TitleComponent,\n options,\n ],\n );\n return (\n <ConfigurationContext.Provider value={value}>\n {children}\n </ConfigurationContext.Provider>\n );\n },\n);\n","import type { Color, Duration } from '@aileron/declare';\n\nexport const DEFAULT_ANIMATION_DURATION: Duration = '300ms';\n\nexport const DEFAULT_BACKDROP_COLOR: Color = 'rgba(0, 0, 0, 0.5)';\n","import { useContext } from 'react';\n\nimport { convertMsFromDuration } from '@winglet/common-utils';\n\nimport { ConfigurationContext } from './ConfigurationContext';\n\nexport const useConfigurationContext = () => useContext(ConfigurationContext);\n\nexport const useConfigurationOptions = () => {\n const context = useContext(ConfigurationContext);\n return context.options;\n};\n\nexport const useConfigurationDuration = () => {\n const context = useConfigurationOptions();\n return {\n duration: context.duration,\n milliseconds: convertMsFromDuration(context.duration),\n };\n};\n\nexport const useConfigurationBackdrop = () => {\n const context = useConfigurationOptions();\n return context.backdrop;\n};\n","import { createContext } from 'react';\n\nimport type { Dictionary } from '@aileron/declare';\n\nexport interface UserDefinedContext {\n context: Dictionary;\n}\n\nexport const UserDefinedContext = createContext<UserDefinedContext>(\n {} as UserDefinedContext,\n);\n","import { PropsWithChildren, useMemo } from 'react';\n\nimport type { Dictionary } from '@aileron/declare';\n\nimport { UserDefinedContext } from './UserDefinedContext';\n\ninterface UserDefinedContextProviderProps {\n /** User defined context */\n context?: Dictionary;\n}\n\nexport const UserDefinedContextProvider = ({\n context,\n children,\n}: PropsWithChildren<UserDefinedContextProviderProps>) => {\n const contextValue = useMemo(() => ({ context: context || {} }), [context]);\n return (\n <UserDefinedContext.Provider value={contextValue}>\n {children}\n </UserDefinedContext.Provider>\n );\n};\n","import { useContext } from 'react';\n\nimport { UserDefinedContext } from './UserDefinedContext';\n\nexport const useUserDefinedContext = () => {\n return useContext(UserDefinedContext);\n};\n","import { useLayoutEffect, useState } from 'react';\n\nexport const usePathname = () => {\n const [pathname, setPathname] = useState(window.location.pathname);\n useLayoutEffect(() => {\n let requestId: number;\n const checkPathname = () => {\n if (requestId) cancelAnimationFrame(requestId);\n if (pathname !== window.location.pathname) {\n setPathname(window.location.pathname);\n } else {\n requestId = requestAnimationFrame(checkPathname);\n }\n };\n requestId = requestAnimationFrame(checkPathname);\n return () => {\n if (requestId) cancelAnimationFrame(requestId);\n };\n }, [pathname]);\n return { pathname };\n};\n","import { css } from '@emotion/css';\n\nexport const background = css`\n display: none;\n position: fixed;\n inset: 0;\n z-index: -999;\n pointer-events: none;\n > * {\n pointer-events: none;\n }\n`;\n\nexport const active = css`\n pointer-events: all;\n`;\n\nexport const visible = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","import { type MouseEvent, useCallback, useMemo } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport {\n useConfigurationContext,\n useModal,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, background, visible } from './classNames.emotion';\n\nexport const BackgroundFrame = ({\n modalId,\n onChangeOrder,\n}: ModalLayerProps) => {\n const { BackgroundComponent } = useConfigurationContext();\n const { context: userDefinedContext } = useUserDefinedContext();\n const { modal, onClose, onChange, onConfirm, onDestroy } = useModal(modalId);\n\n const handleClose = useCallback(\n (event: MouseEvent) => {\n if (modal && modal.closeOnBackdropClick && modal.visible) onClose();\n event.stopPropagation();\n },\n [modal, onClose],\n );\n\n const Background = useMemo(\n () => modal?.BackgroundComponent || BackgroundComponent,\n [BackgroundComponent, modal],\n );\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(background, {\n [visible]: modal.manualDestroy ? modal.alive : modal.visible,\n [active]: modal.closeOnBackdropClick && modal.visible,\n })}\n onClick={handleClose}\n >\n {Background && (\n <Background\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n context={userDefinedContext}\n />\n )}\n </div>\n );\n};\n","import { css } from '@emotion/css';\n\nexport const foreground = css`\n pointer-events: none;\n display: none;\n position: fixed;\n inset: 0;\n z-index: 1;\n`;\n\nexport const active = css`\n > * {\n pointer-events: all;\n }\n`;\n\nexport const visible = css`\n display: flex !important;\n justify-content: center;\n align-items: center;\n`;\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { AlertNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface AlertInnerProps<B> {\n modal: AlertNode<B>;\n handlers: Pick<ModalActions, 'onConfirm'>;\n}\n\nexport const AlertInner = memo(\n <B,>({ modal, handlers }: AlertInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { context: userDefinedContext } = useUserDefinedContext();\n const { onConfirm } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n confirmLabel={footer?.confirm}\n hideConfirm={footer?.hideConfirm}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useMemo } from 'react';\n\nimport { isString } from '@winglet/common-utils';\nimport { renderComponent, useHandle } from '@winglet/react-utils';\n\nimport type { ConfirmNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface ConfirmInnerProps<B> {\n modal: ConfirmNode<B>;\n handlers: Pick<ModalActions, 'onConfirm' | 'onClose'>;\n}\n\nexport const ConfirmInner = memo(\n <B,>({ modal, handlers }: ConfirmInnerProps<B>) => {\n const { title, subtitle, content, footer } = useMemo(() => modal, [modal]);\n const { context: userDefinedContext } = useUserDefinedContext();\n const { onConfirm, onClose } = useMemo(() => handlers, [handlers]);\n\n const handleConfirm = useHandle(onConfirm);\n const handleClose = useHandle(onClose);\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ))}\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { Fragment, memo, useCallback, useMemo, useState } from 'react';\n\nimport { isFunction, isString } from '@winglet/common-utils';\nimport {\n renderComponent,\n useHandle,\n withErrorBoundary,\n} from '@winglet/react-utils';\n\nimport type { PromptNode } from '@/promise-modal/core';\nimport {\n useConfigurationContext,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalActions } from '@/promise-modal/types';\n\ninterface PromptInnerProps<T, B> {\n modal: PromptNode<T, B>;\n handlers: Pick<ModalActions, 'onChange' | 'onClose' | 'onConfirm'>;\n}\n\nexport const PromptInner = memo(\n <T, B>({ modal, handlers }: PromptInnerProps<T, B>) => {\n const {\n Input,\n defaultValue,\n disabled: checkDisabled,\n title,\n subtitle,\n content,\n footer,\n } = useMemo(\n () => ({\n ...modal,\n Input: memo(withErrorBoundary(modal.Input)),\n }),\n [modal],\n );\n\n const { context: userDefinedContext } = useUserDefinedContext();\n\n const [value, setValue] = useState<T | undefined>(defaultValue);\n\n const { onChange, onClose, onConfirm } = useMemo(\n () => handlers,\n [handlers],\n );\n\n const handleClose = useHandle(onClose);\n const handleChange = useHandle(\n (inputValue?: T | ((prevState: T | undefined) => T | undefined)) => {\n const input = isFunction(inputValue) ? inputValue(value) : inputValue;\n setValue(input);\n onChange(input);\n },\n );\n\n const handleConfirm = useCallback(() => {\n // NOTE: wait for the next tick to ensure the value is updated\n requestAnimationFrame(onConfirm);\n }, [onConfirm]);\n\n const disabled = useMemo(\n () => (value ? !!checkDisabled?.(value) : false),\n [checkDisabled, value],\n );\n\n const {\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n } = useConfigurationContext();\n\n return (\n <Fragment>\n {title &&\n (isString(title) ? (\n <TitleComponent context={userDefinedContext}>\n {title}\n </TitleComponent>\n ) : (\n title\n ))}\n {subtitle &&\n (isString(subtitle) ? (\n <SubtitleComponent context={userDefinedContext}>\n {subtitle}\n </SubtitleComponent>\n ) : (\n subtitle\n ))}\n {content &&\n (isString(content) ? (\n <ContentComponent context={userDefinedContext}>\n {content}\n </ContentComponent>\n ) : (\n renderComponent(content, {\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ))}\n\n {Input && (\n <Input\n defaultValue={defaultValue}\n value={value}\n onChange={handleChange}\n onConfirm={handleConfirm}\n onCancel={handleClose}\n context={userDefinedContext}\n />\n )}\n\n {footer !== false &&\n (typeof footer === 'function' ? (\n footer({\n value,\n disabled,\n onChange: handleChange,\n onConfirm: handleConfirm,\n onCancel: handleClose,\n context: userDefinedContext,\n })\n ) : (\n <FooterComponent\n disabled={disabled}\n onConfirm={handleConfirm}\n onCancel={handleClose}\n confirmLabel={footer?.confirm}\n cancelLabel={footer?.cancel}\n hideConfirm={footer?.hideConfirm}\n hideCancel={footer?.hideCancel}\n context={userDefinedContext}\n />\n ))}\n </Fragment>\n );\n },\n);\n","import { useMemo } from 'react';\n\nimport { cx } from '@emotion/css';\n\nimport {\n useConfigurationContext,\n useModal,\n useUserDefinedContext,\n} from '@/promise-modal/providers';\nimport type { ModalLayerProps } from '@/promise-modal/types';\n\nimport { active, foreground, visible } from './classNames.emotion';\nimport { AlertInner, ConfirmInner, PromptInner } from './components';\n\nexport const ForegroundFrame = ({\n modalId,\n onChangeOrder,\n}: ModalLayerProps) => {\n const { ForegroundComponent } = useConfigurationContext();\n const { context: userDefinedContext } = useUserDefinedContext();\n\n const { modal, onChange, onConfirm, onClose, onDestroy } = useModal(modalId);\n\n const Foreground = useMemo(\n () => modal?.ForegroundComponent || ForegroundComponent,\n [ForegroundComponent, modal],\n );\n\n if (!modal) return null;\n\n return (\n <div\n className={cx(foreground, {\n [visible]: modal.manualDestroy ? modal.alive : modal.visible,\n [active]: modal.visible,\n })}\n >\n <Foreground\n id={modal.id}\n type={modal.type}\n alive={modal.alive}\n visible={modal.visible}\n initiator={modal.initiator}\n manualDestroy={modal.manualDestroy}\n closeOnBackdropClick={modal.closeOnBackdropClick}\n background={modal.background}\n onChange={onChange}\n onConfirm={onConfirm}\n onClose={onClose}\n onDestroy={onDestroy}\n onChangeOrder={onChangeOrder}\n context={userDefinedContext}\n >\n {modal.type === 'alert' && (\n <AlertInner modal={modal} handlers={{ onConfirm }} />\n )}\n {modal.type === 'confirm' && (\n <ConfirmInner modal={modal} handlers={{ onConfirm, onClose }} />\n )}\n {modal.type === 'prompt' && (\n <PromptInner\n modal={modal}\n handlers={{ onChange, onConfirm, onClose }}\n />\n )}\n </Foreground>\n </div>\n );\n};\n","import { useEffect } from 'react';\n\nimport { useVersion } from '@winglet/react-utils';\n\nimport type { ModalNode } from '@/promise-modal/core';\n\nexport const useSubscribeModal = (modal?: ModalNode) => {\n const [version, update] = useVersion();\n useEffect(() => {\n if (!modal) return;\n const unsubscribe = modal.subscribe(update);\n return unsubscribe;\n }, [modal, update]);\n return version;\n};\n","import { css } from '@emotion/css';\n\nexport const presenter = css`\n position: fixed;\n inset: 0;\n pointer-events: none;\n overflow: hidden;\n`;\n","import { memo, useRef } from 'react';\n\nimport { counterFactory } from '@winglet/common-utils';\nimport { useHandle } from '@winglet/react-utils';\n\nimport { Background } from '@/promise-modal/components/Background';\nimport { Foreground } from '@/promise-modal/components/Foreground';\nimport { useSubscribeModal } from '@/promise-modal/hooks/useSubscribeModal';\nimport { useModal } from '@/promise-modal/providers';\nimport type { ModalIdProps } from '@/promise-modal/types';\n\nimport { presenter } from './classNames.emotion';\n\nconst { increment } = counterFactory(1);\n\nexport const Presenter = memo(({ modalId }: ModalIdProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { modal } = useModal(modalId);\n useSubscribeModal(modal);\n const handleChangeOrder = useHandle(() => {\n if (ref.current) {\n ref.current.style.zIndex = `${increment()}`;\n }\n });\n return (\n <div ref={ref} className={presenter}>\n <Background modalId={modalId} onChangeOrder={handleChangeOrder} />\n <Foreground modalId={modalId} onChangeOrder={handleChangeOrder} />\n </div>\n );\n});\n","import { css } from '@emotion/css';\n\nexport const anchor = css`\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 1000;\n transition: background-color ease-in-out;\n`;\n","import { memo, useEffect } from 'react';\n\nimport { map } from '@winglet/common-utils';\nimport { useVersion, withErrorBoundary } from '@winglet/react-utils';\n\nimport { Presenter } from '@/promise-modal/components/Presenter';\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useActiveModalCount } from '@/promise-modal/hooks/useActiveModalCount';\nimport {\n useConfigurationOptions,\n useModalManagerContext,\n} from '@/promise-modal/providers';\n\nimport { anchor } from './classNames.emotion';\n\nconst AnchorInner = () => {\n const [version, update] = useVersion();\n\n const { modalIds, setUpdater } = useModalManagerContext();\n\n useEffect(() => {\n setUpdater(update);\n }, [setUpdater, update]);\n\n const options = useConfigurationOptions();\n\n const dimmed = useActiveModalCount(validateDimmable, version);\n\n return (\n <div\n className={anchor}\n style={{\n transitionDuration: options.duration,\n backgroundColor: dimmed ? options.backdrop : 'transparent',\n }}\n >\n {map(modalIds, (id) => (\n <Presenter key={id} modalId={id} />\n ))}\n </div>\n );\n};\n\nconst validateDimmable = (modal?: ModalNode) => modal?.visible && modal.dimmed;\n\nexport const Anchor = memo(withErrorBoundary(AnchorInner));\n","import { createPortal } from 'react-dom';\n\nimport type { Dictionary, Fn } from '@aileron/declare';\n\nimport { Anchor } from '@/promise-modal/components/Anchor';\nimport {\n ConfigurationContextProvider,\n type ConfigurationContextProviderProps,\n} from '@/promise-modal/providers/ConfigurationContext';\nimport { ModalManagerContextProvider } from '@/promise-modal/providers/ModalManagerContext';\nimport { UserDefinedContextProvider } from '@/promise-modal/providers/UserDefinedContext';\n\ninterface BootstrapProps extends ConfigurationContextProviderProps {\n usePathname: Fn<[], { pathname: string }>;\n context?: Dictionary;\n anchor: HTMLElement;\n}\n\nexport const bootstrap = ({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n usePathname,\n options,\n context,\n anchor,\n}: BootstrapProps) =>\n createPortal(\n <UserDefinedContextProvider context={context}>\n <ConfigurationContextProvider\n ForegroundComponent={ForegroundComponent}\n BackgroundComponent={BackgroundComponent}\n TitleComponent={TitleComponent}\n SubtitleComponent={SubtitleComponent}\n ContentComponent={ContentComponent}\n FooterComponent={FooterComponent}\n options={options}\n >\n <ModalManagerContextProvider usePathname={usePathname}>\n <Anchor />\n </ModalManagerContextProvider>\n </ConfigurationContextProvider>\n </UserDefinedContextProvider>,\n anchor,\n );\n","import { useCallback, useRef } from 'react';\n\nimport { printError } from '@winglet/common-utils';\nimport { useVersion } from '@winglet/react-utils';\n\nimport { ModalManager } from '@/promise-modal/app/ModalManager';\n\nexport const useInitialize = () => {\n const permitted = useRef(ModalManager.activate());\n const anchorRef = useRef<HTMLElement | null>(null);\n const [, update] = useVersion();\n\n const handleInitialize = useCallback(\n (root?: HTMLElement) => {\n if (permitted.current) {\n anchorRef.current = ModalManager.anchor({ root });\n update();\n } else\n printError(\n 'ModalProvider is already initialized',\n [\n 'ModalProvider can only be initialized once.',\n 'Nesting ModalProvider will be ignored...',\n ],\n {\n info: 'Something is wrong with the ModalProvider initialization...',\n },\n );\n },\n [update],\n );\n\n return {\n anchorRef,\n handleInitialize,\n } as const;\n};\n","import {\n Fragment,\n type PropsWithChildren,\n forwardRef,\n useImperativeHandle,\n useMemo,\n} from 'react';\n\nimport { useOnMount } from '@winglet/react-utils';\n\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\n\nimport { bootstrap } from './helpers/bootstrap';\nimport { useInitialize } from './hooks/useInitialize';\nimport type { BootstrapProviderHandle, BootstrapProviderProps } from './type';\n\nexport const BootstrapProvider = forwardRef<\n BootstrapProviderHandle,\n PropsWithChildren<BootstrapProviderProps>\n>(\n (\n {\n usePathname: useExternalPathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n children,\n },\n handleRef,\n ) => {\n const usePathname = useMemo(\n () => useExternalPathname || useDefaultPathname,\n [useExternalPathname],\n );\n\n const { anchorRef, handleInitialize } = useInitialize();\n\n useImperativeHandle(\n handleRef,\n () => ({\n initialize: handleInitialize,\n }),\n [handleInitialize],\n );\n\n useOnMount(() => {\n /**\n * NOTE: `handleRef` being null indicates that no `ref` was provided.\n * In this case, the `ModalProvider`(=`BootstrapProvider`) is not receiving the `ref`,\n * so it should be initialized automatically.\n */\n if (handleRef === null) handleInitialize();\n return () => {\n if (anchorRef.current) anchorRef.current.remove();\n };\n });\n\n return (\n <Fragment>\n {children}\n {anchorRef.current &&\n bootstrap({\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n usePathname,\n options,\n context,\n anchor: anchorRef.current,\n })}\n </Fragment>\n );\n },\n);\n","import { useCallback, useMemo } from 'react';\n\nimport { useOnMount } from '@winglet/react-utils';\n\nimport { usePathname as useDefaultPathname } from '@/promise-modal/hooks/useDefaultPathname';\n\nimport { bootstrap } from './helpers/bootstrap';\nimport { useInitialize } from './hooks/useInitialize';\nimport type { BootstrapProviderProps } from './type';\n\nexport const useBootstrap = ({\n usePathname: useExternalPathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n mode = 'auto',\n}: BootstrapProviderProps & { mode?: 'manual' | 'auto' } = {}) => {\n const usePathname = useMemo(\n () => useExternalPathname || useDefaultPathname,\n [useExternalPathname],\n );\n\n const { anchorRef, handleInitialize } = useInitialize();\n\n useOnMount(() => {\n if (mode === 'auto') handleInitialize();\n return () => {\n if (anchorRef.current) anchorRef.current.remove();\n };\n });\n\n const initialize = useCallback(\n (element: HTMLElement) => {\n if (mode === 'manual') handleInitialize(element);\n },\n [mode, handleInitialize],\n );\n\n const portal =\n anchorRef.current &&\n bootstrap({\n usePathname,\n ForegroundComponent,\n BackgroundComponent,\n TitleComponent,\n SubtitleComponent,\n ContentComponent,\n FooterComponent,\n options,\n context,\n anchor: anchorRef.current,\n });\n\n return { portal, initialize };\n};\n","import { useEffect, useRef } from 'react';\n\nimport { convertMsFromDuration, isString } from '@winglet/common-utils';\n\nimport type { Duration } from '@aileron/declare';\n\nimport type { ModalNode } from '@/promise-modal/core';\nimport { useModal } from '@/promise-modal/providers';\n\nimport { useSubscribeModal } from './useSubscribeModal';\n\nexport const useDestroyAfter = (\n modalId: ModalNode['id'],\n duration: Duration | number,\n) => {\n const { modal, onDestroy } = useModal(modalId);\n const tick = useSubscribeModal(modal);\n\n const reference = useRef({\n modal,\n onDestroy,\n milliseconds: isString(duration)\n ? convertMsFromDuration(duration)\n : duration,\n });\n\n useEffect(() => {\n const { modal, onDestroy, milliseconds } = reference.current;\n if (!modal || modal.visible || !modal.alive) return;\n const timer = setTimeout(() => {\n onDestroy();\n }, milliseconds);\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [tick]);\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nimport type { Fn } from '@aileron/declare';\n\ninterface ModalAnimationHandler {\n onVisible?: Fn;\n onHidden?: Fn;\n}\n\nexport const useModalAnimation = (\n visible: boolean,\n handler: ModalAnimationHandler,\n) => {\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n useLayoutEffect(() => {\n if (!handlerRef.current) return;\n let frame: ReturnType<typeof requestAnimationFrame>;\n if (visible)\n frame = requestAnimationFrame(() => handlerRef.current.onVisible?.());\n else frame = requestAnimationFrame(() => handlerRef.current.onHidden?.());\n return () => {\n if (frame) cancelAnimationFrame(frame);\n };\n }, [visible]);\n};\n"],"names":["ModalManager","static","activate","active","anchor","options","document","getElementById","id","tag","prefix","root","body","node","createElement","setAttribute","getRandomString","appendChild","prerender","prerenderList","modal","push","openHandler","handler","unanchored","reset","open","alert","subtype","title","subtitle","content","background","footer","dimmed","manualDestroy","closeOnBackdropClick","ForegroundComponent","BackgroundComponent","Promise","resolve","reject","type","error","confirm","result","prompt","defaultValue","Input","disabled","returnOnCancel","AbstractNode","initiator","alive","this","visible","listeners","Set","constructor","subscribe","listener","add","delete","publish","onDestroy","needPublish","onShow","onHide","AlertNode","super","onClose","onConfirm","ConfirmNode","PromptNode","value","onChange","nodeFactory","Error","ModalManagerContext","createContext","ModalManagerContextProvider","memo","usePathname","children","modalDictionary","useRef","Map","modalIds","setModalIds","useState","modalIdsRef","useReference","pathname","modalIdSequence","useConfigurationOptions","duration","useMemo","convertMsFromDuration","useOnMountLayout","data","current","undefined","set","ids","aliveIds","index","length","get","useLayoutEffect","getModalNode","useCallback","modalId","updaterRef","hideModal","setTimeout","getModal","setUpdater","updater","_jsx","Provider","useModalManagerContext","useContext","useModal","fallback","css","process","env","NODE_ENV","name","styles","toString","_EMOTION_STRINGIFIED_CSS_ERROR__","frame","FallbackTitle","className","FallbackSubtitle","FallbackContent","FallbackFooter","confirmLabel","hideConfirm","cancelLabel","hideCancel","onCancel","_jsxs","onClick","defaultValidate","useActiveModalCount","validate","refreshKey","count","FallbackForegroundFrame","forwardRef","onChangeOrder","ref","activeCount","level","offset","stacked","Math","floor","style","marginBottom","marginLeft","transform","ConfigurationContext","ConfigurationContextProvider","TitleComponent","SubtitleComponent","ContentComponent","FooterComponent","backdrop","useConfigurationContext","useConfigurationDuration","context","milliseconds","useConfigurationBackdrop","UserDefinedContext","UserDefinedContextProvider","contextValue","useUserDefinedContext","setPathname","window","location","requestId","checkPathname","cancelAnimationFrame","requestAnimationFrame","BackgroundFrame","userDefinedContext","handleClose","event","stopPropagation","Background","cx","visible$1","active$1","foreground","AlertInner","handlers","handleConfirm","useHandle","Fragment","isString","renderComponent","ConfirmInner","cancel","PromptInner","checkDisabled","withErrorBoundary","setValue","handleChange","inputValue","input","isFunction","ForegroundFrame","Foreground","useSubscribeModal","version","update","useVersion","useEffect","presenter","increment","counterFactory","Presenter","handleChangeOrder","zIndex","validateDimmable","Anchor","transitionDuration","backgroundColor","map","bootstrap","createPortal","useInitialize","permitted","anchorRef","handleInitialize","printError","info","BootstrapProvider","useExternalPathname","handleRef","useDefaultPathname","useImperativeHandle","initialize","useOnMount","remove","useBootstrap","mode","element","portal","useDestroyAfter","tick","reference","timer","clearTimeout","useModalAnimation","handlerRef","onVisible","onHidden"],"mappings":"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"}
|