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: 'ppl: ' + (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; | ||
|  | }); | ||
|  | })(); |