{ "version": 3, "sources": ["../../../../src/lib/ui/hooks/useMenuIsOpen.ts"], "sourcesContent": ["import { useEditor, useValue } from '@tldraw/editor'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { useUiEvents } from './useEventsProvider'\n\n/** @public */\nexport function useMenuIsOpen(id: string, cb?: (isOpen: boolean) => void) {\n\tconst editor = useEditor()\n\tconst rIsOpen = useRef(false)\n\tconst trackEvent = useUiEvents()\n\n\tconst onOpenChange = useCallback(\n\t\t(isOpen: boolean) => {\n\t\t\trIsOpen.current = isOpen\n\t\t\teditor.batch(() => {\n\t\t\t\tif (isOpen) {\n\t\t\t\t\teditor.complete()\n\t\t\t\t\teditor.addOpenMenu(id)\n\t\t\t\t} else {\n\t\t\t\t\teditor.updateInstanceState({\n\t\t\t\t\t\topenMenus: editor.openMenus.filter((m) => !m.startsWith(id)),\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tcb?.(isOpen)\n\t\t\t})\n\t\t},\n\t\t[editor, id, cb]\n\t)\n\n\tuseEffect(() => {\n\t\t// When the effect runs, if the menu is open then\n\t\t// add it to the open menus list.\n\n\t\t// This is necessary for cases where the user closes\n\t\t// the parent of a submenu before closing the submenu.\n\t\t// There is some duplication between this and `onOpenChange`\n\t\t// hook but it's necessary to handle the case where the\n\t\t// this effect runs twice or re-runs.\n\t\tif (rIsOpen.current) {\n\t\t\ttrackEvent('open-menu', { source: 'unknown', id })\n\t\t\teditor.addOpenMenu(id)\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (rIsOpen.current) {\n\t\t\t\t// Close menu on unmount\n\t\t\t\teditor.deleteOpenMenu(id)\n\n\t\t\t\t// Close menu and all submenus when the parent is closed\n\t\t\t\teditor.openMenus.forEach((menuId) => {\n\t\t\t\t\tif (menuId.startsWith(id)) {\n\t\t\t\t\t\ttrackEvent('close-menu', { source: 'unknown', id })\n\t\t\t\t\t\teditor.deleteOpenMenu(menuId)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\trIsOpen.current = false\n\t\t\t}\n\t\t}\n\t}, [editor, id, trackEvent])\n\n\tconst isOpen = useValue('is menu open', () => editor.openMenus.includes(id), [editor, id])\n\n\treturn [isOpen, onOpenChange] as const\n}\n"], "mappings": "AAAA,SAAS,WAAW,gBAAgB;AACpC,SAAS,aAAa,WAAW,cAAc;AAC/C,SAAS,mBAAmB;AAGrB,SAAS,cAAc,IAAY,IAAgC;AACzE,QAAM,SAAS,UAAU;AACzB,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,aAAa,YAAY;AAE/B,QAAM,eAAe;AAAA,IACpB,CAACA,YAAoB;AACpB,cAAQ,UAAUA;AAClB,aAAO,MAAM,MAAM;AAClB,YAAIA,SAAQ;AACX,iBAAO,SAAS;AAChB,iBAAO,YAAY,EAAE;AAAA,QACtB,OAAO;AACN,iBAAO,oBAAoB;AAAA,YAC1B,WAAW,OAAO,UAAU,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;AAAA,UAC5D,CAAC;AAAA,QACF;AAEA,aAAKA,OAAM;AAAA,MACZ,CAAC;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,YAAU,MAAM;AASf,QAAI,QAAQ,SAAS;AACpB,iBAAW,aAAa,EAAE,QAAQ,WAAW,GAAG,CAAC;AACjD,aAAO,YAAY,EAAE;AAAA,IACtB;AAEA,WAAO,MAAM;AACZ,UAAI,QAAQ,SAAS;AAEpB,eAAO,eAAe,EAAE;AAGxB,eAAO,UAAU,QAAQ,CAAC,WAAW;AACpC,cAAI,OAAO,WAAW,EAAE,GAAG;AAC1B,uBAAW,cAAc,EAAE,QAAQ,WAAW,GAAG,CAAC;AAClD,mBAAO,eAAe,MAAM;AAAA,UAC7B;AAAA,QACD,CAAC;AAED,gBAAQ,UAAU;AAAA,MACnB;AAAA,IACD;AAAA,EACD,GAAG,CAAC,QAAQ,IAAI,UAAU,CAAC;AAE3B,QAAM,SAAS,SAAS,gBAAgB,MAAM,OAAO,UAAU,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;AAEzF,SAAO,CAAC,QAAQ,YAAY;AAC7B;", "names": ["isOpen"] }