From e31d49382eeb4717e2675b2fbd26ece250985001 Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 21 Aug 2017 19:18:34 +0300 Subject: [PATCH 1/4] Initial commit --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..ad8947a --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# advreact_21_08 \ No newline at end of file From 82ce719b545e0facd5b6d8fd34b31475a7d5cb79 Mon Sep 17 00:00:00 2001 From: SerGladkOFF Date: Sun, 27 Aug 2017 17:39:53 +0300 Subject: [PATCH 2/4] add user from arhitecture --- src/components/admin/RegisteredUserForm.js | 46 ++++++++++++++++++++++ src/components/common/ErrorField.js | 3 -- src/components/routes/AdminPage.js | 17 +++++++- src/config.js | 8 ++-- 4 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 src/components/admin/RegisteredUserForm.js diff --git a/src/components/admin/RegisteredUserForm.js b/src/components/admin/RegisteredUserForm.js new file mode 100644 index 0000000..393747a --- /dev/null +++ b/src/components/admin/RegisteredUserForm.js @@ -0,0 +1,46 @@ +import React, { Component } from 'react' +import {reduxForm, Field} from 'redux-form' +import emailValidator from 'email-validator' +import ErrorField from '../common/ErrorField' + +class RegisteredUserForm extends Component { + static propTypes = { + + }; + + render() { + const {handleSubmit} = this.props + return ( +
+

Add user form

+
+ + + + +
+ +
+ +
+ ) + } +} + +const validate = ({email, password}) => { + const errors = {} + + if (!email) errors.email = 'email is required' + else if (!emailValidator.validate(email)) errors.email = 'invalid email' + + if (!password) errors.password = 'password is required' + else if (password.length < 8) errors.password = 'to short' + + return errors +} + + +export default reduxForm({ + form: 'registeredUserForm', + validate +})(RegisteredUserForm) \ No newline at end of file diff --git a/src/components/common/ErrorField.js b/src/components/common/ErrorField.js index a4879c1..925999d 100644 --- a/src/components/common/ErrorField.js +++ b/src/components/common/ErrorField.js @@ -12,7 +12,4 @@ function ErrorField(props) { ) } -ErrorField.propTypes = { -} - export default ErrorField \ No newline at end of file diff --git a/src/components/routes/AdminPage.js b/src/components/routes/AdminPage.js index 1c4cb84..2a064b2 100644 --- a/src/components/routes/AdminPage.js +++ b/src/components/routes/AdminPage.js @@ -1,4 +1,10 @@ import React, { Component } from 'react' +import {Route, NavLink} from 'react-router-dom' +//import {connect} from 'react-redux' +//import {registeredUser} from '../../ducks/registeredUser' +//import Loader from '../common/Loader' +import RegisteredUserForm from '../admin/RegisteredUserForm' + class AdminPage extends Component { static propTypes = { @@ -9,9 +15,18 @@ class AdminPage extends Component { return (

Admin Page

