import { useState, useId, forwardRef } from 'react' import styled from 'styled-components' import * as RadixPopover from '@radix-ui/react-popover' import Block from '../Primitives/Block/Block' import { PopoverV2Align, PopoverV2Props, PopoverV2Side, PopoverV2Size, } from './popoverV2.types' import PopoverV2Header from './PopoverV2Header' import PopoverV2Footer from './PopoverV2Footer' import { PopoverV2TokenType } from './popoverV2.token' import { useBreakpoints } from '../../hooks/useBreakPoints' import MobilePopoverV2 from './MobilePopoverV2' import { useResponsiveTokens } from '../../hooks/useResponsiveTokens' import { popoverContentAnimations } from '../Popover/popover.animations' import PopoverV2Skeleton from './PopoverV2Skeleton' import { BREAKPOINTS } from '../../breakpoints/breakPoints' const AnimatedPopoverSurface = styled(Block)` ${popoverContentAnimations} ` const PopoverV2 = forwardRef( ( { heading, description, trigger, children, showCloseButton = true, onOpenChange, open, asModal = false, primaryAction, secondaryAction, sideOffset = 8, side = PopoverV2Side.BOTTOM, align = PopoverV2Align.CENTER, alignOffset = 0, width, minWidth = 300, maxWidth = 400, height, minHeight, maxHeight, size = PopoverV2Size.MD, onClose, shadow = 'lg', useDrawerOnMobile = true, avoidCollisions = true, skeleton, }, ref ) => { const [internalOpen, setInternalOpen] = useState(false) const isControlled = open !== undefined const effectiveOpen = isControlled ? open : internalOpen const handleOpenChange = (nextOpen: boolean) => { if (!isControlled) { setInternalOpen(nextOpen) } onOpenChange?.(nextOpen) } const popoverTokens = useResponsiveTokens('POPOVERV2') const { breakPointLabel } = useBreakpoints(BREAKPOINTS) const isSmallScreen = breakPointLabel === 'sm' const hasHeading = Boolean( heading != null && (typeof heading !== 'string' || heading.trim() !== '') ) const hasDescription = Boolean( description != null && (typeof description !== 'string' || description.trim() !== '') ) const isCustomPopover = !hasHeading && !hasDescription && !primaryAction && !secondaryAction const shouldShowSkeleton = skeleton?.show const showBodySkeleton = skeleton?.bodySkeletonProps?.show const skeletonVariant = skeleton?.variant ?? 'pulse' const baseId = useId() const headingId = hasHeading ? `${baseId}-heading` : undefined const descriptionId = hasDescription ? `${baseId}-description` : undefined const ariaDescribedBy = descriptionId || undefined const handleClose = () => { handleOpenChange(false) onClose?.() } if (isSmallScreen && useDrawerOnMobile) { return ( {children} ) } return ( {trigger} {shouldShowSkeleton && showBodySkeleton ? ( ) : ( children )} ) } ) PopoverV2.displayName = 'PopoverV2' export default PopoverV2