Skip to content

Commit e3f8a78

Browse files
Merge pull request #10 from balazsorban44/dev
Performance improvements
2 parents 2157c81 + 295360d commit e3f8a78

File tree

6 files changed

+30
-37
lines changed

6 files changed

+30
-37
lines changed

src/__tests__/useForm.test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
import React, { useEffect } from 'react'
22
import { render, screen } from '@testing-library/react'
3-
import { render as customRender, fireEvent, cleanup } from '../test-utils'
3+
import { render as customRender, fireEvent } from '../test-utils'
44
import useForm from '../useForm'
55
import { errors } from '../handleDevErrors'
66
import validatorsMock from './utils/validators.mock'
77

88
it('invalid validator throws error', () => {
99

1010
const Component = ({ validators }) => {
11-
useForm({ name: 'form', validators })
11+
useForm({ name: 'form', validators, onSubmit: jest.fn() }).handleSubmit()
1212
return null
1313
}
1414

1515
expect(() => customRender(
1616
<Component/>,
1717
{ initialStates: { form: { input: '' } } }
1818
))
19-
.toThrow(errors.validators())
19+
.toThrow(errors.validators(undefined))
2020

2121
expect(() => customRender(
2222
<Component validators={() => ({ input: null })} />,
2323
{ initialStates: { form: { input: '' } } }
2424
))
25-
.toThrow(errors.validator('input'))
25+
.toThrow(errors.invalidValidators(['input']))
2626

2727
})
2828

src/changeHandler.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { errors as devErrors } from './handleDevErrors'
77
* merged with the form.
88
*/
99
export default function changeHandler({
10-
dispatch, setErrors, form, name, onNotify, validators, args, extendValidations
10+
dispatch, setErrors, form, name, onNotify, validators, args
1111
}) {
1212

1313
let fields = {}
@@ -31,7 +31,8 @@ export default function changeHandler({
3131
}
3232
if (Array.isArray(args[1])) {
3333
validations = args[1]
34-
extendValidations(args[1])
34+
} else {
35+
validations = Object.keys(fields)
3536
}
3637

3738

src/handleDevErrors.js

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@ export const errors = {
2525
`onSubmit must be a function, but it was ${typeof onSubmit}.`,
2626
'docs: https://github.com/balazsorban44/use-form/wiki#use-form-onSubmit',
2727
].join('\n'),
28-
2928
validators: validators => [
3029
`validators must be a function, but it was ${typeof validators}.`,
3130
'docs: https://github.com/balazsorban44/use-form/wiki#use-form-validators',
3231
].join('\n'),
33-
34-
validator: keys => [
35-
`The validator(s) for ${keys} in validators are invalid.`,
32+
invalidValidators: (keys) => [
33+
`The following validator(s) were invalid: ${keys}`,
3634
'docs: https://github.com/balazsorban44/use-form/wiki#use-form-validators',
3735
].join('\n'),
3836
outsideProvider: name => `useForm with name cannot be used outside a FormProvider (name was ${name})`
@@ -50,17 +48,9 @@ export default function handleDevErrors ({ name, initialState, form, validators,
5048
if (!form)
5149
throw new Error(errors.initialState(name))
5250

53-
if (typeof validators !== 'function') {
51+
if (typeof validators !== 'function')
5452
throw new TypeError(errors.validators(validators))
5553

56-
} else {
57-
const invalidValidators = Object.keys(form).filter(key =>
58-
typeof validators(form, false)[key] !== 'boolean'
59-
)
60-
if (invalidValidators.length)
61-
throw new TypeError(errors.validator(invalidValidators))
62-
}
63-
6454
if (typeof onSubmit !== 'function')
6555
throw new TypeError(errors.onSubmit(onSubmit))
6656
}

src/submitHandler.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,22 @@ import { errors as devErrors } from './handleDevErrors'
77
* before it is being sent.
88
*/
99
export default function submitHandler({
10-
e, options, name, form, submit, setLoading, setErrors, onNotify, validators, customValidations
10+
e, options, name, form, submit, setLoading, setErrors, onNotify, validators
1111
}) {
1212
e?.preventDefault?.()
1313
name = options?.formName || name
1414

15-
const validations = [...Object.keys(form), ...customValidations]
15+
16+
const validations = Object.keys(validators({}))
17+
18+
if (process.env.NODE_ENV !== 'production') {
19+
const invalidValidators = validations.filter(validation =>
20+
typeof validators(form, false)[validation] !== 'boolean'
21+
)
22+
if (invalidValidators.length)
23+
throw new Error(devErrors.invalidValidators(invalidValidators))
24+
}
25+
1626
const errors = validate({ fields: form, validators, submitting: true, validations })
1727
setErrors(e => ({ ...e, ...errors }))
1828

src/useForm.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,14 @@ export default function useForm ({ name, initialState, validators, onSubmit, onN
2525
const fields = concatFieldsAndErrors(form, errors)
2626
const hasErrors = Object.values(errors).some(e => e)
2727

28-
const [customValidations, extendValidations] = useState(Object.keys(validators))
29-
3028
const handleChange = (...args) =>
3129
changeHandler({
32-
dispatch, setErrors, form, name, onNotify, validators, args, extendValidations
30+
dispatch, setErrors, form, name, onNotify, validators, args
3331
})
3432

3533
const handleSubmit = (e, options) =>
3634
submitHandler({
37-
e, options, name, form, submit: onSubmit, setLoading, onNotify, setErrors, validators, customValidations
35+
e, options, name, form, submit: onSubmit, setLoading, onNotify, setErrors, validators
3836
})
3937

4038
const inputs = inputPropGenerators({ fields, handleChange, handleSubmit })

src/validate.js

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
1-
export default function validate({
2-
fields,
3-
validators,
4-
validations,
5-
form = {},
6-
submitting = false
7-
}) {
8-
return (validations || Object.keys(fields))
9-
.reduce((acc, field) => ({
10-
...acc,
11-
[field]: !validators({ ...form, ...fields }, submitting)[field]
12-
}), {})
1+
export default function validate({ fields, validators, validations, form = {}, submitting = false }) {
2+
const validationReducer = (acc, field) => {
3+
acc[field] = !validators({ ...form, ...fields }, submitting)[field]
4+
return acc
5+
}
6+
return validations.reduce(validationReducer, {})
137
}

0 commit comments

Comments
 (0)