UNPKG

@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 1.79 kB
import{EventEmitter as t}from"@vegajs/shared";import{createConfirmId as i,isConfirmModalUnit as e,isModalUnit as s}from"../utils";class r{constructor(){this.queue=[],this.modalEmitter=new t,this.currentEmitter=new t,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(s(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,i)=>{const e=this.modalEmitter.listeners.length>0;e&&this.modalEmitter.emit({status:t,data:i}),t&&e&&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 i=this.currentEmitter.subscribe(t);return this.current&&t(this.current||null),i}get isConfirm(){return e(this.current)}showConfirm(){const t=this.current;if(s(t)&&t.confirmComponent){const e={id:i(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 i=this.queue.find((({id:i})=>t.id===i));if(i)return this.queue=this.queue.filter((({id:t})=>t!==i.id)),this.queue.push(i),this.notify(i),this.modalEmitter;const e={...t,onResolve:this.onResolve};return this.queue.push(e),this.notify(e),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)}))}}export{r as ModalController};