Skip to content

Commit d794c3d

Browse files
committed
support conditionally rendered field
1 parent 2f4c225 commit d794c3d

23 files changed

+86
-48
lines changed

packages/documentation/docs/api/generated/interfaces/react_formz_native_src_components_DependentField_DependentField_types.DependentFieldProps.md

+3-9
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ custom_edit_url: null
1919

2020
## Hierarchy
2121

22-
- `Omit`<[`NativeFieldProps`](react_formz_native_src_components_Field_Field_types.NativeFieldProps.md)<`Value`, `Key`, `Ref`\>, ``"validate"``\>
22+
- `Omit`<[`NativeFieldProps`](react_formz_native_src_components_Field_Field_types.NativeFieldProps.md)<`Value`, `Key`, `Ref`\>, ``"validate"`` \| ``"as"``\>
2323

2424
- [`UseDependentFieldEventsOptions`](react_formz_src_hooks_fields_useDependentFieldEvents.UseDependentFieldEventsOptions.md)<`Values`, `Value`, `DependentValues`\>
2525

@@ -29,17 +29,11 @@ custom_edit_url: null
2929

3030
### as
3131

32-
`Optional` **as**: `ComponentType`<[`FieldComponentProps`](react_formz_native_src_components_Field_Field_types.FieldComponentProps.md)<`Value`, `Key`, `Ref`\>\>
33-
34-
The component to render the ui of the field.
35-
36-
#### Inherited from
37-
38-
Omit.as
32+
`Optional` **as**: `ComponentType`<[`FieldComponentProps`](react_formz_native_src_components_Field_Field_types.FieldComponentProps.md)<`Value`, `Key`, `Ref`\> & { `dependencies`: `DependentValues` }\>
3933

4034
#### Defined in
4135

