import React, { useCallback, useEffect, useState } from "react"; import ReactSelect, { components, GroupBase, Props, InputProps, SingleValue, MultiValue } from "react-select"; import classNames from "@lib/classNames"; export type SelectProps< Option, IsMulti extends boolean = false, Group extends GroupBase = GroupBase > = Props; export const InputComponent = >({ inputClassName, ...props }: InputProps) => { return ( ); }; function Select< Option, IsMulti extends boolean = false, Group extends GroupBase = GroupBase >({ className, ...props }: SelectProps) { return ( ({ ...theme, borderRadius: 2, colors: { ...theme.colors, primary: "var(--brand-color)", primary50: "rgba(209 , 213, 219, var(--tw-bg-opacity))", primary25: "rgba(244, 245, 246, var(--tw-bg-opacity))", }, })} styles={{ option: (provided, state) => ({ ...provided, color: state.isSelected ? "var(--brand-text-color)" : "black", ":active": { backgroundColor: state.isSelected ? "" : "var(--brand-color)", color: "var(--brand-text-color)", }, }), }} components={{ ...components, IndicatorSeparator: () => null, Input: InputComponent, }} className={classNames("text-sm", className)} {...props} /> ); } export function SelectWithValidation< Option extends { label: string; value: string }, isMulti extends boolean = false, Group extends GroupBase = GroupBase >({ required = false, onChange, value, ...remainingProps }: SelectProps & { required?: boolean }) { const [hiddenInputValue, _setHiddenInputValue] = useState(() => { if (value instanceof Array || !value) { return; } return value.value || ""; }); const setHiddenInputValue = useCallback((value: MultiValue | SingleValue) => { let hiddenInputValue = ""; if (value instanceof Array) { hiddenInputValue = value.map((val) => val.value).join(","); } else { hiddenInputValue = value?.value || ""; } _setHiddenInputValue(hiddenInputValue); }, []); useEffect(() => { if (!value) { return; } setHiddenInputValue(value); }, [value, setHiddenInputValue]); return ( { setHiddenInputValue(value); if (onChange) { onChange(value, ...remainingArgs); } }} /> {required && ( {}} // TODO:Not able to get focus to work // onFocus={() => selectRef.current?.focus()} required={required} /> )} ); } export default Select;