"use client" import * as React from "react" import { Slot } from "radix-ui" import { Controller, FormProvider, useFormContext, type ControllerProps, type FieldPath, type FieldValues, } from "react-hook-form" import { cn } from "../../lib/utils" import { Label } from "./label" const Form = FormProvider interface FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath, > { name: TName } const FormFieldContext = React.createContext(null) function FormField< TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath, >({ ...props }: ControllerProps) { const fieldContextValue = React.useMemo( () => ({ name: props.name }), [props.name], ) return ( ) } function useFormField() { const fieldContext = React.useContext(FormFieldContext) const itemContext = React.useContext(FormItemContext) const formContext = useFormContext() if (!fieldContext) { throw new Error("useFormField must be used inside ") } if (!itemContext) { throw new Error("useFormField must be used inside ") } if (!formContext) { throw new Error("useFormField must be used inside
") } const { getFieldState, formState } = formContext const fieldState = getFieldState(fieldContext.name, formState) const { id } = itemContext return { id, name: fieldContext.name, formItemId: `${id}-form-item`, formDescriptionId: `${id}-form-item-description`, formMessageId: `${id}-form-item-message`, ...fieldState, } } interface FormItemContextValue { id: string } const FormItemContext = React.createContext(null) function FormItem({ className, ...props }: React.ComponentProps<"div">) { const id = React.useId() const itemContextValue = React.useMemo(() => ({ id }), [id]) return (
) } function FormLabel({ className, onClick, ...props }: React.ComponentProps) { const { error, formItemId } = useFormField() return (