From 8cffab39c24158e4c94dc7c1efad7d22f45e09f3 Mon Sep 17 00:00:00 2001 From: Vadim Tatarchuk Date: Wed, 16 May 2018 20:27:25 +0500 Subject: [PATCH 1/2] =?UTF-8?q?-=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=83=D1=82=D0=BA=D1=83=20admin=20=D0=B2=20=D0=BD=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=B9=20reducer=20=D0=BD=D0=BE=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=87=D0=B5=D0=BC=D1=83=20=D1=82=D0=BE=20=D0=BE=D0=BD=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B2=D1=8B=D0=B7=D1=8B=D0=B2=D0=B0=D0=BB=D1=81=D1=8F?= =?UTF-8?q?,=20=D0=B0=20=D0=B2=D1=8B=D0=B7=D1=8B=D0=B2=D0=B0=D0=BB=D1=81?= =?UTF-8?q?=D1=8F=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B8=D0=B7=20?= =?UTF-8?q?auth=20-=20=D0=BF=D0=BE=D1=87=D0=B5=D0=BC=D1=83=20=D1=82=D0=BE?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B5=20NavLin?= =?UTF-8?q?k=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=8F=D1=8E=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20(=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=B1=D1=80=D0=B0=D1=83=D0=B7?= =?UTF-8?q?=D0=B5=D1=80=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit по HomeTasks все выполнено --- admin/src/components/admin/addMembers.js | 48 ++++++++++++++++++ admin/src/components/admin/memberList.js | 49 +++++++++++++++++++ .../src/components/common/protected-route.js | 2 +- admin/src/config.js | 6 +-- admin/src/ducks/admin.js | 41 ++++++++++++++++ admin/src/ducks/auth.js | 17 +++++++ admin/src/routes/admin.js | 23 ++++++++- 7 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 admin/src/components/admin/addMembers.js create mode 100644 admin/src/components/admin/memberList.js create mode 100644 admin/src/ducks/admin.js diff --git a/admin/src/components/admin/addMembers.js b/admin/src/components/admin/addMembers.js new file mode 100644 index 0000000..86b5de0 --- /dev/null +++ b/admin/src/components/admin/addMembers.js @@ -0,0 +1,48 @@ +import React, {Component} from 'react'; +import { reduxForm, reset, Field } from 'redux-form' +import validator from 'email-validator' +import ErrorField from '../common/error-field' + +class AddMembers extends Component { + render() { + return ( +
+

Add members

+
+
+ +
+
+ +
+
+ +
+ +
+
+ ); + } +} + +const validate = ({ email, password }) => { + const errors = {} + + if (!email) errors.email = 'email is a required field' + if (email && !validator.validate(email)) errors.email = 'invalid email' + + if (!password) errors.password = 'password is a required field' + if (password && password.length < 8) errors.password = 'to short' + + return errors +} + +const afterSumbit = (result, dispatch) => { + dispatch(reset('auth')); +} + +export default reduxForm({ + form: 'auth', + onSubmitSuccess: afterSumbit, + validate +})(AddMembers); diff --git a/admin/src/components/admin/memberList.js b/admin/src/components/admin/memberList.js new file mode 100644 index 0000000..5970104 --- /dev/null +++ b/admin/src/components/admin/memberList.js @@ -0,0 +1,49 @@ +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import {membersList} from "../../ducks/auth"; + +class MemberList extends Component { + render() { + const {membersList} = this.props; + + return ( +
+ {membersList && membersList.length > 0 ? + + + + + + + + + + {membersList.map(member => + + + + )} + +
First nameLast Namee-mail
{member.firstname}{member.lastname}{member.email}
+ : null} +
+ ); + } +} + +export default connect(state => ({membersList: membersList(state)}),)(MemberList); + +const styles = { + table: { + marginTop: 30, + border: 1,borderStyle: 'solid', borderColor: '#000' + }, + td: { + borderRight: 1, + borderLeft: 0, + borderTop: 0, + borderBottom: 0, + borderStyle: 'solid', + borderColor: '#000', + } +} \ No newline at end of file diff --git a/admin/src/components/common/protected-route.js b/admin/src/components/common/protected-route.js index 521e2a2..409e2c8 100644 --- a/admin/src/components/common/protected-route.js +++ b/admin/src/components/common/protected-route.js @@ -9,7 +9,7 @@ class ProtectedRoute extends Component { } render() { - const {component, ...rest} = this.props + const {...rest} = this.props return } diff --git a/admin/src/config.js b/admin/src/config.js index b042e54..17aec1d 100644 --- a/admin/src/config.js +++ b/admin/src/config.js @@ -1,14 +1,14 @@ import firebase from 'firebase' -export const appName = 'advreact-10-05' +export const appName = 'reactfirstproject-80dc2' export const config = { - apiKey: 'AIzaSyCbMQM0eQUSQ0SuLVAu9ZNPUcm4rdbiB8U', + apiKey: 'AIzaSyBTCfco9DOZ1M1OcWI662uOgYbBCQm5jXQ', authDomain: `${appName}.firebaseapp.com`, databaseURL: `https://${appName}.firebaseio.com`, projectId: appName, storageBucket: "", - messagingSenderId: "1094825197832" + messagingSenderId: "165794362538" } firebase.initializeApp(config) \ No newline at end of file diff --git a/admin/src/ducks/admin.js b/admin/src/ducks/admin.js new file mode 100644 index 0000000..91126b1 --- /dev/null +++ b/admin/src/ducks/admin.js @@ -0,0 +1,41 @@ +import {appName} from '../config' +import {Record} from 'immutable' + +/** + * Constants + * */ +export const moduleName = 'admin' +const prefix = `${appName}/${moduleName}` + +export const ADD_MEMBER_SUCCESS = `${prefix}/ADD_MEMBER_SUCCESS` + +/** + * Reducer + * */ +export const ReducerRecord2 = Record({ + members: null +}) + +export default function reducer(state = new ReducerRecord2(), action) { + const {type, payload} = action + + switch (type) { + case ADD_MEMBER_SUCCESS: + return state.set('members', payload.members) + + default: + return state + } +} + +/** + * Selectors + * */ +/* +export const membersReturn = createSelector(membersSelector, members => members)*/ + +/** + * Action Creators + * */ + + diff --git a/admin/src/ducks/auth.js b/admin/src/ducks/auth.js index 0c6bd0c..af61d67 100644 --- a/admin/src/ducks/auth.js +++ b/admin/src/ducks/auth.js @@ -11,11 +11,13 @@ const prefix = `${appName}/${moduleName}` export const SIGN_IN_SUCCESS = `${prefix}/SIGN_IN_SUCCESS` export const SIGN_UP_SUCCESS = `${prefix}/SIGN_UP_SUCCESS` +export const ADD_MEMBER_SUCCESS = `${prefix}/ADD_MEMBER_SUCCESS` /** * Reducer * */ export const ReducerRecord = Record({ + members: [], user: null }) @@ -23,6 +25,12 @@ export default function reducer(state = new ReducerRecord(), action) { const {type, payload} = action switch (type) { + case ADD_MEMBER_SUCCESS: + const arr = state.get('members').slice(0); + + arr.push(payload); + + return state.set('members', arr) case SIGN_IN_SUCCESS: case SIGN_UP_SUCCESS: return state.set('user', payload.user) @@ -36,6 +44,9 @@ export default function reducer(state = new ReducerRecord(), action) { * Selectors * */ export const userSelector = state => state[moduleName].user +export const membersSelector = state => state[moduleName].members + +export const membersList = createSelector(membersSelector, members => members) export const authorizedSelector = createSelector(userSelector, user => !!user) /** @@ -56,6 +67,12 @@ export function signIn(email, password) { } } +export function addMembers(firstname, lastname, email) { + return (dispatch) => { + dispatch({ type: ADD_MEMBER_SUCCESS, payload: {firstname, lastname, email} }) + } +} + firebase.auth().onAuthStateChanged(user => { user && window.store.dispatch({ type: SIGN_IN_SUCCESS, diff --git a/admin/src/routes/admin.js b/admin/src/routes/admin.js index 743e0b9..4fcdde5 100644 --- a/admin/src/routes/admin.js +++ b/admin/src/routes/admin.js @@ -1,4 +1,11 @@ import React, { Component } from 'react' +import {NavLink, Route} from 'react-router-dom' +import {connect} from 'react-redux' + +import {addMembers, membersList} from '../ducks/auth' + +import AddMembers from '../components/admin/addMembers' +import MemberList from '../components/admin/memberList' class AdminPage extends Component { static propTypes = { @@ -9,9 +16,23 @@ class AdminPage extends Component { return (

Admin Page

+
+ Add member +
+
+ } /> +
+ +
+ ) } + + addMembers = ({ firstName, lastName, email }) => { + this.props.addMembers(firstName, lastName, email) + } + } -export default AdminPage \ No newline at end of file +export default connect(state => ({membersList: membersList(state)}), {addMembers})(AdminPage) \ No newline at end of file From 53991147db2155a8c9e0848501d772b802638400 Mon Sep 17 00:00:00 2001 From: Vadim Tatarchuk Date: Thu, 17 May 2018 02:02:02 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D1=81=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20reducer,=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=83=D1=87=D0=B0=D1=81=D1=82=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20reducer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/components/admin/addMembers.js | 2 +- admin/src/components/admin/memberList.js | 2 +- admin/src/ducks/admin.js | 24 ++++++++++++++++-------- admin/src/ducks/auth.js | 17 ----------------- admin/src/redux/reducer.js | 4 +++- admin/src/routes/admin.js | 2 +- 6 files changed, 22 insertions(+), 29 deletions(-) diff --git a/admin/src/components/admin/addMembers.js b/admin/src/components/admin/addMembers.js index 86b5de0..737451e 100644 --- a/admin/src/components/admin/addMembers.js +++ b/admin/src/components/admin/addMembers.js @@ -42,7 +42,7 @@ const afterSumbit = (result, dispatch) => { } export default reduxForm({ - form: 'auth', + form: 'admin', onSubmitSuccess: afterSumbit, validate })(AddMembers); diff --git a/admin/src/components/admin/memberList.js b/admin/src/components/admin/memberList.js index 5970104..9331454 100644 --- a/admin/src/components/admin/memberList.js +++ b/admin/src/components/admin/memberList.js @@ -1,6 +1,6 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; -import {membersList} from "../../ducks/auth"; +import {membersList} from "../../ducks/admin"; class MemberList extends Component { render() { diff --git a/admin/src/ducks/admin.js b/admin/src/ducks/admin.js index 91126b1..b0034bf 100644 --- a/admin/src/ducks/admin.js +++ b/admin/src/ducks/admin.js @@ -1,5 +1,6 @@ import {appName} from '../config' import {Record} from 'immutable' +import {createSelector} from "reselect"; /** * Constants @@ -12,16 +13,20 @@ export const ADD_MEMBER_SUCCESS = `${prefix}/ADD_MEMBER_SUCCESS` /** * Reducer * */ -export const ReducerRecord2 = Record({ - members: null +export const ReducerRecord = Record({ + members: [] }) -export default function reducer(state = new ReducerRecord2(), action) { +export default function reducer(state = new ReducerRecord(), action) { const {type, payload} = action switch (type) { case ADD_MEMBER_SUCCESS: - return state.set('members', payload.members) + const arr = state.get('members').slice(0); + + arr.push(payload); + return state.set('members', arr) + default: return state @@ -31,11 +36,14 @@ export default function reducer(state = new ReducerRecord2(), action) { /** * Selectors * */ -/* -export const membersReturn = createSelector(membersSelector, members => members)*/ +export const membersSelector = state => state[moduleName].members +export const membersList = createSelector(membersSelector, members => members) /** * Action Creators * */ - - +export function addMembers(firstname, lastname, email) { + return (dispatch) => { + dispatch({ type: ADD_MEMBER_SUCCESS, payload: {firstname, lastname, email} }) + } +} diff --git a/admin/src/ducks/auth.js b/admin/src/ducks/auth.js index af61d67..0c6bd0c 100644 --- a/admin/src/ducks/auth.js +++ b/admin/src/ducks/auth.js @@ -11,13 +11,11 @@ const prefix = `${appName}/${moduleName}` export const SIGN_IN_SUCCESS = `${prefix}/SIGN_IN_SUCCESS` export const SIGN_UP_SUCCESS = `${prefix}/SIGN_UP_SUCCESS` -export const ADD_MEMBER_SUCCESS = `${prefix}/ADD_MEMBER_SUCCESS` /** * Reducer * */ export const ReducerRecord = Record({ - members: [], user: null }) @@ -25,12 +23,6 @@ export default function reducer(state = new ReducerRecord(), action) { const {type, payload} = action switch (type) { - case ADD_MEMBER_SUCCESS: - const arr = state.get('members').slice(0); - - arr.push(payload); - - return state.set('members', arr) case SIGN_IN_SUCCESS: case SIGN_UP_SUCCESS: return state.set('user', payload.user) @@ -44,9 +36,6 @@ export default function reducer(state = new ReducerRecord(), action) { * Selectors * */ export const userSelector = state => state[moduleName].user -export const membersSelector = state => state[moduleName].members - -export const membersList = createSelector(membersSelector, members => members) export const authorizedSelector = createSelector(userSelector, user => !!user) /** @@ -67,12 +56,6 @@ export function signIn(email, password) { } } -export function addMembers(firstname, lastname, email) { - return (dispatch) => { - dispatch({ type: ADD_MEMBER_SUCCESS, payload: {firstname, lastname, email} }) - } -} - firebase.auth().onAuthStateChanged(user => { user && window.store.dispatch({ type: SIGN_IN_SUCCESS, diff --git a/admin/src/redux/reducer.js b/admin/src/redux/reducer.js index 8a2942d..49721c0 100644 --- a/admin/src/redux/reducer.js +++ b/admin/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 adminReducer, { moduleName as adminModule } from '../ducks/admin' export default combineReducers({ router, form, - [authModule]: authReducer + [authModule]: authReducer, + [adminModule]: adminReducer }) \ No newline at end of file diff --git a/admin/src/routes/admin.js b/admin/src/routes/admin.js index 4fcdde5..c6383c8 100644 --- a/admin/src/routes/admin.js +++ b/admin/src/routes/admin.js @@ -2,7 +2,7 @@ import React, { Component } from 'react' import {NavLink, Route} from 'react-router-dom' import {connect} from 'react-redux' -import {addMembers, membersList} from '../ducks/auth' +import {addMembers, membersList} from '../ducks/admin' import AddMembers from '../components/admin/addMembers' import MemberList from '../components/admin/memberList'