diff --git a/src/components/App.js b/src/components/App.js index f70a4ed..8192704 100644 --- a/src/components/App.js +++ b/src/components/App.js @@ -3,6 +3,8 @@ 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/PeopleContainer' + class App extends Component { static propTypes = { @@ -14,6 +16,7 @@ class App extends Component {

Hello world

+
) diff --git a/src/components/routes/PeopleContainer.js b/src/components/routes/PeopleContainer.js new file mode 100644 index 0000000..12ce15a --- /dev/null +++ b/src/components/routes/PeopleContainer.js @@ -0,0 +1,28 @@ +import React, { Component } from 'react' +import {Route, NavLink} from 'react-router-dom' +import {connect} from 'react-redux' +import { parsonAdd } from '../../ducks/people' +import SignIn from '../auth/SignIn' +import PeopleForm from './PeopleForm' + +class PeoplePage extends Component { + static propTypes = { + + }; + + render() { + return ( +
+

People Container Page

+ +
+ ) + } + + handlePersonAdd = ({email, firstName, lastName}) => { + this.props.parsonAdd({email, firstName, lastName}) + } + +} + +export default connect(null, { parsonAdd })(PeoplePage) \ No newline at end of file diff --git a/src/components/routes/PeopleForm.js b/src/components/routes/PeopleForm.js new file mode 100644 index 0000000..4d3fee0 --- /dev/null +++ b/src/components/routes/PeopleForm.js @@ -0,0 +1,46 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import { reduxForm, Field } from 'redux-form' +import emailValidator from 'email-validator' +import ErrorField from '../common/ErrorField' + +export class PeopleForm extends Component { + static propTypes = { + + } + + render() { + return ( +
+

Add person

+
+ + + +
+ +
+ +
+ ) + } + +} + + +const validate = ({email, firstName, lastName}) => { + const errors = {} + + if(!email) errors.email = 'email is a required field' + if(!firstName) errors.firstName = 'provide a first name' + if(!lastName) errors.lastName = 'provide a last name' + + if(email && !emailValidator.validate(email)) errors.email = 'invalid email' + + return errors +} + +export default reduxForm({ + form: "people", + validate +}) (PeopleForm) diff --git a/src/ducks/people.js b/src/ducks/people.js new file mode 100644 index 0000000..6aef1f7 --- /dev/null +++ b/src/ducks/people.js @@ -0,0 +1,57 @@ +import {appName} from '../config' +import {Record} from 'immutable' +import firebase from 'firebase' +import { createSelector } from 'reselect' + +/** + * Constants + */ +export const moduleName = 'people' +const prefix = '${appName}/${moduleName}' + +export const ADD_PERSON = '${prefix}/ADD_PERSON' + + +/** + * Reducer + */ +export default function reducer(state = [], action) { + const {type, payload} = action + + switch(type) { + case ADD_PERSON: + const user = { + firstName: payload.firstName, + lastName: payload.lastName, + email: payload.email + } + return [ ...state, user ]; + + default: + return state + } +} + +/** + * Selectors + */ +export const stateSelector = state => state[moduleName] +export const userSelector = createSelector( + stateSelector, + state => state +) + + /** + * Action Creators + */ + export function parsonAdd(email, firstName, lastName) { + return { + type: ADD_PERSON, + payload: { + email, + firstName, + lastName + } + } + } + diff --git a/src/redux/reducer.js b/src/redux/reducer.js index 34143fe..259a58b 100644 --- a/src/redux/reducer.js +++ b/src/redux/reducer.js @@ -1,9 +1,22 @@ import {combineReducers} from 'redux' import {routerReducer as router} from 'react-router-redux' -import {reducer as form} from 'redux-form' +import {reducer as formReducer} from 'redux-form' import authReducer, {moduleName as authModule} from '../ducks/auth' +import peopleReducer, {moduleName as peopleModule} from '../ducks/people' +import {ADD_PERSON} from '../ducks/people' export default combineReducers({ - router, form, - [authModule]: authReducer + router, + form: formReducer.plugin({ + people: (state, action) => { + switch(action.type) { + case ADD_PERSON: + return undefined; + default: + return state; + } + } + }), + [authModule]: authReducer, + [peopleModule]: peopleReducer }) \ No newline at end of file