{"version":3,"file":"useDisclosure.cjs","sources":["../../../src/components/Disclosure/useDisclosure.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react'\n\nconst DISCLOSURE_CHANGE_EVENT = 'smarthr-ui:disclosure-change'\ntype DisclosureChangeEventDetail = { id: string; expanded: boolean }\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n  interface DocumentEventMap {\n    [DISCLOSURE_CHANGE_EVENT]: CustomEvent<DisclosureChangeEventDetail>\n  }\n}\n\ntype Setter = (value: boolean | ((prev: boolean) => boolean)) => void\n\ntype UseDisclosureResult = [expanded: boolean, setExpanded: Setter]\n\n/**\n * 同じ `id` で呼ぶとイベント経由で状態が同期される custom hook\n */\nexport const useDisclosure = (id: string): UseDisclosureResult => {\n  const [expanded, setExpanded] = useState(false)\n\n  useEffect(() => {\n    document.dispatchEvent(\n      new CustomEvent<DisclosureChangeEventDetail>(DISCLOSURE_CHANGE_EVENT, {\n        detail: { id, expanded },\n      }),\n    )\n  }, [expanded, id])\n\n  const handleDisclosureChange = useCallback(\n    (e: CustomEvent<DisclosureChangeEventDetail>) => {\n      if (id === e.detail.id) {\n        setExpanded(e.detail.expanded)\n      }\n    },\n    [id],\n  )\n\n  useEffect(() => {\n    document.addEventListener(DISCLOSURE_CHANGE_EVENT, handleDisclosureChange)\n    return () => {\n      document.removeEventListener(DISCLOSURE_CHANGE_EVENT, handleDisclosureChange)\n    }\n  }, [id, handleDisclosureChange])\n\n  const safeSetExpanded: Setter = useCallback(\n    (value) => {\n      // DisclosureTrigger と DisclosureContent のレンダリング順序に影響しないように animation frame を待ってから state を更新する\n      requestAnimationFrame(() => {\n        if (typeof value === 'function') {\n          const newValue = value(expanded)\n          setExpanded(newValue)\n        } else {\n          setExpanded(value)\n        }\n      })\n    },\n    [expanded],\n  )\n\n  return [expanded, safeSetExpanded]\n}\n"],"names":["useState","useEffect","useCallback"],"mappings":";;;;AAEA,MAAM,uBAAuB,GAAG,8BAA8B;AAc9D;;AAEG;AACI,MAAM,aAAa,GAAG,CAAC,EAAU,KAAyB;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IAE/CC,eAAS,CAAC,MAAK;AACb,QAAA,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAA8B,uBAAuB,EAAE;AACpE,YAAA,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE;AACzB,SAAA,CAAC,CACH;AACH,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAElB,IAAA,MAAM,sBAAsB,GAAGC,iBAAW,CACxC,CAAC,CAA2C,KAAI;QAC9C,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE;AACtB,YAAA,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChC;AACF,IAAA,CAAC,EACD,CAAC,EAAE,CAAC,CACL;IAEDD,eAAS,CAAC,MAAK;AACb,QAAA,QAAQ,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;AAC1E,QAAA,OAAO,MAAK;AACV,YAAA,QAAQ,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;AAC/E,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;AAEhC,IAAA,MAAM,eAAe,GAAWC,iBAAW,CACzC,CAAC,KAAK,KAAI;;QAER,qBAAqB,CAAC,MAAK;AACzB,YAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAChC,WAAW,CAAC,QAAQ,CAAC;YACvB;iBAAO;gBACL,WAAW,CAAC,KAAK,CAAC;YACpB;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,EACD,CAAC,QAAQ,CAAC,CACX;AAED,IAAA,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC;AACpC;;;;"}