Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions admin/src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<div>
<Route path="/auth" component={Auth} />
<Route path="/user" component={NewUser} />
<ProtectedRoute path="/admin" component={Admin} />
</div>
)
Expand Down
40 changes: 40 additions & 0 deletions admin/src/components/user/create-user.js
Original file line number Diff line number Diff line change
@@ -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 (
<div>
<h3>Create User Form</h3>
<form onSubmit={this.props.handleSubmit}>
<Field label="First Name" name="firstName" component={ErrorField} />
<Field label="Last Name" name="lastName" component={ErrorField} />
<Field label="Email" name="email" component={ErrorField} />

<button type="submit">Submit</button>
<button onClick={this.props.reset}>Reset</button>
</form>
</div>
)
}
}

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)
43 changes: 43 additions & 0 deletions admin/src/ducks/user.js
Original file line number Diff line number Diff line change
@@ -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
}
}
}
17 changes: 15 additions & 2 deletions admin/src/redux/reducer.js
Original file line number Diff line number Diff line change
@@ -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({
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я бы в user редюсере чистил форму

[userModule]: (state, action) => {
switch (action.type) {
case CREATE_USER:
return undefined
default:
return state
}
}
}),
[authModule]: authReducer
})
31 changes: 31 additions & 0 deletions admin/src/routes/user.js
Original file line number Diff line number Diff line change
@@ -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 (
<div>
<h1>User page</h1>
<NavLink to="/user/new-user" activeStyle={{ color: 'red' }}>
Create a new user
</NavLink>

<Route path="/user/new-user" render={this.newUserForm} onSubmit />
</div>
)
}

newUserForm = () => <NewUserForm onSubmit={this.handleSubmit} />

handleSubmit = ({ firstName, lastName, email }) => {
this.props.createUser(firstName, lastName, email)
}
}

export default connect(
null,
{ createUser }
)(UserRoute)