'use client' import * as LabelPrimitive from '@radix-ui/react-label' import {Slot} from '@radix-ui/react-slot' import { Controller, FormProvider, ControllerProps, SubmitHandler, FieldValues, useFormContext, FieldPath, UseFormReturn, ControllerRenderProps, ControllerFieldState, UseFormStateReturn, FieldError, FieldErrors, SubmitErrorHandler, } from 'react-hook-form' import {merge} from '@/lib/utils' import {Label} from '@/components/ui/label' import React, {BaseSyntheticEvent, ComponentProps, createContext, ReactNode, useContext, useId} from 'react' type FormProps = { form: UseFormReturn onSubmit?: SubmitHandler onError?: SubmitErrorHandler handler?: (e?: React.BaseSyntheticEvent) => Promise } & Omit, 'onSubmit' | 'onError'> function Form(rawProps: FormProps) { const {children, onSubmit, onError, handler, ...props} = rawProps const form = props.form const handle = handler || form.handleSubmit( onSubmit || (_ => {}), onError, ) return (
{ event.preventDefault() event.stopPropagation() await handle(event) }}> {children}
) } type FormFieldProps< V extends FieldValues = FieldValues, N extends FieldPath = FieldPath, > = { label?: ReactNode className?: string children: (props: { id: string field: ControllerRenderProps fieldState: ControllerFieldState formState: UseFormStateReturn }) => ReactNode } & Omit, 'control' | 'render'> type FormFieldContext = { id: string error?: FieldError } const FormFieldContext = createContext(null) function FormField< V extends FieldValues = FieldValues, N extends FieldPath = FieldPath, >(props: FormFieldProps) { const form = useFormContext() const id = useId() return ( name={props.name} control={form.control} render={({field, fieldState, formState}) => (
{!!props.label && } {props.children({id, field, fieldState, formState})} {!fieldState.error ? null : (

{fieldState.error?.message}

)}
)} /> ) } const useFormField = () => { const context = useContext(FormFieldContext) if (!context) { throw new Error('FormField components must be used within a FormField component') } return context } function FormLabel({className, ...props}: ComponentProps) { const {id, error} = useFormField() return (