import React, { FC, ReactNode, useEffect, useState, useRef } from 'react'; import { useLayer, Arrow } from 'react-laag'; import { PopUpButton, PopUpBody } from './style'; type TPlacements = | 'bottom-start' | 'bottom-end' | 'bottom-center' | 'top-start' | 'top-center' | 'top-end'; export interface Props { body: ReactNode; active?: boolean; fullWidth?: boolean; padding?: string | number; borderRadius?: number; onOpenChange?: (val: boolean) => void; trigger?: boolean; placement?: TPlacements; arrow?: boolean; disableClickOutside?: boolean; disableAutoTrigger?: boolean; unsetWidth?: boolean; disableMaxHeight?: boolean; limitPlacements?: boolean; fullHeightContent?: boolean; } export const Popup: FC = ({ children, body, onOpenChange, padding = 0.5, borderRadius = 5, fullWidth = false, trigger, placement = 'bottom-center', arrow = false, disableAutoTrigger = false, disableClickOutside = false, unsetWidth = false, disableMaxHeight = false, limitPlacements = false, fullHeightContent, }) => { const [isOpen, setOpen] = useState(false); const ref = useRef(null); const [width, setWidth] = useState(); useEffect(() => { if (fullWidth && ref.current) { // @ts-ignore: Object is possibly 'null'. setWidth(ref.current.offsetWidth); } }, [ref.current, fullWidth]); useEffect(() => { if (onOpenChange) { onOpenChange(isOpen); } }, [isOpen]); useEffect(() => { if (trigger !== undefined) { setOpen(trigger); } }, [trigger]); const { renderLayer, triggerProps, layerProps, arrowProps } = useLayer({ isOpen, placement: placement, auto: true, possiblePlacements: [ 'bottom-start', 'bottom-end', 'bottom-center', 'top-start', 'top-center', 'top-end', ], triggerOffset: 2, containerOffset: 13, arrowOffset: 8, onOutsideClick: () => { if (!disableClickOutside) { setOpen(false); } }, }); return ( <>
{ if (!disableAutoTrigger) { setOpen(!isOpen); } }} style={{ height: fullHeightContent ? '100%' : undefined }} > {children}
{isOpen && renderLayer(
{body} {arrow && }
)} ); };