Skip to content

Commit 946b63f

Browse files
committed
fix(manager): reset errors when revalidated
1 parent 35dbce2 commit 946b63f

File tree

2 files changed

+84
-5
lines changed

2 files changed

+84
-5
lines changed

packages/form-state-manager/src/tests/utils/manager-api.test.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,6 +1219,47 @@ describe('managerApi', () => {
12191219
});
12201220
});
12211221
});
1222+
1223+
it('should reset error state when revalidated', () => {
1224+
jest.useFakeTimers();
1225+
const render = jest.fn();
1226+
const managerApi = createManagerApi({ validate: asyncValidate });
1227+
const { registerField, change } = managerApi();
1228+
1229+
registerField({ name: 'foo', render });
1230+
1231+
change('foo', 'foo');
1232+
1233+
jest.advanceTimersByTime(10);
1234+
setImmediate(() => {
1235+
expect(managerApi().getState().errors).toEqual({
1236+
foo: 'error'
1237+
});
1238+
expect(managerApi().getState().valid).toEqual(false);
1239+
expect(managerApi().getState().invalid).toEqual(true);
1240+
expect(managerApi().getState().validating).toEqual(false);
1241+
expect(managerApi().hasValidationErrors).toEqual(true);
1242+
1243+
change('foo', 'foo');
1244+
1245+
expect(managerApi().getState().errors).toEqual({});
1246+
expect(managerApi().getState().valid).toEqual(true);
1247+
expect(managerApi().getState().invalid).toEqual(false);
1248+
expect(managerApi().getState().validating).toEqual(true);
1249+
expect(managerApi().hasValidationErrors).toEqual(false);
1250+
1251+
jest.advanceTimersByTime(10);
1252+
setImmediate(() => {
1253+
expect(managerApi().getState().errors).toEqual({
1254+
foo: 'error'
1255+
});
1256+
expect(managerApi().getState().valid).toEqual(false);
1257+
expect(managerApi().getState().invalid).toEqual(true);
1258+
expect(managerApi().getState().validating).toEqual(false);
1259+
expect(managerApi().hasValidationErrors).toEqual(true);
1260+
});
1261+
});
1262+
});
12221263
});
12231264

12241265
describe('Combine form and field level validation', () => {
@@ -1532,6 +1573,37 @@ describe('managerApi', () => {
15321573
});
15331574
});
15341575
});
1576+
1577+
it('should reset field.error when validating', async (done) => {
1578+
expect.assertions(8);
1579+
jest.useFakeTimers();
1580+
const render = jest.fn();
1581+
1582+
const managerApi = createManagerApi({});
1583+
managerApi().registerField({ name: 'field', initialValue: 'one', validate: asyncValidate1, render, internalId: 1 });
1584+
1585+
jest.runAllTimers();
1586+
1587+
setImmediate(() => {
1588+
expect(managerApi().getFieldState('field').error).toEqual('error-one');
1589+
expect(managerApi().getFieldState('field').valid).toEqual(false);
1590+
expect(managerApi().getFieldState('field').invalid).toEqual(true);
1591+
1592+
managerApi().change('field', 'ok');
1593+
1594+
expect(managerApi().getFieldState('field').error).toEqual(undefined);
1595+
expect(managerApi().getFieldState('field').valid).toEqual(true);
1596+
expect(managerApi().getFieldState('field').invalid).toEqual(false);
1597+
1598+
jest.runAllTimers();
1599+
1600+
setImmediate(() => {
1601+
expect(managerApi().getFieldState('field').validating).toEqual(false);
1602+
expect(managerApi().getState().validating).toEqual(false);
1603+
done();
1604+
});
1605+
});
1606+
});
15351607
});
15361608

15371609
describe('initialize', () => {

packages/form-state-manager/src/utils/manager-api.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ const createManagerApi: CreateManagerApi = ({
322322
if (validators.length > 0) {
323323
const result = composeValidators(validators as Validator[])(value, state.values);
324324
if (isPromise(result)) {
325+
handleFieldError(name, true);
325326
(result as Promise<string | undefined>)
326327
.then(() => handleFieldError(name, true))
327328
.catch((response) => {
@@ -443,22 +444,28 @@ const createManagerApi: CreateManagerApi = ({
443444
const currentInvalidFields = Object.keys(state.errors);
444445
if (isPromise(result)) {
445446
const asyncResult = result as Promise<FormLevelError>;
447+
448+
state.errors = {};
449+
state.hasValidationErrors = false;
450+
state.valid = true;
451+
state.invalid = false;
452+
state.error = undefined;
453+
446454
return asyncResult
447455
.then(() => {
448456
if (!state.validating) {
449-
state.errors = {};
450-
state.hasValidationErrors = false;
451-
state.valid = true;
452-
state.invalid = false;
453-
state.error = undefined;
454457
revalidateFields(currentInvalidFields);
455458
}
456459
})
457460
.catch((errors) => {
461+
const render = prepareRerender();
462+
458463
state.errors = errors;
459464
state.hasValidationErrors = true;
460465
state.valid = false;
461466
state.invalid = true;
467+
468+
render();
462469
});
463470
}
464471

0 commit comments

Comments
 (0)