@chakra-ui/modal
Version:
An accessible dialog (modal) component for React & Chakra UI
1 lines • 1.91 kB
Source Map (JSON)
{"version":3,"sources":["../src/modal-manager.ts"],"sourcesContent":["import { RefObject, useEffect, useState } from \"react\"\n\n/**\n * Proper state management for nested modals.\n * Simplified, but inspired by material-ui's ModalManager class.\n */\nclass ModalManager {\n modals: Map<HTMLElement, number>\n constructor() {\n this.modals = new Map()\n }\n\n add(modal: HTMLElement) {\n this.modals.set(modal, this.modals.size + 1)\n return this.modals.size\n }\n\n remove(modal: HTMLElement) {\n this.modals.delete(modal)\n }\n\n isTopModal(modal: HTMLElement | null) {\n if (!modal) return false\n return this.modals.get(modal) === this.modals.size\n }\n}\n\nexport const modalManager = new ModalManager()\n\nexport function useModalManager(ref: RefObject<HTMLElement>, isOpen?: boolean) {\n const [index, setIndex] = useState(0)\n\n useEffect(() => {\n const node = ref.current\n\n if (!node) return\n\n if (isOpen) {\n const index = modalManager.add(node)\n setIndex(index)\n }\n\n return () => {\n modalManager.remove(node)\n setIndex(0)\n }\n }, [isOpen, ref])\n\n return index\n}\n"],"mappings":";;;;;;AAAA,SAAoB,WAAW,gBAAgB;AAM/C,IAAM,eAAN,MAAmB;AAAA,EAEjB,cAAc;AADd;AAEE,SAAK,SAAS,oBAAI,IAAI;AAAA,EACxB;AAAA,EAEA,IAAI,OAAoB;AACtB,SAAK,OAAO,IAAI,OAAO,KAAK,OAAO,OAAO,CAAC;AAC3C,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,OAAO,OAAoB;AACzB,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,WAAW,OAA2B;AACpC,QAAI,CAAC;AAAO,aAAO;AACnB,WAAO,KAAK,OAAO,IAAI,KAAK,MAAM,KAAK,OAAO;AAAA,EAChD;AACF;AAEO,IAAM,eAAe,IAAI,aAAa;AAEtC,SAAS,gBAAgB,KAA6B,QAAkB;AAC7E,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,CAAC;AAEpC,YAAU,MAAM;AACd,UAAM,OAAO,IAAI;AAEjB,QAAI,CAAC;AAAM;AAEX,QAAI,QAAQ;AACV,YAAMA,SAAQ,aAAa,IAAI,IAAI;AACnC,eAASA,MAAK;AAAA,IAChB;AAEA,WAAO,MAAM;AACX,mBAAa,OAAO,IAAI;AACxB,eAAS,CAAC;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,QAAQ,GAAG,CAAC;AAEhB,SAAO;AACT;","names":["index"]}