modal-manager.service.ts raw

   1  class ModalManagerService {
   2    static instance: ModalManagerService
   3  
   4    private modals: { id: string; cb: () => void }[] = []
   5  
   6    constructor() {
   7      if (!ModalManagerService.instance) {
   8        ModalManagerService.instance = this
   9      }
  10      return ModalManagerService.instance
  11    }
  12  
  13    register(id: string, cb: () => void) {
  14      const modal = this.modals.find((m) => m.id === id)
  15      if (modal) {
  16        // already registered, update callback
  17        modal.cb = cb
  18        return
  19      }
  20      this.modals.push({ id, cb })
  21    }
  22  
  23    unregister(id: string) {
  24      const modal = this.modals.find((m) => m.id === id)
  25      if (!modal) return
  26  
  27      modal.cb()
  28      this.modals = this.modals.filter((m) => m.id !== id)
  29    }
  30  
  31    pop() {
  32      const modal = this.modals.pop()
  33      if (!modal) return false
  34  
  35      modal.cb()
  36      return true
  37    }
  38  
  39    hasOpenModal() {
  40      return this.modals.length > 0
  41    }
  42  }
  43  
  44  const instance = new ModalManagerService()
  45  export default instance
  46