@coreui/react
Version:
UI Components Library for React.js
50 lines (39 loc) • 1.24 kB
text/typescript
import { useRef } from 'react'
import { createPopper } from '@popperjs/core'
import type { Instance, Options } from '@popperjs/core'
interface UsePopperOutput {
popper: Instance | undefined
initPopper: (reference: HTMLElement, popper: HTMLElement, options: Partial<Options>) => void
destroyPopper: () => void
updatePopper: (options?: Partial<Options>) => void
}
export const usePopper = (): UsePopperOutput => {
const _popper = useRef<Instance>(undefined)
const el = useRef<HTMLElement>(null)
const initPopper = (reference: HTMLElement, popper: HTMLElement, options: Partial<Options>) => {
_popper.current = createPopper(reference, popper, options)
el.current = popper
}
const destroyPopper = () => {
const popperInstance = _popper.current
if (popperInstance && el.current) {
popperInstance.destroy()
}
_popper.current = undefined
}
const updatePopper = (options?: Partial<Options>) => {
const popperInstance = _popper.current
if (popperInstance && options) {
popperInstance.setOptions(options)
}
if (popperInstance) {
popperInstance.update()
}
}
return {
popper: _popper.current,
initPopper,
destroyPopper,
updatePopper,
}
}