From 707e35ad899a8663d8d3ac7a6907c7defefc26d7 Mon Sep 17 00:00:00 2001 From: Mark renzo Santiago Date: Mon, 4 Sep 2017 19:48:37 -0700 Subject: [PATCH 01/10] fix formatting of text for volunteer form --- .../src/app/src/components/forms/volunteer.js | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/HackMerced/2017F/src/app/src/components/forms/volunteer.js b/HackMerced/2017F/src/app/src/components/forms/volunteer.js index 171f947..2b65435 100644 --- a/HackMerced/2017F/src/app/src/components/forms/volunteer.js +++ b/HackMerced/2017F/src/app/src/components/forms/volunteer.js @@ -21,7 +21,7 @@ export class VolunteerForm extends Component { error={this.props.errors.name} value={this.props.data.name} name='name' - type='name' + type='text' label='Name' placeholder='Your Full Name' autoCorrect="off" autoCapitalize="off" spellCheck="false"/> @@ -30,7 +30,7 @@ export class VolunteerForm extends Component { error={this.props.errors.age} value={this.props.data.age} name='age' - type='age' + type='number' label='Age' placeholder='Your Age' autoCorrect="off" autoCapitalize="off" spellCheck="false"/> @@ -39,27 +39,48 @@ export class VolunteerForm extends Component { error={this.props.errors.availibility} value={this.props.data.availibility} name='availibility' - type='availibility' + type='options' label='Availability' placeholder='Availability Hours' autoCorrect="off" autoCapitalize="off" spellCheck="false"/> - + type='options' + optionsType='small' + onChange={this.props.onChange} + options={[ + 'None', + 'Vegetarian', + 'Vegan', + 'Halal', + 'Kosher', + 'Jain', + 'Hindu', + ]}/> - - + name='shirt_size' + type='options' + optionsType='small' + onChange={this.props.onChange} + options={[ + 'XS', + 'S', + 'M', + 'L', + 'XL', + '2XL', + '3XL', + '4XL' + ]}/> From 4c9206fdb7f8a9a5da66dada53c6878e8a04923c Mon Sep 17 00:00:00 2001 From: Mark renzo Santiago Date: Mon, 4 Sep 2017 20:13:07 -0700 Subject: [PATCH 02/10] fix value --- .../src/app/src/components/forms/volunteer.js | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/HackMerced/2017F/src/app/src/components/forms/volunteer.js b/HackMerced/2017F/src/app/src/components/forms/volunteer.js index 2b65435..9223635 100644 --- a/HackMerced/2017F/src/app/src/components/forms/volunteer.js +++ b/HackMerced/2017F/src/app/src/components/forms/volunteer.js @@ -25,8 +25,15 @@ export class VolunteerForm extends Component { label='Name' placeholder='Your Full Name' autoCorrect="off" autoCapitalize="off" spellCheck="false"/> + - - - - + ]}/> - - + ); From 4829354d5b5e6dbdb1a9e1aa3fbbdeea8d8c56f1 Mon Sep 17 00:00:00 2001 From: Mark renzo Santiago Date: Wed, 6 Sep 2017 14:48:21 -0700 Subject: [PATCH 03/10] fix padding on top of volunteer page --- HackMerced/2017F/src/app/src/components/volunteer.js | 11 ++++++----- HackMerced/2017F/src/app/src/styles/home.scss | 2 +- HackMerced/2017F/src/app/src/styles/main.scss | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/HackMerced/2017F/src/app/src/components/volunteer.js b/HackMerced/2017F/src/app/src/components/volunteer.js index 8883c02..9704d89 100644 --- a/HackMerced/2017F/src/app/src/components/volunteer.js +++ b/HackMerced/2017F/src/app/src/components/volunteer.js @@ -3,8 +3,9 @@ import React, { Component} from 'react'; import { connect } from 'react-redux'; import { browserHistory } from 'react-router' import { VolunteerForm } from './forms'; -import { LogoWithCopy } from './partials' +import { LogoWithCopy } from './partials'; +import '../styles/apply.scss'; export class VolunteerComponent extends Component { @@ -14,10 +15,10 @@ export class VolunteerComponent extends Component { const { volunteerPersonForm, loginErrors } = this.props.data; return ( -
- - -
+
+ + +
) } } diff --git a/HackMerced/2017F/src/app/src/styles/home.scss b/HackMerced/2017F/src/app/src/styles/home.scss index 92c4ecf..23cd579 100644 --- a/HackMerced/2017F/src/app/src/styles/home.scss +++ b/HackMerced/2017F/src/app/src/styles/home.scss @@ -82,7 +82,7 @@ width: 100%; height: 100%; top: 40px; - opacity: 0; + opacity: 0; @include animation('fadein 1500ms forwards 4.5s'); } diff --git a/HackMerced/2017F/src/app/src/styles/main.scss b/HackMerced/2017F/src/app/src/styles/main.scss index fd496f0..5a805da 100644 --- a/HackMerced/2017F/src/app/src/styles/main.scss +++ b/HackMerced/2017F/src/app/src/styles/main.scss @@ -28,4 +28,4 @@ body { @import 'authorization-form'; @import 'home'; -@import 'logo'; +@import 'logo'; \ No newline at end of file From ddb31d112c0917ef4a1011c3ecd63c4f0ec84fbf Mon Sep 17 00:00:00 2001 From: Mark renzo Santiago Date: Thu, 14 Sep 2017 01:32:24 -0700 Subject: [PATCH 04/10] allow routing for volunteer form submission --- .../2017F/src/app/src/actions/actions.js | 10 ++++++++ .../app/src/components/application/layout.js | 2 -- .../src/app/src/components/forms/index.js | 4 ++-- .../src/app/src/components/forms/volunteer.js | 12 ++++++---- HackMerced/2017F/src/app/src/util/auth.js | 23 ++++++++++++++++--- 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/HackMerced/2017F/src/app/src/actions/actions.js b/HackMerced/2017F/src/app/src/actions/actions.js index e774c21..1448862 100644 --- a/HackMerced/2017F/src/app/src/actions/actions.js +++ b/HackMerced/2017F/src/app/src/actions/actions.js @@ -186,6 +186,14 @@ export function logout() { } } +export function signUpVolunteer(user) { + return (dispatch) => { + auth.submitVolunteerApplication(user).catch(err => { + // Log the volunteer signup error + }); + } +} + export function signup(user) { return (dispatch) => { @@ -216,6 +224,8 @@ export function signup(user) { } } + + export function updateApplyStep(index, data){ const applyStepMap = [ updateApplyStepOne(data), diff --git a/HackMerced/2017F/src/app/src/components/application/layout.js b/HackMerced/2017F/src/app/src/components/application/layout.js index f2a4800..01231dd 100644 --- a/HackMerced/2017F/src/app/src/components/application/layout.js +++ b/HackMerced/2017F/src/app/src/components/application/layout.js @@ -9,7 +9,6 @@ let timeChecker; export class ApplicationLayout extends Component { - render() { return (
@@ -86,7 +85,6 @@ export class ApplicationLayout extends Component { const { name, value } = event.target; let newState = {}; let newErrorState = {} - newErrorState = assign(data.applyErrors, { [ name ]: undefined }), diff --git a/HackMerced/2017F/src/app/src/components/forms/index.js b/HackMerced/2017F/src/app/src/components/forms/index.js index 532a3ab..f10cea2 100644 --- a/HackMerced/2017F/src/app/src/components/forms/index.js +++ b/HackMerced/2017F/src/app/src/components/forms/index.js @@ -1,4 +1,4 @@ export * from './signup'; export * from './login'; -export *from'./forget'; -export *from'./volunteer'; \ No newline at end of file +export * from './forget'; +export * from './volunteer'; \ No newline at end of file diff --git a/HackMerced/2017F/src/app/src/components/forms/volunteer.js b/HackMerced/2017F/src/app/src/components/forms/volunteer.js index 9223635..f616b25 100644 --- a/HackMerced/2017F/src/app/src/components/forms/volunteer.js +++ b/HackMerced/2017F/src/app/src/components/forms/volunteer.js @@ -8,15 +8,16 @@ import React, { Component } from 'react'; import { TextInputBlock } from '../partials'; -import { updateVolunteerForm} from '../../actions'; +import { signUpVolunteer, updateVolunteerForm } from '../../actions'; const assign = Object.assign || require('object.assign'); export class VolunteerForm extends Component { + render() { return (
-

Volunteer Form

+

Volunteer for HackMerced

{ + axios({ + method: 'post', + url: BASE_URI + '/volunteer/submit', + headers: { + 'Authorization': 'Bearer ' + localStorage.token + }, + data: details + }) + .then((response) => { + const user = response.data.results; + resolve(user); + }) + .catch((error) => { + reject(error.response.data); + }) + }) + }, logout(callback) { return new Promise((resolve, reject) => { @@ -125,7 +143,6 @@ export const auth = { let headers = new Headers(); headers.append('Content-Type', 'application/json'); headers.append('Accept', 'application/json'); - axios.post(BASE_URI + '/signup', user) .then((response) => { auth.saveUser(response, resolve); From c54e0fb7500c41a5826cb353c7597963db51a5f0 Mon Sep 17 00:00:00 2001 From: Mark renzo Santiago Date: Thu, 14 Sep 2017 16:43:01 -0700 Subject: [PATCH 05/10] change availability input from string to number --- HackMerced/2017F/src/app/src/components/forms/volunteer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HackMerced/2017F/src/app/src/components/forms/volunteer.js b/HackMerced/2017F/src/app/src/components/forms/volunteer.js index f616b25..74998a4 100644 --- a/HackMerced/2017F/src/app/src/components/forms/volunteer.js +++ b/HackMerced/2017F/src/app/src/components/forms/volunteer.js @@ -46,10 +46,10 @@ export class VolunteerForm extends Component { error={this.props.errors.availibility} value={this.props.data.availibility} name='availibility' - type='text' + type='number' label='Availability' helper='In order to be eligable for free HackMerced goodies, you must volunteer for a minimum of 3 hours' - placeholder='Availability Hours' autoCorrect="off" autoCapitalize="off" spellCheck="false"/> + placeholder='Number Hours Available' autoCorrect="off" autoCapitalize="off" spellCheck="false"/> Date: Mon, 18 Sep 2017 21:47:09 -0700 Subject: [PATCH 06/10] fix(volunteers) basic af javascript errors lol --- .../src/server/src/handlers/volunteer.js | 58 +------------------ 1 file changed, 3 insertions(+), 55 deletions(-) diff --git a/HackMerced/2017F/src/server/src/handlers/volunteer.js b/HackMerced/2017F/src/server/src/handlers/volunteer.js index e45caa9..d617b78 100644 --- a/HackMerced/2017F/src/server/src/handlers/volunteer.js +++ b/HackMerced/2017F/src/server/src/handlers/volunteer.js @@ -1,62 +1,15 @@ import Boom from 'boom'; import axios from 'axios'; import jwt from 'jsonwebtoken'; +import parseError from '../handlers' const TOMOE_URI = process.env.TOMOE_URI; -export function createUserSession(req, response){ - return new Promise((resolve, reject) => { - const user = response.data; - user.meta.token = jwt.sign({ accountId: user.results.id }, process.env.COOKIE_SECRET, { algorithm: 'HS256'} ); - - resolve(user); - }); -} - -export function parseError(err){ - const statusCode = err.statusCode; - const validation = (err.validation && err.validation.errors) ? err.validation.errors : null; - - if(statusCode === 400){ - const boomMessage = Boom.badRequest(err.message); - - if(validation){ - boomMessage.output.payload.validation = validation; - } - - return boomMessage; - } else if(statusCode === 403){ - return Boom.forbidden(err.message); - } else if(statusCode === 404){ - const boomMessage = Boom.notFound(err.message); - - if(validation){ - boomMessage.output.payload.validation = validation; - } - - return boomMessage; - } else if(statusCode === 401){ - const boomMessage = Boom.unauthorized(err.message); - - if(validation){ - boomMessage.output.payload.validation = validation; - } - - return boomMessage; - } else { - return Boom.badImplementation(err.message); - } -} - export const volunteerHandlers = { postVolunteer: (req, reply) => { axios .post(TOMOE_URI + '/volunteers/', req.payload) .then((response) => { - createUserSession(req, response).then((user) => { - reply(user); - }).catch((err) => { - reply(err); - }); + reply(user); }).catch((err) => { reply(parseError(err.response.data)); }); @@ -80,14 +33,9 @@ export const volunteerHandlers = { details: req.payload }) .then((response) => { - createUserSession(req, response).then((user) => { - reply(user); - }).catch((err) => { - reply(err); - }); + reply(user); }).catch((err) => { reply(parseError(err.response.data)); }); } } - From 3d1c9e161c0dea242e9f2e80fe2ef6fdad5ee4e9 Mon Sep 17 00:00:00 2001 From: Mark renzo Santiago Date: Tue, 19 Sep 2017 19:35:23 -0700 Subject: [PATCH 07/10] Volunteer application --- .../2017F/src/app/src/actions/actions.js | 27 +++++++ .../app/src/components/application/layout.js | 3 +- .../src/components/application/step-three.js | 2 +- .../src/app/src/components/forms/index.js | 4 +- .../src/app/src/components/forms/volunteer.js | 76 +++++++++++++++---- .../2017F/src/app/src/components/volunteer.js | 10 +-- .../2017F/src/app/src/reducers/index.js | 33 +++----- HackMerced/2017F/src/app/src/util/auth.js | 19 +++++ .../src/server/src/handlers/volunteer.js | 24 +++--- .../2017F/src/server/src/routes/hacker.js | 4 - .../2017F/src/server/src/routes/volunteer.js | 21 +---- .../src/server/src/validators/volunteer.js | 4 - 12 files changed, 142 insertions(+), 85 deletions(-) diff --git a/HackMerced/2017F/src/app/src/actions/actions.js b/HackMerced/2017F/src/app/src/actions/actions.js index e774c21..f9084ab 100644 --- a/HackMerced/2017F/src/app/src/actions/actions.js +++ b/HackMerced/2017F/src/app/src/actions/actions.js @@ -186,6 +186,33 @@ export function logout() { } } +/** + * + * @param user + * @returns {function(*)} + */ +export function signUpVolunteer(user) { + return (dispatch) => { + auth.submitVolunteerApplication(user) + .then(() => { + dispatch(updateVolunteerForm({ + name: "", + email: "", + age: "", + availability: "", + dietary_restrictions: "", + shirt_size: "" + })); + + forwardTo('/'); + }) + .catch(err => { + // Log the volunteer sign up error + + }); + } +} + export function signup(user) { return (dispatch) => { diff --git a/HackMerced/2017F/src/app/src/components/application/layout.js b/HackMerced/2017F/src/app/src/components/application/layout.js index f2a4800..c7575f2 100644 --- a/HackMerced/2017F/src/app/src/components/application/layout.js +++ b/HackMerced/2017F/src/app/src/components/application/layout.js @@ -1,5 +1,4 @@ import React, { Component } from 'react'; -import { TextInputBlock } from '../partials'; import { updateApplyStep, update, updateApplyErrors } from '../../actions'; import { StepOne, StepTwo, StepThree, StepFour } from './'; import { notMercedOptions } from '../../constants'; @@ -85,7 +84,7 @@ export class ApplicationLayout extends Component { const { data } = this.props; const { name, value } = event.target; let newState = {}; - let newErrorState = {} + let newErrorState = {}; newErrorState = assign(data.applyErrors, { [ name ]: undefined diff --git a/HackMerced/2017F/src/app/src/components/application/step-three.js b/HackMerced/2017F/src/app/src/components/application/step-three.js index 4d5c4af..d195696 100644 --- a/HackMerced/2017F/src/app/src/components/application/step-three.js +++ b/HackMerced/2017F/src/app/src/components/application/step-three.js @@ -7,7 +7,7 @@ export class StepThree extends Component { render() { - const { resume, question, experience, dietary_restrictions, allergies, github, linkedin, devpost } = this.props.data; + const { resume, experience, dietary_restrictions, allergies, github, linkedin, devpost } = this.props.data; return (
diff --git a/HackMerced/2017F/src/app/src/components/forms/index.js b/HackMerced/2017F/src/app/src/components/forms/index.js index 532a3ab..ad620a2 100644 --- a/HackMerced/2017F/src/app/src/components/forms/index.js +++ b/HackMerced/2017F/src/app/src/components/forms/index.js @@ -1,4 +1,4 @@ export * from './signup'; export * from './login'; -export *from'./forget'; -export *from'./volunteer'; \ No newline at end of file +export * from './forget'; +export * from './volunteer'; diff --git a/HackMerced/2017F/src/app/src/components/forms/volunteer.js b/HackMerced/2017F/src/app/src/components/forms/volunteer.js index f616b25..7806307 100644 --- a/HackMerced/2017F/src/app/src/components/forms/volunteer.js +++ b/HackMerced/2017F/src/app/src/components/forms/volunteer.js @@ -13,11 +13,12 @@ import { signUpVolunteer, updateVolunteerForm } from '../../actions'; const assign = Object.assign || require('object.assign'); export class VolunteerForm extends Component { - + render() { return ( -

Volunteer for HackMerced

+

Interested in helping out HackMerced?

+

Become a volunteer!

- - - + + + + + + + ); @@ -117,8 +158,13 @@ export class VolunteerForm extends Component { this.props.dispatch(signUpVolunteer({ name: this.props.data.name, + email: this.props.data.email, age: this.props.data.age, - availibility: this.props.data.availibility, + availability: { + friday: this.props.data.friday_availability, + saturday: this.props.data.saturday_availability, + sunday: this.props.data.sunday_availability + }, dietary_restrictions: this.props.data.dietary_restrictions, shirt_size: this.props.data.shirt_size })) diff --git a/HackMerced/2017F/src/app/src/components/volunteer.js b/HackMerced/2017F/src/app/src/components/volunteer.js index 8883c02..0a543f9 100644 --- a/HackMerced/2017F/src/app/src/components/volunteer.js +++ b/HackMerced/2017F/src/app/src/components/volunteer.js @@ -1,10 +1,10 @@ - import React, { Component} from 'react'; import { connect } from 'react-redux'; import { browserHistory } from 'react-router' import { VolunteerForm } from './forms'; -import { LogoWithCopy } from './partials' +import { LogoWithCopy } from './partials'; +import '../styles/apply.scss'; export class VolunteerComponent extends Component { @@ -14,9 +14,9 @@ export class VolunteerComponent extends Component { const { volunteerPersonForm, loginErrors } = this.props.data; return ( -
- - +
+ +
) } diff --git a/HackMerced/2017F/src/app/src/reducers/index.js b/HackMerced/2017F/src/app/src/reducers/index.js index 455ce49..d83b523 100644 --- a/HackMerced/2017F/src/app/src/reducers/index.js +++ b/HackMerced/2017F/src/app/src/reducers/index.js @@ -27,20 +27,16 @@ const initialState = { forgotPasswordForm: { email: '' }, - - - - -volunteerPersonForm: { - name: '', - age: '', - availibility: '', - dietary_restrictions: '', - shirt_size: '', + volunteerPersonForm: { + name: '', + age: '', + email: '', + friday_availability: '', + saturday_availability: '', + sunday_availability: '', + dietary_restrictions: '', + shirt_size: '', }, - - - signupErrors:{}, loginForm: { email: '', @@ -156,18 +152,11 @@ export function homeReducer(state = initialState, action) { forgotPasswordForm: action.newState }); break; - - - - - - case UPDATE_VOLUNTEER_FORM: + case UPDATE_VOLUNTEER_FORM: return assign({}, state, { volunteerPersonForm: action.newState }); break; - - case SET_AUTH_AS_FALSE: return assign({}, state, { loggedIn: false @@ -186,8 +175,6 @@ export function homeReducer(state = initialState, action) { return assign({}, state, { applyErrors: action.newState }); - - case SET_AUTH: return assign({}, state, { loggedIn: action.newState diff --git a/HackMerced/2017F/src/app/src/util/auth.js b/HackMerced/2017F/src/app/src/util/auth.js index 674f31a..82fcfae 100644 --- a/HackMerced/2017F/src/app/src/util/auth.js +++ b/HackMerced/2017F/src/app/src/util/auth.js @@ -75,6 +75,25 @@ export const auth = { }); }) }, + submitVolunteerApplication(details) { + return new Promise((resolve, reject) => { + axios({ + method: 'post', + url: BASE_URI + '/volunteer', + headers: { + 'Authorization': 'Bearer ' + localStorage.token + }, + data: details, + }) + .then(response => { + const user = response.data.results; + resolve(user); + }) + .catch(error => { + reject(error.response.data); + }); + }) + }, submitApplication(details) { return new Promise((resolve, reject) => { axios({ diff --git a/HackMerced/2017F/src/server/src/handlers/volunteer.js b/HackMerced/2017F/src/server/src/handlers/volunteer.js index d617b78..32944a3 100644 --- a/HackMerced/2017F/src/server/src/handlers/volunteer.js +++ b/HackMerced/2017F/src/server/src/handlers/volunteer.js @@ -1,18 +1,24 @@ -import Boom from 'boom'; import axios from 'axios'; -import jwt from 'jsonwebtoken'; import parseError from '../handlers' const TOMOE_URI = process.env.TOMOE_URI; export const volunteerHandlers = { postVolunteer: (req, reply) => { - axios - .post(TOMOE_URI + '/volunteers/', req.payload) - .then((response) => { - reply(user); - }).catch((err) => { - reply(parseError(err.response.data)); - }); + const email = req.payload.email ? req.payload.email.toLowerCase() : 'bad'; + const name = req.payload.name ? req.payload.name : ''; + axios + .post(TOMOE_URI + '/volunteers', { + name, + email, + status: 'applied', + details: req.payload + }) + .then((response) => { + const user = response.data; + reply(user); + }).catch((err) => { + reply(parseError(err.response.data)); + }); }, getMe: (req, reply) => { diff --git a/HackMerced/2017F/src/server/src/routes/hacker.js b/HackMerced/2017F/src/server/src/routes/hacker.js index 7d1bfc4..edef1ba 100644 --- a/HackMerced/2017F/src/server/src/routes/hacker.js +++ b/HackMerced/2017F/src/server/src/routes/hacker.js @@ -1,10 +1,6 @@ /* */ - - -import Joi from 'joi'; -import Boom from 'boom'; import { hackerHandlers } from '../handlers' import { hackerValidators } from '../validators' diff --git a/HackMerced/2017F/src/server/src/routes/volunteer.js b/HackMerced/2017F/src/server/src/routes/volunteer.js index a657af3..d25c547 100644 --- a/HackMerced/2017F/src/server/src/routes/volunteer.js +++ b/HackMerced/2017F/src/server/src/routes/volunteer.js @@ -1,18 +1,13 @@ -import Joi from 'joi'; -import Boom from 'boom'; import { volunteerHandlers } from '../handlers' -import { volunteerValidators } from '../validators' -// [POST] /login export const postVolunteer = { - path: '/volunteer/signup', + path: '/volunteer', method: 'POST', config: { handler: volunteerHandlers.postVolunteer, } }; -// [GET] /me export const getMe = { path: '/volunteer/me', method: 'GET', @@ -24,23 +19,9 @@ export const getMe = { } }; -// [POST] /submit -export const postSubmit = { - path: '/volunteer/submit', - method: 'POST', - config: { - handler: volunteerHandlers.postSubmit, - validate: volunteerValidators.postSubmit, - auth: { - strategy: 'token', - } - } -}; - const volunteerRoutes = [ postVolunteer, getMe, - postSubmit ] export default volunteerRoutes; diff --git a/HackMerced/2017F/src/server/src/validators/volunteer.js b/HackMerced/2017F/src/server/src/validators/volunteer.js index 588fc49..14ba1b4 100644 --- a/HackMerced/2017F/src/server/src/validators/volunteer.js +++ b/HackMerced/2017F/src/server/src/validators/volunteer.js @@ -1,8 +1,4 @@ import Joi from 'joi'; -import fs from 'fs'; -import path from 'path'; - -import { notMercedOptions } from '../../../app/src/constants' export const volunteerValidators = { postVolunteer:{ From 634f2a58311459fa770891700fe129420bd191cc Mon Sep 17 00:00:00 2001 From: Mark renzo Santiago Date: Wed, 20 Sep 2017 16:51:43 -0700 Subject: [PATCH 08/10] update actions --- HackMerced/2017F/src/app/src/actions/actions.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/HackMerced/2017F/src/app/src/actions/actions.js b/HackMerced/2017F/src/app/src/actions/actions.js index 009e555..130dca1 100644 --- a/HackMerced/2017F/src/app/src/actions/actions.js +++ b/HackMerced/2017F/src/app/src/actions/actions.js @@ -199,7 +199,9 @@ export function signUpVolunteer(user) { name: "", email: "", age: "", - availability: "", + friday_availability: "", + saturday_availability: "", + sunday_availability: "", dietary_restrictions: "", shirt_size: "" })); From ca711ac509d05e2c4d236f9233d048603d2c7adb Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Sat, 23 Sep 2017 21:20:18 -0700 Subject: [PATCH 09/10] feature(2017F/volunteers) Volunteer errors --- .../2017F/src/app/src/actions/actions.js | 19 +++++++++-- .../src/app/src/components/forms/volunteer.js | 6 ++-- .../2017F/src/app/src/components/volunteer.js | 4 +-- .../2017F/src/app/src/constants/constants.js | 1 + .../2017F/src/app/src/reducers/index.js | 10 ++++-- HackMerced/2017F/src/app/src/util/auth.js | 6 ++-- .../src/server/src/handlers/volunteer.js | 34 +++---------------- .../2017F/src/server/src/routes/volunteer.js | 15 ++------ .../src/server/src/validators/volunteer.js | 23 ++++--------- 9 files changed, 47 insertions(+), 71 deletions(-) diff --git a/HackMerced/2017F/src/app/src/actions/actions.js b/HackMerced/2017F/src/app/src/actions/actions.js index 130dca1..11758ed 100644 --- a/HackMerced/2017F/src/app/src/actions/actions.js +++ b/HackMerced/2017F/src/app/src/actions/actions.js @@ -24,11 +24,12 @@ */ -import { SET_AUTH, UPDATE_LOGIN_FORM, UPDATE_USER_DATA, UPDATE_SIGNUP_FORM, UPDATE_SIGNUP_ERRORS, UPDATE_LOGIN_ERRORS, SET_AUTH_AS_FALSE, SET_USER_NAME_AS_FALSE, SET_USER_NAME, SET_USER_ID_AS_FALSE, SET_USER_ID, UPDATE_APPLY_STEP_ONE, UPDATE_APPLY_STEP_TWO, UPDATE_APPLY_STEP_THREE, UPDATE_APPLY_STEP_FOUR, SET_CURRENT_APPLY_STEP, UPDATE_USER_UPDATING_STATUS, UPDATE_APPLY_ERRORS, UPDATE_MOBILE_MENU_STATUS, UPDATE_SUBMITTED_VIEW,UPDATE_FORGOT_PASSWORD_FORM,UPDATE_VOLUNTEER_FORM } from '../constants'; +import { SET_AUTH, UPDATE_LOGIN_FORM, UPDATE_USER_DATA, UPDATE_SIGNUP_FORM, UPDATE_SIGNUP_ERRORS, UPDATE_LOGIN_ERRORS, UPDATE_VOLUNTEER_ERRORS, SET_AUTH_AS_FALSE, SET_USER_NAME_AS_FALSE, SET_USER_NAME, SET_USER_ID_AS_FALSE, SET_USER_ID, UPDATE_APPLY_STEP_ONE, UPDATE_APPLY_STEP_TWO, UPDATE_APPLY_STEP_THREE, UPDATE_APPLY_STEP_FOUR, SET_CURRENT_APPLY_STEP, UPDATE_USER_UPDATING_STATUS, UPDATE_APPLY_ERRORS, UPDATE_MOBILE_MENU_STATUS, UPDATE_SUBMITTED_VIEW,UPDATE_FORGOT_PASSWORD_FORM,UPDATE_VOLUNTEER_FORM } from '../constants'; import { auth } from '../util'; import { browserHistory } from 'react-router'; import { notMercedOptions } from '../constants' +import { parseError } from '../util' function mapUserDetailsToApplication(dispatch, details){ let stepOne = { @@ -208,8 +209,15 @@ export function signUpVolunteer(user) { forwardTo('/'); }) - .catch(err => { - // Log the volunteer sign up error + .catch(({ validation }) => { + let errorSet = {}; + if(validation.errors){ + validation.errors.forEach((error) => { + errorSet[error.key] = parseError(error.key, error.message); + }) + } + + dispatch(updateVolunteerErrors(errorSet)); }); } } @@ -298,6 +306,11 @@ export function updateSignupErrors(newState) { return { type: UPDATE_SIGNUP_ERRORS, newState }; } + +export function updateVolunteerErrors(newState) { + return { type: UPDATE_VOLUNTEER_ERRORS, newState }; +} + export function updateApplyErrors(newState) { return { type: UPDATE_APPLY_ERRORS, newState }; } diff --git a/HackMerced/2017F/src/app/src/components/forms/volunteer.js b/HackMerced/2017F/src/app/src/components/forms/volunteer.js index 7806307..86d862c 100644 --- a/HackMerced/2017F/src/app/src/components/forms/volunteer.js +++ b/HackMerced/2017F/src/app/src/components/forms/volunteer.js @@ -83,7 +83,7 @@ export class VolunteerForm extends Component { - +
) } diff --git a/HackMerced/2017F/src/app/src/constants/constants.js b/HackMerced/2017F/src/app/src/constants/constants.js index 4bd90c1..fe55e23 100644 --- a/HackMerced/2017F/src/app/src/constants/constants.js +++ b/HackMerced/2017F/src/app/src/constants/constants.js @@ -31,3 +31,4 @@ export const UPDATE_MOBILE_MENU_STATUS ='UPDATE_MOBILE_MENU_STATUS'; export const UPDATE_SUBMITTED_VIEW = 'UPDATE_SUBMITTED_VIEW'; export const UPDATE_FORGOT_PASSWORD_FORM = 'UPDATE_FORGOT_PASSWORD_FORM'; export const UPDATE_VOLUNTEER_FORM = 'UPDATE_VOLUNTEER_FORM'; +export const UPDATE_VOLUNTEER_ERRORS = 'UPDATE_VOLUNTEER_ERRORS'; diff --git a/HackMerced/2017F/src/app/src/reducers/index.js b/HackMerced/2017F/src/app/src/reducers/index.js index d83b523..3edfeed 100644 --- a/HackMerced/2017F/src/app/src/reducers/index.js +++ b/HackMerced/2017F/src/app/src/reducers/index.js @@ -10,7 +10,7 @@ * }); */ -import { UPDATE_SIGNUP_FORM, UPDATE_LOGIN_FORM, UPDATE_USER_DATA, UPDATE_SUBMITTED_VIEW, UPDATE_SIGNUP_ERRORS, UPDATE_LOGIN_ERRORS, SET_AUTH, SENDING_REQUEST, SET_ERROR_MESSAGE, SET_AUTH_AS_FALSE, SET_USER_NAME_AS_FALSE, SET_USER_NAME, SET_USER_ID_AS_FALSE, SET_USER_ID, UPDATE_APPLY_STEP_ONE, UPDATE_APPLY_STEP_TWO, UPDATE_APPLY_STEP_THREE, UPDATE_APPLY_STEP_FOUR, SET_CURRENT_APPLY_STEP, UPDATE_USER_UPDATING_STATUS, UPDATE_APPLY_ERRORS, UPDATE_MOBILE_MENU_STATUS,UPDATE_FORGOT_PASSWORD_FORM, UPDATE_VOLUNTEER_FORM} from '../constants'; +import { UPDATE_SIGNUP_FORM, UPDATE_LOGIN_FORM, UPDATE_USER_DATA, UPDATE_SUBMITTED_VIEW, UPDATE_SIGNUP_ERRORS, UPDATE_LOGIN_ERRORS, SET_AUTH, SENDING_REQUEST, SET_ERROR_MESSAGE, SET_AUTH_AS_FALSE, SET_USER_NAME_AS_FALSE, SET_USER_NAME, SET_USER_ID_AS_FALSE, SET_USER_ID, UPDATE_APPLY_STEP_ONE, UPDATE_APPLY_STEP_TWO, UPDATE_APPLY_STEP_THREE, UPDATE_APPLY_STEP_FOUR, SET_CURRENT_APPLY_STEP, UPDATE_USER_UPDATING_STATUS, UPDATE_APPLY_ERRORS, UPDATE_MOBILE_MENU_STATUS,UPDATE_FORGOT_PASSWORD_FORM, UPDATE_VOLUNTEER_FORM, UPDATE_VOLUNTEER_ERRORS } from '../constants'; // Object.assign is not yet fully supported in all browsers, so we fallback to // a polyfill const assign = Object.assign || require('object.assign'); @@ -42,6 +42,7 @@ const initialState = { email: '', password: '', }, + volunteerErrors: {}, loginErrors:{}, user:{}, currentlySending: false, @@ -137,9 +138,14 @@ export function homeReducer(state = initialState, action) { signupErrors: action.newState }); break; + case UPDATE_VOLUNTEER_ERRORS: + return assign({}, state, { + volunteerErrors: action.newState + }); + break; case UPDATE_LOGIN_FORM: return assign({}, state, { - loginFom: action.newState + loginForm: action.newState }); break; case UPDATE_LOGIN_ERRORS: diff --git a/HackMerced/2017F/src/app/src/util/auth.js b/HackMerced/2017F/src/app/src/util/auth.js index 648c6c2..7626751 100644 --- a/HackMerced/2017F/src/app/src/util/auth.js +++ b/HackMerced/2017F/src/app/src/util/auth.js @@ -1,6 +1,6 @@ import axios from 'axios'; -const BASE_URI = (process.env.NODE_ENV === 'development') ? 'http://localhost:' + process.env.PORT : ''; +const BASE_URI = (process.env.NODE_ENV === 'development') ? 'http://localhost:' + (process.env.PORT || 1954) : ''; export const auth = { saveUser(response, resolve) { @@ -114,9 +114,10 @@ export const auth = { }, submitVolunteerApplication(details) { return new Promise((resolve, reject) => { + console.log(BASE_URI + '/volunteer') axios({ method: 'post', - url: BASE_URI + '/volunteer/submit', + url: BASE_URI + '/volunteer', headers: { 'Authorization': 'Bearer ' + localStorage.token }, @@ -127,6 +128,7 @@ export const auth = { resolve(user); }) .catch((error) => { + console.log(error) reject(error.response.data); }) }) diff --git a/HackMerced/2017F/src/server/src/handlers/volunteer.js b/HackMerced/2017F/src/server/src/handlers/volunteer.js index 32944a3..4b7f6ba 100644 --- a/HackMerced/2017F/src/server/src/handlers/volunteer.js +++ b/HackMerced/2017F/src/server/src/handlers/volunteer.js @@ -1,47 +1,21 @@ import axios from 'axios'; -import parseError from '../handlers' +import { parseError } from '../handlers' const TOMOE_URI = process.env.TOMOE_URI; export const volunteerHandlers = { postVolunteer: (req, reply) => { const email = req.payload.email ? req.payload.email.toLowerCase() : 'bad'; const name = req.payload.name ? req.payload.name : ''; - axios - .post(TOMOE_URI + '/volunteers', { + axios.post(TOMOE_URI + '/volunteers', { name, email, status: 'applied', details: req.payload }) - .then((response) => { - const user = response.data; - reply(user); + .then(({ data }) => { + reply(data); }).catch((err) => { reply(parseError(err.response.data)); }); - }, - - getMe: (req, reply) => { - axios - .get(TOMOE_URI + '/volunteers/' + req.auth.credentials.id) - .then((response) => { - const user = response.data; - reply(user); - }).catch((err) => { - reply(err); - }); - }, - - postSubmit: (req, reply) => { - axios - .post(TOMOE_URI + '/volunteers/' + req.auth.credentials.id, { - status: 'submitted', - details: req.payload - }) - .then((response) => { - reply(user); - }).catch((err) => { - reply(parseError(err.response.data)); - }); } } diff --git a/HackMerced/2017F/src/server/src/routes/volunteer.js b/HackMerced/2017F/src/server/src/routes/volunteer.js index d25c547..de0ebbd 100644 --- a/HackMerced/2017F/src/server/src/routes/volunteer.js +++ b/HackMerced/2017F/src/server/src/routes/volunteer.js @@ -1,28 +1,17 @@ import { volunteerHandlers } from '../handlers' +import { volunteerValidators } from '../validators' export const postVolunteer = { path: '/volunteer', method: 'POST', config: { handler: volunteerHandlers.postVolunteer, + validate: volunteerValidators.postVolunteer, } }; -export const getMe = { - path: '/volunteer/me', - method: 'GET', - config: { - handler: volunteerHandlers.getMe, - auth: { - strategy: 'token', - } - } -}; - const volunteerRoutes = [ postVolunteer, - getMe, ] export default volunteerRoutes; - diff --git a/HackMerced/2017F/src/server/src/validators/volunteer.js b/HackMerced/2017F/src/server/src/validators/volunteer.js index 14ba1b4..86ed31f 100644 --- a/HackMerced/2017F/src/server/src/validators/volunteer.js +++ b/HackMerced/2017F/src/server/src/validators/volunteer.js @@ -2,26 +2,17 @@ import Joi from 'joi'; export const volunteerValidators = { postVolunteer:{ - //tomoe - }, - - getMe:{ - payload:{ - id: Joi.string().required() - } - }, - - postSubmit:{ payload:{ name: Joi.string().required(), - age: Joi.number().integer().min(14).max(121).required().options({ language: { any: { allowOnly: 'Sorry we only allow people older than age 14 and younger than 121!' } } }), - email: Joi.string().required(), - availability: Joi.string().required(), + age: Joi.number().integer().min(18).max(121).required().options({ language: { any: { allowOnly: 'Sorry we only allow people older than age 18 and younger than 121!' } } }), + email: Joi.string().required().email(), + availability: { + friday: Joi.string().required(), + saturday: Joi.string().required(), + sunday: Joi.string().required(), + }, dietary_restrictions: Joi.string().required(), shirt_size: Joi.string().required() } } } - - - \ No newline at end of file From 5df55ab17d7eff1bc60656bab8d7384fa8fd1237 Mon Sep 17 00:00:00 2001 From: Shubham Naik Date: Sat, 23 Sep 2017 21:47:57 -0700 Subject: [PATCH 10/10] feature(2017F/volunteers) update import --- .../src/app/src/components/forms/volunteer.js | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/HackMerced/2017F/src/app/src/components/forms/volunteer.js b/HackMerced/2017F/src/app/src/components/forms/volunteer.js index 86d862c..7baa201 100644 --- a/HackMerced/2017F/src/app/src/components/forms/volunteer.js +++ b/HackMerced/2017F/src/app/src/components/forms/volunteer.js @@ -15,37 +15,39 @@ const assign = Object.assign || require('object.assign'); export class VolunteerForm extends Component { render() { + const { errors, data } = this.props; + return (

Interested in helping out HackMerced?

Become a volunteer!