From a58147c86b0fe0f31e8d66dc1f8888a62f3f6fb6 Mon Sep 17 00:00:00 2001 From: Gatilin Maxim Date: Sat, 21 Oct 2017 15:48:01 +0300 Subject: [PATCH 1/7] #HT1 Use own firebase account --- src/config.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/config.js b/src/config.js index 2782a0b..0df932e 100644 --- a/src/config.js +++ b/src/config.js @@ -1,12 +1,12 @@ import firebase from 'firebase' -export const appName = 'advreact-1610' +export const appName = 'react-course-f262b' firebase.initializeApp({ - apiKey: "AIzaSyB31xpTtp4Jln_hb2kAbE4PGf6Mi8EgLyA", - authDomain: `${appName}.firebaseapp.com`, - databaseURL: `https://${appName}.firebaseio.com`, - projectId: appName, - storageBucket: "", - messagingSenderId: "397157634637" + authDomain: `${appName}.firebaseapp.com`, + databaseURL: `https://${appName}.firebaseio.com`, + projectId: appName, + apiKey: "AIzaSyAt-smU_1tqNdkj9pmSpVLxqaOjhDwf4dk", + storageBucket: "react-course-f262b.appspot.com", + messagingSenderId: "447165438476" }) \ No newline at end of file From 55ed85ebfa65b37cca76a3128507b803facbddd8 Mon Sep 17 00:00:00 2001 From: Gatilin Maxim Date: Sat, 21 Oct 2017 15:52:11 +0300 Subject: [PATCH 2/7] Add route for people page --- src/components/App.js | 2 ++ src/components/routes/People.js | 13 +++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/components/routes/People.js diff --git a/src/components/App.js b/src/components/App.js index f70a4ed..d43dd4f 100644 --- a/src/components/App.js +++ b/src/components/App.js @@ -3,6 +3,7 @@ import {Route} from 'react-router-dom' import ProtectedRoute from './common/ProtectedRoute' import AdminPage from './routes/Admin' import AuthPage from './routes/Auth' +import PeoplePage from './routes/People'; class App extends Component { static propTypes = { @@ -15,6 +16,7 @@ class App extends Component {

Hello world

+ ) } diff --git a/src/components/routes/People.js b/src/components/routes/People.js new file mode 100644 index 0000000..6904659 --- /dev/null +++ b/src/components/routes/People.js @@ -0,0 +1,13 @@ +import React, { Component } from 'react' + +class PeoplePage extends Component { + render() { + return ( +
+

People

+
+ ) + } +} + +export default PeoplePage; \ No newline at end of file From 12bb45ab1360efa6cf7b65ff8541811e36bd71e1 Mon Sep 17 00:00:00 2001 From: Gatilin Maxim Date: Sat, 21 Oct 2017 16:07:21 +0300 Subject: [PATCH 3/7] #HT1 Add people module to Redux --- src/ducks/people.js | 39 +++++++++++++++++++++++++++++++++++++++ src/redux/reducer.js | 4 +++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/ducks/people.js diff --git a/src/ducks/people.js b/src/ducks/people.js new file mode 100644 index 0000000..b49ad02 --- /dev/null +++ b/src/ducks/people.js @@ -0,0 +1,39 @@ +import {appName} from '../config' +import {Record} from 'immutable' + +/** + * Constants + * */ +export const moduleName = 'people' +const prefix = `${appName}/${moduleName}` + +export const ADD_PEOPLE_ENTRY = `${prefix}/ADD_PEOPLE` + +/** + * Reducer + * */ +export const ReducerRecord = Record({ + people: [] +}) + +export default function reducer(state = new ReducerRecord(), action) { + const {type, payload} = action + + switch (type) { + case ADD_PEOPLE_ENTRY: + return state.set('people', state.get('people').push(payload.entry)) + + default: + return state + } +} + +/** + * Action Creators + * */ +export function addPeopleEntry(entry) { + return { + type: ADD_PEOPLE_ENTRY, + payload: {entry} + } +} \ No newline at end of file diff --git a/src/redux/reducer.js b/src/redux/reducer.js index 34143fe..cc6e0aa 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 From 107ad6901c39cae26c13f5d6a8587598eb7cfc4e Mon Sep 17 00:00:00 2001 From: Gatilin Maxim Date: Sat, 21 Oct 2017 16:23:29 +0300 Subject: [PATCH 4/7] #HT1 Add people form --- src/components/people/Add.js | 39 +++++++++++++++++++++++++++++++++ src/components/routes/People.js | 12 ++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/components/people/Add.js diff --git a/src/components/people/Add.js b/src/components/people/Add.js new file mode 100644 index 0000000..9592ca2 --- /dev/null +++ b/src/components/people/Add.js @@ -0,0 +1,39 @@ +import React, {Component} from 'react' +import {reduxForm, Field} from 'redux-form' +import emailValidator from 'email-validator' +import ErrorField from '../common/ErrorField' + +class PeopleAdd extends Component { + render() { + return ( +
+

Add people