+ Registered user + + }/> +
) } } -export default AdminPage \ No newline at end of file +export default AdminPage +// export default connect(state => ({ +// loading: state[moduleName].loading +// }), {signUp})(AdminPage) +//sign up +// }/> \ No newline at end of file diff --git a/src/config.js b/src/config.js index e8d8d78..6a042e8 100644 --- a/src/config.js +++ b/src/config.js @@ -1,13 +1,15 @@ import firebase from 'firebase' -export const appName = "advreact-21-08" +export const appName = 'advreact-277e8'//"advreact-21-08" export const firebaseConfig = { - apiKey: "AIzaSyDjA6CeIHuni5lNm4ML1b-TSxJltsYUO8g", + //apiKey: "AIzaSyDjA6CeIHuni5lNm4ML1b-TSxJltsYUO8g", + apiKey: "AIzaSyCw2LF9saF-AiDhbN464gWERWR35m5qm0Q", authDomain: `${appName}.firebaseapp.com`, databaseURL: `https://${appName}.firebaseio.com`, projectId: appName, storageBucket: `${appName}.appspot.com`, - messagingSenderId: "789814589283" + //messagingSenderId: "789814589283" + messagingSenderId: "313050002315" } firebase.initializeApp(firebaseConfig) \ No newline at end of file From a576377b61765976141febe760dac3cd0f708b2d Mon Sep 17 00:00:00 2001 From: SerGladkOFF Date: Sun, 27 Aug 2017 21:36:09 +0300 Subject: [PATCH 3/4] home work complete --- src/components/admin/RegisteredUserForm.js | 24 +++++++-------- src/components/admin/UserList.js | 20 +++++++++++++ src/components/routes/AdminPage.js | 24 +++++---------- src/ducks/registeredUser.js | 35 ++++++++++++++++++++++ src/redux/reducer.js | 4 ++- 5 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 src/components/admin/UserList.js create mode 100644 src/ducks/registeredUser.js diff --git a/src/components/admin/RegisteredUserForm.js b/src/components/admin/RegisteredUserForm.js index 393747a..94206ae 100644 --- a/src/components/admin/RegisteredUserForm.js +++ b/src/components/admin/RegisteredUserForm.js @@ -4,10 +4,6 @@ import emailValidator from 'email-validator' import ErrorField from '../common/ErrorField' class RegisteredUserForm extends Component { - static propTypes = { - - }; - render() { const {handleSubmit} = this.props return ( @@ -27,15 +23,19 @@ class RegisteredUserForm extends Component { } } -const validate = ({email, password}) => { - const errors = {} - +const validate = ({firstName,lastName, email}) => { + //debugger + let errors = {} + const validateName = (param,label)=>{ + + if (!param) errors[label] = `${label} is required` + else if (/^[a-zA-Zа-яА-ЯёЁ]$/.test(param)) errors[label] = `invalid ${label}` + } if (!email) errors.email = 'email is required' - else if (!emailValidator.validate(email)) errors.email = 'invalid email' - - if (!password) errors.password = 'password is required' - else if (password.length < 8) errors.password = 'to short' - + else if (!emailValidator.validate(email)) errors.email = 'invalid email' + + validateName(lastName,'lastName') + validateName(firstName,'firstName') return errors } diff --git a/src/components/admin/UserList.js b/src/components/admin/UserList.js new file mode 100644 index 0000000..c665d45 --- /dev/null +++ b/src/components/admin/UserList.js @@ -0,0 +1,20 @@ +import React from 'react' +import {connect} from 'react-redux' +import {moduleName} from '../../ducks/registeredUser' + + +const UserList = (props)=>{ + console.log(props) + const _list = props.users.map( + user=>
  • {user.firstName} /{user.lastName}/ {user.email}
  • ) + return ( +
    +

    User list

    + {_list} +
    + ) +} + +export default connect(store=>({ + users:store[moduleName].users +}))(UserList) \ No newline at end of file diff --git a/src/components/routes/AdminPage.js b/src/components/routes/AdminPage.js index 2a064b2..9e66f79 100644 --- a/src/components/routes/AdminPage.js +++ b/src/components/routes/AdminPage.js @@ -1,32 +1,24 @@ import React, { Component } from 'react' import {Route, NavLink} from 'react-router-dom' -//import {connect} from 'react-redux' -//import {registeredUser} from '../../ducks/registeredUser' -//import Loader from '../common/Loader' +import {connect} from 'react-redux' +import {addUser} from '../../ducks/registeredUser' import RegisteredUserForm from '../admin/RegisteredUserForm' - +import UserList from '../admin/UserList' class AdminPage extends Component { - static propTypes = { - - }; render() { return (

    Admin Page

    Registered user - - }/> - + User list + }/> + }/>
    ) } + handleAddUser=({email, lastName,firstName}) => this.props.addUser(email, lastName,firstName) } -export default AdminPage -// export default connect(state => ({ -// loading: state[moduleName].loading -// }), {signUp})(AdminPage) -//sign up -// }/> \ No newline at end of file +export default connect(null, {addUser})(AdminPage) \ No newline at end of file diff --git a/src/ducks/registeredUser.js b/src/ducks/registeredUser.js new file mode 100644 index 0000000..7cfbd7e --- /dev/null +++ b/src/ducks/registeredUser.js @@ -0,0 +1,35 @@ +import {appName} from '../config' +import {Record} from 'immutable' + +const ReducerRecord = Record({ + users: [], + loading: false +}) + +export const moduleName = 'registeredUser' +export const CHANGE_USERS_LIST = `${appName}/${moduleName}/CHANGE_USERS_LIST` + +//console.log('---', ReducerRecord) +export default function reducer(state = new ReducerRecord(), action) { + const {type, payload} = action + + switch (type) { + case CHANGE_USERS_LIST: + return state + .set('users', payload) + default: + return state + } +} + +export function addUser(email, lastName,firstName) { + + return (dispatch,getState) => { + let _users=[...getState()[moduleName].users] + _users.push({email,lastName,firstName}) + dispatch({ + type: CHANGE_USERS_LIST, + payload:_users + }) + } +} diff --git a/src/redux/reducer.js b/src/redux/reducer.js index 34143fe..adfb338 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 registeredUser, {moduleName as registeredUserModule} from '../ducks/registeredUser' export default combineReducers({ router, form, - [authModule]: authReducer + [authModule]: authReducer, + [registeredUserModule]:registeredUser }) \ No newline at end of file From d429840249ee2276da298ca270f3e018a1f56414 Mon Sep 17 00:00:00 2001 From: SerGladkOFF Date: Sun, 3 Sep 2017 16:03:08 +0300 Subject: [PATCH 4/4] result --- src/components/admin/RegisteredUserForm.js | 29 ++++++++----- src/components/admin/UserList.js | 7 ++-- src/components/routes/AdminPage.js | 6 +-- src/components/routes/AuthPage.js | 6 +-- src/ducks/auth.js | 9 +++-- src/ducks/auth.test.js | 47 ++++++++++++++++++++++ 6 files changed, 80 insertions(+), 24 deletions(-) create mode 100644 src/ducks/auth.test.js diff --git a/src/components/admin/RegisteredUserForm.js b/src/components/admin/RegisteredUserForm.js index 94206ae..a3c893c 100644 --- a/src/components/admin/RegisteredUserForm.js +++ b/src/components/admin/RegisteredUserForm.js @@ -1,5 +1,5 @@ import React, { Component } from 'react' -import {reduxForm, Field} from 'redux-form' +import {reduxForm, Field,reset} from 'redux-form' import emailValidator from 'email-validator' import ErrorField from '../common/ErrorField' @@ -22,25 +22,34 @@ class RegisteredUserForm extends Component { ) } } +const validateName = (param,label,errors)=>{ + + if (!param) errors[label] = `${label} is required` + else if (/^[a-zA-Zа-яА-ЯёЁ]$/.test(param)) errors[label] = `invalid ${label}` +} const validate = ({firstName,lastName, email}) => { //debugger let errors = {} - const validateName = (param,label)=>{ - - if (!param) errors[label] = `${label} is required` - else if (/^[a-zA-Zа-яА-ЯёЁ]$/.test(param)) errors[label] = `invalid ${label}` - } + if (!email) errors.email = 'email is required' else if (!emailValidator.validate(email)) errors.email = 'invalid email' - validateName(lastName,'lastName') - validateName(firstName,'firstName') + validateName(lastName,'lastName',errors) + validateName(firstName,'firstName',errors) return errors } +const afterSubmit = (result, dispatch) =>{ + console.log('afterSubmit') + return dispatch(reset('RegisteredUserForm')); +} + + export default reduxForm({ - form: 'registeredUserForm', + form: 'RegisteredUserForm', + onSubmitSuccess: afterSubmit, validate -})(RegisteredUserForm) \ No newline at end of file +})(RegisteredUserForm) + diff --git a/src/components/admin/UserList.js b/src/components/admin/UserList.js index c665d45..d320ee6 100644 --- a/src/components/admin/UserList.js +++ b/src/components/admin/UserList.js @@ -1,11 +1,10 @@ import React from 'react' import {connect} from 'react-redux' -import {moduleName} from '../../ducks/registeredUser' +import {moduleName} from '../../ducks/people' const UserList = (props)=>{ - console.log(props) - const _list = props.users.map( + const _list = props.people.map( user=>
  • {user.firstName} /{user.lastName}/ {user.email}
  • ) return (
    @@ -16,5 +15,5 @@ const UserList = (props)=>{ } export default connect(store=>({ - users:store[moduleName].users + people:store[moduleName].entities }))(UserList) \ No newline at end of file diff --git a/src/components/routes/AdminPage.js b/src/components/routes/AdminPage.js index 9e66f79..ddebe01 100644 --- a/src/components/routes/AdminPage.js +++ b/src/components/routes/AdminPage.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import {Route, NavLink} from 'react-router-dom' import {connect} from 'react-redux' -import {addUser} from '../../ducks/registeredUser' +import {addPerson} from '../../ducks/people' import RegisteredUserForm from '../admin/RegisteredUserForm' import UserList from '../admin/UserList' @@ -18,7 +18,7 @@ class AdminPage extends Component {
    ) } - handleAddUser=({email, lastName,firstName}) => this.props.addUser(email, lastName,firstName) + handleAddUser=({email, lastName,firstName}) => this.props.addPerson({email, lastName,firstName}) } -export default connect(null, {addUser})(AdminPage) \ No newline at end of file +export default connect(null, {addPerson})(AdminPage) \ No newline at end of file diff --git a/src/components/routes/AuthPage.js b/src/components/routes/AuthPage.js index cc9a55f..2b9de1d 100644 --- a/src/components/routes/AuthPage.js +++ b/src/components/routes/AuthPage.js @@ -3,7 +3,7 @@ import SignInForm from '../auth/SignInForm' import SignUpForm from '../auth/SignUpForm' import {Route, NavLink} from 'react-router-dom' import {connect} from 'react-redux' -import {signUp, moduleName} from '../../ducks/auth' +import {signUp,signIn, moduleName} from '../../ducks/auth' import Loader from '../common/Loader' class AuthPage extends Component { @@ -25,10 +25,10 @@ class AuthPage extends Component { ) } - handleSignIn = (values) => console.log('---', values) + handleSignIn = ({email, password}) => this.props.signIn(email, password) handleSignUp = ({email, password}) => this.props.signUp(email, password) } export default connect(state => ({ loading: state[moduleName].loading -}), {signUp})(AuthPage) \ No newline at end of file +}), {signUp,signIn})(AuthPage) \ No newline at end of file diff --git a/src/ducks/auth.js b/src/ducks/auth.js index 8d754a8..69dcaf5 100644 --- a/src/ducks/auth.js +++ b/src/ducks/auth.js @@ -22,7 +22,7 @@ export const SIGN_IN_ERROR = `${appName}/${moduleName}/SIGN_IN_ERROR` export const SIGN_OUT_REQUEST = `${appName}/${moduleName}/SIGN_OUT_REQUEST` export const SIGN_OUT_SUCCESS = `${appName}/${moduleName}/SIGN_OUT_SUCCESS` -const AUTH = firebase.auth() +export const AUTH = firebase.auth() //console.log('---', ReducerRecord) export default function reducer(state = new ReducerRecord(), action) { @@ -97,19 +97,20 @@ export const signUpSaga = function * () { export const signInSaga = function * () { - while (true) { const action = yield take(SIGN_IN_REQUEST) - try { const user = yield call( [AUTH, AUTH.signInWithEmailAndPassword], action.payload.email, action.payload.password ) + yield put({ type: SIGN_IN_SUCCESS, payload: {user} }) + yield put(push('/admin/people')) + } catch (error) { yield put({ type: SIGN_IN_ERROR, @@ -148,8 +149,8 @@ export const signOutSaga = function * () { export const saga = function * () { yield all([ signUpSaga(), + signInSaga(), watchStatusChange(), takeEvery(SIGN_OUT_REQUEST, signOutSaga), - takeEvery(SIGN_OUT_REQUEST,signInSaga) ]) } \ No newline at end of file diff --git a/src/ducks/auth.test.js b/src/ducks/auth.test.js new file mode 100644 index 0000000..75f7630 --- /dev/null +++ b/src/ducks/auth.test.js @@ -0,0 +1,47 @@ +import {signInSaga, + signUpSaga, + SIGN_IN_REQUEST, + SIGN_UP_SUCCESS, + SIGN_IN_SUCCESS, + SIGN_IN_ERROR, + AUTH +} from './auth' +import {call,take, put} from 'redux-saga/effects' +import {push} from 'react-router-redux' + +//signIn + +const user = { + email: 'uu@uu.com', + password: '11111111' +} + +const action ={ + type:SIGN_IN_REQUEST, + payload:user +} + + +it('sign In user', () => { + + const saga = signInSaga() + + expect(saga.next().value).toEqual(take(SIGN_IN_REQUEST)) + + expect(saga.next(action).value).toEqual(call( + [AUTH, AUTH.signInWithEmailAndPassword], + user.email, user.password + )) + + expect(saga.next(user).value).toEqual(put({ + type:SIGN_IN_SUCCESS, + payload:{user} + })) + + expect(saga.next().value).toEqual(put(push('/admin/people'))) + + //const error = 'some error'; + expect(saga.throw()).toEqual({ + type: SIGN_IN_ERROR + }) +})