@@ -64,6 +64,25 @@ const POPUP_HEIGHT = 100;
6464const ANIMATION_DURATION = 300 ;
6565const CONFIRM_MODAL_OVERLAY_CLASS = 'pp-dev-info__confirm-overlay' ;
6666
67+ const activeConfirmModals = new Map <
68+ HTMLDivElement ,
69+ { resolve : ( value : boolean ) => void ; onKeyDown : ( event : KeyboardEvent ) => void }
70+ > ( ) ;
71+
72+ function teardownConfirmModal ( overlay : HTMLDivElement , result : boolean ) {
73+ const entry = activeConfirmModals . get ( overlay ) ;
74+
75+ if ( ! entry ) {
76+ return ;
77+ }
78+
79+ document . removeEventListener ( 'keydown' , entry . onKeyDown ) ;
80+
81+ activeConfirmModals . delete ( overlay ) ;
82+ overlay . remove ( ) ;
83+ entry . resolve ( result ) ;
84+ }
85+
6786function createPopupElement ( opts : InfoPopupOptions ) : HTMLDivElement {
6887 const $popup = document . createElement ( 'div' ) ;
6988
@@ -220,64 +239,73 @@ function infoPopup(opts: InfoPopupOptions) {
220239 }
221240}
222241
223- function closeConfirmModalByResult ( overlay : HTMLDivElement , resolve : ( value : boolean ) => void , value : boolean ) {
224- overlay . remove ( ) ;
225- resolve ( value ) ;
226- }
227-
228242function closeAllConfirmModals ( ) {
229- document . querySelectorAll ( `.${ CONFIRM_MODAL_OVERLAY_CLASS } ` ) . forEach ( ( element ) => element . remove ( ) ) ;
243+ for ( const overlay of [ ...activeConfirmModals . keys ( ) ] ) {
244+ teardownConfirmModal ( overlay , false ) ;
245+ }
230246}
231247
232248function confirmModal ( opts : ConfirmModalOptions ) : Promise < boolean > {
233249 closeAllConfirmModals ( ) ;
234250
235251 return new Promise < boolean > ( ( resolve ) => {
236252 const $overlay = document . createElement ( 'div' ) ;
253+
237254 $overlay . classList . add ( 'pp-dev-info-namespace' , CONFIRM_MODAL_OVERLAY_CLASS ) ;
255+
238256 const $confirm = document . createElement ( 'div' ) ;
257+
239258 $confirm . classList . add ( 'pp-dev-info__confirm' ) ;
259+
240260 const $title = document . createElement ( 'div' ) ;
261+
241262 $title . classList . add ( 'pp-dev-info__confirm-title' ) ;
242263 $title . textContent = opts . title ;
264+
243265 const $content = document . createElement ( 'div' ) ;
266+
244267 $content . classList . add ( 'pp-dev-info__confirm-content' ) ;
245268 $content . textContent = opts . content ;
269+
246270 const $actions = document . createElement ( 'div' ) ;
271+
247272 $actions . classList . add ( 'pp-dev-info__confirm-actions' ) ;
273+
248274 const $cancelButton = document . createElement ( 'button' ) ;
275+
249276 $cancelButton . type = 'button' ;
250277 $cancelButton . classList . add ( 'pp-dev-info__confirm-btn' , 'pp-dev-info__confirm-btn--cancel' ) ;
251278 $cancelButton . textContent = opts . cancelText ;
279+
252280 const $confirmButton = document . createElement ( 'button' ) ;
281+
253282 $confirmButton . type = 'button' ;
254283 $confirmButton . classList . add ( 'pp-dev-info__confirm-btn' , 'pp-dev-info__confirm-btn--confirm' ) ;
255284 $confirmButton . textContent = opts . confirmText ;
285+
256286 $actions . append ( $cancelButton , $confirmButton ) ;
257287 $confirm . append ( $title , $content , $actions ) ;
258288 $overlay . appendChild ( $confirm ) ;
259289
260290 const onKeyDown = ( event : KeyboardEvent ) => {
261291 if ( event . key === 'Escape' ) {
262- document . removeEventListener ( 'keydown' , onKeyDown ) ;
263- closeConfirmModalByResult ( $overlay , resolve , false ) ;
292+ teardownConfirmModal ( $overlay , false ) ;
264293 }
265294 } ;
266295
296+ activeConfirmModals . set ( $overlay , { resolve, onKeyDown } ) ;
297+
267298 $confirmButton . addEventListener ( 'click' , ( ) => {
268- document . removeEventListener ( 'keydown' , onKeyDown ) ;
269- closeConfirmModalByResult ( $overlay , resolve , true ) ;
299+ teardownConfirmModal ( $overlay , true ) ;
270300 } ) ;
271301
272302 $cancelButton . addEventListener ( 'click' , ( ) => {
273- document . removeEventListener ( 'keydown' , onKeyDown ) ;
274- closeConfirmModalByResult ( $overlay , resolve , false ) ;
303+ teardownConfirmModal ( $overlay , false ) ;
275304 } ) ;
276305
277306 $overlay . addEventListener ( 'click' , ( event ) => {
278307 if ( event . target === $overlay ) {
279- document . removeEventListener ( 'keydown' , onKeyDown ) ;
280- closeConfirmModalByResult ( $overlay , resolve , false ) ;
308+ teardownConfirmModal ( $overlay , false ) ;
281309 }
282310 } ) ;
283311
0 commit comments