diff --git a/src/config.js b/src/config.js index 43576a3..84d5d3b 100644 --- a/src/config.js +++ b/src/config.js @@ -6,11 +6,11 @@ var development = { } var production = { - stripe: { - publicKey: "pk_live_xrnwdLNXbt20LMxpIDffJnnC" - } + stripe: { + publicKey: "pk_live_xrnwdLNXbt20LMxpIDffJnnC" + } } -module.exports = function() { +module.exports = function () { return process.env.ENV == 'development' ? development : production; } diff --git a/src/js/components/membershipForm.js b/src/js/components/membershipForm.js index d40287c..253bfb8 100644 --- a/src/js/components/membershipForm.js +++ b/src/js/components/membershipForm.js @@ -1,50 +1,26 @@ -'use strict'; - -var classSet = require('classnames'); -var React = require('react'); -var request = require('axios'); - -var MembershipInfoForm = require('./membershipInfoForm.js'); -var StripeCheckout = require('./stripeCheckout.js'); +import React from 'react'; +import MembershipInfoForm from './membershipInfoForm'; module.exports = React.createClass({ getInitialState() { return { - infoFormSuccess: false, - paymentSuccess: false, - userInfo: null + paymentSuccess: false }; }, - handlePaymentSuccess() { this.setState({ paymentSuccess: true }); }, - - handleInfoFormSuccess(userInfo) { - this.setState({ - infoFormSuccess: true, - userInfo: userInfo - }); - }, - render() { - if(!this.state.infoFormSuccess) { - return - - } else if (!this.state.paymentSuccess) { + if(!this.state.paymentSuccess) { return ( - - ) - - } else { - return ( -
-

Maksu ja rekisteröityminen onnistui.

-

Tervetuloa Koodiklinikka ry:n jäseneksi!

-
- ) + + ); } + return ( +
+

Maksu ja rekisteröityminen onnistui.

+

Tervetuloa Koodiklinikka ry:n jäseneksi!

+
+ ); } }); diff --git a/src/js/components/membershipInfoForm.js b/src/js/components/membershipInfoForm.js index 2363ec3..67fe7db 100644 --- a/src/js/components/membershipInfoForm.js +++ b/src/js/components/membershipInfoForm.js @@ -1,21 +1,22 @@ 'use strict'; -var _ = require('lodash'); -var request = require('axios'); -var React = require('react'); +var _ = require('lodash'); +var request = require('axios'); +var React = require('react'); var classSet = require('classnames'); -var api = require('../api'); -var StripeCheckout = require('./stripeCheckout.js'); +var api = require('../api'); +var StripeCheckout = require('react-stripe-checkout').default; +var config = require('../../config.js')(); var fieldNameTranslations = { - address: { fi: "Osoite" }, - city: { fi: "Paikkakunta" }, - email: { fi: "Sähköpostiosoite" }, - handle: { fi: "Slack-käyttäjätunnus "}, - name: { fi: "Koko nimi "}, - postcode: { fi: "Postinumero" } -} + address: { fi: 'Osoite' }, + city: { fi: 'Paikkakunta' }, + email: { fi: 'Sähköpostiosoite' }, + handle: { fi: 'Slack-käyttäjätunnus ' }, + name: { fi: 'Koko nimi ' }, + postcode: { fi: 'Postinumero' } +}; function validateEmail(email) { var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; @@ -24,54 +25,51 @@ function validateEmail(email) { const fieldNames = ['name', 'email', 'handle', 'address', 'city', 'postcode']; +function getUserInfo(state) { + return _.pick(state, fieldNames); +} + module.exports = React.createClass({ getInitialState() { return { - address: '', - city: '', - email: '', - errors: [], - handle: '', - name: '', - postcode: '', - sending: false + address: '', + city: '', + email: '', + handle: '', + name: '', + postcode: '', + sending: false, + pristineFields: fieldNames }; }, - onSubmit(e) { - e.preventDefault(); - + onSubmit(token) { this.setState({ sending: true, - errors: [] + error: null }); - if (this.getDataErrors().length) { - this.setState({ - sending: false, - errors: userInfoErrors + request.post(api('membership'), { + userInfo: getUserInfo(this.state), + stripeToken: token.id + }) + .then(() => { + this.setState({ sending: false }); + this.props.onPaymentSuccess(); + }) + .catch((err) => { + this.setState({ error: err, sending: false }); }); - } else { - this.props.onSuccess({ - email: this.state.email, - name: this.state.name, - handle: this.state.handle, - address: this.state.address, - postcode: this.state.postcode, - city: this.state.city, - }); - } - }, - handleError(err) { - this.setState({ error: err, sending: false }); }, onChange(e) { - if (e.target.value === this.state[e.target.name]) { + var name = e.target.name; + if (e.target.value === this.state[name]) { return; } this.setState({ [e.target.name]: e.target.value, + pristineFields: this.state.pristineFields.filter((fieldName) => fieldName !== name), errors: [] }); }, @@ -80,84 +78,110 @@ module.exports = React.createClass({ var foundErrors = []; fieldNames.forEach((fieldName) => { - if(!this.state[fieldName]) - foundErrors.push({ field: fieldName, type: 'missing' }) - }) + if (!this.state[fieldName]) { + foundErrors.push({ field: fieldName, type: 'missing' }); + } + }); - if(this.state.email && !validateEmail(this.state.email)) + if (this.state.email && !validateEmail(this.state.email)) { foundErrors.push({ field: 'email', type: 'invalid' }); + } return foundErrors; }, render() { + const inputErrors = this.getDataErrors(); + var formClasses = classSet({ - 'form': true, + 'form': true, 'membership-form': true, - 'has-error': this.state.errors.length, - 'sending': this.state.sending + 'has-error': inputErrors.length !== 0 || this.state.error, + 'sending': this.state.sending }); - - /* generate error messages */ - var feedbackMessages = []; - var fieldsWithErrors = []; - - this.state.errors.forEach((err, i) => { + function getErrorMessage(err) { var feedbackText; - fieldsWithErrors.push(err.field); - - if(err.type == 'missing') { - feedbackText = `${ fieldNameTranslations[err.field].fi } on pakollinen.` - } else if (err.type == 'invalid') { - feedbackText = `${ fieldNameTranslations[err.field].fi } on virheellinen.` + if (err.type === 'missing') { + feedbackText = `${fieldNameTranslations[err.field].fi} on pakollinen.`; + } else if (err.type === 'invalid') { + feedbackText = `${fieldNameTranslations[err.field].fi} on virheellinen.`; } - feedbackMessages.push((
{ feedbackText }
)) - }); + return
{feedbackText}
; + } + /* generate error messages */ + var visibleErrors = inputErrors + .filter((error) => this.state.pristineFields.indexOf(error.field) === -1); - /* generate input fields */ - var inputFields = []; + var fieldsWithErrors = visibleErrors.map(({ field }) => field); - fieldNames.forEach((fieldName) => { + var inputFields = fieldNames.map((fieldName) => { var inputClasses = classSet({ 'input': true, 'has-error': _.includes(fieldsWithErrors, fieldName), - 'half': fieldName == 'city' || fieldName == 'postcode', - 'left': fieldName == 'city' + 'half': fieldName === 'city' || fieldName === 'postcode', + 'left': fieldName === 'city' }); - inputFields.push(( - - )) - }) + function showsErrorFor(field) { + if (fieldName === 'city') { + return false; + } + + return field === fieldName || fieldName === 'postcode' && field === 'city'; + } + + return ( + + + { + visibleErrors + .filter(({ field }) => showsErrorFor(field)) + .map(getErrorMessage) + + } + + ); + }); return (
-
- { feedbackMessages } - { inputFields } - - - + + {inputFields} + {this.state.error && ( +
+ Jotain meni pieleen! Ota yhteyttä info@koodiklinikka.fi +
+ )} + + +
- ) + ); } }); diff --git a/src/js/components/stripeCheckout.js b/src/js/components/stripeCheckout.js deleted file mode 100644 index 98da3fb..0000000 --- a/src/js/components/stripeCheckout.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict'; - -var request = require('axios'); -var React = require('react'); -var classSet = require('classnames'); -import StripeCheckout from 'react-stripe-checkout'; - -var api = require('../api'); -var config = require('../../config.js')(); - -module.exports = React.createClass({ - getInitialState() { - return { - error: null, - sending: false - }; - }, - - onSubmit(token) { - this.setState({ - error: null, - sending: true - }); - - request.post(api('membership'), { - userInfo: this.props.userInfo, - stripeToken: token.id - }) - .then(() => { - this.setState({ - sending: false - }); - this.props.onPaymentSuccess(); - }) - .catch((e) => { - this.setState({ - error: e, - sending: false - }); - }); - }, - - render() { - if (this.state.error) { - return

Virhe maksaessa! Ota yhteyttä info@koodiklinikka.fi

- } else if (this.state.sending) { - return Odota hetki... - } else { - return ( - - ) - } - } -});