UNPKG

@govuk-pay/pay-js-commons

Version:

Reusable js scripts for GOV.UK Pay Node.js projects

94 lines (92 loc) 3.84 kB
"use strict"; 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 };