diff --git a/packages/example/src/lib/input/OptionalInput.tsx b/packages/example/src/lib/input/OptionalInput.tsx new file mode 100644 index 0000000..20073f4 --- /dev/null +++ b/packages/example/src/lib/input/OptionalInput.tsx @@ -0,0 +1,44 @@ +import { Callout, Flex, TextField } from "@radix-ui/themes" +import { Option, ParseResult, Schema, Struct } from "effect" +import { Component } from "effect-fc" +import { useInput } from "effect-fc/hooks" +import * as React from "react" + + +export interface OptionalInputProps, T, R> +extends + Omit, "schema"> +{} + +export const OptionalInput = , T, R>( + schema: Schema.Schema +): Component.Component< + OptionalInputProps, + React.JSX.Element, + ParseResult.ParseError, + R +> => Component.makeUntraced(function* OptionalInput(props) { + const input = yield* useInput({ schema, ...props }) + const issues = React.useMemo(() => Option.map( + input.error, + ParseResult.ArrayFormatter.formatErrorSync, + ), [input.error]) + + return ( + + {Option.isSome(issues) && + + +
    {issues.value.map((issue, i) =>
  • {issue.message}
  • )}
+
+
+ } + + +
+ ) +})