150 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (function(){
 | |
| 'use strict';
 | |
| 
 | |
| function validateFormData(data) {
 | |
|   var errors = {}
 | |
|   if(!data.address) {
 | |
|     errors.email = "Please enter an email address.";
 | |
|   } else if(data.address.length > 244) {
 | |
|     errors.email = "Email is too long.<br>" +
 | |
|       "If your email address is really this long, we apologize. <br>" +
 | |
|       "Please email us directly (hello@ppl.family) so we can adjust our form.";
 | |
|   } else if(!/.+@.+\..+/.test(data.address)) {
 | |
|     errors.email = "Please enter a valid email address.";
 | |
|   }
 | |
| 
 | |
|   if(data.comment && data.comment.length > 102400) {
 | |
|     errors.name = "Name is too long. <br>Please use a shorter version of your name.";
 | |
|   }
 | |
| 
 | |
|   if(Object.keys(errors).length) {
 | |
|     return errors;
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| function enableForm(form) {
 | |
|   var elements = form.elements;
 | |
| 
 | |
|   for(var i = 0; i < elements.length; ++i) {
 | |
|     elements[i].removeAttribute("disabled");
 | |
|   }
 | |
| }
 | |
| 
 | |
| function disableForm(form) {
 | |
|   var elements = form.elements;
 | |
| 
 | |
|   for(var i = 0; i < elements.length; ++i) {
 | |
|     elements[i].setAttribute("disabled", "");
 | |
|   }
 | |
| }
 | |
| 
 | |
| function enableEmailForms() {
 | |
|   enableForm(document.querySelector(".js-inline-email-form"));
 | |
| }
 | |
| 
 | |
| function disableEmailForms() {
 | |
|   disableForm(document.querySelector(".js-inline-email-form"));
 | |
| }
 | |
| 
 | |
| function displaySuccess(form) {
 | |
|   var successEle = form.querySelector(".success-message");
 | |
|   if(successEle) {
 | |
|     successEle.classList.remove("js-inactive");
 | |
|   }
 | |
| }
 | |
| function hideSuccess(form){
 | |
|   var successEle = form.querySelector(".success-message");
 | |
|   if(successEle) {
 | |
|     successEle.classList.add("js-inactive");
 | |
|   }
 | |
| }
 | |
| 
 | |
| function displayErrors(form, errors) {
 | |
|   errors = errors || {};
 | |
| 
 | |
|   form.querySelectorAll(".input-error").forEach(function(ele) {
 | |
|     ele.classList.add("js-inactive");
 | |
|   });
 | |
|   form.querySelector(".form-error").classList.add("js-inactive");
 | |
| 
 | |
|   Object.keys(errors).forEach(function(key) {
 | |
|     var errorEle;
 | |
|     if(key === "_form" && errors[key]) {
 | |
|       errorEle = form.querySelector(".form-error");
 | |
|     } else if(errors[key]) {
 | |
|       var query = "." + key + ".input-error";
 | |
|       errorEle = form.querySelector(query);
 | |
|     }
 | |
|     if(!errorEle) return;
 | |
| 
 | |
|     errorEle.innerHTML = errors[key];
 | |
|     errorEle.classList.remove("js-inactive");
 | |
|   });
 | |
| }
 | |
| 
 | |
| function submitFormData(form) {
 | |
|   hideSuccess(form);
 | |
|   var data = new FormData(form);
 | |
| 
 | |
|   var msg = {
 | |
|     address: data.get("email")
 | |
|   , comment: 'telebit: ' + (data.get("name") || '')
 | |
|   };
 | |
| 
 | |
|   var errors = validateFormData(msg);
 | |
|   displayErrors(form, errors);
 | |
|   if(errors) {
 | |
|     console.warn("Form validation failed: ", errors);
 | |
|     return Promise.resolve();
 | |
|   }
 | |
| 
 | |
| 
 | |
|   disableEmailForms();
 | |
| 
 | |
|   return window.fetch('https://api.ppl.family/api/ppl.family/public/list', {
 | |
|     method: 'POST'
 | |
|   , cors: true
 | |
|   , headers: new Headers({ 'Content-Type': 'application/json' })
 | |
|   , body: JSON.stringify(msg)
 | |
|   }).then(function (resp) {
 | |
|     return resp.json();
 | |
|   }).then(function (data) {
 | |
|     enableEmailForms();
 | |
|     if (data.error) {
 | |
|       console.error("Error submitting form: ", data.error);
 | |
|       err = {
 | |
|         "_form": "Couldn't save email. <br>Try again or email hello@ppl.family directly."
 | |
|       };
 | |
|       return displayErrors(form, errors);
 | |
|     }
 | |
|     displaySuccess(form);
 | |
|     console.log("Successfully subscribed!");
 | |
| 
 | |
|     form.reset();
 | |
| 
 | |
|   }, function (err) {
 | |
|     enableEmailForms();
 | |
|     console.error("Error sending form data to server: ", err);
 | |
|     displayErrors(form, {
 | |
|       "_form": "Unable to send the info to the server.<br>" +
 | |
|       "Please try again or email hello@ppl.family directly."
 | |
|     });
 | |
|   });
 | |
| }
 | |
| document.body.addEventListener('submit', function (ev) {
 | |
|   console.log("Caught event!");
 | |
|   function eleMatchesString(ele, selector) {
 | |
|      return ele.matches ? ele.matches(selector) : ele.msMatchesSelector(selector);
 | |
|   }
 | |
|   var form = ev.target;
 | |
|   if (!eleMatchesString(form, '.js-inline-email-form')) {
 | |
|     return;
 | |
|   }
 | |
|   ev.preventDefault();
 | |
|   ev.stopPropagation();
 | |
|   submitFormData(form);
 | |
|   return;
 | |
| });
 | |
| })();
 |