"use client"; import { useCallback, useMemo } from "react"; import type { SelectProps } from "@mantine/core"; import { Combobox, Input, InputBase, useCombobox } from "@mantine/core"; import { useUncontrolled } from "@mantine/hooks"; interface BaseSelectItem { value: string; label: string; } export interface SelectWithCustomItemsProps extends Pick< SelectProps, "label" | "error" | "defaultValue" | "value" | "onChange" | "placeholder" > { data: TSelectItem[]; onBlur?: (event: React.FocusEvent) => void; onFocus?: (event: React.FocusEvent) => void; } type Props = SelectWithCustomItemsProps & { SelectOption: React.ComponentType; }; export const SelectWithCustomItems = ({ data, onChange, value, defaultValue, placeholder, SelectOption, ...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], ); return ( } onClick={toggle} rightSectionPointerEvents="none" multiline > {selectedOption ? ( ) : ( {placeholder} )} {options} ); };