import * as React from "react"; import { useTranslation } from "react-i18next"; import { SendouSelect, SendouSelectItem } from "~/components/elements/Select"; import type { FormFieldItems, FormFieldProps } from "../types"; import { ariaAttributes } from "../utils"; import { FormFieldMessages, FormFieldWrapper, useTranslatedTexts, } from "./FormFieldWrapper"; import styles from "./SelectFormField.module.css"; type SelectFormFieldProps = Omit< FormFieldProps<"select">, "items" | "clearable" | "onBlur" | "name" | "searchable" > & { name?: string; items: FormFieldItems; value: V | null; onChange: (value: V | null) => void; onSelect?: (value: V) => void; onBlur?: () => void; clearable?: boolean; searchable?: boolean; }; export function SelectFormField({ name, label, bottomText, items, error, onBlur, value, onChange, onSelect, clearable, searchable, }: SelectFormFieldProps) { const { t, i18n } = useTranslation(["common"]); const id = React.useId(); const itemsWithResolvedLabels = items.map((item) => { const itemLabel = item.label; const resolvedLabel = typeof itemLabel === "function" ? itemLabel(i18n.language) : typeof itemLabel === "string" && itemLabel.includes(":") ? t(itemLabel as never) : String(itemLabel); return { value: item.value, resolvedLabel, }; }); if (searchable) { return ( ); } const handleChange = (e: React.ChangeEvent) => { const newValue = e.target.value === "" ? null : (e.target.value as V); onChange(newValue); if (newValue && onSelect) { onSelect(newValue); } }; return ( ); } function SearchableSelect({ name, label, bottomText, error, items, value, onChange, onBlur, clearable, searchPlaceholder, }: { name?: string; label?: string; bottomText?: string; error?: string; items: Array<{ value: V; resolvedLabel: string }>; value: V | null; onChange: (value: V | null) => void; onBlur?: () => void; clearable?: boolean; searchPlaceholder: string; }) { const { translatedLabel } = useTranslatedTexts({ label }); const selectItems = items.map((item) => ({ id: item.value, textValue: item.resolvedLabel, })); return (
{ const newValue = key === "" ? null : (key as V); onChange(newValue); onBlur?.(); }} items={selectItems} search={{ placeholder: searchPlaceholder }} clearable={clearable} > {(item) => ( {item.textValue} )}
); }