@danderson00/react-forms 0.0.48 → 0.0.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/Form.js CHANGED
@@ -1,124 +1,124 @@
1
- import { createElement, createRef, useCallback, useEffect, useReducer, useState } from 'react'
2
- import { get, set } from 'object-path-immutable'
3
-
4
- const Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (
5
- ({ resetOnSubmit, row, gap, values, ...props }) => {
6
- const [fieldValues, setFieldValues] = useState(values || {})
7
- const [fieldValidators, registerFieldValidator] = useReducer((validators, validator) => [...validators, validator], [])
8
- const [error, setError] = useState()
9
- const [valid, setValid] = useState()
10
- const form = createRef()
11
-
12
- useEffect(() => {
13
- if(form.current) {
14
- setValid(form.current.checkValidity())
15
- }
16
- }, [form.current])
17
-
18
- const getFieldValue = useCallback(path => get(fieldValues, path), [fieldValues])
19
- const getFieldValues = useCallback(() => fieldValues, [fieldValues])
20
- const mapFieldValues = target => Object.keys(target).reduce(
21
- (values, name) => set(values, name, target[name]),
22
- {}
23
- )
24
-
25
- const setFieldValue = (path, value) => {
26
- setFieldValues(previousValues => set(previousValues, path, value))
27
- if(form.current) {
28
- setValid(form.current.checkValidity())
29
- }
30
- }
31
-
32
- const onSubmit = useCallback((e, { additionalValues, validate } = {}) => {
33
- if(validate !== false) {
34
- fieldValidators.forEach(setFieldValidated => setFieldValidated(undefined, fieldValues))
35
- }
36
-
37
- if((validate === false || form.current.checkValidity()) && props.onSubmit) {
38
- setError(undefined)
39
-
40
- const interactiveElements = form.current.querySelectorAll('input,button,textarea,select')
41
- const setFormDisabled = disabled => interactiveElements.forEach(x => x.disabled = disabled)
42
-
43
- const reset = () => {
44
- if(resetOnSubmit) {
45
- setFieldValues(values || {})
46
- }
47
- }
48
-
49
- try {
50
- const checkResultForError = result => {
51
- if(result && (result.success === false || result.error)) {
52
- setError(result.error || result.message || 'Form submission failed')
53
- } else {
54
- reset()
55
- }
56
- return result
57
- }
58
-
59
- const result = props.onSubmit(mapFieldValues({ ...fieldValues, ...additionalValues }))
60
- if(result && typeof result.then === 'function') {
61
- setFormDisabled(true)
62
- result
63
- .then(checkResultForError)
64
- .catch(setError)
65
- .finally(() => setFormDisabled(false))
66
- } else {
67
- reset()
68
- }
69
- } catch(error) {
70
- setError(error)
71
- }
72
- }
73
-
74
- e && e.preventDefault && e.preventDefault()
75
- e && e.stopPropagation && e.stopPropagation()
76
- }, [props, fieldValues])
77
-
78
- const classNames = ['react-forms', props.className]
79
- if(row) {
80
- classNames.push('react-forms-row')
81
- }
82
-
83
- const mergedAdditionalContext = Object.keys(additionalContext).reduce(
84
- (result, property) => ({ ...result, [property]: props[property] || additionalContext[property] }),
85
- {}
86
- )
87
-
88
- return (
89
- createElement('form', {
90
- ...props,
91
- className: classNames.join(' '),
92
- noValidate: true,
93
- onSubmit: onSubmit,
94
- ref: form,
95
- ...(gap && { style: { gap } }),
96
- children: [
97
- createElement(ContextProvider, {
98
- ...props,
99
- key: 'context',
100
- value: {
101
- registerFieldValidator,
102
- setFieldValue,
103
- getFieldValue,
104
- getFieldValues,
105
- onSubmit,
106
- valid,
107
- ...mergedAdditionalContext
108
- }
109
- }),
110
- error && createElement(ErrorMessage, { key: 'error', error }),
111
- createElement('input', {
112
- key: 'submit',
113
- type: 'submit',
114
- style: {
115
- visibility: 'hidden',
116
- position: 'absolute'
117
- }
118
- }),
119
- ]
120
- })
121
- )
122
- }
123
- )
1
+ import { createElement, createRef, useCallback, useEffect, useReducer, useState } from 'react'
2
+ import { get, set } from 'object-path-immutable'
3
+
4
+ const Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (
5
+ ({ resetOnSubmit, row, gap, values, ...props }) => {
6
+ const [fieldValues, setFieldValues] = useState(values || {})
7
+ const [fieldValidators, registerFieldValidator] = useReducer((validators, validator) => [...validators, validator], [])
8
+ const [error, setError] = useState()
9
+ const [valid, setValid] = useState()
10
+ const form = createRef()
11
+
12
+ useEffect(() => {
13
+ if(form.current) {
14
+ setValid(form.current.checkValidity())
15
+ }
16
+ }, [form.current])
17
+
18
+ const getFieldValue = useCallback(path => get(fieldValues, path), [fieldValues])
19
+ const getFieldValues = useCallback(() => fieldValues, [fieldValues])
20
+ const mapFieldValues = target => Object.keys(target).reduce(
21
+ (values, name) => set(values, name, target[name]),
22
+ {}
23
+ )
24
+
25
+ const setFieldValue = (path, value) => {
26
+ setFieldValues(previousValues => set(previousValues, path, value))
27
+ if(form.current) {
28
+ setValid(form.current.checkValidity())
29
+ }
30
+ }
31
+
32
+ const onSubmit = useCallback((e, { additionalValues, validate } = {}) => {
33
+ if(validate !== false) {
34
+ fieldValidators.forEach(setFieldValidated => setFieldValidated(undefined, fieldValues))
35
+ }
36
+
37
+ if((validate === false || form.current.checkValidity()) && props.onSubmit) {
38
+ setError(undefined)
39
+
40
+ const interactiveElements = form.current.querySelectorAll('input,button,textarea,select')
41
+ const setFormDisabled = disabled => interactiveElements.forEach(x => x.disabled = disabled)
42
+
43
+ const reset = () => {
44
+ if(resetOnSubmit) {
45
+ setFieldValues(values || {})
46
+ }
47
+ }
48
+
49
+ try {
50
+ const checkResultForError = result => {
51
+ if(result && (result.success === false || result.error)) {
52
+ setError(result.error || result.message || 'Form submission failed')
53
+ } else {
54
+ reset()
55
+ }
56
+ return result
57
+ }
58
+
59
+ const result = props.onSubmit(mapFieldValues({ ...fieldValues, ...additionalValues }))
60
+ if(result && typeof result.then === 'function') {
61
+ setFormDisabled(true)
62
+ result
63
+ .then(checkResultForError)
64
+ .catch(setError)
65
+ .finally(() => setFormDisabled(false))
66
+ } else {
67
+ reset()
68
+ }
69
+ } catch(error) {
70
+ setError(error)
71
+ }
72
+ }
73
+
74
+ e && e.preventDefault && e.preventDefault()
75
+ e && e.stopPropagation && e.stopPropagation()
76
+ }, [props.onSubmit, fieldValues])
77
+
78
+ const classNames = ['react-forms', props.className]
79
+ if(row) {
80
+ classNames.push('react-forms-row')
81
+ }
82
+
83
+ const mergedAdditionalContext = Object.keys(additionalContext).reduce(
84
+ (result, property) => ({ ...result, [property]: props[property] || additionalContext[property] }),
85
+ {}
86
+ )
87
+
88
+ return (
89
+ createElement('form', {
90
+ ...props,
91
+ className: classNames.join(' '),
92
+ noValidate: true,
93
+ onSubmit: onSubmit,
94
+ ref: form,
95
+ ...(gap && { style: { gap } }),
96
+ children: [
97
+ createElement(ContextProvider, {
98
+ ...props,
99
+ key: 'context',
100
+ value: {
101
+ registerFieldValidator,
102
+ setFieldValue,
103
+ getFieldValue,
104
+ getFieldValues,
105
+ onSubmit,
106
+ valid,
107
+ ...mergedAdditionalContext
108
+ }
109
+ }),
110
+ error && createElement(ErrorMessage, { key: 'error', error }),
111
+ createElement('input', {
112
+ key: 'submit',
113
+ type: 'submit',
114
+ style: {
115
+ visibility: 'hidden',
116
+ position: 'absolute'
117
+ }
118
+ }),
119
+ ]
120
+ })
121
+ )
122
+ }
123
+ )
124
124
  export default Form
