@vegajs/modal-controller
Version:
A flexible modal management system for React applications, featuring ModalContainer, ModalProvider, and ModalController components for advanced and intuitive modal workflows.
1 lines • 2.23 kB
JavaScript
"use strict";var t,e=Object.defineProperty,i=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,n={};((t,i)=>{for(var s in i)e(t,s,{get:i[s],enumerable:!0})})(n,{ModalController:()=>h}),module.exports=(t=n,((t,n,o,u)=>{if(n&&"object"===typeof n||"function"===typeof n)for(let h of s(n))r.call(t,h)||h===o||e(t,h,{get:()=>n[h],enumerable:!(u=i(n,h))||u.enumerable});return t})(e({},"__esModule",{value:!0}),t));var o=require("@vegajs/shared"),u=require("../utils");class h{constructor(){this.queue=[],this.modalEmitter=new o.EventEmitter,this.currentEmitter=new o.EventEmitter,this.closeLastListener=()=>{const t=this.modalEmitter.listeners.at(-1);this.modalEmitter.unsubscribe(t)},this.getCurrent=()=>this.current,this.onClose=()=>{const t=this.current;if(!t)return;if((0,u.isModalUnit)(t)&&t.confirmComponent)return void this.showConfirm();if(this.isConfirm)return void this.closeConfirm();this.modalEmitter.listeners.length>0&&this.closeLastListener(),this.queue.pop(),this.notify(null)},this.onResolve=(t,e)=>{const i=this.modalEmitter.listeners.length>0;i&&this.modalEmitter.emit({status:t,data:e}),t&&i&&this.closeLastListener(),this.isConfirm&&this.closeConfirm(),t&&(this.queue.pop(),this.notify(this.queue.at(-1)||null))}}notify(t){this.currentEmitter.emit(t)}subscribe(t){const e=this.currentEmitter.subscribe(t);return this.current&&t(this.current||null),e}get isConfirm(){return(0,u.isConfirmModalUnit)(this.current)}showConfirm(){const t=this.current;if((0,u.isModalUnit)(t)&&t.confirmComponent){const e={id:(0,u.createConfirmId)(t.id),component:t.confirmComponent};return this.show(e)}}closeConfirm(){this.queue.pop(),this.notify(this.queue.at(-1)||null)}get current(){return this.queue[this.queue.length-1]}show(t){const e=this.queue.find((({id:e})=>t.id===e));if(e)return this.queue=this.queue.filter((({id:t})=>t!==e.id)),this.queue.push(e),this.notify(e),this.modalEmitter;const i={...t,onResolve:this.onResolve};return this.queue.push(i),this.notify(i),this.modalEmitter}closeAll(){this.queue=[],this.notify(null),this.modalEmitter.listeners.forEach((t=>{this.modalEmitter.unsubscribe(t)})),this.currentEmitter.listeners.forEach((t=>{this.currentEmitter.unsubscribe(t)}))}}