Skip to content

Commit f4a8e2c

Browse files
committed
Run custom validate fn after native validations
1 parent 4490fb0 commit f4a8e2c

File tree

1 file changed

+26
-24
lines changed

1 file changed

+26
-24
lines changed

packages/react/src/field/control/useFieldControlValidation.ts

+26-24
Original file line numberDiff line numberDiff line change
@@ -140,45 +140,47 @@ export function useFieldControlValidation() {
140140
computedState.valid = true;
141141
computedState.valueMissing = false;
142142
}
143-
144143
return computedState;
145144
}
146145

147146
timeout.clear();
148147

149-
const resultOrPromise = validate(value);
150148
let result: null | string | string[] = null;
151-
if (
152-
typeof resultOrPromise === 'object' &&
153-
resultOrPromise !== null &&
154-
'then' in resultOrPromise
155-
) {
156-
result = await resultOrPromise;
157-
} else {
158-
result = resultOrPromise;
159-
}
160-
161-
let errorMessage = '';
162-
if (result !== null) {
163-
errorMessage = Array.isArray(result) ? result.join('\n') : result;
164-
}
165-
element.setCustomValidity(errorMessage);
149+
let validationErrors: string[] = [];
166150

167151
const nextState = getState(element);
168152

169-
let validationErrors: string[] = [];
170-
if (Array.isArray(result)) {
171-
validationErrors = result;
172-
} else if (result) {
173-
validationErrors = [result];
174-
} else if (element.validationMessage) {
153+
if (element.validationMessage) {
175154
validationErrors = [element.validationMessage];
155+
} else {
156+
const resultOrPromise = validate(value);
157+
if (
158+
typeof resultOrPromise === 'object' &&
159+
resultOrPromise !== null &&
160+
'then' in resultOrPromise
161+
) {
162+
result = await resultOrPromise;
163+
} else {
164+
result = resultOrPromise;
165+
}
166+
167+
if (result !== null) {
168+
nextState.valid = false;
169+
170+
if (Array.isArray(result)) {
171+
validationErrors = result;
172+
element.setCustomValidity(result.join('\n'));
173+
} else if (result) {
174+
validationErrors = [result];
175+
element.setCustomValidity(result);
176+
}
177+
}
176178
}
177179

178180
const nextValidityData = {
179181
value,
180182
state: nextState,
181-
error: Array.isArray(result) ? result[0] : (result ?? element.validationMessage),
183+
error: element.validationMessage ?? (Array.isArray(result) ? result[0] : result),
182184
errors: validationErrors,
183185
initialValue: validityData.initialValue,
184186
};

0 commit comments

Comments
 (0)