@tldraw/editor
Version:
tldraw infinite canvas SDK (editor).
8 lines (7 loc) • 2.64 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/lib/hooks/useGlobalMenuIsOpen.ts"],
"sourcesContent": ["import { useValue } from '@tldraw/state-react'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { tlmenus } from '../globals/menus'\n\n/** @public */\nexport function useGlobalMenuIsOpen(\n\tid: string,\n\tonChange?: (isOpen: boolean) => void,\n\tonEvent?: (id: string) => void\n) {\n\tconst rIsOpen = useRef(false)\n\n\tconst onOpenChange = useCallback(\n\t\t(isOpen: boolean) => {\n\t\t\trIsOpen.current = isOpen\n\n\t\t\tif (isOpen) {\n\t\t\t\ttlmenus.addOpenMenu(id)\n\t\t\t} else {\n\t\t\t\ttlmenus.deleteOpenMenu(id)\n\t\t\t}\n\n\t\t\tonChange?.(isOpen)\n\t\t},\n\t\t[id, onChange]\n\t)\n\n\tconst isOpen = useValue('is menu open', () => tlmenus.getOpenMenus().includes(id), [id])\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\tonEvent?.('open-menu')\n\t\t\ttlmenus.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\ttlmenus.deleteOpenMenu(id)\n\n\t\t\t\t// Close menu and all submenus when the parent is closed\n\t\t\t\ttlmenus.getOpenMenus().forEach((menuId) => {\n\t\t\t\t\tif (menuId.startsWith(id)) {\n\t\t\t\t\t\tonEvent?.('close-menu')\n\t\t\t\t\t\ttlmenus.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}, [id, onEvent])\n\n\treturn [isOpen, onOpenChange] as const\n}\n"],
"mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,aAAa,WAAW,cAAc;AAC/C,SAAS,eAAe;AAGjB,SAAS,oBACf,IACA,UACA,SACC;AACD,QAAM,UAAU,OAAO,KAAK;AAE5B,QAAM,eAAe;AAAA,IACpB,CAACA,YAAoB;AACpB,cAAQ,UAAUA;AAElB,UAAIA,SAAQ;AACX,gBAAQ,YAAY,EAAE;AAAA,MACvB,OAAO;AACN,gBAAQ,eAAe,EAAE;AAAA,MAC1B;AAEA,iBAAWA,OAAM;AAAA,IAClB;AAAA,IACA,CAAC,IAAI,QAAQ;AAAA,EACd;AAEA,QAAM,SAAS,SAAS,gBAAgB,MAAM,QAAQ,aAAa,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;AAEvF,YAAU,MAAM;AASf,QAAI,QAAQ,SAAS;AACpB,gBAAU,WAAW;AACrB,cAAQ,YAAY,EAAE;AAAA,IACvB;AAEA,WAAO,MAAM;AACZ,UAAI,QAAQ,SAAS;AAEpB,gBAAQ,eAAe,EAAE;AAGzB,gBAAQ,aAAa,EAAE,QAAQ,CAAC,WAAW;AAC1C,cAAI,OAAO,WAAW,EAAE,GAAG;AAC1B,sBAAU,YAAY;AACtB,oBAAQ,eAAe,MAAM;AAAA,UAC9B;AAAA,QACD,CAAC;AAED,gBAAQ,UAAU;AAAA,MACnB;AAAA,IACD;AAAA,EACD,GAAG,CAAC,IAAI,OAAO,CAAC;AAEhB,SAAO,CAAC,QAAQ,YAAY;AAC7B;",
"names": ["isOpen"]
}