"use client"; import { type ChangeEvent, useId } from "react"; import { Checkbox } from "@/components/shadcn/checkbox/checkbox"; import { Field, FieldError, FieldLabel } from "@/components/shadcn/field/field"; import { Input } from "@/components/shadcn/input/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/shadcn/select/select"; import { Textarea } from "@/components/shadcn/textarea/textarea"; import type { RegistryCredentialSchema, RegistryCredentialValue, } from "@/lib/provider-credentials/provider-credential-schema"; import { formatRegistryLabel } from "@/lib/registry/labels"; interface RegistryCredentialFieldsProps { readonly errors: Readonly>; readonly onChange: (name: string, value: RegistryCredentialValue) => void; readonly schema: RegistryCredentialSchema; readonly values: Readonly< Record >; } export function RegistryCredentialFields({ errors, onChange, schema, values, }: RegistryCredentialFieldsProps) { const instanceId = useId(); return (
{schema.fields.map((field, index) => { if (field.kind === "constant") return null; const error = errors[field.name]; const fieldId = `registry-credential-${instanceId}-${index}`; const id = `${fieldId}-control`; const descriptionId = field.description ? `${fieldId}-description` : undefined; const errorId = error ? `${fieldId}-error` : undefined; const describedBy = [descriptionId, errorId].filter(Boolean).join(" ") || undefined; const invalid = error ? true : undefined; const value = values[field.name]; const textControlProps = { "aria-describedby": describedBy, "aria-invalid": invalid, id, onChange: ( event: ChangeEvent, ) => onChange(field.name, event.target.value), required: field.required, placeholder: field.placeholder, spellCheck: false, value: typeof value === "string" || typeof value === "number" ? value : "", }; return ( {field.kind === "checkbox" ? (
onChange(field.name, checked === true) } /> {field.label} {field.required && }
) : ( {field.label} {field.required && } )} {field.kind === "checkbox" ? null : field.kind === "select" ? ( ) : field.kind === "textarea" ? (