import { useCallback, useState, } from 'react' import { useTranslation } from 'react-i18next' import { RiArrowDownSLine, RiCheckLine, } from '@remixicon/react' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import type { PortalToFollowElemOptions, } from '@/app/components/base/portal-to-follow-elem' import cn from '@/utils/classnames' type Option = { label: string value: string } type PureSelectProps = { options: Option[] value?: string onChange?: (value: string) => void containerProps?: PortalToFollowElemOptions & { open?: boolean onOpenChange?: (open: boolean) => void } triggerProps?: { className?: string }, popupProps?: { wrapperClassName?: string className?: string itemClassName?: string title?: string }, } const PureSelect = ({ options, value, onChange, containerProps, triggerProps, popupProps, }: PureSelectProps) => { const { t } = useTranslation() const { open, onOpenChange, placement, offset, } = containerProps || {} const { className: triggerClassName, } = triggerProps || {} const { wrapperClassName: popupWrapperClassName, className: popupClassName, itemClassName: popupItemClassName, title: popupTitle, } = popupProps || {} const [localOpen, setLocalOpen] = useState(false) const mergedOpen = open ?? localOpen const handleOpenChange = useCallback((openValue: boolean) => { onOpenChange?.(openValue) setLocalOpen(openValue) }, [onOpenChange]) const selectedOption = options.find(option => option.value === value) const triggerText = selectedOption?.label || t('common.placeholder.select') return ( handleOpenChange(!mergedOpen)} asChild >
{triggerText}
{ popupTitle && (
{popupTitle}
) } { options.map(option => (
{ onChange?.(option.value) handleOpenChange(false) }} >
{option.label}
{ value === option.value && }
)) }
) } export default PureSelect