import React, { useEffect, useState } from 'react' import * as RadixSelect from '@radix-ui/react-select' import classNames from 'classnames' import Overlay from '~components/common/Overlay' import ChevronIcon from '~public/icons/Chevron.svg' import styles from './index.module.scss' // Props interface Props extends React.DetailedHTMLProps< React.SelectHTMLAttributes, HTMLSelectElement > { open: boolean icon?: { src: string alt: string } trigger?: { bound?: boolean className?: string placeholder?: string size?: 'small' | 'medium' | 'large' } children?: React.ReactNode onOpenChange?: () => void onValueChange?: (value: string) => void onClose?: () => void overlayVisible?: boolean } const Select = React.forwardRef(function Select( props: Props, forwardedRef ) { const [open, setOpen] = useState(false) const [value, setValue] = useState('') 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 selectClasses = classNames( { [styles.select]: true, [styles.bound]: props.trigger ? props.trigger.bound : false, }, props.className?.split(' ').map((className) => styles[className]) ) useEffect(() => { setOpen(props.open) }, [props.open]) useEffect(() => { if (props.value && props.value !== '') setValue(`${props.value}`) else setValue('') }, [props.value]) function onValueChange(newValue: string) { setValue(`${newValue}`) if (props.onValueChange) props.onValueChange(newValue) } function onCloseAutoFocus() { setOpen(false) if (props.onClose) props.onClose() } function onEscapeKeyDown() { setOpen(false) if (props.onClose) props.onClose() } function onPointerDownOutside() { setOpen(false) if (props.onClose) props.onClose() } return ( {props.icon?.src && {props.icon.alt}} {!props.disabled && ( )} <> {props.children} ) }) Select.defaultProps = { overlayVisible: true, } export default Select