Skip to content

Commit e8a8fe7

Browse files
committed
fix(manager): do not allow send submit when invalid
1 parent d12cac6 commit e8a8fe7

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,4 +1904,25 @@ describe('managerApi', () => {
19041904
});
19051905
});
19061906
});
1907+
1908+
describe('invalid submit', () => {
1909+
it('should not call submit action when invalid + all fields are touched', () => {
1910+
const onSubmit = jest.fn();
1911+
1912+
const managerApi = createManagerApi({ onSubmit });
1913+
1914+
managerApi().registerField({ name: 'field', validate: () => 'error', render: jest.fn(), internalId: 1 });
1915+
managerApi().registerField({ name: 'field2', render: jest.fn(), internalId: 1 });
1916+
1917+
expect(managerApi().getFieldState('field').touched).toEqual(false);
1918+
expect(managerApi().getFieldState('field').touched).toEqual(false);
1919+
1920+
managerApi().handleSubmit();
1921+
1922+
expect(managerApi().getFieldState('field').touched).toEqual(true);
1923+
expect(managerApi().getFieldState('field').touched).toEqual(true);
1924+
1925+
expect(onSubmit).not.toHaveBeenCalled();
1926+
});
1927+
});
19071928
});

packages/form-state-manager/src/types/form-spy.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Subscription } from './use-subscription';
1+
import { Subscription } from './use-field';
22
import { ManagerState } from './manager-api';
33

44
type Children = (props: ManagerState) => React.ReactElement;

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,24 @@ const createManagerApi: CreateManagerApi = ({
554554
function handleSubmit(event?: FormEvent): void {
555555
event && event.preventDefault && event.preventDefault();
556556

557+
if (state.submitting) {
558+
return;
559+
}
560+
561+
if (state.invalid) {
562+
state.registeredFields.forEach((name) => {
563+
setFieldState(name, (state) => ({
564+
...state,
565+
meta: {
566+
...state.meta,
567+
touched: true
568+
}
569+
}));
570+
});
571+
572+
return;
573+
}
574+
557575
let error = false;
558576
state.registeredFields.forEach((name) =>
559577
traverseObject(state.fieldListeners[name].fields, (field) => {

0 commit comments

Comments
 (0)