import {cn} from "@/lib/utils"; import {zodResolver} from "@hookform/resolvers/zod"; import type * as LabelPrimitive from "@radix-ui/react-label"; import {Slot} from "@radix-ui/react-slot"; import * as React from "react"; import type { ControllerProps, FieldPath, FieldValues, SubmitHandler, UseFormProps, UseFormReturn, } from "react-hook-form"; import { Controller, FormProvider, useForm, useFormContext, } from "react-hook-form"; import type {TypeOf, ZodSchema} from "zod"; import {Label} from "./label"; type FormProps = Omit< React.ComponentProps<"form">, "onSubmit" > & { form: UseFormReturn; onSubmit: SubmitHandler; disabled?: boolean; }; const Form = ({ form, onSubmit, children, className, disabled, ...props }: FormProps) => (
{children}
); type FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath > = { name: TName; }; const FormFieldContext = React.createContext( {} as FormFieldContextValue ); const FormField = < TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath >({ ...props }: ControllerProps) => { return ( ); }; const useFormField = () => { const fieldContext = React.useContext(FormFieldContext); const itemContext = React.useContext(FormItemContext); const {getFieldState, formState} = useFormContext(); const fieldState = getFieldState(fieldContext.name, formState); if (!fieldContext.name) { throw new Error("useFormField should be used within "); } const {id} = itemContext; return { id, name: fieldContext.name, formItemId: `${id}-form-item`, formDescriptionId: `${id}-form-item-description`, formMessageId: `${id}-form-item-message`, ...fieldState, }; }; type FormItemContextValue = { id: string; }; const FormItemContext = React.createContext( {} as FormItemContextValue ); const FormItem = React.forwardRef< HTMLDivElement, React.HTMLAttributes >(({className, ...props}, ref) => { const id = React.useId(); return (
); }); FormItem.displayName = "FormItem"; const FormLabel = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({className, ...props}, ref) => { const {error, formItemId} = useFormField(); return (