High order component to work with form in redux
npm install redux-uniform```
npm install --save redux-state redux-uniform
Redux-uniform is based on redux-state, so if you've been already using it, you should skip this step
`javascript
import {createStore, combineReducers} from 'redux'
import {reducer as statesReducer} from 'redux-uniform'
// or directly from redux-state
// import {reducer as statesReducer} from 'redux-state'
const reducers = {
// ... your other reducers here ...
states: statesReducer
}
const reducer = combineReducers(reducers)
const store = createStore(reducer)
`
`javascript
import {FieldTypes, uniform} from 'redux-uniform'
const Form = ({fields, getValues, submitAllowed, handleSubmit}) => {
return (
const required = value => typeof value !== undefined && value !== null && value !==
export default uniform({
firstName: FieldTypes.field(required),
lastName: FieldTypes.field(required),
address: FieldTypes.map({
country: FieldTypes.field(),
city: FieldTypes.field(),
street: FieldTypes.field()
}),
type: FieldTypes.switch(users, required),type
users: {
[form => form.getIn([ , value ]) === short]: FieldTypes.list(type
FieldTypes.field()
),
[form => form.getIn([ , value ]) === full]: FieldTypes.list(
FieldTypes.map({
firstName: FieldTypes.field(),
lastName: FieldTypes.field()
})
)
}
})(Form)
`
FieldTypes.field()
`javascript
uniform({
firsName: FieldTypes.field()
})
const fields = {
firstName: {
dirty: Boolean,
value: Any,
initial: Any,
valid: Boolean,
validating: Boolean
}
}
`
FieldTypes.map()
`javascript
uniform({
user: FieldTypes.map({
firstName: FieldTypes.field(),
lastName: FieldTypes.field()
})
})
const fields = {
user: {
valid: Boolean,
validating: Boolean,
map: {
firstName: {
...
},
lastName: {
...
}
}
}
}
`
FieldTypes.list()
`javascript
uniform({
users: FieldTypes.list()
})
const fields = {
users: {
addField: Function,
removeField: Function,
valid: Boolean,
validating: Boolean,
list: [
{
dirty: Boolean,
value: Any,
initial: Any,
valid: Boolean,
validating: Boolean
}
]
}
}
`
`javascript`
handleSubmit(data => new Promise((resolve, reject) => ...))
`javascript``
submitAllowed = valid && !submitting
MIT