diff --git a/src/fields/text-field/Docs.mdx b/src/fields/text-field/Docs.mdx index 821c9f2..c50d95a 100644 --- a/src/fields/text-field/Docs.mdx +++ b/src/fields/text-field/Docs.mdx @@ -1,8 +1,8 @@ -import { Meta, Markdown } from "@storybook/blocks"; - +import { Meta, Markdown, Stories } from "@storybook/blocks"; +import * as TextFieldStories from "./textField.stories"; import Config from "./config.md?raw"; - + # `textField(): ZodField` @@ -19,3 +19,5 @@ const bio = textField().optional(); ## Initial Config {Config} + + diff --git a/src/fields/text-field/TextInput.mock.tsx b/src/fields/text-field/TextInput.mock.tsx new file mode 100644 index 0000000..519996e --- /dev/null +++ b/src/fields/text-field/TextInput.mock.tsx @@ -0,0 +1,21 @@ +import { ComponentProps } from "react"; + +import { FieldErrors, FieldLabel } from "../../components"; +import { TextFieldProps, useTextFieldProps } from "../../hooks"; + +export const TextInput = ({ + field, + label, + initialValue, + ...inputProps +}: TextFieldProps & ComponentProps<"input">) => { + const props = useTextFieldProps(field, { initialValue }); + + return ( +

+ + + +

+ ); +}; diff --git a/src/fields/text-field/textField.stories.tsx b/src/fields/text-field/textField.stories.tsx new file mode 100644 index 0000000..6e1ec98 --- /dev/null +++ b/src/fields/text-field/textField.stories.tsx @@ -0,0 +1,45 @@ +import { textField } from "./textField"; +import { TextInput } from "./TextInput.mock"; +import { formStory, meta } from "../../scenarios/StoryForm"; + +export default { + ...meta, + title: "fields/textField", +}; + +export const Required = formStory({ + args: { + fields: { + name: textField({ name: "name" }), + }, + children: ({ fields }) => ( + + ), + }, +}); + +export const Optional = formStory({ + args: { + fields: { + nick: textField({ name: "nick" }).optional(), + }, + children: ({ fields }) => ( + + ), + }, +}); + +export const Initialized = formStory({ + args: { + fields: { + title: textField({ name: "title" }).optional(), + }, + children: ({ fields }) => ( + + ), + }, +}); diff --git a/src/hooks/use-text-field-props/useTextFieldProps.test.ts b/src/hooks/use-text-field-props/useTextFieldProps.test.ts new file mode 100644 index 0000000..7980a41 --- /dev/null +++ b/src/hooks/use-text-field-props/useTextFieldProps.test.ts @@ -0,0 +1,17 @@ +import { renderHook } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; + +import { useTextFieldProps } from "./useTextFieldProps"; +import { textField } from "../../fields"; + +describe("useTextFieldProps()", () => { + it("initializes the field via options", async () => { + const field = textField(); + + const props = renderHook(() => + useTextFieldProps(field, { initialValue: "hello" }), + ); + + expect(props.result.current.value).toBe("hello"); + }); +}); diff --git a/src/hooks/use-text-field-props/useTextFieldProps.tsx b/src/hooks/use-text-field-props/useTextFieldProps.tsx index c8625b2..b961926 100644 --- a/src/hooks/use-text-field-props/useTextFieldProps.tsx +++ b/src/hooks/use-text-field-props/useTextFieldProps.tsx @@ -1,7 +1,8 @@ +import { UseFieldOptions } from "form-atoms"; import { ChangeEvent } from "react"; import { FieldProps, useFieldProps } from "../"; -import { type TextField } from "../../fields"; +import type { TextField, TextFieldValue } from "../../fields"; export type TextFieldProps = FieldProps; @@ -9,8 +10,12 @@ const getEventValue = ( event: ChangeEvent | ChangeEvent, ) => event.currentTarget.value; -export const useTextFieldProps = (field: TextField) => +export const useTextFieldProps = ( + field: TextField, + options: UseFieldOptions, +) => useFieldProps( field, getEventValue, + options, );