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 (
- )
+ );
}
});
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
- } else {
- return (
-
- )
- }
- }
-});