{"version":3,"file":"use-popover.mjs","sources":["../../../src/components/Popover/use-popover.ts"],"sourcesContent":["import { useRef } from 'react';\nimport {\n  arrow,\n  flip,\n  inline,\n  limitShift,\n  Middleware,\n  offset,\n  shift,\n  size,\n  useFloating,\n  UseFloatingReturn,\n} from '@floating-ui/react';\nimport { useDidUpdate, useUncontrolled } from '@raikou/hooks';\nimport {\n  FloatingAxesOffsets,\n  FloatingPosition,\n  FloatingStrategy,\n  useFloatingAutoUpdate,\n} from '../Floating';\nimport { PopoverMiddlewares, PopoverWidth } from './Popover.types';\n\ninterface UsePopoverOptions {\n  offset: number | FloatingAxesOffsets;\n  position: FloatingPosition;\n  positionDependencies: any[] | undefined;\n  onPositionChange?: (position: FloatingPosition) => void;\n  opened: boolean | undefined;\n  defaultOpened: boolean | undefined;\n  onChange?: (opened: boolean) => void;\n  onClose?: () => void;\n  onOpen?: () => void;\n  width: PopoverWidth;\n  middlewares: PopoverMiddlewares | undefined;\n  arrowRef: React.RefObject<HTMLDivElement>;\n  arrowOffset: number;\n  strategy?: FloatingStrategy;\n}\n\nfunction getDefaultMiddlewares(middlewares: PopoverMiddlewares | undefined): PopoverMiddlewares {\n  if (middlewares === undefined) {\n    return { shift: true, flip: true };\n  }\n\n  const result = { ...middlewares };\n  if (middlewares.shift === undefined) {\n    result.shift = true;\n  }\n\n  if (middlewares.flip === undefined) {\n    result.flip = true;\n  }\n\n  return result;\n}\n\nfunction getPopoverMiddlewares(\n  options: UsePopoverOptions,\n  getFloating: () => UseFloatingReturn<Element>\n) {\n  const middlewaresOptions = getDefaultMiddlewares(options.middlewares);\n  const middlewares: Middleware[] = [offset(options.offset)];\n\n  if (middlewaresOptions.shift) {\n    middlewares.push(\n      shift(\n        typeof middlewaresOptions.shift === 'boolean'\n          ? { limiter: limitShift(), padding: 5 }\n          : { limiter: limitShift(), padding: 5, ...middlewaresOptions.shift }\n      )\n    );\n  }\n\n  if (middlewaresOptions.flip) {\n    middlewares.push(\n      typeof middlewaresOptions.flip === 'boolean' ? flip() : flip(middlewaresOptions.flip)\n    );\n  }\n\n  if (middlewaresOptions.inline) {\n    middlewares.push(\n      typeof middlewaresOptions.inline === 'boolean' ? inline() : inline(middlewaresOptions.inline)\n    );\n  }\n\n  middlewares.push(arrow({ element: options.arrowRef, padding: options.arrowOffset }));\n\n  if (middlewaresOptions.size || options.width === 'target') {\n    middlewares.push(\n      size({\n        ...(typeof middlewaresOptions.size === 'boolean' ? {} : middlewaresOptions.size),\n        apply({ rects, availableWidth, availableHeight, ...rest }) {\n          const floating = getFloating();\n          const styles = floating.refs.floating.current?.style ?? {};\n\n          if (middlewaresOptions.size) {\n            //If custom apply function is given use that else set defaults\n            if (typeof middlewaresOptions.size === 'object' && !!middlewaresOptions.size.apply) {\n              middlewaresOptions.size.apply({ rects, availableWidth, availableHeight, ...rest });\n            } else {\n              Object.assign(styles, {\n                maxWidth: `${availableWidth}px`,\n                maxHeight: `${availableHeight}px`,\n              });\n            }\n          }\n\n          if (options.width === 'target') {\n            Object.assign(styles, {\n              width: `${rects.reference.width}px`,\n            });\n          }\n        },\n      })\n    );\n  }\n\n  return middlewares;\n}\n\nexport function usePopover(options: UsePopoverOptions): any {\n  const [_opened, setOpened] = useUncontrolled({\n    value: options.opened,\n    defaultValue: options.defaultOpened,\n    finalValue: false,\n    onChange: options.onChange,\n  });\n  const previouslyOpened = useRef(_opened);\n\n  const onClose = () => {\n    if (_opened) {\n      setOpened(false);\n    }\n  };\n\n  const onToggle = () => {\n    if (_opened) {\n      options.onClose?.();\n      setOpened(false);\n    } else {\n      options.onOpen?.();\n      setOpened(true);\n    }\n  };\n\n  const floating: UseFloatingReturn<Element> = useFloating({\n    strategy: options.strategy,\n    placement: options.position,\n    middleware: getPopoverMiddlewares(options, () => floating),\n  });\n\n  useFloatingAutoUpdate({\n    opened: _opened,\n    position: options.position,\n    positionDependencies: options.positionDependencies || [],\n    floating,\n  });\n\n  useDidUpdate(() => {\n    options.onPositionChange?.(floating.placement);\n  }, [floating.placement]);\n\n  useDidUpdate(() => {\n    if (_opened !== previouslyOpened.current) {\n      if (!_opened) {\n        options.onClose?.();\n      } else {\n        options.onOpen?.();\n      }\n    }\n    previouslyOpened.current = _opened;\n  }, [_opened, options.onClose, options.onOpen]);\n\n  return {\n    floating,\n    controlled: typeof options.opened === 'boolean',\n    opened: _opened,\n    onClose,\n    onToggle,\n  };\n}\n"],"names":[],"mappings":"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"}