react-snappy-modal
Version:
Flexible and easy-to-use modal library for React, supporting customizable dialogs with promise-based interactions.
1 lines • 5.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/SnappyModal.tsx","../src/context/useSnappyModalState.tsx"],"sourcesContent":["import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport \"./SnappyModal.css\";\nimport { SnappyModalExternalStore } from \"./context/useSnappyModalState\";\n\nconst currentComponents: ModalProgress[] = [];\nexport class SnappyModal {\n static isShow() {\n return currentComponents.length > 0;\n }\n\n static getCurrentComponent(layer: number) {\n return currentComponents.find(c => c.options.layer === layer);\n }\n\n static removeModalProcess(layer: number) {\n const index = currentComponents.findIndex(c => c.options.layer === layer);\n if (index === -1) return;\n currentComponents.splice(index, 1);\n SnappyModalExternalStore.emitChange();\n }\n\n static getModalProcess() {\n return currentComponents;\n }\n\n static close(value?: any, layer = 0) {\n const currentComponent = this.getCurrentComponent(layer);\n currentComponent?.resolve(value);\n this.removeModalProcess(layer);\n }\n\n static throw(thrower?: any, layer = 0) {\n const currentComponent = this.getCurrentComponent(layer);\n currentComponent?.throw(thrower);\n this.removeModalProcess(layer);\n currentComponent?.throw(thrower);\n }\n\n static show(\n component: React.ReactElement,\n options?: SnappyModalOptions,\n ): Promise<any> {\n const dialogOptions = {\n ...defaultDialogOptions,\n ...options,\n };\n\n return new Promise((resolve, reject) => {\n currentComponents.push({\n component: () => <React.Fragment>{component}</React.Fragment>,\n options: dialogOptions,\n resolve: (value: any) => {\n resolve(value);\n SnappyModalExternalStore.emitChange();\n },\n throw: (thrower: any) => {\n reject(thrower);\n SnappyModalExternalStore.emitChange();\n },\n });\n currentComponents.sort((a, b) => a.options.layer - b.options.layer);\n SnappyModalExternalStore.emitChange();\n });\n }\n}\n\nexport interface ModalProgress {\n component: React.FC<any>;\n options: SnappyModalOptions;\n resolve: (value?: any) => void;\n throw: (thrower?: any) => void;\n}\n\nconst defaultDialogOptions: SnappyModalOptions = {\n allowOutsideClick: true,\n allowScroll: false,\n backdrop: true,\n position: \"center\",\n layer: 0,\n};\n\ntype SnappyModalPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"center-left\"\n | \"center\"\n | \"center-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n\nexport type SnappyModalOptions = {\n allowOutsideClick?: boolean;\n allowScroll?: boolean;\n backdrop?: boolean | string;\n position?: SnappyModalPosition;\n zIndex?: number;\n layer?: number;\n};\n","import { ModalProgress, SnappyModal } from \"../SnappyModal\";\nimport { useSyncExternalStore } from \"react\";\n\nlet snappyModalListeners = [];\nlet snappyModalState: {\n isShow: boolean;\n modalProgress: ModalProgress[];\n} = {\n isShow: false,\n modalProgress: [],\n};\n\nfunction emitChange() {\n for (const listener of snappyModalListeners) {\n listener();\n }\n}\n\nexport const SnappyModalExternalStore = {\n emitChange: () => {\n snappyModalState = {\n isShow: SnappyModal.isShow(),\n modalProgress: [...SnappyModal.getModalProcess()],\n };\n emitChange();\n },\n subscribe(listener: () => unknown) {\n snappyModalListeners = [...snappyModalListeners, listener];\n return () => {\n snappyModalListeners = snappyModalListeners.filter(l => l !== listener);\n };\n },\n getSnappyModalState() {\n return snappyModalState;\n },\n};\n\nexport const useSnappyModalState = () => {\n return useSyncExternalStore(\n SnappyModalExternalStore.subscribe,\n SnappyModalExternalStore.getSnappyModalState,\n );\n};\n"],"mappings":";AAAA,OAAO,WAAW;AAElB,OAAO;;;ACDP,SAAS,4BAA4B;AAErC,IAAI,uBAAuB,CAAC;AAC5B,IAAI,mBAGA;AAAA,EACF,QAAQ;AAAA,EACR,eAAe,CAAC;AAClB;AAEA,SAAS,aAAa;AACpB,aAAW,YAAY,sBAAsB;AAC3C,aAAS;AAAA,EACX;AACF;AAEO,IAAM,2BAA2B;AAAA,EACtC,YAAY,MAAM;AAChB,uBAAmB;AAAA,MACjB,QAAQ,YAAY,OAAO;AAAA,MAC3B,eAAe,CAAC,GAAG,YAAY,gBAAgB,CAAC;AAAA,IAClD;AACA,eAAW;AAAA,EACb;AAAA,EACA,UAAU,UAAyB;AACjC,2BAAuB,CAAC,GAAG,sBAAsB,QAAQ;AACzD,WAAO,MAAM;AACX,6BAAuB,qBAAqB,OAAO,OAAK,MAAM,QAAQ;AAAA,IACxE;AAAA,EACF;AAAA,EACA,sBAAsB;AACpB,WAAO;AAAA,EACT;AACF;;;ADeyB;AA7CzB,IAAM,oBAAqC,CAAC;AACrC,IAAM,cAAN,MAAkB;AAAA,EACvB,OAAO,SAAS;AACd,WAAO,kBAAkB,SAAS;AAAA,EACpC;AAAA,EAEA,OAAO,oBAAoB,OAAe;AACxC,WAAO,kBAAkB,KAAK,OAAK,EAAE,QAAQ,UAAU,KAAK;AAAA,EAC9D;AAAA,EAEA,OAAO,mBAAmB,OAAe;AACvC,UAAM,QAAQ,kBAAkB,UAAU,OAAK,EAAE,QAAQ,UAAU,KAAK;AACxE,QAAI,UAAU;AAAI;AAClB,sBAAkB,OAAO,OAAO,CAAC;AACjC,6BAAyB,WAAW;AAAA,EACtC;AAAA,EAEA,OAAO,kBAAkB;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,OAAa,QAAQ,GAAG;AACnC,UAAM,mBAAmB,KAAK,oBAAoB,KAAK;AACvD,sBAAkB,QAAQ,KAAK;AAC/B,SAAK,mBAAmB,KAAK;AAAA,EAC/B;AAAA,EAEA,OAAO,MAAM,SAAe,QAAQ,GAAG;AACrC,UAAM,mBAAmB,KAAK,oBAAoB,KAAK;AACvD,sBAAkB,MAAM,OAAO;AAC/B,SAAK,mBAAmB,KAAK;AAC7B,sBAAkB,MAAM,OAAO;AAAA,EACjC;AAAA,EAEA,OAAO,KACL,WACA,SACc;AACd,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,wBAAkB,KAAK;AAAA,QACrB,WAAW,MAAM,oBAAC,MAAM,UAAN,EAAgB,qBAAU;AAAA,QAC5C,SAAS;AAAA,QACT,SAAS,CAAC,UAAe;AACvB,kBAAQ,KAAK;AACb,mCAAyB,WAAW;AAAA,QACtC;AAAA,QACA,OAAO,CAAC,YAAiB;AACvB,iBAAO,OAAO;AACd,mCAAyB,WAAW;AAAA,QACtC;AAAA,MACF,CAAC;AACD,wBAAkB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,QAAQ,EAAE,QAAQ,KAAK;AAClE,+BAAyB,WAAW;AAAA,IACtC,CAAC;AAAA,EACH;AACF;AASA,IAAM,uBAA2C;AAAA,EAC/C,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AACT;","names":[]}