import pick from "lodash/pick"; import request from "axios"; import React from "react"; import classSet from "classnames"; import api from "../api"; import Loader from "../Loader"; const 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" }, }; const mailValidateRe = /^(([^<>()[\]\\.,;:\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,}))$/; function validateEmail(email) { return mailValidateRe.test(email); } const fieldNames = ["name", "email", "handle", "address", "postcode", "city"]; function getUserInfo(state) { return pick(state, fieldNames); } export default class MembershipInfoForm extends React.Component { state = { address: "", city: "", email: "", handle: "", name: "", postcode: "", sending: false, pristineFields: fieldNames, }; onSubmit = async () => { this.setState({ sending: true, error: null, }); try { await request.post(api("membership"), { userInfo: getUserInfo(this.state), }); this.setState({ sending: false }); this.props.onSignupSuccess(); } catch (err) { this.setState({ error: err, sending: false }); } }; onChange = e => { const 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: [], }); }; getDataErrors = () => { const foundErrors = []; fieldNames.forEach(fieldName => { if (!this.state[fieldName]) { foundErrors.push({ field: fieldName, type: "missing" }); } }); if (this.state.email && !validateEmail(this.state.email)) { foundErrors.push({ field: "email", type: "invalid" }); } return foundErrors; }; render() { const inputErrors = this.getDataErrors(); const formClasses = classSet({ form: true, "membership-form": true, "has-error": inputErrors.length !== 0 || this.state.error, sending: this.state.sending, }); function getErrorMessage(err) { let feedbackText; if (err.type === "missing") { feedbackText = `${fieldNameTranslations[err.field].fi} on pakollinen.`; } else if (err.type === "invalid") { feedbackText = `${fieldNameTranslations[err.field].fi} on virheellinen.`; } return (