diff --git a/README.md b/README.md index 3bd00c1..9e9af93 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ -##HT1.1 Сделать форму для добавления людей(firstName, lastName, email) с валидацией, по /people роуту -##HT1.2 добавлять их в редакс-стор -##HT1.3 Создать собственный проект на firebase и использовать его в своих ДЗ \ No newline at end of file +## HT1.1 Сделать форму для добавления людей(firstName, lastName, email) с валидацией, по /people роуту(complete) + +## HT1.2 добавлять их в редакс-стор(complete?) + +## HT1.3 Создать собственный проект на firebase и использовать его в своих ДЗ (complete) diff --git a/src/components/People/PeopleForm.js b/src/components/People/PeopleForm.js new file mode 100644 index 0000000..1bfe298 --- /dev/null +++ b/src/components/People/PeopleForm.js @@ -0,0 +1,44 @@ +import React, { Component } from 'react' +import { reduxForm, Field } from 'redux-form' +import ErrorField from '../common/ErrorField' +import emailValidator from 'email-validator' + +class PeopleForm extends Component { + render() { + const { handleSubmit, submitting } = this.props; + return ( +
+

+ Add person +

+
console.log(values))}> + + + +
+ +
+ +
+ ); + } +} + +const validate = ({first_name, last_name, email}) => { + const errors = {} + + if (!email) errors.email = 'email is required' + else if (!emailValidator.validate(email)) errors.email = 'invalid email' + + if (!first_name) errors.first_name = 'first_name is required' + + if(!last_name) errors.last_name = 'last_name is required' + + return errors +} + + +export default reduxForm({ + form: 'people', + validate +})(PeopleForm); \ No newline at end of file diff --git a/src/components/Root.js b/src/components/Root.js index bbf2596..bcd533c 100644 --- a/src/components/Root.js +++ b/src/components/Root.js @@ -3,6 +3,7 @@ import {Route} from 'react-router-dom' import AdminPage from './routes/AdminPage' import AuthPage from './routes/AuthPage' import ProtectedRoute from './common/ProtectedRoute' +import PeopleForm from './People/PeopleForm' class Root extends Component { static propTypes = { @@ -14,6 +15,7 @@ class Root extends Component {
+
) } diff --git a/src/components/routes/PeoplePage.js b/src/components/routes/PeoplePage.js new file mode 100644 index 0000000..ed8e070 --- /dev/null +++ b/src/components/routes/PeoplePage.js @@ -0,0 +1,13 @@ +import React, { Component } from 'react' + +class PeoplePage extends Comment { + render () { + return ( +
+ People Page +
+ ) + } +} + +export default PeoplePage diff --git a/src/config.js b/src/config.js index e8d8d78..3d96faa 100644 --- a/src/config.js +++ b/src/config.js @@ -1,13 +1,13 @@ import firebase from 'firebase' -export const appName = "advreact-21-08" +export const appName = "adv-21-08" export const firebaseConfig = { - apiKey: "AIzaSyDjA6CeIHuni5lNm4ML1b-TSxJltsYUO8g", + apiKey: "AIzaSyAFf2xnTf-RQAxK0W_QWKbsf8nEW0vJ66Y", authDomain: `${appName}.firebaseapp.com`, databaseURL: `https://${appName}.firebaseio.com`, projectId: appName, storageBucket: `${appName}.appspot.com`, - messagingSenderId: "789814589283" + messagingSenderId: "497019564518" } firebase.initializeApp(firebaseConfig) \ No newline at end of file diff --git a/src/ducks/people.js b/src/ducks/people.js new file mode 100644 index 0000000..d13ca9d --- /dev/null +++ b/src/ducks/people.js @@ -0,0 +1,34 @@ +import firebase from 'firebase' +import {appName} from '../config' +import {Record} from 'immutable' + +const ReducerRecord = Record({ + user: null, + error: null, + loading: false +}) + +export const moduleName = 'people' +export const ADD_USER_REQUEST = `${appName}/${moduleName}/ADD_USER_REQUEST` +export const ADD_USER_SUCCESS = `${appName}/${moduleName}/ADD_USER_SUCCESS` +export const ADD_USER_ERROR = `${appName}/${moduleName}/ADD_USER_ERROR` + +export default function reducer(state = new ReducerRecord(), action) { + const {type, payload, error} = action + + switch(type) { + case ADD_USER_REQUEST: + return state + .set('loading', true) + + case ADD_USER_SUCCESS: + return state + + case ADD_USER_ERROR: + return state + .set('loading', false) + .set('error', error) + default: + return state; + } +} \ No newline at end of file diff --git a/src/redux/index.js b/src/redux/index.js index b45bb34..0860785 100644 --- a/src/redux/index.js +++ b/src/redux/index.js @@ -7,7 +7,9 @@ import history from '../history' const enhancer = applyMiddleware(routerMiddleware(history), thunk, logger) -const store = createStore(reducer, enhancer) +const store = createStore(reducer, + enhancer, + window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()) window.store = store export default store diff --git a/src/redux/reducer.js b/src/redux/reducer.js index 34143fe..918c743 100644 --- a/src/redux/reducer.js +++ b/src/redux/reducer.js @@ -2,8 +2,10 @@ import {combineReducers} from 'redux' import {routerReducer as router} from 'react-router-redux' import {reducer as form} from 'redux-form' import authReducer, {moduleName as authModule} from '../ducks/auth' +import peopleReducer, {moduleName as peopleModule } from '../ducks/people'; export default combineReducers({ router, form, - [authModule]: authReducer + [authModule]: authReducer, + [peopleModule]: peopleReducer }) \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 10d3512..6bab36e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47,14 +47,10 @@ acorn@^5.0.0, acorn@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" -address@1.0.2: +address@1.0.2, address@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/address/-/address-1.0.2.tgz#480081e82b587ba319459fef512f516fe03d58af" -address@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" - ajv-keywords@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" @@ -338,7 +334,7 @@ babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@6.25.0: +babel-core@6.25.0, babel-core@^6.0.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" dependencies: @@ -362,7 +358,7 @@ babel-core@6.25.0: slash "^1.0.0" source-map "^0.5.0" -babel-core@^6.0.0, babel-core@^6.26.0: +babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" dependencies: @@ -838,18 +834,12 @@ babel-plugin-transform-react-jsx@6.24.1, babel-plugin-transform-react-jsx@^6.24. babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-regenerator@6.24.1: +babel-plugin-transform-regenerator@6.24.1, babel-plugin-transform-regenerator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" dependencies: regenerator-transform "0.9.11" -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - babel-plugin-transform-runtime@6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" @@ -950,14 +940,14 @@ babel-register@^6.24.1, babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@6.23.0: +babel-runtime@6.23.0, babel-runtime@^6.22.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" dependencies: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.18.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: @@ -4199,7 +4189,7 @@ minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: +minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -4207,10 +4197,6 @@ minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -5440,14 +5426,6 @@ regenerator-transform@0.9.11: babel-types "^6.19.0" private "^0.1.6" -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - regex-cache@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" @@ -6600,14 +6578,10 @@ window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -wordwrap@0.0.2: +wordwrap@0.0.2, wordwrap@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"