11 Commits abe2794858 ... f8b3a421a5

Author SHA1 Message Date
  Marina Yakovenko f8b3a421a5 admin-results 5 years ago
  Tanya Sashyna e22dd6afdd the profile page is creating. part 1 5 years ago
  Tanya Sashyna 8ca88001ee the filter is created on the events page 5 years ago
  Tanya Sashyna 81e6b777bf the reviews page is continue creating 5 years ago
  Tanya Sashyna fd3326abdd Merge branch 'dev' of http://gitlab.a-level.com.ua/Entony/FEA_12_TRIATHLON into dev 5 years ago
  Tanya Sashyna ceb5d1ee3a The page gallery is created 5 years ago
  Tanya Sashyna 7e05485804 fix router 5 years ago
  Tanya Sashyna 976aeb10af fix action login 5 years ago
  Tanya Sashyna 2da2d6ab6c delete localStorage in the reducer. Fix router 5 years ago
  Tanya Sashyna 885fda51cd fix sidebar 5 years ago
  Marina Yakovenko e66f72a9f3 router 5 years ago
43 changed files with 1154 additions and 137 deletions
  1. 14 1
      src/actionTypes/actionTypes.js
  2. 25 0
      src/actions/adminMainPageActions.js
  3. 29 0
      src/actions/adminResultsActions.js
  4. 4 2
      src/actions/getAllEvents.js
  5. 4 1
      src/actions/login.js
  6. 3 11
      src/actions/logout.js
  7. 65 0
      src/actions/reviews.js
  8. 2 0
      src/assets/img/man.svg
  9. 5 0
      src/assets/img/woman.svg
  10. 16 11
      src/components/adminMenu/adminMenu.scss
  11. 13 20
      src/components/adminPhotogalary/adminPhotogalary.scss
  12. 4 4
      src/components/adminPhotogalary/adminPhotogalaryReduxForm.js
  13. 95 0
      src/components/adminResults/adminResultsForm.js
  14. 108 0
      src/components/adminResults/adminResultsForm.scss
  15. 3 16
      src/components/filtersEvents/FiltersEvents.js
  16. 35 0
      src/components/review-form/ReviewForm.js
  17. 1 0
      src/components/review-form/review-form.scss
  18. 3 2
      src/components/sidebar/Sidebar.js
  19. 6 0
      src/components/sidebar/sidebar.scss
  20. 3 15
      src/conteiners/adminMyEventsPage/adminMyEventsPage.js
  21. 3 11
      src/conteiners/adminPhotogalaryPage/adminPhotogalaryPage.js
  22. 102 0
      src/conteiners/adminResultsPage/adminResultsPage.js
  23. 6 5
      src/conteiners/events/Events.js
  24. 46 2
      src/conteiners/gallery/Gallery.js
  25. 65 0
      src/conteiners/gallery/gallery.scss
  26. 0 2
      src/conteiners/login/Login.js
  27. 64 4
      src/conteiners/profile/Profile.js
  28. 158 0
      src/conteiners/profile/profile.scss
  29. 72 1
      src/conteiners/reviews/Reviews.js
  30. 65 0
      src/conteiners/reviews/reviews.scss
  31. 2 2
      src/private-router.js
  32. 14 0
      src/reducers/adminMainPageReducer.js
  33. 26 0
      src/reducers/adminResultsReduser.js
  34. 5 1
      src/reducers/combineReducers.js
  35. 4 8
      src/reducers/login.js
  36. 1 4
      src/reducers/logout.js
  37. 4 4
      src/reducers/photogalaryReducer.js
  38. 42 0
      src/reducers/reviews.js
  39. 20 9
      src/router.js
  40. 1 0
      src/state/addEventInitialValue.js
  41. 1 1
      src/state/adminMenu.js
  42. 14 0
      src/styles/custom.scss
  43. 1 0
      src/styles/variables.scss

+ 14 - 1
src/actionTypes/actionTypes.js

@@ -54,5 +54,18 @@ export const GET_REQUEST_EVENT_CARD = "GET_REQUEST_EVENT_CARD";
 export const GET_REQUEST_SUCCESS_EVENT_CARD = "GET_REQUEST_SUCCESS_EVENT_CARD";
 export const GET_REQUEST_ERROR_EVENT_CARD = "GET_REQUEST_ERROR_EVENT_CARD";
 
+export const GET_REQUEST_REVIEWS = "GET_REQUEST_REVIEWS";
+export const GET_REQUEST_SUCCESS_REVIEWS = "GET_REQUEST_SUCCESS_REVIEWS";
+export const GET_REQUEST_ERROR_REVIEWS = "GET_REQUEST_ERROR_REVIEWS";
 
-// export const PHOTOGALARY_ONCHAGE = "PHOTOGALARY_ONCHAGE";
+export const POST_REQUEST_REVIEW = "POST_REQUEST_REVIEW";
+export const POST_REQUEST_SUCCESS_REVIEW = "POST_REQUEST_SUCCESS_REVIEW";
+export const POST_REQUEST_ERROR_REVIEW = "POST_REQUEST_ERROR_REVIEW";
+
+export const GET_EVENT_BY_TITLE = "GET_EVENT_BY_TITLE";
+export const GET_EVENT_BY_TITLE_SUCCESS = "GET_EVENT_BY_TITLE_SUCCESS";
+export const GET_EVENT_BY_TITLE_FAIL = "GET_EVENT_BY_TITLE_FAIL";
+
+export const GET_REGISTRED_USERS = "GET_REGISTRED_USERS";
+export const GET_REGISTRED_USERS_SUCCESS = "GET_REGISTRED_USERS_SUCCESS";
+export const GET_REGISTRED_USERS_FAIL = "GET_REGISTRED_USERS_FAIL";

+ 25 - 0
src/actions/adminMainPageActions.js

@@ -89,6 +89,31 @@ export const getEvents = (type = 'Select Event Type') => dispatch => {
 		.catch(err => dispatch(getEventsRequestFail(err)));
 };
 
