The original example: Redux Form - Field Normalizing Example
Last active
October 31, 2017 14:10
-
-
Save shinaisan/46877f46602fd8f1ecb3786daee0fd4e to your computer and use it in GitHub Desktop.
Redux Form - Field Normalizing Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React from 'react'; | |
import FieldNormalizingForm from './FieldNormalizingForm'; | |
import { createStore } from 'redux'; | |
import { Provider } from 'react-redux'; | |
import reducer from './reducer'; | |
import "bootstrap/dist/css/bootstrap.css"; | |
const store = createStore(reducer); | |
class App extends React.Component { | |
constructor(props) { | |
super(props); | |
this.state = {debug: ''}; | |
} | |
handleSubmit(values) { | |
const self = this; | |
self.setState({debug: JSON.stringify(values)}); | |
} | |
render() { | |
const onSubmit = this.handleSubmit.bind(this); | |
return ( | |
<Provider store={store}> | |
<div> | |
<FieldNormalizingForm onSubmit={onSubmit} /> | |
<div> | |
<pre>{this.state.debug}</pre> | |
</div> | |
</div> | |
</Provider> | |
); | |
} | |
} | |
export default App; | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
NAME=redux-form-normalizing | |
echo -n "This script runs create-react-app $NAME. Proceed? (Y/N) " | |
read YN | |
if [ x$YN != xY ] | |
then | |
echo "Bye." | |
exit | |
fi | |
# Delete this line only if you are sure what is done from this line on. | |
exit | |
create-react-app $NAME | |
cd $NAME | |
cp -v ../package.json . | |
cd src | |
rm -f App.* logo.svg | |
cp -v ../../*.js . | |
cd .. | |
yarn install | |
echo 'To launch the dev server, run `yarn run start`.' | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React from 'react' | |
import { Field, reduxForm } from 'redux-form' | |
import normalizePhone from './normalizePhone' | |
import { | |
Form, FormGroup, | |
Row, Col, | |
Button | |
} from 'react-bootstrap' | |
const upper = value => value && value.toUpperCase() | |
const lower = value => value && value.toLowerCase() | |
const lessThan = otherField => (value, previousValue, allValues) => | |
parseFloat(value) < parseFloat(allValues[otherField]) ? value : previousValue | |
const greaterThan = otherField => (value, previousValue, allValues) => | |
parseFloat(value) > parseFloat(allValues[otherField]) ? value : previousValue | |
const FieldNormalizingForm = props => { | |
const { handleSubmit, pristine, reset, submitting } = props | |
return ( | |
<Form onSubmit={handleSubmit}> | |
<FormGroup> | |
<Row> | |
<Col sm={2}> | |
<label>Username</label> | |
</Col> | |
<Col sm={8}> | |
<Field | |
name="username" | |
component="input" | |
type="text" | |
placeholder="Username" | |
normalize={lower} | |
/> | |
</Col> | |
</Row> | |
</FormGroup> | |
<FormGroup> | |
<Row> | |
<Col sm={2}> | |
<label>Shout</label> | |
</Col> | |
<Col sm={8}> | |
<Field | |
name="shout" | |
component="input" | |
type="text" | |
placeholder="Shout something!" | |
normalize={upper} | |
/> | |
</Col> | |
</Row> | |
</FormGroup> | |
<FormGroup> | |
<Row> | |
<Col sm={2}> | |
<label>Phone</label> | |
</Col> | |
<Col sm={8}> | |
<Field | |
name="phone" | |
component="input" | |
type="text" | |
placeholder="Phone Number" | |
normalize={normalizePhone} | |
/> | |
</Col> | |
</Row> | |
</FormGroup> | |
<FormGroup> | |
<Row> | |
<Col sm={2}> | |
<label>Min</label> | |
</Col> | |
<Col sm={8}> | |
<Field | |
name="min" | |
component="input" | |
type="number" | |
normalize={lessThan('max')} | |
/> | |
</Col> | |
</Row> | |
</FormGroup> | |
<FormGroup> | |
<Row> | |
<Col sm={2}> | |
<label>Max</label> | |
</Col> | |
<Col sm={8}> | |
<Field | |
name="max" | |
component="input" | |
type="number" | |
normalize={greaterThan('min')} | |
/> | |
</Col> | |
</Row> | |
</FormGroup> | |
<Button type="submit" bsStyle="primary" | |
disabled={submitting}> | |
Submit | |
</Button> | |
<Button type="button" bsStyle="default" | |
disabled={pristine || submitting} onClick={reset}> | |
Clear Values | |
</Button> | |
</Form> | |
) | |
} | |
export default reduxForm({ | |
form: 'normalizing', // a unique identifier for this form | |
initialValues: { min: '1', max: '10' } | |
})(FieldNormalizingForm) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const normalizePhone = value => { | |
if (!value) { | |
return value | |
} | |
const onlyNums = value.replace(/[^\d]/g, '') | |
if (onlyNums.length <= 3) { | |
return onlyNums | |
} | |
if (onlyNums.length <= 7) { | |
return `${onlyNums.slice(0, 3)}-${onlyNums.slice(3)}` | |
} | |
return `${onlyNums.slice(0, 3)}-${onlyNums.slice(3, 6)}-${onlyNums.slice( | |
6, | |
10 | |
)}` | |
} | |
export default normalizePhone |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "redux-form-selecting-form-values", | |
"version": "0.1.0", | |
"private": true, | |
"dependencies": { | |
"bootstrap": "^3.3.7", | |
"react": "^16.0.0", | |
"react-bootstrap": "^0.31.5", | |
"react-dom": "^16.0.0", | |
"react-redux": "^5.0.6", | |
"redux": "^3.7.2", | |
"redux-form": "^7.1.2" | |
}, | |
"devDependencies": { | |
"react-scripts": "1.0.14" | |
}, | |
"scripts": { | |
"start": "react-scripts start", | |
"build": "react-scripts build", | |
"test": "react-scripts test --env=jsdom", | |
"eject": "react-scripts eject" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { combineReducers } from 'redux'; | |
import { reducer as formReducer } from 'redux-form'; | |
const rootReducer = combineReducers({ | |
form: formReducer | |
}); | |
export default rootReducer; | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { SubmissionError } from 'redux-form' | |
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) | |
function submit(values) { | |
return sleep(1000).then(() => { | |
// simulate server latency | |
if (!['john', 'paul', 'george', 'ringo'].includes(values.username)) { | |
throw new SubmissionError({ | |
username: 'User does not exist', | |
_error: 'Login failed!' | |
}) | |
} else if (values.password !== 'redux-form') { | |
throw new SubmissionError({ | |
password: 'Wrong password', | |
_error: 'Login failed!' | |
}) | |
} else { | |
return values; | |
} | |
}) | |
} | |
export default submit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment