190 lines
5.3 KiB
JavaScript
190 lines
5.3 KiB
JavaScript
"use strict";
|
|
|
|
let newsletter_send_all_form;
|
|
let newsletter_send_all_safe_code;
|
|
let newsletter_send_all_input_safe_code_repeat;
|
|
let newsletter_send_all_input_content_name;
|
|
let newsletter_send_all_input_csrf_token;
|
|
let newsletter_send_all_input_submit;
|
|
let newsletter_send_all_feedback;
|
|
let newsletter_send_all_feedback_wait;
|
|
let newsletter_send_all_feedback_success;
|
|
let newsletter_send_all_feedback_failure;
|
|
|
|
let newsletter_send_all_valid_safe_code = false;
|
|
|
|
window.addEventListener("load", function(){
|
|
// STORE ELEMENTS //
|
|
newsletter_send_all_form = document.getElementById("newsletter-send-all-form");
|
|
newsletter_send_all_safe_code = document.getElementById("newsletter-send-all-form-safe-code");
|
|
newsletter_send_all_input_safe_code_repeat = document.getElementById("newsletter-send-all-form-safe-code-repeat");
|
|
newsletter_send_all_input_content_name = document.getElementById("newsletter-send-all-form-content-name");
|
|
newsletter_send_all_input_csrf_token = document.getElementById("newsletter-send-all-form-csrf-token");
|
|
newsletter_send_all_input_submit = document.getElementById("newsletter-send-all-form-submit");
|
|
newsletter_send_all_feedback = document.getElementById("newsletter-send-all-form-feedback");
|
|
newsletter_send_all_feedback_wait = document.getElementById("newsletter-send-all-form-feedback-wait");
|
|
newsletter_send_all_feedback_success = document.getElementById("newsletter-send-all-form-feedback-success");
|
|
newsletter_send_all_feedback_failure = document.getElementById("newsletter-send-all-form-feedback-failure");
|
|
|
|
|
|
// INITIALIZE INPUTS //
|
|
newsletter_send_all_init_safe_code();
|
|
newsletter_send_all_init_safe_code_repeat();
|
|
newsletter_send_all_init_submit();
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
* HELPER: Initialize safe code text.
|
|
*/
|
|
async function newsletter_send_all_init_safe_code(){
|
|
// POPULATE WITH RANDOM NUMBER //
|
|
newsletter_send_all_safe_code.textContent = Math.random().toString().slice(2, 6);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* HELPER: Initialize safe code repeat input.
|
|
*/
|
|
async function newsletter_send_all_init_safe_code_repeat(){
|
|
// REGISTER INPUT HANDLER //
|
|
newsletter_send_all_input_safe_code_repeat.addEventListener("input", newsletter_send_all_update_safe_code_repeat);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* HELPER: Initialize submit button input.
|
|
*/
|
|
async function newsletter_send_all_init_submit(){
|
|
// REGISTER CLICK HANDLER //
|
|
newsletter_send_all_input_submit.addEventListener("click", newsletter_send_all_submit);
|
|
|
|
|
|
// UPDATE STATE //
|
|
newsletter_send_all_update_submit();
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* CALLBACK: Update safe code repeat state.
|
|
*/
|
|
async function newsletter_send_all_update_safe_code_repeat(){
|
|
// VALIDATE INPUT //
|
|
// load values
|
|
let should = newsletter_send_all_safe_code.textContent;
|
|
let is = newsletter_send_all_input_safe_code_repeat.value;
|
|
|
|
// compare
|
|
newsletter_send_all_valid_safe_code = (is === should);
|
|
|
|
|
|
// UPDATE VALIDITY INDICATOR //
|
|
// get element
|
|
let validity_indicator = newsletter_send_all_input_safe_code_repeat.parentElement;
|
|
|
|
// reset state
|
|
validity_indicator.classList.remove("valid", "invalid");
|
|
|
|
// set state
|
|
if(newsletter_send_all_valid_safe_code){
|
|
validity_indicator.classList.add("valid");
|
|
} else {
|
|
validity_indicator.classList.add("invalid");
|
|
}
|
|
|
|
|
|
// UPDATE SUBMIT BUTTON //
|
|
newsletter_send_all_update_submit();
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* HELPER: Update submit button state.
|
|
*/
|
|
async function newsletter_send_all_update_submit(){
|
|
// DISABLE //
|
|
newsletter_send_all_input_submit.classList.add("disabled");
|
|
|
|
|
|
// MAYBE ENABLE //
|
|
if(newsletter_send_all_valid_safe_code){
|
|
newsletter_send_all_input_submit.classList.remove("disabled");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* CALLBACK: Maybe submit the form.
|
|
*/
|
|
async function newsletter_send_all_submit(){
|
|
// MAKE SURE ALL INPUTS ARE VALID //
|
|
if(!newsletter_send_all_valid_safe_code) return;
|
|
|
|
|
|
// SHOW WAIT FEEDBACK //
|
|
newsletter_send_all_feedback.classList.remove("hidden", "gone");
|
|
newsletter_send_all_form.classList.add("hidden");
|
|
newsletter_send_all_feedback_wait.classList.remove("hidden", "gone");
|
|
|
|
|
|
// COLLECT VALUES //
|
|
// content name
|
|
let content_name = newsletter_send_all_input_content_name.value;
|
|
|
|
// csrf token
|
|
let csrf_token = newsletter_send_all_input_csrf_token.value;
|
|
|
|
|
|
// SEND API REQUEST //
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open("POST", "/admin/newsletter/api/send-all", true);
|
|
xhr.setRequestHeader("Content-Type", "application/json");
|
|
xhr.send(JSON.stringify({
|
|
content_name: content_name,
|
|
csrf_token: csrf_token
|
|
}));
|
|
|
|
xhr.onload = function(){
|
|
let success = true;
|
|
|
|
// validate http status code
|
|
if(xhr.status !== 200) success = false;
|
|
|
|
// check response
|
|
let response = null;
|
|
if(success){
|
|
try {
|
|
response = JSON.parse(xhr.response);
|
|
} catch(e){}
|
|
|
|
if(typeof response !== "object") success = false;
|
|
if(success && response === null) success = false;
|
|
if(success && response.success !== true) success = false;
|
|
}
|
|
|
|
// positive feedback
|
|
if(success){
|
|
newsletter_send_all_feedback_wait.classList.add("gone");
|
|
newsletter_send_all_feedback_success.classList.remove("hidden", "gone");
|
|
return;
|
|
}
|
|
|
|
// negative feedback: no member
|
|
if(response !== null && (response.reason ?? "") === "no_member"){
|
|
newsletter_send_all_feedback_wait.classList.add("gone");
|
|
newsletter_send_all_feedback_failure_no_member.classList.remove("hidden", "gone");
|
|
return;
|
|
}
|
|
|
|
// negative feedback: default
|
|
newsletter_send_all_feedback_wait.classList.add("gone");
|
|
newsletter_send_all_feedback_failure.classList.remove("hidden", "gone");
|
|
}
|
|
}
|