package/src/Group.js CHANGED
@@ -1,15 +1,15 @@
1
- import { createElement, useContext } from 'react'
2
-
3
- const Group = formContext => ({ name, ...props }) => {
4
- if (!name) throw new Error("You must provide a name prop to form components")
5
- const { groups = [], ...context } = useContext(formContext)
6
-
7
- return createElement(formContext.Provider, {
8
- ...props,
9
- value: {
10
- ...context,
11
- groups: groups.concat(name)
12
- }
13
- })
14
- }
1
+ import { createElement, useContext } from 'react'
2
+
3
+ const Group = formContext => ({ name, ...props }) => {
4
+ if (!name) throw new Error("You must provide a name prop to form components")
5
+ const { groups = [], ...context } = useContext(formContext)
6
+
7
+ return createElement(formContext.Provider, {
8
+ ...props,
9
+ value: {
10
+ ...context,
11
+ groups: groups.concat(name)
12
+ }
13
+ })
14
+ }
15
15
  export default Group
package/src/index.js CHANGED
@@ -1,41 +1,41 @@
1
- import { createContext, createElement } from 'react'
2
- import FormProvider from './Form'
3
- import GroupProvider from './Group'
4
- import ErrorMessage from './ErrorMessage'
5
- import submit from './submit'
6
- import input from './input'
7
- import useFormValuesImpl from './useFormValues'
8
- import useFormImpl from './useForm'
9
- import './styles'
10
-
11
- export const context = createContext({})
12
-
13
- const createConsumer = ConsumerComponent => props => createElement(
14
- context.Consumer,
15
- { children: context => createElement(ConsumerComponent, { ...context, ...props }) }
16
- )
17
-
18
- export const createRawConsumer = ConsumerComponent => (
19
- props => createElement(
20
- context.Consumer,
21
- { children: ({ registerFieldValidator, setFieldValue, getFieldValue, ...context }) => (
22
- createElement(ConsumerComponent, { ...context, ...props })
23
- )}
24
- )
25
- )
26
-
27
- export const Form = FormProvider(context.Provider, {}, ErrorMessage)
28
- export const Group = GroupProvider(context)
29
- export const Submit = createConsumer(submit(props => createElement('button', props)))
30
-
31
- export const Input = createConsumer(input(props => createElement('input', props)))
32
- export const Textarea = createConsumer(input(props => createElement('textarea', props)))
33
- export const Select = createConsumer(input(props => createElement('select', props), { type: 'select' }))
34
-
35
- export const wrapInput = (component, options) => createConsumer(input(props => createElement(component, props), options))
36
- export const wrapSubmit = component => createConsumer(submit(props => createElement(component, props)))
37
-
38
- export const useFormValues = useFormValuesImpl(context)
39
- export const useForm = useFormImpl(context)
40
-
1
+ import { createContext, createElement } from 'react'
2
+ import FormProvider from './Form'
3
+ import GroupProvider from './Group'
4
+ import ErrorMessage from './ErrorMessage'
5
+ import submit from './submit'
6
+ import input from './input'
7
+ import useFormValuesImpl from './useFormValues'
8
+ import useFormImpl from './useForm'
9
+ import './styles'
10
+
11
+ export const context = createContext({})
12
+
13
+ const createConsumer = ConsumerComponent => props => createElement(
14
+ context.Consumer,
15
+ { children: context => createElement(ConsumerComponent, { ...context, ...props }) }
16
+ )
17
+
18
+ export const createRawConsumer = ConsumerComponent => (
19
+ props => createElement(
20
+ context.Consumer,
21
+ { children: ({ registerFieldValidator, setFieldValue, getFieldValue, ...context }) => (
22
+ createElement(ConsumerComponent, { ...context, ...props })
23
+ )}
24
+ )
25
+ )
26
+
27
+ export const Form = FormProvider(context.Provider, {}, ErrorMessage)
28
+ export const Group = GroupProvider(context)
29
+ export const Submit = createConsumer(submit(props => createElement('button', props)))
30
+
31
+ export const Input = createConsumer(input(props => createElement('input', props)))
32
+ export const Textarea = createConsumer(input(props => createElement('textarea', props)))
33
+ export const Select = createConsumer(input(props => createElement('select', props), { type: 'select' }))
34
+
35
+ export const wrapInput = (component, options) => createConsumer(input(props => createElement(component, props), options))
36
+ export const wrapSubmit = component => createConsumer(submit(props => createElement(component, props)))
37
+
38
+ export const useFormValues = useFormValuesImpl(context)
39
+ export const useForm = useFormImpl(context)
40
+
41
41
  export { FormProvider }
package/src/injectCss.js CHANGED
@@ -1,16 +1,16 @@
1
- export default function injectCss(id, css) {
2
- if (!css || typeof document === 'undefined' || document.querySelector(`#${id}`)) return
3
-
4
- const head = document.head || document.getElementsByTagName('head')[0]
5
- const style = document.createElement('style')
6
- style.id = id
7
- style.type = 'text/css'
8
-
9
- head.appendChild(style)
10
-
11
- if (style.styleSheet) {
12
- style.styleSheet.cssText = css
13
- } else {
14
- style.appendChild(document.createTextNode(css))
15
- }
1
+ export default function injectCss(id, css) {
2
+ if (!css || typeof document === 'undefined' || document.querySelector(`#${id}`)) return
3
+
4
+ const head = document.head || document.getElementsByTagName('head')[0]
5
+ const style = document.createElement('style')
6
+ style.id = id
7
+ style.type = 'text/css'
8
+
9
+ head.appendChild(style)
10
+
11
+ if (style.styleSheet) {
12
+ style.styleSheet.cssText = css
13
+ } else {
14
+ style.appendChild(document.createTextNode(css))
15
+ }
16
16
  }