'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, SubmitErrorHandler, } from 'react-hook-form' import {merge} from '@/lib/utils' import {Label} from '@/components/ui/label' import React, {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, > = Omit, 'control' | 'render'> & Omit, 'children'> & { label?: ReactNode description?: ReactNode children: (props: { id: string field: ControllerRenderProps fieldState: ControllerFieldState formState: UseFormStateReturn }) => ReactNode classNames?: { label?: string description?: string message?: string } } 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}) => (
{/* label */} {!!props.label && ( {props.label} ) } {/* control */} {props.children({id, field, fieldState, formState})} {/* description */} {!!props.description && ( {props.description} )} {/* message */} {!fieldState.error ? null : ( )}
)}/> ) } type FormState = { error?: FieldError } function FormLabel({className, id, error, ...props}: ComponentProps & FormState) { return (