42-
[packages/react-formz-native/src/components/Field/Field.types.ts:94](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-native/src/components/Field/Field.types.ts#L94)
36+
[packages/react-formz-native/src/components/DependentField/DependentField.types.ts:12](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-native/src/components/DependentField/DependentField.types.ts#L12)
4337

4438
___
4539

packages/documentation/docs/api/generated/interfaces/react_formz_native_src_components_Field_Field_types.FieldInputProps.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ ___
203203

204204
### value
205205

206-
`Optional` **value**: `Value` extends `boolean` ? `undefined` : `Value`
206+
`Optional` **value**: `Value`
207207

208208
The current value of the input.
209209

packages/documentation/docs/api/generated/interfaces/react_formz_web_src_components_DependentField_DependentField_types.DependentFieldProps.md

+3-9
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ custom_edit_url: null
1919

2020
## Hierarchy
2121

22-
- `Omit`<[`WebFieldProps`](react_formz_web_src_components_Field_Field_types.WebFieldProps.md)<`Value`, `Key`, `Ref`\>, ``"validate"``\>
22+
- `Omit`<[`WebFieldProps`](react_formz_web_src_components_Field_Field_types.WebFieldProps.md)<`Value`, `Key`, `Ref`\>, ``"validate"`` \| ``"as"``\>
2323

2424
- [`UseDependentFieldEventsOptions`](react_formz_src_hooks_fields_useDependentFieldEvents.UseDependentFieldEventsOptions.md)<`Values`, `Value`, `DependentValues`\>
2525

@@ -29,17 +29,11 @@ custom_edit_url: null
2929

3030
### as
3131

32-
`Optional` **as**: `ComponentType`<[`FieldComponentProps`](react_formz_web_src_components_Field_Field_types.FieldComponentProps.md)<`Value`, `Key`, `Ref`\>\>
33-
34-
The component to render the ui of the field.
35-
36-
#### Inherited from
37-
38-
Omit.as
32+
`Optional` **as**: `ComponentType`<[`FieldComponentProps`](react_formz_web_src_components_Field_Field_types.FieldComponentProps.md)<`Value`, `Key`, `Ref`\> & { `dependencies`: `DependentValues` }\>
3933

4034
#### Defined in
4135

42-
[packages/react-formz-web/src/components/Field/Field.types.ts:79](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-web/src/components/Field/Field.types.ts#L79)
36+
[packages/react-formz-web/src/components/DependentField/DependentField.types.ts:12](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-web/src/components/DependentField/DependentField.types.ts#L12)
4337

4438
___
4539

packages/documentation/docs/api/generated/modules/react_formz_native_src.md

+6
Original file line numberDiff line numberDiff line change
@@ -233,3 +233,9 @@ ___
233233
### useField
234234

235235
Renames and re-exports [useNativeField](react_formz_native_src_hooks_fields_useField.md#usenativefield)
236+
237+
___
238+
239+
### useFormSubmission
240+
241+
Re-exports [useFormSubmission](react_formz_src_hooks_forms_useFormSubmission.md#useformsubmission)

packages/documentation/docs/api/generated/modules/react_formz_native_src_components_DependentField_DependentField.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,4 @@ onDependenciesChange={(dependencies, actions) => {
5757

5858
#### Defined in
5959

60-
[packages/react-formz-native/src/components/DependentField/DependentField.tsx:60](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-native/src/components/DependentField/DependentField.tsx#L60)
60+
[packages/react-formz-native/src/components/DependentField/DependentField.tsx:66](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-native/src/components/DependentField/DependentField.tsx#L66)

packages/documentation/docs/api/generated/modules/react_formz_native_src_components_Field_Field.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,4 @@ function UserProfile() {
4646

4747
#### Defined in
4848

49-
[packages/react-formz-native/src/components/Field/Field.tsx:110](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-native/src/components/Field/Field.tsx#L110)
49+
[packages/react-formz-native/src/components/Field/Field.tsx:109](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-native/src/components/Field/Field.tsx#L109)

packages/documentation/docs/api/generated/modules/react_formz_native_src_hooks_fields_useInternalFieldValue.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,4 @@ the user finishes typing or submits the form.
4848

4949
#### Defined in
5050

51-
packages/react-formz-native/src/hooks/fields/useInternalFieldValue.ts:25
51+
[packages/react-formz-native/src/hooks/fields/useInternalFieldValue.ts:25](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-native/src/hooks/fields/useInternalFieldValue.ts#L25)

packages/documentation/docs/api/generated/modules/react_formz_native_src_providers_ArrayFieldProvider_ArrayFieldProvider.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Informs fields rendered within an array provider that they are within an array.
2626

2727
#### Defined in
2828

29-
packages/react-formz-native/src/providers/ArrayFieldProvider/ArrayFieldProvider.tsx:8
29+
[packages/react-formz-native/src/providers/ArrayFieldProvider/ArrayFieldProvider.tsx:8](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-native/src/providers/ArrayFieldProvider/ArrayFieldProvider.tsx#L8)
3030

3131
___
3232

@@ -42,4 +42,4 @@ Custom hook that returns true if a field is rendered within an array.
4242

4343
#### Defined in
4444

45-
packages/react-formz-native/src/providers/ArrayFieldProvider/ArrayFieldProvider.tsx:17
45+
[packages/react-formz-native/src/providers/ArrayFieldProvider/ArrayFieldProvider.tsx:17](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-native/src/providers/ArrayFieldProvider/ArrayFieldProvider.tsx#L17)

packages/documentation/docs/api/generated/modules/react_formz_src_hooks_fields_useDependentFieldEvents.md

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ that will be called when the dependencies change.
4242

4343
| Name | Type |
4444
| :------ | :------ |
45+
| `dependentFields` | `DependentValues` |
4546
| `validate` | [`FieldValidator`](react_formz_src_types_field.md#fieldvalidator)<`Value`\> |
4647

4748
#### Defined in

packages/documentation/docs/api/generated/modules/react_formz_web_src_components_DependentField_DependentField.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,4 @@ onDependenciesChange={(dependencies, actions) => {
5757

5858
#### Defined in
5959

60-
[packages/react-formz-web/src/components/DependentField/DependentField.tsx:60](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-web/src/components/DependentField/DependentField.tsx#L60)
60+
[packages/react-formz-web/src/components/DependentField/DependentField.tsx:66](https://github.com/ZerryStack/react-formz/blob/main/packages/react-formz-web/src/components/DependentField/DependentField.tsx#L66)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
---
2+
sidebar_position: 1
3+
---
4+
5+
# Conditional Fields
6+
7+
There will be times when you want to conditionally render a field based on the value or values of other fields. React Hook Form supports that out of the box with ease. You can use as `DependentField` as so:
8+
9+
```tsx
10+
<TextField name="dob" />
11+
<DependentField<{ dob: Date; favoriteDrink?: string; }>
12+
name="favoriteDrink"
13+
dependencies={(values) => ({ dob: values.dob })}
14+
as={({ input, dependencies }) => {
15+
if (dependencies.dob < 21) return null;
16+
return <TextInput />
17+
}}
18+
/>
19+
```
20+
21+
<iframe src="https://codesandbox.io/embed/zerry-react-formz-conditional-fields-0tpebi?fontsize=14&hidenavigation=1&theme=dark"
22+
style={{ width: "100%", height: 700 }}
23+
title="zerry-react-formz-conditional-fields"
24+
allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking"
25+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
26+
></iframe>

packages/documentation/sidebars.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const sidebars = {
2222
{
2323
type: 'category',
2424
label: 'Guides',
25-
items: ['guides/basic-usage', 'guides/form-validations', 'guides/field-validation', 'guides/form-persistance', 'guides/dependent-field'],
25+
items: ['guides/basic-usage', 'guides/form-validations', 'guides/field-validation', 'guides/form-persistance', 'guides/dependent-field', 'guides/conditional-field'],
2626
},
2727
{
2828
type: 'category',

packages/react-formz-native/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zerry/react-formz-native",
3-
"version": "0.0.9-beta",
3+
"version": "0.0.12-beta",
44
"repository": {
55
"type": "git",
66
"url": "https://github.com/ZerryStack/react-formz.git"

packages/react-formz-native/src/components/DependentField/DependentField.tsx

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FieldId, FieldValue, FormzValues, useDependentFieldEvents } from "../../../../react-formz";
22
import React from "react";
3-
import Field from "../Field";
3+
import Field, { FieldComponentProps } from "../Field";
44
import { DependentFieldProps } from "./DependentField.types";
55

66
const DependentFieldInner = <
@@ -13,15 +13,21 @@ const DependentFieldInner = <
1313
props: DependentFieldProps<Values, Value, Key, Ref, DependentValues>,
1414
ref: React.Ref<Ref>
1515
) => {
16-
const { dependencies, onDependenciesChange, name, validate, ...restProps } = props;
16+
const { dependencies, onDependenciesChange, name, validate, as: Component, ...restProps } = props;
1717

18-
const { validate: dependentValidate } = useDependentFieldEvents(name, {
18+
const { validate: dependentValidate, dependentFields } = useDependentFieldEvents(name, {
1919
dependencies,
2020
onDependenciesChange,
2121
validate
2222
});
2323

24-
return <Field<Value, Key, Ref> {...restProps} name={name} ref={ref} validate={dependentValidate} />;
24+
const DependentComponent = (props: FieldComponentProps<Value, Key, Ref>) => {
25+
if (!Component) return null;
26+
27+
return <Component {...props} dependencies={dependentFields} />
28+
}
29+
30+
return <Field<Value, Key, Ref> {...restProps} as={DependentComponent} name={name} ref={ref} validate={dependentValidate} />;
2531
};
2632

2733
/**
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { FieldId, FieldValue, FormzValues, UseDependentFieldEventsOptions } from "../../../../react-formz";
2-
import { NativeFieldProps } from "../Field/Field.types";
2+
import { FieldComponentProps, NativeFieldProps } from "../Field/Field.types";
33

44
export interface DependentFieldProps<
55
Values extends FormzValues = FormzValues,
66
Value extends FieldValue = FieldValue,
77
Key extends FieldId = FieldId,
88
Ref = HTMLInputElement,
99
DependentValues extends Partial<Values> = Partial<Values>
10-
> extends Omit<NativeFieldProps<Value, Key, Ref>, "validate">,
11-
UseDependentFieldEventsOptions<Values, Value, DependentValues> {}
10+
> extends Omit<NativeFieldProps<Value, Key, Ref>, "validate" | "as">,
11+
UseDependentFieldEventsOptions<Values, Value, DependentValues> {
12+
as?: React.ComponentType<FieldComponentProps<Value, Key, Ref> & { dependencies: DependentValues }>
13+
}

packages/react-formz-native/src/components/Field/Field.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import {
22
FieldValue,
33
FieldId,
4-
isValidInputValue,
54
logger,
65
} from "../../../../react-formz";
76
import React from "react";
@@ -60,7 +59,7 @@ const FieldInner = <
6059
"aria-required": required ?? undefined,
6160
"aria-describedby": `${name}-error`,
6261
nativeID: name,
63-
value: isValidInputValue(value) ? value : undefined,
62+
value: value,
6463
onEndEditing: handleFinishEditing,
6564
onSubmitEditing: handleFinishEditing,
6665
};

packages/react-formz-native/src/components/Field/Field.types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export interface FieldInputProps<
5959
/**
6060
* The current value of the input.
6161
*/
62-
value?: Value extends boolean ? undefined : Value;
62+
value?: Value;
6363
}
6464

6565
export interface FieldComponentProps<

packages/react-formz-native/src/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,6 @@ export {
5959
isNull,
6060
isNumber,
6161
set,
62-
get
62+
get,
63+
useFormSubmission,
6364
} from "../../react-formz/src";

packages/react-formz-web/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zerry/react-formz",
3-
"version": "0.3.6-beta",
3+
"version": "0.3.8-beta",
44
"files": [
55
"dist"
66
],

packages/react-formz-web/src/components/DependentField/DependentField.tsx

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FieldId, FieldValue, FormzValues, useDependentFieldEvents } from "../../../../react-formz";
22
import React from "react";
3-
import Field from "../Field";
3+
import Field, { FieldComponentProps } from "../Field";
44
import { DependentFieldProps } from "./DependentField.types";
55

66
const DependentFieldInner = <
@@ -13,15 +13,21 @@ const DependentFieldInner = <
1313
props: DependentFieldProps<Values, Value, Key, Ref, DependentValues>,
1414
ref: React.Ref<Ref>
1515
) => {
16-
const { dependencies, onDependenciesChange, name, validate, ...restProps } = props;
16+
const { dependencies, onDependenciesChange, name, validate, as: Component, ...restProps } = props;
1717

18-
const { validate: dependentValidate } = useDependentFieldEvents(name, {
18+
const { validate: dependentValidate, dependentFields } = useDependentFieldEvents(name, {
1919
dependencies,
2020
onDependenciesChange,
2121
validate
2222
});
2323

24-
return <Field<Value, Key, Ref> {...restProps} name={name} ref={ref} validate={dependentValidate} />;
24+
const DependentComponent = (props: FieldComponentProps<Value, Key, Ref>) => {
25+
if (!Component) return null;
26+
27+
return <Component {...props} dependencies={dependentFields} />
28+
};
29+
30+
return <Field<Value, Key, Ref> {...restProps} as={DependentComponent} name={name} ref={ref} validate={dependentValidate} />;
2531
};
2632

2733
/**
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { FieldId, FieldValue, FormzValues, UseDependentFieldEventsOptions } from "../../../../react-formz";
2-
import { WebFieldProps } from "../Field/Field.types";
2+
import { FieldComponentProps, WebFieldProps } from "../Field/Field.types";
33

44
export interface DependentFieldProps<
55
Values extends FormzValues = FormzValues,
66
Value extends FieldValue = FieldValue,
77
Key extends FieldId = FieldId,
88
Ref = HTMLInputElement,
99
DependentValues extends Partial<Values> = Partial<Values>
10-
> extends Omit<WebFieldProps<Value, Key, Ref>, "validate">,
11-
UseDependentFieldEventsOptions<Values, Value, DependentValues> {}
10+
> extends Omit<WebFieldProps<Value, Key, Ref>, "validate" | "as">,
11+
UseDependentFieldEventsOptions<Values, Value, DependentValues> {
12+
as?: React.ComponentType<FieldComponentProps<Value, Key, Ref> & { dependencies: DependentValues }>
13+
}

packages/react-formz/src/hooks/fields/useDependentFieldEvents.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ function useDependentFieldEvents<
8787
})();
8888
}, [dependentFields]);
8989

90-
return { validate: dependentValidate };
90+
return { validate: dependentValidate, dependentFields };
9191
}
9292

9393
export default useDependentFieldEvents;

packages/react-formz/src/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
export type { FieldActions } from "./hooks/fields/useFieldActions";
66
export type { FieldEvents } from "./hooks/fields/useFieldEvents";
7-
export { default as useDependentFieldEvents, UseDependentFieldEventsOptions } from "./hooks/fields/useDependentFieldEvents";
7+
export type { UseDependentFieldEventsOptions } from "./hooks/fields/useDependentFieldEvents";
8+
export { default as useDependentFieldEvents } from "./hooks/fields/useDependentFieldEvents";
89
export type { UseFieldOptions, UseFieldResult } from "./hooks/fields/useField";
910
export { default as useField } from "./hooks/fields/useField";
1011
export type { UseDependentFieldOptions } from "./hooks/fields/useDependentField";

0 commit comments

Comments
 (0)