Skip to content

Commit 91f009b

Browse files
authored
fix: native validation with inputs array (#329)
1 parent 83f3397 commit 91f009b

File tree

3 files changed

+40
-13
lines changed

3 files changed

+40
-13
lines changed

src/__tests__/validateFieldsNatively.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const flatObject: Record<string, FieldError> = {
55
name: { type: 'st', message: 'first message' },
66
};
77

8-
const fields = {
8+
const getfields = (mockReportValidity: any, mockSetCustomValidity: any) => ({
99
name: {
1010
ref: {
1111
reportValidity: jest.fn(),
@@ -18,9 +18,23 @@ const fields = {
1818
setCustomValidity: jest.fn(),
1919
},
2020
},
21-
} as any as Record<InternalFieldName, Field['_f']>;
21+
array: {
22+
refs: [{
23+
reportValidity: mockReportValidity,
24+
setCustomValidity: mockSetCustomValidity,
25+
}, {
26+
reportValidity: mockReportValidity,
27+
setCustomValidity: mockSetCustomValidity,
28+
}]
29+
30+
}
31+
}) as any as Record<InternalFieldName, Field['_f']>;
2232

2333
test('validates natively fields', () => {
34+
const mockReportValidity = jest.fn();
35+
const mockSetCustomValidity = jest.fn();
36+
const fields = getfields(mockReportValidity, mockSetCustomValidity)
37+
2438
validateFieldsNatively(flatObject, {
2539
fields,
2640
shouldUseNativeValidation: true,
@@ -39,4 +53,7 @@ test('validates natively fields', () => {
3953
expect(
4054
(fields.nd.ref as HTMLInputElement).reportValidity,
4155
).toHaveBeenCalledTimes(1);
56+
57+
expect((mockReportValidity)).toHaveBeenCalledTimes(2);
58+
expect((mockSetCustomValidity)).toHaveBeenCalledTimes(2);
4259
});

src/validateFieldsNatively.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
1-
import { get, FieldError, ResolverOptions } from 'react-hook-form';
1+
import {
2+
get, FieldError, ResolverOptions, Ref
3+
} from 'react-hook-form';
4+
5+
const setCustomValidity = (ref: Ref, fieldPath: string, errors: Record<string, FieldError>) => {
6+
if (ref && 'reportValidity' in ref) {
7+
const error = get(errors, fieldPath) as FieldError | undefined;
8+
ref.setCustomValidity((error && error.message) || '');
9+
10+
ref.reportValidity();
11+
}
12+
};
213

314
// Native validation (web only)
415
export const validateFieldsNatively = <TFieldValues>(
516
errors: Record<string, FieldError>,
617
options: ResolverOptions<TFieldValues>,
718
): void => {
19+
20+
821
for (const fieldPath in options.fields) {
922
const field = options.fields[fieldPath];
10-
1123
if (field && field.ref && 'reportValidity' in field.ref) {
12-
const error = get(errors, fieldPath) as FieldError | undefined;
13-
14-
field.ref.setCustomValidity((error && error.message) || '');
15-
16-
field.ref.reportValidity();
24+
setCustomValidity(field.ref, fieldPath, errors)
25+
} else if (field.refs) {
26+
field.refs.forEach((ref: HTMLInputElement, i) => setCustomValidity(ref, fieldPath + '.' + i, errors))
1727
}
1828
}
1929
};

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,7 +1494,7 @@
14941494
source-map "^0.6.1"
14951495
write-file-atomic "^3.0.0"
14961496

1497-
"@jest/types@^27.4.2":
1497+
"@jest/types@^27.2.5", "@jest/types@^27.4.2":
14981498
version "27.4.2"
14991499
resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.4.2.tgz#96536ebd34da6392c2b7c7737d693885b5dd44a5"
15001500
integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==
@@ -2886,7 +2886,7 @@ detect-newline@^3.0.0:
28862886
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
28872887
integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
28882888

2889-
diff-sequences@^27.4.0:
2889+
diff-sequences@^27.0.6, diff-sequences@^27.4.0:
28902890
version "27.4.0"
28912891
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5"
28922892
integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==
@@ -4117,7 +4117,7 @@ jest-environment-node@^27.4.6:
41174117
jest-mock "^27.4.6"
41184118
jest-util "^27.4.2"
41194119

4120-
jest-get-type@^27.4.0:
4120+
jest-get-type@^27.3.1, jest-get-type@^27.4.0:
41214121
version "27.4.0"
41224122
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5"
41234123
integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==
@@ -5614,7 +5614,7 @@ pretty-format@^27.0.0, pretty-format@^27.0.2:
56145614
ansi-styles "^5.0.0"
56155615
react-is "^17.0.1"
56165616

5617-
pretty-format@^27.4.6:
5617+
pretty-format@^27.3.1, pretty-format@^27.4.6:
56185618
version "27.4.6"
56195619
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7"
56205620
integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==

0 commit comments

Comments
 (0)