import { useInterval } from '@past3lle/hooks' import { Placement } from '@popperjs/core' import { Portal } from '@reach/portal' import React, { useCallback, useState } from 'react' import { usePopper } from 'react-popper' import { Arrow, PopoverContainer, ReferenceElement } from './styleds' export interface PopoverProps { content: React.ReactNode show: boolean children: React.ReactNode placement?: Placement } export function Popover({ content, show, children, placement = 'auto' }: PopoverProps) { const [referenceElement, setReferenceElement] = useState(null) const [popperElement, setPopperElement] = useState(null) const [arrowElement, setArrowElement] = useState(null) const { styles, update, attributes } = usePopper(referenceElement, popperElement, { placement, strategy: 'fixed', modifiers: [ { name: 'offset', options: { offset: [8, 8] } }, { name: 'arrow', options: { element: arrowElement } } ] }) const updateCallback = useCallback(() => { update && update() }, [update]) useInterval(updateCallback, show ? 100 : null) return ( <> {children} {content} ) }