import { Hint as HintComponent, Label as LabelComponent, clx, } from "@medusajs/ui" import * as LabelPrimitives from "@radix-ui/react-label" import { Slot } from "@radix-ui/react-slot" import * as React from "react" import { Controller, ControllerProps, FieldPath, FieldValues, FormProvider, useFormContext, useFormState, } from "react-hook-form" const Provider = FormProvider type FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath > = { name: TName } const FormFieldContext = React.createContext( {} as FormFieldContextValue ) const Field = < TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath >({ ...props }: ControllerProps) => { return ( ) } type FormItemContextValue = { id: string } const FormItemContext = React.createContext( {} as FormItemContextValue ) 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 a FormField") } const { id } = itemContext return { id, name: fieldContext.name, formItemId: `${id}-form-item`, formDescriptionId: `${id}-form-item-description`, formErrorMessageId: `${id}-form-item-message`, ...fieldState, } } const Item = React.forwardRef< HTMLDivElement, React.HTMLAttributes >(({ className, ...props }, ref) => { const id = React.useId() return (
) }) Item.displayName = "Form.Item" const Label = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => { const { formItemId } = useFormField() return ( ) }) Label.displayName = "Form.Label" const Control = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ ...props }, ref) => { const { error, formItemId, formDescriptionId, formErrorMessageId } = useFormField() return ( ) }) Control.displayName = "Form.Control" const Hint = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ className, ...props }, ref) => { const { formDescriptionId } = useFormField() return ( ) }) Hint.displayName = "Form.Hint" const ErrorMessage = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ className, children, ...props }, ref) => { const { error, formErrorMessageId } = useFormField() const msg = error ? String(error?.message) : children if (!msg) { return null } return ( {msg} ) }) ErrorMessage.displayName = "Form.ErrorMessage" const Form = Object.assign(Provider, { Item, Label, Control, Hint, ErrorMessage, Field, }) export { Form }