import React, { useId, useRef } from 'react' import { useComboBoxState } from '@react-stately/combobox' import classNames from 'classnames' import { useComboBox, useFilter } from 'react-aria' import { FieldMessage } from '~components/FieldMessage' import { Label } from '~components/Label' import { SingleSelectContext } from '../../context' import { type ComboBoxProps, type SelectItem } from '../../types' import { ComboBoxTrigger } from '../ComboBoxTrigger' import { List } from '../List' import { Popover } from '../Popover' import styles from './ComboBox.module.css' export const ComboBox = (props: ComboBoxProps): JSX.Element => { const { items, children, label, description, labelHidden, labelPosition = 'top', isReadOnly, isDisabled, size = 'medium', variant = 'primary', } = props const { contains } = useFilter({ sensitivity: 'base' }) const state = useComboBoxState({ ...props, items: items, defaultFilter: contains, children: children, menuTrigger: 'focus', }) const inputRef = useRef(null) const popoverRef = useRef(null) const listBoxRef = useRef(null) const buttonRef = useRef(null) const clearButtonRef = useRef(null) const triggerWrapperRef = useRef(null) const { labelProps, descriptionProps, inputProps, listBoxProps, buttonProps } = useComboBox( { ...props, 'aria-label': labelHidden ? label : undefined, inputRef, buttonRef, popoverRef, listBoxRef, }, state, ) const uniqueId = useId() const anchorName = `--trigger-${uniqueId}` return (
{!labelHidden && (
)}
{description && (
)}
) }