"use client"; import { useCallback, useMemo } from "react"; import type { SelectProps } from "@mantine/core"; import { Combobox, ComboboxClearButton, Input, InputBase, useCombobox } from "@mantine/core"; import { useUncontrolled } from "@mantine/hooks"; interface BaseSelectItem { value: string; label: string; } export interface SelectWithCustomItemsProps extends Pick { data: TSelectItem[]; description?: string; withAsterisk?: boolean; onBlur?: (event: React.FocusEvent) => void; onFocus?: (event: React.FocusEvent) => void; w?: string; } type Props = SelectWithCustomItemsProps & { SelectOption: React.ComponentType; }; export const SelectWithCustomItems = ({ data, onChange, value, defaultValue, placeholder, SelectOption, w, clearable, ...props }: Props) => { const combobox = useCombobox({ onDropdownClose: () => combobox.resetSelectedOption(), }); const [_value, setValue] = useUncontrolled({ value, defaultValue, finalValue: null, onChange, }); const selectedOption = useMemo(() => data.find((item) => item.value === _value), [data, _value]); const options = data.map((item) => ( )); const toggle = useCallback(() => combobox.toggleDropdown(), [combobox]); const onOptionSubmit = useCallback( (value: string) => { setValue( value, data.find((item) => item.value === value), ); combobox.closeDropdown(); }, [setValue, data, combobox], ); const _clearable = clearable && Boolean(_value); return ( setValue(null, null)} />} __clearable={_clearable} __defaultRightSection={} onClick={toggle} rightSectionPointerEvents={_clearable ? "all" : "none"} multiline w={w} > {selectedOption ? : {placeholder}} {options} ); };