+//GET BY TITLE 
+
+const getEventByTitleRequest = payload => ({
+	type: types.GET_EVENT_BY_TITLE,
+	payload
+});
+
+const getEventByTitleRequestSuccess = payload => ({
+	type: types.GET_EVENT_BY_TITLE_SUCCESS,
+	payload
+});
+
+const getEventByTitleRequestFail = payload => ({
+	type: types.GET_EVENT_BY_TITLE_FAIL,
+	payload
+});
+
+export const getEventByTitle = (title) => dispatch => {
+	dispatch(getEventByTitleRequest());
+	return axios
+		.get( title && `${eventURL}/?title=${title}`)
+		.then(res => dispatch(getEventByTitleRequestSuccess(res)))
+		.catch(err => dispatch(getEventByTitleRequestFail(err)));
+};
+
 // REMOVE
 const removeEventRequest = payload => ({
 	type: types.REMOVE_EVENT_REQUEST,

+ 29 - 0
src/actions/adminResultsActions.js

@@ -0,0 +1,29 @@
+import axios from "axios";
+import * as types from "../actionTypes/actionTypes"
+
+const eventUserURL = 'https://api-marathon.herokuapp.com/api/v1/eventUsers'
+
+//GET REGISTRED USERS
+const getRegistredUsersRequest = payload => ({
+	type: types.GET_REGISTRED_USERS,
+	payload
+});
+
+const getRegistredUsersRequestSuccess = payload => ({
+	type: types.GET_EVENTS_REQUEST_SUCCESS,
+	payload
+});
+
+const getRegistredUsersRequestFail = payload => ({
+	type: types.GET_EVENTS_REQUEST_FAIL,
+	payload
+});
+
+export const getRegistredUsers = (_id) => dispatch => {
+	dispatch(getRegistredUsersRequest());
+	return axios
+		.get( `${eventUserURL}/?event[0]=${_id} `)
+		.then(res => {dispatch(getRegistredUsersRequestSuccess(res))
+        })
+		.catch(err => dispatch(getRegistredUsersRequestFail(err)));
+};

+ 4 - 2
src/actions/getAllEvents.js

@@ -1,5 +1,7 @@
 import * as types from "../actionTypes/actionTypes";
 
+const eventURL = 'https://api-marathon.herokuapp.com/api/v1/event';
+
 export const getEvents = payload => ({
     type: types.GET_REQUEST_EVENTS,
     payload
@@ -15,9 +17,9 @@ export const getEventsError = payload => ({
     payload
 });
 
-export const getAllEvents = () => {
+export const getAllEvents = (type = 'All events') => {
     return dispatch => {
-        let promise = fetch("https://api-marathon.herokuapp.com/api/v1/event")
+        let promise = fetch(type !== 'All events' ? `${eventURL}/?eventType=${type}` : eventURL)
 
         dispatch(getEvents())
 

+ 4 - 1
src/actions/login.js

@@ -30,7 +30,10 @@ export const postLoginSubmit = payload => {
         dispatch(postLogin())
 
         promise.then(
-            data => data.json().then(data => dispatch(postLoginSuccess(data))),
+            data => data.json().then(data => {
+                writeLocalStorage(data);
+                dispatch(postLoginSuccess(data))
+            }),
             error => dispatch(postLoginError(error))
         )
     }

+ 3 - 11
src/actions/logout.js

@@ -18,21 +18,13 @@ export const getLogoutUserError = payload => ({
 export const getLogoutUserSubmit = () => {
     return dispatch => {
         let promise = fetch("https://api-marathon.herokuapp.com/api/v1/auth/logout")
-        console.log('getLogoutUserSubmit');
+        //console.log('getLogoutUserSubmit');
 
         dispatch(getLogoutUser())
 
         promise.then(
-            data => data.json().then(data => {
-                localStorage.removeItem('user');
-                dispatch(getLogoutUserSuccess(data))
-        }),
+            data => data.json().then(data => dispatch(getLogoutUserSuccess(data))),
             error => dispatch(getLogoutUserError(error))
         )
     }
-}
-
-// export const clearLocalStorage = () => {
-//     localStorage.removeItem('user');
-//     document.location.reload(true);
-// }
+}

+ 65 - 0
src/actions/reviews.js

@@ -0,0 +1,65 @@
+import * as types from "../actionTypes/actionTypes";
+
+export const getReviews = payload => ({
+    type: types.GET_REQUEST_REVIEWS,
+    payload
+});
+
+export const getReviewsSuccess = payload => ({
+    type: types.GET_REQUEST_SUCCESS_REVIEWS,
+    payload
+});
+
+export const getReviewsError = payload => ({
+    type: types.GET_REQUEST_ERROR_REVIEWS,
+    payload
+});
+
+export const getAllReviews = () => {
+    return dispatch => {
+        let promise = fetch("https://api-marathon.herokuapp.com/api/v1/feedback")
+
+        dispatch(getReviews())
+
+        promise.then(
+            data => data.json().then(data => dispatch(getReviewsSuccess(data))),
+            error => dispatch(getReviewsError(error))
+        )
+    }
+}
+
+export const postReview = payload => ({
+    type: types.POST_REQUEST_REVIEW,
+    payload
+});
+
+export const postReviewSuccess = payload => ({
+    type: types.POST_REQUEST_SUCCESS_REVIEW,
+    payload
+});
+
+export const postReviewError = payload => ({
+    type: types.POST_REQUEST_ERROR_REVIEW,
+    payload
+});
+
+export const postReviewSubmit = payload => {
+    return dispatch => {
+        let promise = fetch("https://api-marathon.herokuapp.com/api/v1/feedback",
+            {
+                method: 'POST',
+                body: JSON.stringify(payload),
+                headers: {
+                    "Content-type": "application/json"
+                }
+            }
+        )
+
+        dispatch(postReview())
+
+        promise.then(
+            data => data.json().then(data => dispatch(postReviewSuccess(data))),
+            error => dispatch(postReviewError(error))
+        )
+    }
+}

File diff suppressed because it is too large
+ 2 - 0
src/assets/img/man.svg


File diff suppressed because it is too large
+ 5 - 0
src/assets/img/woman.svg


+ 16 - 11
src/components/adminMenu/adminMenu.scss

@@ -27,7 +27,7 @@
     &:first-child {
       clip-path: polygon(0 0,100% 0,80% 100%,0% 100%);
        background-image: 
-    url(https://i2-prod.mirror.co.uk/incoming/article12948642.ece/ALTERNATES/s615/0_xxxxxxx.jpg);
+    url(https://cdn.pixabay.com/photo/2018/08/09/02/50/person-3593664_1280.jpg);
     }
 
      &:nth-child(2) {
@@ -35,7 +35,7 @@
       clip-path: polygon(12% 0,100% 0,100% 100%,0% 100%);
       margin-left: -7%;
       flex-grow: 2;
-      background-image: url(https://cdn.pixabay.com/photo/2014/01/24/13/32/marathon-250987_1280.jpg);
+      background-image: url(https://cdn.pixabay.com/photo/2018/08/12/11/02/swim-3600519_1280.jpg);
     } 
     
      &:nth-child(3){
@@ -53,18 +53,18 @@
     }
 
     &:nth-child(5) {
-      clip-path: polygon(0 0,100% 0,80% 100%,0% 100%);
+       width: 100%;
        background-image: 
-    url(https://cdn.pixabay.com/photo/2018/08/09/02/50/person-3593664_1280.jpg);
+    url(https://cdn.pixabay.com/photo/2014/01/24/13/32/marathon-250987_1280.jpg);
     }
 
-     &:nth-child(6) {
-      right: -100px;
-      clip-path: polygon(12% 0,100% 0,100% 100%,0% 100%);
-      margin-left: -7%;
-      flex-grow: 2;
-      background-image: url(https://cdn.pixabay.com/photo/2018/08/12/11/02/swim-3600519_1280.jpg);
-    } 
+    //  &:nth-child(6) {
+    //   right: -100px;
+    //   clip-path: polygon(12% 0,100% 0,100% 100%,0% 100%);
+    //   margin-left: -7%;
+    //   flex-grow: 2;
+    //   background-image: url(https://cdn.pixabay.com/photo/2018/08/12/11/02/swim-3600519_1280.jpg);
+    // } 
     
     .menu-text{
       color: $color-white;
@@ -128,6 +128,11 @@
         font-weight: 600;
         text-shadow: 2px 2px 2px #000;
       }
+      &:hover {
+        .menu-text{
+          font-size: 2.5rem;
+        }
+      }
     }
   }
 }

+ 13 - 20
src/components/adminPhotogalary/adminPhotogalary.scss

@@ -1,22 +1,19 @@
 @import "../../styles/variables";
 
-.photogalary-form {
+.photogalary-form{
 	width: 100%;
 	min-height: 100vh;
 	margin: auto;
 
-	background: -webkit-linear-gradient(top, #fff, $color-blue); /* Safari 5.1, iOS 5.0-6.1, Chrome 10-25, Android 4.0-4.3 */
-	background: -moz-linear-gradient(top, #fff, $color-blue); /* Firefox 3.6-15 */
-	background: -o-linear-gradient(top,  #fff, $color-blue); /* Opera 11.1-12 */
+	background: -webkit-linear-gradient(top, #fff, $color-blue);
+	background: -moz-linear-gradient(top, #fff, $color-blue); 
+	background: -o-linear-gradient(top,  #fff, $color-blue); 
 	background: linear-gradient(to bottom,  #fff, $color-blue);
 
 	&__content {
 		max-width: 1000px;
         height: 100%;
 		position: relative;
-		// top: 40%;
-		// left: 20%;
-		// transform: translate(-50%, -50%);
 		margin: auto;
 		padding: 2rem;
 		border-left: 1px solid $color-mint;
@@ -38,14 +35,10 @@
     }
     
     &__form-title{
-        // font-size: 2rem;
-        // margin-bottom: 1rem;
-		// color: #5acec2;
 		color: $color-blue;
 		font-size: 3rem;
 		letter-spacing: 0.2;
 		font-weight: 600;
-		// text-shadow: 3px 3px 3px #000;
 		margin-bottom: 3%;
     }
 
@@ -128,13 +121,12 @@
 
 	&__submit-btn {
 		width: 100%;
-		border: 1px solid #5acec2;
 		border-radius: 3px;
 		display: block;
-
-		color: #fff;
-		background-color: #5acec2;
 		border: none;
+
+		color: $color-white;
+		background-color: $color-mint;
 		cursor: pointer;
 		font-weight: 600;
 		font-size: 1.2rem;
@@ -145,6 +137,9 @@
 			outline: none;
 		}
 		&:hover {
+			background-color: $color-blue;
+			color: $color-white;
+
 			outline: none;
 			transform: translateY(-1px);
 			box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.2);
@@ -153,13 +148,11 @@
 				opacity: 0;
 			}
 		}
-
 		&:disabled {
-			color: #5acec2;
-			border: 1px solid #5acec2;
+			color: $color-mint;
+			border: 1px solid $color-mint;
 			background-color: #eee;
-        }
-        
+		}
 	}
 
 }

+ 4 - 4
src/components/adminPhotogalary/adminPhotogalaryReduxForm.js

@@ -19,9 +19,9 @@ class PhotogalaryReduxForm extends Component {
             return prev.concat(elem.value);
         }, []);
 
-        const eventId = this.props.eventList.find(
-            event => event.title === this.state.addPhotogalaryInitialValue.eventTitle
-        )._id
+        // const eventId = this.props.eventList.find(
+        //     event => event.title === this.state.addPhotogalaryInitialValue.eventTitle
+        // )._id
 
         const submitValues = {
             ...this.state.addPhotogalaryInitialValue,
@@ -107,7 +107,7 @@ class PhotogalaryReduxForm extends Component {
 
     render() {
         const { filteredEventList, addPhotogalaryInitialValue } = this.state;
-        // console.log(this.state)
+        // console.log(this.state )
 
         const {
             handleSubmit,

+ 95 - 0
src/components/adminResults/adminResultsForm.js

@@ -0,0 +1,95 @@
+import React, { Component } from "react";
+import { reduxForm, Field } from "redux-form";
+import "./adminResultsForm.scss";
+import { customInput } from "../customFields/customInput/customInput";
+import { customSelect } from "../customFields/customSelect/customSelect";
+
+class AdminResultsForm extends Component {
+
+    // state = {
+        // addPhotogalaryInitialValue,
+        // filteredEventList: []
+    // }
+
+    submit = values => {
+        console.log('submit props', this.props)
+        // console.log('submit state', this.state)
+        // const pictures = this.state.addPhotogalaryInitialValue.pictures.reduce((prev, elem) => {
+        //     return prev.concat(elem.value);
+        // }, []);
+    }
+
+    render() {
+        // const { filteredEventList, addPhotogalaryInitialValue } = this.state;
+        // console.log(this.state )
+
+        const {
+            handleSubmit,
+            eventTypes,
+            eventList,
+            // eventByTitle,
+            eventusers,
+            onChangeTypeHandler,
+            onChangeTitleHandler
+        } = this.props;
+
+        return (
+            <form className="results-form__results-form__main" onSubmit={handleSubmit(this.submit)}>
+
+                <Field
+                    name="eventType"
+                    label="Event Type"
+                    required
+                    component={customSelect}
+                    onChange={onChangeTypeHandler}
+                    className="form-block__select -wide"
+                >
+                    {eventTypes.map(elem => <option key={elem.id} value={elem.optionName}>{elem.optionName}</option>)}
+                </Field>
+
+                <Field
+                    name="eventTitle"
+                    label="Event Title"
+                    required
+                    component={customSelect}
+                    onChange={onChangeTitleHandler}
+                    className="form-block__select -wide"
+                >   
+                    {console.log('event list', eventList)}
+                    {eventList && eventList.map(elem => <option key={elem._id} id={elem._id} value={elem.title}>{elem.title}</option>)}
+                </Field>
+
+                <div className = 'results-form__table'>  
+                    <div className = 'results-form__header'>
+                        <div className = 'results-form__header_name'>Name</div>
+                        <div className = 'results-form__header_email'>Email</div>
+                        <div className = 'results-form__header_country'>Country</div>
+                        <div className = 'results-form__header_distance'>Distance</div>
+                        <div className = 'results-form__header_time'>Time</div>
+
+                    </div>              
+                {eventusers && eventusers.map( elem => 
+                    <div key={elem._id} className='results-form__user-data'>
+                        <div className = "results-form__user-data_name">{elem.name}</div>
+                        <div className = "results-form__user-data_email">{elem.email}</div>
+                        <div className = "results-form__user-data_country">{elem.userCountry}</div>
+                        <div className = "results-form__user-data_distance">{elem.distance}</div>
+                        <Field
+                            name="time"
+                            component={customInput}
+                            className="input-box -wide"
+                        />
+                    </div>
+                )}
+                </div>
+
+                <div className="results-form__control-box">
+                    <button className="results-form__submit-btn" >Add Results</button>
+                </div>
+            </form>
+
+        );
+    }
+}
+
+export default reduxForm({ form: "resultsForm", enableReinitialize: true })(AdminResultsForm);

+ 108 - 0
src/components/adminResults/adminResultsForm.scss

@@ -0,0 +1,108 @@
+@import "../../styles/variables";
+
+.results-form {
+	width: 100%;
+	min-height: 100vh;
+	margin: auto;
+
+	background: -webkit-linear-gradient(top, #fff, $color-blue); /* Safari 5.1, iOS 5.0-6.1, Chrome 10-25, Android 4.0-4.3 */
+	background: -moz-linear-gradient(top, #fff, $color-blue); /* Firefox 3.6-15 */
+	background: -o-linear-gradient(top,  #fff, $color-blue); /* Opera 11.1-12 */
+	background: linear-gradient(to bottom,  #fff, $color-blue);
+
+	&__content {
+		max-width: 1000px;
+        height: 100%;
+		position: relative;
+		margin: auto;
+		padding: 2rem;
+		border-left: 1px solid $color-mint;
+        border-right: 1px solid $color-mint;
+        border-bottom: 1px solid $color-mint;
+		background-color: #eee;
+		padding-bottom: 3%;
+	}
+
+	&__text {
+		font-size: 1.6rem;
+    }
+    
+    &__form-title{
+		color: $color-blue;
+		font-size: 3rem;
+		letter-spacing: 0.2;
+		font-weight: 600;
+		margin-bottom: 3%;
+    }
+
+	&__toggle-span {
+		font-size: 1.6rem;
+		font-weight: bold;
+		color: rgb(102, 104, 223);
+	}
+
+	&__header{
+		// display: flex;
+		// flex-direction: row;
+		// justify-content: space-between;
+		display: grid;
+		grid-template-columns: repeat(5, 1fr);
+		grid-gap: 1rem;
+		align-items: start;
+		font-size: 2rem;
+		color: $color-blue;
+		font-weight: 600;
+		border-bottom: 2px solid $color-mint;
+		margin-left: 0;
+		margin-top: 3%;
+		margin-bottom: 1%;
+
+	}	
+
+	&__user-data{
+		// display: flex;
+		// justify-content: space-between;
+		display: grid;
+		grid-template-columns: repeat(5, 1fr);
+		align-items: start;
+		grid-gap: 1rem;
+		font-size: 1.4rem;
+	}
+
+	&__submit-btn {
+		width: 100%;
+		border: 1px solid #5acec2;
+		border-radius: 3px;
+		display: block;
+
+		color: #fff;
+		background-color: #5acec2;
+		border: none;
+		cursor: pointer;
+		font-weight: 600;
+		font-size: 1.2rem;
+		transition: 0.2s;
+		padding: 1.3rem 1rem;
+
+		&:focus {
+			outline: none;
+		}
+		&:hover {
+			outline: none;
+			transform: translateY(-1px);
+			box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.2);
+			&:after {
+				transform: scaleX(1.4) scaleY(1.6);
+				opacity: 0;
+			}
+		}
+
+		&:disabled {
+			color: #5acec2;
+			border: 1px solid #5acec2;
+			background-color: #eee;
+        }
+        
+	}
+
+}

+ 3 - 16
src/components/filtersEvents/FiltersEvents.js

@@ -4,32 +4,19 @@ import { Field, reduxForm } from 'redux-form';
 import './filtersEvents.scss';
 
 let FiltersEvents = props => {
-    const { handleSubmit } = props;
+    const { handleSubmit, getAllEvents } = props;
 
     const submit = value => {
         console.log(value);
-        //postLoginSubmit(value);
+        getAllEvents(value.typeEvent);
     };
 
     return (
         <form className="form" onSubmit={handleSubmit(submit)}>
-            <div>
-                <label htmlFor="country">Country</label>
-                <Field name="country" component="select">
-                    <option value="country1">country1</option>
-                    <option value="country2">country2</option>
-                </Field>
-            </div>
-            <div>
-                <label htmlFor="city">City</label>
-                <Field name="city" component="select">
-                    <option value="city1">city1</option>
-                    <option value="city2">city2</option>
-                </Field>
-            </div>
             <div>
                 <label htmlFor="typeEvent">Type event</label>
                 <Field name="typeEvent" component="select">
+                    <option value="All events">All events</option>
                     <option value="Marathon">Marathon</option>
                     <option value="Triathlon">Triathlon</option>
                     <option value="Cycling">Cycling</option>

+ 35 - 0
src/components/review-form/ReviewForm.js

@@ -0,0 +1,35 @@
+import React from 'react'
+import { Field, reduxForm } from 'redux-form';
+
+import './review-form.scss';
+
+let ReviewForm = props => {
+    //const { handleSubmit, postReviewSubmit } = props;
+    const { handleSubmit } = props;
+
+    const submit = value => {
+        value.date = new Date().toDateString().slice(4);
+        console.log(value);
+        //postReviewSubmit(value);
+    };
+
+    return (
+        <form className="form" onSubmit={handleSubmit(submit)}>
+            <div>
+                <label htmlFor="name">Fullname</label>
+                <Field name="name" component="input" type="text" id="name"/>
+            </div>
+            <div>
+                <label htmlFor="text">Your message</label>
+                <Field name="text" component="textarea" type="text" id="text"/>
+            </div>            
+            <button type="submit">Send</button>
+        </form>
+        )
+};
+
+ReviewForm = reduxForm({
+    form: 'reviewForm'
+})(ReviewForm)
+
+export default ReviewForm

+ 1 - 0
src/components/review-form/review-form.scss

@@ -0,0 +1 @@
+@import "../../styles/variables";

+ 3 - 2
src/components/sidebar/Sidebar.js

@@ -37,13 +37,14 @@ const siteMenu = [
 
 export class Sidebar extends React.Component {
     logoutHandler = () => {
+        localStorage.removeItem('user');
+        this.props.history.push('/');
         this.props.getLogoutUserSubmit()
-        this.props.history.push('/')
     }
 
     render() {
         
-	    const { showSidebar, showSidebarFlag, getLogoutUserSubmit } = this.props;
+	    const { showSidebar, showSidebarFlag } = this.props;
         return (
             <div className={ !showSidebarFlag ? 'menu close' : 'menu' }>
                 <nav>

+ 6 - 0
src/components/sidebar/sidebar.scss

@@ -210,12 +210,18 @@
         .img-bg {
             opacity: 0;
         }
+
         .burgerIcon {
             display: none;
         }
     }
 
     @media (max-width: $medium) {
+        .menu-skew {
+            left: -20rem;
+            opacity: 1;
+        }
+
         nav {
             padding-top: 10rem;
         }

+ 3 - 15
src/conteiners/adminMyEventsPage/adminMyEventsPage.js

@@ -6,12 +6,7 @@ import "./adminMyEventsPage.scss";
 import { Redirect } from 'react-router-dom'
 import * as actions from "../../actions/adminMainPageActions";
 import AdminHeader from "../../components/adminHeader/adminHeader";
-// import Form from "../../components/eventForm/eventReduxForm";
-// import AdminEventElement from "../../components/adminEventElement/adminEventElement";
-import ConfirmationMessage from "../../components/confirmationMessage/confirmationMessage";
-// import {customSelect} from "../../components/customFields/customSelect/customSelect";
 import EventInfoShort from "../../components/eventInfoShort/EventInfoShort";
-import { customSelect as CustomSelect } from "../../components/customFields/customSelect/customSelect";
 
 class AdminAddEventPage extends Component {
 
@@ -20,22 +15,15 @@ class AdminAddEventPage extends Component {
         // confirmationMessageFlag: false,
         // editFormFlag: false
     };
-    //?eventType=''
+
     componentDidMount() {
         this.props.getEvents();
     }
 
     onChangeTypeHandler = e => {
-        const { name, value } = e.target;
+        const { value } = e.target;
         this.props.getEvents(value)
-        console.log('eventInput', value)
-        // this.setState(prevState => {
-        //     console.log('prevStateInput', prevState)
-        //     return {
-        //         ...prevState,
-        //         filteredEventList: this.props.eventList.filter(el => el.eventType === value)
-        //     };
-        // });
+        // console.log('eventInput', value)
     };
 
     render() {

+ 3 - 11
src/conteiners/adminPhotogalaryPage/adminPhotogalaryPage.js

@@ -1,8 +1,6 @@
 import React, { Component } from "react";
 import { connect } from "react-redux";
 import * as actions from "../../actions/photogalaryActions";
-// import {getEvents} from "../../actions/adminMainPageActions";
-// import {photogalaryOnchange} from "../../actions/photogalaryActions";
 import AdminHeader from "../../components/adminHeader/adminHeader";
 import PhotogalaryForm from "../../components/adminPhotogalary/adminPhotogalaryReduxForm";
 import ConfirmationMessage from "../../components/confirmationMessage/confirmationMessage";
@@ -29,16 +27,12 @@ class AdminAddPhotogalarytPage extends Component {
         const {
             eventTypes,
             eventList,
-            // photogalaryOnchange,
-            // addPhotogalaryInitialValue,
-            // putPhotogalary,
             postPhotogalary,
-            // eventFormInitialValue
         } = this.props
 
-        console.log('page props', this.props)
-        console.log('eventList', eventList)
-        console.log('gallery', this.props.gallery)
+        // console.log('page props', this.props)
+        // console.log('eventList', eventList)
+        // console.log('gallery', this.props.gallery)
 
 		// console.log("eventTypes", this.state.eventTypes );
 		return (
@@ -51,8 +45,6 @@ class AdminAddPhotogalarytPage extends Component {
                             eventTypes={eventTypes} 
                             eventList={eventList} 
                             submitHandler = {postPhotogalary}
-                            // photogalaryOnchange = {photogalaryOnchange}
-                            // initialValues = {addPhotogalaryInitialValue}
                         />
                     </div>
                     {this.state.confirmationMessageFlag && 

+ 102 - 0
src/conteiners/adminResultsPage/adminResultsPage.js

@@ -0,0 +1,102 @@
+import React, { Component } from "react";
+import { connect } from "react-redux";
+// import * as actions from "../../actions/photogalaryActions";
+import {getEvents, getEventByTitle} from "../../actions/adminMainPageActions";
+import {getRegistredUsers} from "../../actions/adminResultsActions";
+import AdminHeader from "../../components/adminHeader/adminHeader";
+import ResultsForm from "../../components/adminResults/adminResultsForm";
+import ConfirmationMessage from "../../components/confirmationMessage/confirmationMessage";
+
+class AdminResultstPage extends Component {
+    state = { 
+        confirmationMessageFlag: false
+     };
+
+     componentDidMount() {
+        this.props.getEvents();
+        // this.props.getRegistredUsers()
+    }
+
+    // showConfirmationMessage = () => {
+    //     this.setState({confirmationMessageFlag: true })
+    //     document.location.reload(true);
+    // };
+    // closeConfirmationMessage = () => {
+    //     this.setState({confirmationMessageFlag: false })
+    // };
+
+    onChangeTypeHandler = e => {
+        const { value } = e.target;
+        this.props.getEvents(value)
+        console.log('onChangeTypeHandler', value)
+    };
+
+    onChangeTitleHandler = e => {
+        const { value } = e.target;
+        this.props.getEventByTitle(value).then((res) => {
+            this.props.getRegistredUsers(res.payload.data.events[0]._id)
+        })
+        // console.log('titile eventList', this.props.eventList)
+        // this.props.getRegistredUsers(this.props.eventList_)
+        // console.log('onChangeTitleHandler', value)
+    };
+
+    render() {
+        const {
+            eventTypes,
+            eventList,
+            // eventByTitle,
+            eventusers,
+            // postPhotogalary,
+        } = this.props
+
+        console.log('page props', this.props)
+        // console.log('eventList', eventList)
+        // console.log('gallery', this.props.gallery)
+
+		// console.log("eventTypes", this.state.eventTypes );
+		return (
+            <>
+                <AdminHeader />
+                <div className="results-form">
+                    <div className="results-form__content">
+                        <h2 className="results-form__form-title">RESULTS</h2>
+                        {/* <PhotogalaryForm 
+                            eventTypes={eventTypes} 
+                            eventList={eventList} 
+                            submitHandler = {postPhotogalary}
+                        /> */}
+                        <ResultsForm 
+                            eventTypes={eventTypes}
+                            eventList={eventList}
+                            // eventByTitle ={eventByTitle}
+                            eventusers={eventusers}
+                            onChangeTypeHandler = {this.onChangeTypeHandler}
+                            onChangeTitleHandler = {this.onChangeTitleHandler}
+                        />
+                    </div>
+                    
+                    {this.state.confirmationMessageFlag && 
+                        <ConfirmationMessage closeMessage = {this.closeConfirmationMessage}>
+                            <div className = "text">Results have beed added.</div>
+                        </ConfirmationMessage >}
+                </div>
+            </>
+		);
+	}
+}
+
+const mapStateToProps = state => ({
+    eventList: state.adminMainPageReducer.eventList,
+    eventByTitle: state.adminMainPageReducer.eventByTitle,
+    eventTypes: state.adminMainPageReducer.eventTypes,
+    eventusers: state.adminResultsReduser.eventusers,
+    // eventFormInitialValue: state.adminMainPageReducer.eventFormInitialValue,
+    addPhotogalaryInitialValue: state.photogalaryReducer.addPhotogalaryInitialValue,
+    // gallery: state.photogalaryReducer.gallery
+});
+
+export default connect(
+    mapStateToProps,
+    {getEvents, getEventByTitle, getRegistredUsers}
+)(AdminResultstPage);

+ 6 - 5
src/conteiners/events/Events.js

@@ -16,7 +16,8 @@ export class Events extends React.Component {
     }
 
     render() {
-        const { events } = this.props;
+        const { events, getAllEvents } = this.props;
+        //console.log(events);
         return (
             <>
                 <Sidebar />
@@ -25,8 +26,8 @@ export class Events extends React.Component {
                         <h2>Events</h2>
                     </div>
                     <div className="events-filters">
-                        <h4>Events filters</h4>
-                        <FiltersEvents />
+                        <h4>Events filter</h4>
+                        <FiltersEvents getAllEvents={getAllEvents}/>
                     </div>
                     
                     <div className="events-content">
@@ -34,7 +35,7 @@ export class Events extends React.Component {
 
                         <div className="events-list">
                             {
-                                events.map(event => <EventInfoShort
+                               events.length !== 0 ? events.map(event => <EventInfoShort
                                     key={event._id}
                                     title={event.title}
                                     country={event.country}
@@ -42,7 +43,7 @@ export class Events extends React.Component {
                                     id={event._id}
                                     eventDate={event.eventDate}
                                     imgSrc={event.mainBannerPicture} />
-                                )
+                                ) : <p className="not-found">Not found events</p>
                             }
                         </div>
                     </div>                    

+ 46 - 2
src/conteiners/gallery/Gallery.js

@@ -1,12 +1,21 @@
 import React from 'react';
+import { connect } from "react-redux";
+
+import { getPhotogalary } from "../../actions/photogalaryActions";
 
 import './gallery.scss';
 
 import Sidebar from '../../components/sidebar/Sidebar';
 import Footer from '../../components/footer/Footer';
 
-export default class Gallery extends React.Component {
+class Gallery extends React.Component {
+    componentDidMount() {
+        this.props.getPhotogalary()
+    }
+
     render() {
+        const { gallery } = this.props;
+        //console.log('gallery', this.props.gallery);
         return (
             <>
                 <Sidebar/>
@@ -15,8 +24,43 @@ export default class Gallery extends React.Component {
                         <h2>Gallery page</h2>
                     </div>
                 </div>
+                <div className="container-wrap">
+                    <div className="gallery-wrap">
+                        {
+                            gallery.map((item,ind) => 
+                                <div className="gallery-item" key={ind}>
+                                    <h3>{item.eventTitle}</h3>
+                                    <h5>{item.eventType}</h5>
+
+                                    <div className="gallery-photo">
+                                        {
+                                            item.pictures.map((photo,ind) => 
+                                                <div className="photo-item" key={ind}>
+                                                    <div className="photo-item-bg">
+                                                        <img src={photo} alt={item.eventType} />
+                                                    </div>
+                                                </div>
+                                            )
+                                        }
+                                    </div>
+                                </div>
+                            )
+                        }
+                    </div>
+                </div>
                 <Footer/>
             </>
         )
     }
-}
+};
+
+const mapStateToProps = state => {
+    return {
+        gallery: state.photogalaryReducer.gallery
+    };
+};
+
+export default connect(
+    mapStateToProps,
+    { getPhotogalary }
+)(Gallery);

+ 65 - 0
src/conteiners/gallery/gallery.scss

@@ -1 +1,66 @@
 @import "../../styles/variables";
+
+.gallery {
+    &-wrap {
+        padding: 5rem 0;
+    }
+
+    &-item {
+        text-align: center;
+
+        &:not(:last-child) {
+            padding-bottom: 3rem;
+            margin-bottom: 5rem;
+            border-bottom: 1px solid $color-blue;
+        }
+
+        h3 {
+            font-size: 2.4rem;
+        }
+
+        h5 {
+            font-size: 1.8rem;
+            color: $color-blue;
+            margin-bottom: 2rem;
+        }
+
+        .gallery-photo {
+            display: flex;
+            flex-wrap: wrap;
+            margin: 0 -1rem;
+        }
+
+        .photo-item {
+            width: 33.33%;
+            padding: 1rem;
+
+            &-bg {
+                display: flex;
+                align-items: center;
+                height: 100%;
+                background: $color-grey-light;
+                border: 3px solid $color-grey-light;
+            }
+
+            img {
+                width: 100%;
+            }
+        }
+    }
+
+    @media(max-width: $small) {
+        &-item {
+            .photo-item {
+                width: 50%;
+            }
+        }
+    }
+
+    @media(max-width: $xsmall) {
+        &-item {
+            .photo-item {
+                width: 100%;
+            }
+        }
+    }
+}

+ 0 - 2
src/conteiners/login/Login.js

@@ -11,8 +11,6 @@ import LoginForm from '../../components/login-form/LoginForm';
 export class Login extends React.Component {
     render() {
         const { postLoginSubmit } = this.props;
-        // const history = this.props.history;
-        //console.log(this.props);
         return (
             <div>
                 <LoginForm postLoginSubmit={postLoginSubmit}/>

+ 64 - 4
src/conteiners/profile/Profile.js

@@ -3,18 +3,78 @@ import { connect } from "react-redux";
 
 import './profile.scss';
 
+import manAvatar from '../../assets/img/man.svg';
+import womanAvatar from '../../assets/img/woman.svg';
+
 import Sidebar from '../../components/sidebar/Sidebar';
 
 export class Profile extends React.Component {
     render() {
-	const {user} = this.props;
-	console.log(user);
+    console.log('profileUser',JSON.parse(localStorage.user).user);
+    const user = JSON.parse(localStorage.user).user;
+    
         return (
             <>
                 <Sidebar/>
-                <div className="container-wrap events">
+                <div className="container-wrap events profile">
                     <div className="caption-page">
-                        <h2>Profile page</h2>
+                        <h5>Profile page</h5>
+                        <h2>{ user.name }</h2>
+                    </div>
+                </div>
+                <div className="container-wrap">
+                    <div className="profile-card">
+                        <div className="avatar">
+                            {
+                                <img src={user.sex === "female" ? womanAvatar :manAvatar } alt="avatar" />
+                            }
+                        </div>
+                        <div className="user-info">
+                            <div className="item">
+                                <span className="cap">Name:</span>
+                                <span className="info">{user.name}</span>
+                            </div>
+                            <div className="item">
+                                <span className="cap">E-mail:</span>
+                                <span className="info">{user.email}</span>
+                            </div>
+                            <div className="item">
+                                <span className="cap">Phone:</span>
+                                <span className="info">{user.phone}</span>
+                            </div>
+                            <div className="item">
+                                <span className="cap">Gender:</span>
+                                <span className="info">{user.sex}</span>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div className="profile-tabs-wrap">
+                        <div className="tabs-main">
+                            <input id="tab1" type="radio" name="tabs" checked readOnly hidden/>
+                            <label htmlFor="tab1">History</label>
+
+                            <input id="tab2" type="radio" name="tabs" readOnly hidden/>
+                            <label htmlFor="tab2">Settings</label>
+
+                            <div className="tab-item" id="content1">
+                                <p>
+                                    Jerky jowl pork chop tongue, kielbasa shank venison. Capicola shank pig ribeye leberkas filet mignon brisket beef kevin tenderloin porchetta. Capicola fatback venison shank kielbasa, drumstick ribeye landjaeger beef kevin tail meatball pastrami prosciutto pancetta. Tail kevin spare ribs ground round ham ham hock brisket shoulder. Corned beef tri-tip leberkas flank sausage ham hock filet mignon beef ribs pancetta turkey.
+                                </p>
+                                <p>
+                                    Bacon ipsum dolor sit amet landjaeger sausage brisket, jerky drumstick fatback boudin.
+                                </p>
+                            </div>
+
+                            <div className="tab-item" id="content2">
+                                <p>
+                                    Bacon ipsum dolor sit amet landjaeger sausage brisket, jerky drumstick fatback boudin.
+                                </p>
+                                <p>
+                                    Jerky jowl pork chop tongue, kielbasa shank venison. Capicola shank pig ribeye leberkas filet mignon brisket beef kevin tenderloin porchetta. Capicola fatback venison shank kielbasa, drumstick ribeye landjaeger beef kevin tail meatball pastrami prosciutto pancetta. Tail kevin spare ribs ground round ham ham hock brisket shoulder. Corned beef tri-tip leberkas flank sausage ham hock filet mignon beef ribs pancetta turkey.
+                                </p>
+                            </div>
+                        </div>
                     </div>
                 </div>
             </>

+ 158 - 0
src/conteiners/profile/profile.scss

@@ -1 +1,159 @@
 @import "../../styles/variables";
+
+.profile {
+    padding-bottom: 0;
+
+    .caption-page {
+        padding: 10rem 0 5rem;
+    }
+
+    h5 {
+        color: $color-mint;
+        font-size: 1.8rem;
+        margin-bottom: 2rem;
+    }
+
+    &-card {
+        display: flex;
+        flex-wrap: wrap;
+        padding: 5rem 0 10rem;
+        //border-bottom: 1px solid $color-mint;
+
+        .avatar {
+            width: 280px;
+            margin-right: 5rem;
+    
+            img {
+                width: 100%;
+            }
+        }
+
+        .user-info {
+            padding-left: 10rem;
+            border-left: 1px solid $color-mint;
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            flex-grow: 1;
+
+            .item {
+                font-size: 1.8rem;
+                color: $color-black;
+                padding: 1rem 0;
+                font-weight: $normal;
+
+                span {
+                    display: inline-block;
+                }
+
+                .cap {
+                    width: 7rem;
+                }
+
+                .info {
+                    padding-left: 2rem;
+                    font-weight: $bold
+                }
+            }
+        }
+    }
+
+    &-tabs-wrap {
+        padding-bottom: 5rem;
+        text-align: center;
+
+        .tabs-main {
+            max-width: 100%;
+    
+            .tab-item {
+                display: none;
+                padding: 2rem;
+                border: 1px solid $color-mint;
+                border-bottom: 0;
+                text-align: left;
+            }
+    
+            label {
+                display: inline-block;
+                margin: 0 0 -1px;
+                padding: 1.5rem 5rem;
+                font-weight: $semi-bold;
+                text-align: center;
+                color: $color-grey-3;
+                border: 1px solid transparent;
+                font-size: 1.6rem;
+                width: 30%;
+    
+                &:hover {
+                    color: $color-mint;
+                    cursor: pointer;
+                }
+            }
+    
+            input:checked + label {
+                color: $color-blue;
+                border: 1px solid $color-mint;
+                border-top: 3px solid $color-mint;
+                border-bottom: 1px solid $color-white;
+            }
+    
+            #tab1:checked ~ #content1,
+            #tab2:checked ~ #content2 {
+                display: block;
+            }
+        }
+    }
+
+    @media screen and (max-width: $medium) {
+        h5 {
+            text-align: center;
+        }
+    }
+
+    @media screen and (max-width: $small) {
+        &-card {
+            justify-content: center;
+
+            .avatar {
+                width: 180px;
+                margin-right: 0;
+                margin-bottom: 2rem;
+            }
+
+            .user-info {
+                width: 100%;
+                border-left: 0;
+                padding-left: 0;
+                padding-top: 3rem;
+                border-top: 1px solid $color-mint;
+
+                .item {
+                    display: flex;
+                    
+                    span {
+                        display: block;
+                    }
+
+                    .cap {
+                        text-align: right;
+                        padding-right: 0.5rem;
+                        width: 35%;
+                    }
+
+                    .info  {
+                        padding-left: 0.5rem;
+                        width: 65%;
+                    }
+                }
+            }
+        }
+        &-tabs-wrap {
+            .tabs-main {
+                label {
+                    padding: 1.5rem;
+                    width: 50%;
+                }
+            }
+        }        
+    }
+}

+ 72 - 1
src/conteiners/reviews/Reviews.js

@@ -1,12 +1,51 @@
 import React from 'react';
+import { connect } from "react-redux";
+
+import { getAllReviews, postReviewSubmit } from "../../actions/reviews";
 
 import './reviews.scss';
 
 import Sidebar from '../../components/sidebar/Sidebar';
 import Footer from '../../components/footer/Footer';
+import ReviewForm from '../../components/review-form/ReviewForm';
+
+const reviewsInitial = [
+    {
+        name: "Unknown Raccoon",
+        date: new Date("07-10-2019").toDateString().slice(4),
+        text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
+    },
+    {
+        name: "Htoto Echo",
+        date: new Date("07-29-2019").toDateString().slice(4),
+        text: "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
+    },
+    {
+        name: "Vasya Petrovich",
+        date: new Date("08-06-2019").toDateString().slice(4),
+        text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
+    },
+    {
+        name: "Petya Petrov",
+        date: new Date("08-07-2019").toDateString().slice(4),
+        text: "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
+    },
+    {
+        name: "Tanya Sash",
+        date: new Date("08-08-2019").toDateString().slice(4),
+        text: "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
+    }
+]
+
+export class Reviews extends React.Component {
+    componentDidMount() {
+        this.props.getAllReviews()
+    }
 
-export default class Reviews extends React.Component {
     render() {
+        const { postReviewSubmit } = this.props;
+        //const { reviews, postReviewSubmit } = this.props;
+        //console.log(reviews);
         return (
             <>
                 <Sidebar/>
@@ -15,8 +54,40 @@ export default class Reviews extends React.Component {
                         <h2>Reviews page</h2>
                     </div>
                 </div>
+                <div className="container-wrap">
+                    <div className="reviews-wrap">
+                        {
+                            reviewsInitial.reverse().map((reviewer, ind) => ind < 10 &&
+                                <div className="reviews-item" key={ind}>
+                                <div className="review-content">
+                                        <div className="reviews-name">{reviewer.name}</div>
+                                        <div className="reviews-date">
+                                            <i className="fa fa-calendar-o" aria-hidden="true"></i>
+                                            {reviewer.date}
+                                        </div>
+                                        <div className="reviews-text">{reviewer.text}</div>
+                                    </div>
+                                </div>
+                            )
+                        }
+                    </div>
+                    <div className="reviews-wrap-add">
+                        <ReviewForm postReviewSubmit={postReviewSubmit}/>
+                    </div>
+                </div>
                 <Footer/>
             </>
         )
     }
 }
+
+const mapStateToProps = state => {
+    return {
+        reviews: state.allReviews.reviews
+    };
+};
+
+export default connect(
+    mapStateToProps,
+    { getAllReviews, postReviewSubmit }
+)(Reviews);

+ 65 - 0
src/conteiners/reviews/reviews.scss

@@ -1 +1,66 @@
 @import "../../styles/variables";
+
+.reviews {
+    &-wrap {
+        padding: 5rem 0 2rem;
+        display: flex;
+        flex-wrap: wrap;
+        justify-content: center;
+        margin: 0 -1rem;
+
+        &-add {
+            padding-bottom: 5rem;
+        }
+    }
+
+    &-item {
+        width: 100%;
+        padding: 0 1rem 3rem;
+
+        .review-content {
+            height: 100%;
+            padding: 1.5rem;
+            border: 1px solid $color-mint;
+            text-align: center;
+        }
+    }
+
+    &-name {
+        position: relative;
+        font-size: 2.1rem;
+        margin-bottom: 1.5rem;
+        padding-bottom: 1rem;
+
+        &:after {
+            content: '';
+            display: block;
+            position: absolute;
+            bottom: 0;
+            left: 50%;
+            transform: translateX(-50%);
+            width: 3rem;
+            height: 0.1rem;
+            background: $color-mint;
+        }
+    }
+
+    &-date {
+        font-size: 1.4rem;
+        color: $color-blue;
+        margin-bottom: 1.5rem;
+
+        i {
+            margin-right: 1rem;
+        }
+    }
+
+    &-text {
+        font-size: 1.6rem;
+    }
+
+    @media (min-width: $min-small) {
+        &-item {
+            width: 50%;
+        }
+    }
+}

+ 2 - 2
src/private-router.js

@@ -7,9 +7,9 @@ export const PrivateRoute = ({ component: Component, protectedRoute, ...rest })
 		render={props => {
 			if (protectedRoute) {
 				const user = localStorage.getItem("user");
-				console.log('user')
+				//console.log('user')
 				if (!user) {
-					console.log('user')
+					//console.log('user')
 					return <Redirect to="/" />;
 				}
 

+ 14 - 0
src/reducers/adminMainPageReducer.js

@@ -57,6 +57,20 @@ export default (state = initialState, action) => {
 			return state;
 		}
 
+		// GET EVENT BY TITLE 
+		case types.GET_EVENT_BY_TITLE: {
+			return state;
+		}
+		case types.GET_EVENT_BY_TITLE_SUCCESS: {
+			const { data } = action.payload;
+			console.log('reducer data eventByTitle', data)
+			const eventByTitle = data
+			return { ...state, eventByTitle };
+		}
+		case types.GET_EVENT_BY_TITLE_FAIL: {
+			return state;
+		}
+
 		// REMOVE
 		case types.REMOVE_EVENT_REQUEST: {
 			return state;

+ 26 - 0
src/reducers/adminResultsReduser.js

@@ -0,0 +1,26 @@
+import * as types from "../actionTypes/actionTypes"
+import initialState from "../state/addEventInitialValue";
+
+export default (state = initialState, action) => {
+
+    switch (action.type) {
+
+		//GET REGISTRED USERS
+		case types.GET_REGISTRED_USERS: {
+			return state;
+		}
+		case types.GET_EVENTS_REQUEST_SUCCESS: {
+			const { data } = action.payload;
+            const eventusers = data.eventusers
+            console.log('state', state)
+            console.log('result reduser users', eventusers)
+			return { ...state, eventusers };
+		}
+		case types.GET_EVENTS_REQUEST_FAIL: {
+			return state;
+		}
+
+        default:
+			return state; 
+    }
+}

+ 5 - 1
src/reducers/combineReducers.js

@@ -9,6 +9,8 @@ import getEvents from "./getAllEvents";
 import getEventCard from "./getRequestEvent";
 import photogalaryReducer from "./photogalaryReducer"
 import logout from "./logout";
+import allReviews from "./reviews";
+import adminResultsReduser from "./adminResultsReduser"
 
 export default combineReducers({
 	form: formReducer,
@@ -19,5 +21,7 @@ export default combineReducers({
     getEventCard,
     sidebar,
     photogalaryReducer,
-    logout
+    allReviews,
+    logout,
+    adminResultsReduser
 });

+ 4 - 8
src/reducers/login.js

@@ -1,9 +1,7 @@
 import * as types from "../actionTypes/actionTypes";
-import { writeLocalStorage } from "../actions/login";
 
 const initialState = {
-    user: {},
-    showProfile: false
+    user: {}
 }
 
 export default (state = initialState, action) => {
@@ -12,13 +10,11 @@ export default (state = initialState, action) => {
             return state;
         }
 
-        case types.POST_REQUEST_SUCCESS_LOGIN: {
-            writeLocalStorage(action.payload.user);
-            
+        case types.POST_REQUEST_SUCCESS_LOGIN: {   
+            //console.log('action.payload.user',action.payload.user);
             return {
                 ...state,
-                user: action.payload.user,
-				showProfile: true
+                user: action.payload.user
             };
         }
 

+ 1 - 4
src/reducers/logout.js

@@ -1,5 +1,4 @@
 import * as types from "../actionTypes/actionTypes";
-// import { clearLocalStorage } from "../actions/logout";
 
 const initialState = {
     logOut: false
@@ -12,9 +11,7 @@ export default (state = initialState, action) => {
         }
 
         case types.GET_LOGOUT_USER_SUCCESS: {
-            //console.log('logout',action.payload.logOut);
-            // clearLocalStorage();
-            
+            //console.log('logout',action.payload.logOut);            
             return state
         }
 

+ 4 - 4
src/reducers/photogalaryReducer.js

@@ -23,10 +23,10 @@ export default (state = initialState, action) => {
 			return state;
 		}
 		case types.GET_PHOTOGALARY_REQUEST_SUCCESS: {
-            console.log('GET_PHOTOGALARY reducer data', action.payload.data)
-			const { data } = action.payload;
-			const gallery = data.data.gallery
-			return { ...state, gallery };
+            console.log('GET_PHOTOGALARY reducer data', action.payload.data.gallery)
+			//const { data } = action.payload;
+			//const gallery = data.data.gallery;
+            return { ...state, gallery: action.payload.data.gallery  };
 		}
 		case types.GET_PHOTOGALARY_REQUEST_FAIL: {
 			return state;

+ 42 - 0
src/reducers/reviews.js

@@ -0,0 +1,42 @@
+import * as types from "../actionTypes/actionTypes";
+
+const initialState = {
+    reviews: []
+}
+
+export default (state = initialState, action) => {
+    switch (action.type) {
+        case types.GET_REQUEST_REVIEWS: {
+            return state;
+        }
+
+        case types.GET_REQUEST_SUCCESS_REVIEWS: {
+            //console.log('reviews',action.payload.reviews);
+            return {
+                ...state,
+                reviews: action.payload.reviews
+            };
+        }
+
+        case types.GET_REQUEST_ERROR_REVIEWS: {
+            console.log('error reviews');
+            return state;
+        }
+
+        case types.POST_REQUEST_REVIEW: {
+            return state;
+        }
+
+        case types.POST_REQUEST_SUCCESS_REVIEW: {
+            return state;
+        }
+
+        case types.POST_REQUEST_ERROR_REVIEW: {
+            console.log('error reviews');
+            return state;
+        }
+
+        default:
+            return state;
+    }
+}

+ 20 - 9
src/router.js

@@ -6,6 +6,7 @@ import AdminMainPage from './conteiners/adminMainPage/adminMainPage';
 import AdminAddEventPage from './conteiners/adminAddEventPage/adminAddEventPage';
 import AdminMyEventsPage from './conteiners/adminMyEventsPage/adminMyEventsPage';
 import AdminAddPhotogalarytPage from "./conteiners/adminPhotogalaryPage/adminPhotogalaryPage"
+import AdminResultsPage from "./conteiners/adminResultsPage/adminResultsPage"
 
 import Home from './conteiners/home/Home';
 import Result from './conteiners/result/Result';
@@ -48,7 +49,7 @@ const route = [
 		id: 4,
 		exact: true,
 		path: "/result",
-		protected: true,
+		protected: false,
 		component: Result
 	},
 	{
@@ -114,31 +115,41 @@ const route = [
     {
 		id: 13,
 		exact: true,
+		path: "/admin/results",
+        protected: true,
+        hasAccess: 'admin',
+		component: AdminResultsPage
+	},
+	{
+		id: 14,
+		exact: true,
 		path: "/admin/my_events",
         protected: true,
         hasAccess: 'admin',
 		component: AdminMyEventsPage
 	},
 	{
-		id: 14,
+		id: 15,
 		component: PAGENOTFOUND
 	}
 ];
 
 const Router = withRouter(({ history, user }) => {
-
 	useEffect(() => {
-		const user = localStorage.getItem("user");
-		if (user) {
-			const userRole = JSON.parse(user).role;
+		const userl = localStorage.getItem("user");
+
+		if (userl) {
+			const userRole = JSON.parse(userl).user.role;
+
 			if (userRole === 'admin') {
 				history.push("/admin");
-            }
+			}
+			
             if (userRole === 'user') {
 				history.push("/profile");
 			}
 		}
-	}, [user]);
+	}, [history, user]);
 
 	return (
 		<div className="container">
@@ -164,5 +175,5 @@ const mapStateToProps = state => {
 };
 
 export default connect(
-    mapStateToProps
+	mapStateToProps
 )(Router);

+ 1 - 0
src/state/addEventInitialValue.js

@@ -26,6 +26,7 @@ eventFormInitialValue: {
 eventList: [],
 editFormFlag: false,
 gallery: [],
+// eventusers: [],
 
 eventTypes: [
     { optionName: 'Select Event Type', id: 1 },

+ 1 - 1
src/state/adminMenu.js

@@ -4,7 +4,7 @@ export const adminMenu = [
 	{ path: "/admin/my_events", id: 2, text: "My Events", logout: false },
     { path: "/admin/photogalary", id: 3, text: "Add Photogalery", logout: false },
 	{ path: "/admin/results", id: 4, text: "Add Results", logout: false },
-	{ path: "/admin/feedbacks", id: 5, text: "Feedbacks", logout: false },
+	// { path: "/admin/feedbacks", id: 5, text: "Feedbacks", logout: false },
 	{ path: "/", id: 6, text: "Go to WebSite", logout: false },
 	{ path: "/", id: 7, text: "Log out", logout: true }
 ];

+ 14 - 0
src/styles/custom.scss

@@ -28,6 +28,12 @@
         color: $color-white;
         font-size: 5rem;
     }
+
+    @media (max-width: $medium) {
+        h2 {
+            text-align: center;
+        }
+    }
 }
 
 i {
@@ -77,4 +83,12 @@ i {
     &:hover {
         background-color: $color-blue;
     }
+}
+
+.not-found {
+    font-size: 2.1rem;
+    margin-top: 2rem;
+    text-align: center;
+    width: 100%;
+    color: $color-blue;
 }

+ 1 - 0
src/styles/variables.scss

@@ -5,6 +5,7 @@ $color-black: #000000;
 $color-grey-light: #eeeeee;
 $color-mint: #5acec2;
 $color-grey-2: #f5f5f5;
+$color-grey-3: #aabbcc;
 
 //font-weight
 $light: 300;