{"version":3,"file":"use-collapse.mjs","sources":["../../../src/components/Collapse/use-collapse.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { mergeRefs, useDidUpdate } from '@raikou/hooks';\nimport { CSSProperties } from '../../core';\n\nfunction getAutoHeightDuration(height: number | string) {\n  if (!height || typeof height === 'string') {\n    return 0;\n  }\n  const constant = height / 36;\n  return Math.round((4 + 15 * constant ** 0.25 + constant / 5) * 10);\n}\n\nexport function getElementHeight(\n  el: React.RefObject<HTMLElement> | { current?: { scrollHeight: number } }\n) {\n  return el?.current ? el.current.scrollHeight : 'auto';\n}\n\nconst raf = typeof window !== 'undefined' && window.requestAnimationFrame;\n\ninterface UseCollapse {\n  opened: boolean;\n  transitionDuration?: number;\n  transitionTimingFunction?: string;\n  onTransitionEnd?: () => void;\n}\n\ninterface GetCollapseProps {\n  [key: string]: unknown;\n  style?: CSSProperties;\n  onTransitionEnd?: (e: TransitionEvent) => void;\n  refKey?: string;\n  ref?: React.ForwardedRef<HTMLDivElement>;\n}\n\nexport function useCollapse({\n  transitionDuration,\n  transitionTimingFunction = 'ease',\n  onTransitionEnd = () => {},\n  opened,\n}: UseCollapse): (props: GetCollapseProps) => Record<string, any> {\n  const el = useRef<HTMLElement | null>(null);\n  const collapsedHeight = 0;\n  const collapsedStyles = {\n    display: 'none',\n    height: 0,\n    overflow: 'hidden',\n  };\n  const [styles, setStylesRaw] = useState<CSSProperties>(opened ? {} : collapsedStyles);\n  const setStyles = (newStyles: {} | ((oldStyles: {}) => {})): void => {\n    flushSync(() => setStylesRaw(newStyles));\n  };\n\n  const mergeStyles = (newStyles: {}): void => {\n    setStyles((oldStyles) => ({ ...oldStyles, ...newStyles }));\n  };\n\n  function getTransitionStyles(height: number | string): {\n    transition: string;\n  } {\n    const _duration = transitionDuration || getAutoHeightDuration(height);\n    return {\n      transition: `height ${_duration}ms ${transitionTimingFunction}, opacity ${_duration}ms ${transitionTimingFunction}`,\n    };\n  }\n\n  useDidUpdate(() => {\n    if (typeof raf === 'function') {\n      if (opened) {\n        raf(() => {\n          mergeStyles({ willChange: 'height', display: 'block', overflow: 'hidden' });\n          raf(() => {\n            const height = getElementHeight(el);\n            mergeStyles({ ...getTransitionStyles(height), height });\n          });\n        });\n      } else {\n        raf(() => {\n          const height = getElementHeight(el);\n          mergeStyles({ ...getTransitionStyles(height), willChange: 'height', height });\n          raf(() => mergeStyles({ height: collapsedHeight, overflow: 'hidden' }));\n        });\n      }\n    }\n  }, [opened]);\n\n  const handleTransitionEnd = (e: React.TransitionEvent): void => {\n    if (e.target !== el.current || e.propertyName !== 'height') {\n      return;\n    }\n\n    if (opened) {\n      const height = getElementHeight(el);\n\n      if (height === styles.height) {\n        setStyles({});\n      } else {\n        mergeStyles({ height });\n      }\n\n      onTransitionEnd();\n    } else if (styles.height === collapsedHeight) {\n      setStyles(collapsedStyles);\n      onTransitionEnd();\n    }\n  };\n\n  function getCollapseProps({ style = {}, refKey = 'ref', ...rest }: GetCollapseProps = {}) {\n    const theirRef: any = rest[refKey];\n    return {\n      'aria-hidden': !opened,\n      ...rest,\n      [refKey]: mergeRefs(el, theirRef),\n      onTransitionEnd: handleTransitionEnd,\n      style: { boxSizing: 'border-box', ...style, ...styles },\n    };\n  }\n\n  return getCollapseProps;\n}\n"],"names":[],"mappings":"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"}