import { Callout, Checkbox, Flex, TextField } from "@radix-ui/themes" import { Array, Equivalence, Option, ParseResult, Schema, Struct } from "effect" import { Component, Memo } from "effect-fc" import { useInput, useOptionalInput } from "effect-fc/hooks" import * as React from "react" export type TextFieldInputProps = Omit, "schema" | "equivalence"> & Omit export type TextFieldOptionalInputProps = Omit, "schema" | "equivalence"> & Omit export const TextFieldInput = (options: { readonly optional?: O readonly schema: Schema.Schema readonly equivalence?: Equivalence.Equivalence }) => Component.makeUntraced(function* TextFieldInput(props: O extends true ? TextFieldOptionalInputProps : TextFieldInputProps ) { const input: ( | { readonly optional: true } & useOptionalInput.Result | { readonly optional: false } & useInput.Result ) = options.optional ? { optional: true, // eslint-disable-next-line react-hooks/rules-of-hooks ...yield* useOptionalInput({ schema: options.schema, equivalence: options.equivalence, ...props as TextFieldOptionalInputProps, }), } : { optional: false, // eslint-disable-next-line react-hooks/rules-of-hooks ...yield* useInput({ schema: options.schema, equivalence: options.equivalence, ...props as TextFieldInputProps, }) } const issue = React.useMemo(() => input.error.pipe( Option.map(ParseResult.ArrayFormatter.formatErrorSync), Option.flatMap(Array.head), ), [input.error]) return ( {input.optional && input.setDisabled(!checked)} /> } | TextFieldInputProps, "ref")} /> {(!(input.optional && input.disabled) && Option.isSome(issue)) && {issue.value.message} } ) }).pipe(Memo.memo)