import { Field, FieldDescription, FieldError, Select, SelectContent, SelectItem, SelectTrigger, } from "@repo/shadcn-ui/components"; import { cn } from "@repo/shadcn-ui/lib/utils"; import React from "react"; import { Controller, type FieldPath, type FieldValues, useFormContext } from "react-hook-form"; import { FormFieldLabel } from "./form-field-label.tsx"; interface SelectFieldItem { value: string; label: string; } type SelectFieldValue = string | null; type SelectFieldProps = { name: FieldPath; label?: string; description?: string; reserveDescriptionSpace?: boolean; disabled?: boolean; required?: boolean; readOnly?: boolean; placeholder?: string; items?: SelectFieldItem[]; orientation?: "vertical" | "horizontal" | "responsive"; serialize?: (value: unknown) => string; deserialize?: (value: SelectFieldValue) => unknown; className?: string; inputClassName?: string; }; export function SelectField({ name, label, description, reserveDescriptionSpace = false, disabled = false, required = false, readOnly = false, placeholder, items = [], orientation = "vertical", serialize, deserialize, className, inputClassName, }: SelectFieldProps) { const triggerId = React.useId(); const { control, formState } = useFormContext(); const isDisabled = Boolean(disabled || readOnly || formState.isSubmitting); const serializeValue = serialize ?? ((value: unknown): string => (typeof value === "string" ? value : "")); const deserializeValue = deserialize ?? ((value: SelectFieldValue): string => value ?? ""); return ( { const fieldValue = serializeValue(field.value); const normalizedItems = fieldValue && !items.some((item) => item.value === fieldValue) ? [{ value: fieldValue, label: fieldValue }, ...items] : items; const selectedItem = normalizedItems.find((item) => item.value === fieldValue); return ( {label ? ( {label} ) : null} {description ? ( {description} ) : reserveDescriptionSpace ? (