diff --git a/admin/src/App.js b/admin/src/App.js
index c54f214..a1f61bc 100644
--- a/admin/src/App.js
+++ b/admin/src/App.js
@@ -3,12 +3,14 @@ import { Route } from 'react-router-dom'
import ProtectedRoute from './components/common/protected-route'
import Auth from './routes/auth'
import Admin from './routes/admin'
+import NewUser from './routes/user'
class App extends Component {
render() {
return (
)
diff --git a/admin/src/components/user/create-user.js b/admin/src/components/user/create-user.js
new file mode 100644
index 0000000..93ab23b
--- /dev/null
+++ b/admin/src/components/user/create-user.js
@@ -0,0 +1,40 @@
+import React, { Component } from 'react'
+import { reduxForm, Field } from 'redux-form'
+import ErrorField from '../common/error-field'
+import { validate as validateEmail } from 'email-validator'
+
+class NewUserForm extends Component {
+ render() {
+ return (
+
+
Create User Form
+
+
+ )
+ }
+}
+
+const validate = ({ firstName, lastName, email }) => {
+ const errors = {}
+
+ if (!firstName) errors.firstName = 'first name is a required field'
+
+ if (!lastName) errors.lastName = 'last name is a required field'
+
+ if (!email) errors.email = 'email is a required field'
+ else if (!validateEmail(email)) errors.email = 'email is invalid'
+
+ return errors
+}
+
+export default reduxForm({
+ form: 'user',
+ validate
+})(NewUserForm)
diff --git a/admin/src/ducks/user.js b/admin/src/ducks/user.js
new file mode 100644
index 0000000..4627d0f
--- /dev/null
+++ b/admin/src/ducks/user.js
@@ -0,0 +1,43 @@
+import { appName } from '../config'
+import { Record, OrderedMap } from 'immutable'
+
+/**
+ * Constants
+ * */
+export const moduleName = 'user'
+const prefix = `${appName}/${moduleName}`
+
+export const CREATE_USER = `${prefix}/CREATE_USER`
+
+/**
+ * Reducer
+ * */
+export const ReducerList = Record({
+ users: OrderedMap({})
+})
+
+export default function reducer(state = new ReducerList(), action) {
+ const { type, payload } = action
+
+ switch (type) {
+ case CREATE_USER:
+ return state.setIn(['users', payload.email], payload)
+
+ default:
+ return state
+ }
+}
+
+/**
+ * Action Creators
+ * */
+export function createUser(firstName, lastName, email) {
+ return {
+ type: CREATE_USER,
+ payload: {
+ firstName,
+ lastName,
+ email
+ }
+ }
+}
diff --git a/admin/src/redux/reducer.js b/admin/src/redux/reducer.js
index 78c74cf..4b73749 100644
--- a/admin/src/redux/reducer.js
+++ b/admin/src/redux/reducer.js
@@ -1,8 +1,21 @@
import { combineReducers } from 'redux'
-import { reducer as form } from 'redux-form'
+import { reducer as formReducer } from 'redux-form'
import authReducer, { moduleName as authModule } from '../ducks/auth'
+import userReducer, {
+ moduleName as userModule,
+ CREATE_USER
+} from '../ducks/user'
export default combineReducers({
- form,
+ form: formReducer.plugin({
+ [userModule]: (state, action) => {
+ switch (action.type) {
+ case CREATE_USER:
+ return undefined
+ default:
+ return state
+ }
+ }
+ }),
[authModule]: authReducer
})
diff --git a/admin/src/routes/user.js b/admin/src/routes/user.js
new file mode 100644
index 0000000..85d51bb
--- /dev/null
+++ b/admin/src/routes/user.js
@@ -0,0 +1,31 @@
+import React, { Component } from 'react'
+import { Route, NavLink } from 'react-router-dom'
+import { connect } from 'react-redux'
+import NewUserForm from '../components/user/create-user'
+import { createUser } from '../ducks/user'
+
+class UserRoute extends Component {
+ render() {
+ return (
+
+
User page
+
+ Create a new user
+
+
+
+
+ )
+ }
+
+ newUserForm = () =>
+
+ handleSubmit = ({ firstName, lastName, email }) => {
+ this.props.createUser(firstName, lastName, email)
+ }
+}
+
+export default connect(
+ null,
+ { createUser }
+)(UserRoute)