ArticleTemplates/assets/js/bootstraps/campaign.js (135 lines of code) (raw):
import { initPositionPoller } from 'modules/cards';
import { resetAndCheckForVideos } from 'modules/youtube';
import { initMpuPoller } from 'modules/ads';
import { POST } from 'modules/http';
import { scrollToElement } from 'modules/util';
const endpoint = GU.opts.campaignsUrl;
const confirmationHtml = '<div class="success__container"><div class="success__icon"><svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 32C24.8366 32 32 24.8366 32 16C32 7.16344 24.8366 0 16 0C7.16344 0 0 7.16344 0 16C0 24.8366 7.16344 32 16 32ZM13.1636 19.435L9.53052 15.9642L8.25228 17.2425L12.5856 23.3091H13.3114L25.2403 10.9631L23.9273 9.68294L13.1636 19.435Z" fill="#22874D" /></svg></div><div class="success__header">Thank you!</div><div class="success__body">Your story has been submitted successfully. One of our journalists will be in touch if we wish to take your submission further.</div></div>';
const pageId = document.body.dataset.pageId;
function init() {
var campaign = document.querySelector('.campaign--snippet');
if (campaign) {
initCampaign(campaign);
}
}
function readFile(file, campaign, form) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
setTimeout(reject, 30000);
reader.addEventListener('load', () => {
const fileAsBase64 = reader.result
.toString()
.split(';base64,')[1];
// remove data:*/*;base64, from the start of the base64 string
resolve(fileAsBase64);
}
);
reader.addEventListener('error', () => {
reject();
});
reader.readAsDataURL(file);
})
}
function initCampaign(campaign) {
if (!navigator.onLine) {
displayOfflineMessage(campaign);
}
campaign.addEventListener('toggle', function() {
resetAndCheckForVideos();
initPositionPoller();
initMpuPoller(0);
});
window.addEventListener('online', hideOfflineMessage.bind(null, campaign));
window.addEventListener('offline', displayOfflineMessage.bind(null, campaign));
let form = campaign.querySelector('form');
let promises = [];
let keys = [];
form.addEventListener('submit', function (e) {
displayWaiting(form);
e.preventDefault();
var data = Array.from(form.elements).reduce(function (o, e) {
if (e.type === 'checkbox') {
if (e.checked) {
o[e.name] = o[e.name] ? o[e.name] + '\n' + e.value : e.value;
}
} else if (e.type === 'file' && e.files.length) {
const filePromise = readFile(e.files[0], campaign, form);
promises.push(filePromise);
keys.push(e.name);
o[e.name] = filePromise;
} else if (e.type === 'hidden' && e.name !== "formId") {
o[e.name] = pageId;
} else if (e.value) {
o[e.name] = e.value;
}
return o;
}, {});
Promise.all(promises).then(results => {
results.map((result, index) => {
data[keys[index]] = result;
})
submit(data, campaign, form);
}).catch(() => {
displayFileError(campaign, form);
})
});
}
function submit(data, campaign, form) {
hideError();
const onLoadCallout = displayConfirmation.bind(null, campaign, form);
const onErrorCallout = displayError.bind(null, campaign, form);
POST(endpoint, onLoadCallout, onErrorCallout, JSON.stringify(data))
}
function displayOfflineMessage(campaign) {
campaign.insertAdjacentHTML('afterbegin', '<p class="campaign__offline">You seem to have no connection to the Internet. You won\'t be able to send us anything until you have one.</p>');
}
function hideOfflineMessage(campaign) {
if (campaign.firstElementChild.className === 'campaign__offline') {
campaign.removeChild(campaign.firstElementChild);
}
}
function displayConfirmation(campaign, form) {
form.innerHTML = confirmationHtml
scrollToElement(campaign);
resetAndCheckForVideos();
initPositionPoller();
initMpuPoller(0);
}
function displayError(campaign, form) {
const formError = document.querySelector('.js-form-error');
if (formError) {
formError.style.display = 'block';
}
enableButton(form);
}
function displayFileError(campaign, form) {
const fileError = document.querySelector('.js-file-error');
if (fileError) {
fileError.style.display = 'block';
}
enableButton(form);
}
function hideError() {
const formError = document.querySelector('.js-form-error');
const fileError = document.querySelector('.js-file-error');
if (formError) {
formError.style.display = 'none';
}
if (fileError) {
fileError.style.display = 'none';
}
}
function displayWaiting(form) {
var button = form.querySelector('.form_submit button');
button.textContent = 'Sending...';
disableButton(form);
}
function disableButton(form) {
var button = form.querySelector('button');
button.disabled = true;
}
function enableButton(form) {
var button = form.querySelector('button');
button.disabled = false;
button.textContent = 'Share with the Guardian';
}
export { init, initCampaign };