+
+ + + +
+ +
+ +
+ ) + } +} + +const validate = ({firstName, lastName, email}) => { + const errors = {} + + if (!email) errors.email = 'email is a required field' + if (!firstName) errors.firstName = 'First name is a required field' + if (!lastName) errors.lastName = 'Last name is a required field' + + if (email && !emailValidator.validate(email)) errors.email = 'invalid email' + + return errors +} + +export default reduxForm({ + form: 'people_add', + validate +})(PeopleAdd) \ No newline at end of file diff --git a/src/components/routes/People.js b/src/components/routes/People.js index 6904659..5825633 100644 --- a/src/components/routes/People.js +++ b/src/components/routes/People.js @@ -1,13 +1,21 @@ import React, { Component } from 'react' +import {Route, NavLink} from 'react-router-dom' +import {connect} from 'react-redux' +import {addPeopleEntry} from '../../ducks/people' +import AddPeople from '../people/Add'; class PeoplePage extends Component { render() { return (
-

People

+

People

+ add + }/>
) } + + handleAdd = (entry) => this.props.addPeopleEntry(entry) } -export default PeoplePage; \ No newline at end of file +export default connect(null, { addPeopleEntry })(PeoplePage) \ No newline at end of file From b2c936f58e5914e00603e9fe4999f67de35d2be5 Mon Sep 17 00:00:00 2001 From: Gatilin Maxim Date: Sat, 21 Oct 2017 16:45:54 +0300 Subject: [PATCH 5/7] #HT1 Use List instead of array for people reducer --- src/components/routes/People.js | 20 +++++++++++++++----- src/ducks/people.js | 6 +++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/components/routes/People.js b/src/components/routes/People.js index 5825633..6dac0e5 100644 --- a/src/components/routes/People.js +++ b/src/components/routes/People.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react' +import React, {Component} from 'react' import {Route, NavLink} from 'react-router-dom' import {connect} from 'react-redux' import {addPeopleEntry} from '../../ducks/people' @@ -6,11 +6,19 @@ import AddPeople from '../people/Add'; class PeoplePage extends Component { render() { + const peopleList = this.props.people.toArray(); return (
-

People

- add - }/> +

People

+
    + {peopleList.map((person, index) => { + return
  • + {person.firstName} {person.lastName} +
  • + })} +
+ add + }/>
) } @@ -18,4 +26,6 @@ class PeoplePage extends Component { handleAdd = (entry) => this.props.addPeopleEntry(entry) } -export default connect(null, { addPeopleEntry })(PeoplePage) \ No newline at end of file +export default connect(state => ({ + people: state.people.list +}), {addPeopleEntry})(PeoplePage) \ No newline at end of file diff --git a/src/ducks/people.js b/src/ducks/people.js index b49ad02..5208809 100644 --- a/src/ducks/people.js +++ b/src/ducks/people.js @@ -1,5 +1,5 @@ import {appName} from '../config' -import {Record} from 'immutable' +import {Record, List} from 'immutable' /** * Constants @@ -13,7 +13,7 @@ export const ADD_PEOPLE_ENTRY = `${prefix}/ADD_PEOPLE` * Reducer * */ export const ReducerRecord = Record({ - people: [] + list: List() }) export default function reducer(state = new ReducerRecord(), action) { @@ -21,7 +21,7 @@ export default function reducer(state = new ReducerRecord(), action) { switch (type) { case ADD_PEOPLE_ENTRY: - return state.set('people', state.get('people').push(payload.entry)) + return state.set('list', state.get('list').push(payload.entry)) default: return state From 5c1b0d027289609b2c9e1b6fcf9f331a22fae86b Mon Sep 17 00:00:00 2001 From: Gatilin Maxim Date: Sat, 21 Oct 2017 16:51:10 +0300 Subject: [PATCH 6/7] #HT1 Reset form after submitting --- src/components/people/Add.js | 2 +- src/ducks/people.js | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/people/Add.js b/src/components/people/Add.js index 9592ca2..31d0ced 100644 --- a/src/components/people/Add.js +++ b/src/components/people/Add.js @@ -34,6 +34,6 @@ const validate = ({firstName, lastName, email}) => { } export default reduxForm({ - form: 'people_add', + form: 'peopleAdd', validate })(PeopleAdd) \ No newline at end of file diff --git a/src/ducks/people.js b/src/ducks/people.js index 5208809..c821eb4 100644 --- a/src/ducks/people.js +++ b/src/ducks/people.js @@ -1,5 +1,6 @@ import {appName} from '../config' import {Record, List} from 'immutable' +import {reset} from 'redux-form'; /** * Constants @@ -32,8 +33,11 @@ export default function reducer(state = new ReducerRecord(), action) { * Action Creators * */ export function addPeopleEntry(entry) { - return { - type: ADD_PEOPLE_ENTRY, - payload: {entry} + return (dispatch) => { + dispatch({ + type: ADD_PEOPLE_ENTRY, + payload: {entry} + }) + dispatch(reset('peopleAdd')); } } \ No newline at end of file From 4a65e9fcafbed4faacde65d8e68f2e040aae8f5b Mon Sep 17 00:00:00 2001 From: Gatilin Maxim Date: Mon, 23 Oct 2017 08:08:33 +0300 Subject: [PATCH 7/7] #HT --- src/ducks/people.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ducks/people.js b/src/ducks/people.js index c821eb4..17038a8 100644 --- a/src/ducks/people.js +++ b/src/ducks/people.js @@ -1,5 +1,5 @@ import {appName} from '../config' -import {Record, List} from 'immutable' +import {Record, Map} from 'immutable' import {reset} from 'redux-form'; /** @@ -14,7 +14,7 @@ export const ADD_PEOPLE_ENTRY = `${prefix}/ADD_PEOPLE` * Reducer * */ export const ReducerRecord = Record({ - list: List() + list: Map() }) export default function reducer(state = new ReducerRecord(), action) { @@ -22,7 +22,7 @@ export default function reducer(state = new ReducerRecord(), action) { switch (type) { case ADD_PEOPLE_ENTRY: - return state.set('list', state.get('list').push(payload.entry)) + return state.update('list', list => list.set([payload.entry.firstName], payload.entry)) default: return state