"use client"; import * as React from "react"; import { Controller, FormProvider, useFormContext, type ControllerProps, type FieldPath, type FieldValues, type SubmitHandler, type UseFormReturn, } from "react-hook-form"; import { cn } from "@/lib/utils"; type FormProps = Omit< React.FormHTMLAttributes, "onSubmit" | "children" > & { form: UseFormReturn; onSubmit: SubmitHandler; children: React.ReactNode; }; const FormItemContext = React.createContext<{ id: string } | null>(null); type FormFieldContextValue = { name: string; }; const FormFieldContext = React.createContext(null); const Form = ({ form, onSubmit, children, className, ...props }: FormProps) => { return (
{children}
); }; const useFormField = () => { const itemContext = React.useContext(FormItemContext); const fieldContext = React.useContext(FormFieldContext); const { getFieldState, formState, control } = useFormContext(); if (!itemContext || !fieldContext) { throw new Error("useFormField must be used within a ."); } return { control, id: itemContext.id, name: fieldContext.name, ...getFieldState(fieldContext.name, formState), }; }; const FormField = < TFieldValues extends FieldValues, TName extends FieldPath, >({ ...props }: Omit, "render"> & { render: ControllerProps["render"]; }) => { return ( ); }; const FormItem = React.forwardRef< HTMLDivElement, React.HTMLAttributes >(({ className, ...props }, ref) => { const id = React.useId(); return (
); }); FormItem.displayName = "FormItem"; const FormLabel = React.forwardRef< HTMLLabelElement, React.LabelHTMLAttributes >(({ className, ...props }, ref) => { const { error, id } = useFormField(); return (