'use client'; import type * as LabelPrimitive from '@radix-ui/react-label'; import { Slot } from '@radix-ui/react-slot'; import { type FieldApi, type FieldComponent, type FormApi, useField, } from '@tanstack/react-form'; import { type ZodValidator } from '@tanstack/zod-form-adapter'; import * as React from 'react'; import { cx } from '@/lib/utils'; import { Label } from '@/components/ui/Label'; type FormContextValue = FormApi; const FormContext = React.createContext( {} as FormContextValue, ); interface FormProps extends React.HTMLAttributes { form: FormContextValue; } const Form = ({ form, ...props }: FormProps) => { return (
{ e.preventDefault(); e.stopPropagation(); await form.handleSubmit(); }} {...props} /> ); }; type FormFieldContextValue = { name: string; }; const FormFieldContext = React.createContext( {} as FormFieldContextValue, ); const FormField = ({ name, children, ...props }: FieldComponent & { children: ( fieldApi: FieldApi, ) => React.ReactNode; }) => { const { Field } = React.useContext(FormContext); return ( {children} ); }; const useFormField = () => { const fieldContext = React.useContext(FormFieldContext); const itemContext = React.useContext(FormItemContext); const formContext = React.useContext(FormContext); const fieldState = useField({ form: formContext, name: fieldContext.name, }); if (!fieldContext) { throw new Error('useFormField should be used within '); } const { id } = itemContext; return { id, 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 { state, formItemId } = useFormField(); return (