@govuk-pay/pay-js-commons
Version:
Reusable js scripts for GOV.UK Pay Node.js projects
94 lines (92 loc) • 3.84 kB
JavaScript
;
var fs = require('fs');
var Cookies = require('js-cookie');
var path = require('path');
var template = fs.readFileSync(path.join(__dirname, 'banner.html'), 'utf-8');
var GOVUK_PAY_ANALYTICS_CONSENT_COOKIE_NAME = 'govuk_pay_cookie_policy';
var ANALYTICS_CONSENT_BANNER_ID = 'pay-cookie-banner';
function hasAnalyticsConsent() {
var cookie = Cookies.get(GOVUK_PAY_ANALYTICS_CONSENT_COOKIE_NAME);
var parsed = cookie && JSON.parse(cookie);
return Boolean(parsed) && parsed.analytics === true;
}
function getCookieDomain() {
var PROD_HOSTNAME = 'payments.service.gov.uk';
if (window.location.hostname.includes(PROD_HOSTNAME)) {
return PROD_HOSTNAME;
}
return undefined;
}
function setAnalyticsCookie() {
var userConsentedToAnalytics = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var cookieValue = JSON.stringify({
analytics: userConsentedToAnalytics
});
var cookieAttributes = {
expires: 365,
path: '/',
domain: getCookieDomain()
};
Cookies.set(GOVUK_PAY_ANALYTICS_CONSENT_COOKIE_NAME, cookieValue, cookieAttributes);
}
function hideBannerIfExists(event) {
var banner = document.querySelector("#".concat(ANALYTICS_CONSENT_BANNER_ID));
if (banner) {
banner.style.display = 'none';
}
if (event.target) {
event.preventDefault();
}
}
function showConfirmationMessage(analyticsConsent) {
var messagePrefix = analyticsConsent ? 'You’ve accepted analytics cookies.' : 'You told us not to use analytics cookies.';
var $cookieBannerMainContent = document.querySelector('.pay-cookie-banner__wrapper');
var $cookieBannerConfirmationMessage = document.querySelector('.pay-cookie-banner__confirmation-message');
$cookieBannerConfirmationMessage.prepend(messagePrefix);
$cookieBannerMainContent.style.display = 'none';
var $cookieBannerConfirmationWrapper = document.querySelector('.pay-cookie-banner__confirmation');
$cookieBannerConfirmationWrapper.style.display = 'block';
}
function acceptAnalyticsCookies() {
setAnalyticsCookie(true);
showConfirmationMessage(true);
}
function rejectAnalyticsCookies() {
setAnalyticsCookie(false);
showConfirmationMessage(false);
}
function createBannerHTMLElement() {
var consentProvidedCallback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
var banner = document.createElement('div');
banner.id = ANALYTICS_CONSENT_BANNER_ID;
banner.innerHTML = template.trim();
var acceptButton = banner.querySelector('button[data-accept-cookies=true]');
var rejectButton = banner.querySelector('button[data-accept-cookies=false]');
if (acceptButton && rejectButton) {
acceptButton.addEventListener('click', acceptAnalyticsCookies);
acceptButton.addEventListener('click', consentProvidedCallback);
rejectButton.addEventListener('click', rejectAnalyticsCookies);
}
var hideCookieBannerLink = banner.querySelector('button[data-hide-cookie-banner]');
if (hideCookieBannerLink) {
hideCookieBannerLink.addEventListener('click', hideBannerIfExists);
}
return banner;
}
/**
* ConsentProvidedCallback: function - generic callback that will be called
* if and only if the user provides consent
*/
function showBannerIfConsentNotSet() {
var consentProvidedCallback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
var consentCookieNotSet = !Cookies.get(GOVUK_PAY_ANALYTICS_CONSENT_COOKIE_NAME);
var banner = document.querySelector("#".concat(ANALYTICS_CONSENT_BANNER_ID));
if (consentCookieNotSet && !banner) {
var _banner = createBannerHTMLElement(consentProvidedCallback);
document.body.prepend(_banner);
}
}
module.exports = {
hasAnalyticsConsent: hasAnalyticsConsent,
showBannerIfConsentNotSet: showBannerIfConsentNotSet
};