'use client'; import type * as LabelPrimitive from '@radix-ui/react-label'; import type { ControllerProps, FieldPath, FieldValues } from 'react-hook-form'; import * as React from 'react'; import { Slot } from '@radix-ui/react-slot'; import { Controller, FormProvider, useFormContext, useFormState, } from 'react-hook-form'; import { cn, Label } from '@gib/ui'; const Form = FormProvider; interface 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 } = useFormContext(); const formState = useFormState({ name: fieldContext.name }); const fieldState = getFieldState(fieldContext.name, formState); if (!fieldContext) { 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, }; }; interface FormItemContextValue { id: string; } const FormItemContext = React.createContext( {} as FormItemContextValue, ); const FormItem = ({ className, ...props }: React.ComponentProps<'div'>) => { const id = React.useId(); return (
); }; const FormLabel = ({ className, ...props }: React.ComponentProps) => { const { error, formItemId } = useFormField(); return (