Skip to content

Commit 37ef083

Browse files
committed
fix(manager): errors/warnings rewrites each other
1 parent 946b63f commit 37ef083

File tree

2 files changed

+90
-5
lines changed

2 files changed

+90
-5
lines changed

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,6 +2091,36 @@ describe('managerApi', () => {
20912091
expect(managerApi().getFieldState('field').meta.error).toEqual(undefined);
20922092
});
20932093

2094+
it('warning should rewrite error - sync', () => {
2095+
const managerApi = createManagerApi({});
2096+
managerApi().registerField({
2097+
name: 'field',
2098+
initialValue: 'warning',
2099+
validate: (value) => (value === 'warning' ? { type: 'warning', error: someError } : 'error'),
2100+
render,
2101+
internalId: 1
2102+
});
2103+
2104+
expect(managerApi().getFieldState('field').meta.warning).toEqual(someError);
2105+
expect(managerApi().getFieldState('field').meta.error).toEqual(undefined);
2106+
expect(managerApi().getFieldState('field').meta.valid).toEqual(true);
2107+
expect(managerApi().getFieldState('field').meta.invalid).toEqual(false);
2108+
2109+
managerApi().change('field', 'error');
2110+
2111+
expect(managerApi().getFieldState('field').meta.warning).toEqual(undefined);
2112+
expect(managerApi().getFieldState('field').meta.error).toEqual('error');
2113+
expect(managerApi().getFieldState('field').meta.valid).toEqual(false);
2114+
expect(managerApi().getFieldState('field').meta.invalid).toEqual(true);
2115+
2116+
managerApi().change('field', 'warning');
2117+
2118+
expect(managerApi().getFieldState('field').meta.warning).toEqual(someError);
2119+
expect(managerApi().getFieldState('field').meta.error).toEqual(undefined);
2120+
expect(managerApi().getFieldState('field').meta.valid).toEqual(true);
2121+
expect(managerApi().getFieldState('field').meta.invalid).toEqual(false);
2122+
});
2123+
20942124
it('should save type: warning as warning - async', (done) => {
20952125
expect.assertions(2);
20962126

@@ -2105,6 +2135,52 @@ describe('managerApi', () => {
21052135
done();
21062136
});
21072137
});
2138+
2139+
it('warning should rewrite error - async', (done) => {
2140+
expect.assertions(18);
2141+
2142+
const asyncValidate = jest
2143+
.fn()
2144+
.mockImplementation((value) => Promise.reject(value === 'warning' ? { type: 'warning', error: someError } : 'error'));
2145+
2146+
const managerApi = createManagerApi({});
2147+
managerApi().registerField({ name: 'field', initialValue: 'warning', validate: asyncValidate, render, internalId: 1 });
2148+
2149+
expect(managerApi().getFieldState('field').meta.validating).toEqual(true);
2150+
2151+
setImmediate(() => {
2152+
expect(managerApi().getFieldState('field').meta.warning).toEqual(someError);
2153+
expect(managerApi().getFieldState('field').meta.error).toEqual(undefined);
2154+
expect(managerApi().getFieldState('field').meta.valid).toEqual(true);
2155+
expect(managerApi().getFieldState('field').meta.invalid).toEqual(false);
2156+
expect(managerApi().getFieldState('field').meta.validating).toEqual(false);
2157+
2158+
managerApi().change('field', 'error');
2159+
2160+
expect(managerApi().getFieldState('field').meta.validating).toEqual(true);
2161+
2162+
setImmediate(() => {
2163+
expect(managerApi().getFieldState('field').meta.warning).toEqual(undefined);
2164+
expect(managerApi().getFieldState('field').meta.error).toEqual('error');
2165+
expect(managerApi().getFieldState('field').meta.valid).toEqual(false);
2166+
expect(managerApi().getFieldState('field').meta.invalid).toEqual(true);
2167+
expect(managerApi().getFieldState('field').meta.validating).toEqual(false);
2168+
2169+
managerApi().change('field', 'warning');
2170+
2171+
expect(managerApi().getFieldState('field').meta.validating).toEqual(true);
2172+
2173+
setImmediate(() => {
2174+
expect(managerApi().getFieldState('field').meta.warning).toEqual(someError);
2175+
expect(managerApi().getFieldState('field').meta.error).toEqual(undefined);
2176+
expect(managerApi().getFieldState('field').meta.valid).toEqual(true);
2177+
expect(managerApi().getFieldState('field').meta.invalid).toEqual(false);
2178+
expect(managerApi().getFieldState('field').meta.validating).toEqual(false);
2179+
done();
2180+
});
2181+
});
2182+
});
2183+
});
21082184
});
21092185

21102186
describe('invalid submit', () => {

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,16 @@ const createManagerApi: CreateManagerApi = ({
291291
runFormValidation = false;
292292
}
293293

294-
function handleFieldError(name: string, isValid: boolean, error: string | undefined = undefined) {
294+
function handleFieldError(name: string, isValid: boolean, error: string | undefined = undefined, validating = false) {
295295
setFieldState(name, (prev: FieldState) => ({
296296
...prev,
297297
meta: {
298298
...prev.meta,
299299
error,
300300
valid: isValid,
301301
invalid: !isValid,
302-
validating: false
302+
validating,
303+
warning: undefined
303304
}
304305
}));
305306

@@ -322,7 +323,7 @@ const createManagerApi: CreateManagerApi = ({
322323
if (validators.length > 0) {
323324
const result = composeValidators(validators as Validator[])(value, state.values);
324325
if (isPromise(result)) {
325-
handleFieldError(name, true);
326+
handleFieldError(name, true, undefined, true);
326327
(result as Promise<string | undefined>)
327328
.then(() => handleFieldError(name, true))
328329
.catch((response) => {
@@ -331,7 +332,11 @@ const createManagerApi: CreateManagerApi = ({
331332
...prev,
332333
meta: {
333334
...prev.meta,
334-
warning: response.error
335+
warning: response.error,
336+
error: undefined,
337+
valid: true,
338+
invalid: false,
339+
validating: false
335340
}
336341
}));
337342
} else {
@@ -345,7 +350,11 @@ const createManagerApi: CreateManagerApi = ({
345350
...prev,
346351
meta: {
347352
...prev.meta,
348-
warning: (result as WarningObject)?.error
353+
warning: (result as WarningObject)?.error,
354+
error: undefined,
355+
valid: true,
356+
invalid: false,
357+
validating: false
349358
}
350359
}));
351360
} else {

0 commit comments

Comments
 (0)