import React, { ComponentProps, PropsWithChildren, ReactNode, useEffect, useState, } from 'react' import classNames from 'classnames' import * as PopoverPrimitive from '@radix-ui/react-popover' import ChevronIcon from '~public/icons/Chevron.svg' import styles from './index.module.scss' interface Props extends ComponentProps<'div'> { open: boolean disabled?: boolean icon?: { src: string alt: string } trigger?: { bound?: boolean className?: string placeholder?: string size?: 'small' | 'medium' | 'large' } triggerTabIndex?: number value?: { element: ReactNode rawValue: string } onOpenChange?: () => void } const Popover = React.forwardRef(function Popover( { children, ...props }: PropsWithChildren, forwardedRef ) { // Component state const [open, setOpen] = useState(false) // Element classes const triggerClasses = classNames( { [styles.trigger]: true, [styles.disabled]: props.disabled, [styles.bound]: props.trigger ? props.trigger.bound : false, [styles.small]: props.trigger?.size === 'small', [styles.medium]: !props.trigger || props.trigger?.size === 'medium', [styles.large]: props.trigger?.size === 'large', }, props.trigger?.className?.split(' ').map((className) => styles[className]) ) const popoverClasses = classNames( { [styles.popover]: true, }, props.className?.split(' ').map((className) => styles[className]) ) // Hooks useEffect(() => { setOpen(props.open) }, [props.open]) // Elements const value = props.value ? ( {props.value?.element} ) : ( {props.trigger?.placeholder} ) const icon = props.icon ? ( {props.icon.alt} ) : ( '' ) const arrow = !props.disabled ? ( ) : ( '' ) return ( {icon} {value} {arrow} {children} ) }) Popover.defaultProps = { disabled: false, } export default Popover