uktrade/directory-components

View on GitHub
directory_components/static/directory_components/js/dit.components.cookie-notice.js

Summary

Maintainability
C
1 day
Test Coverage
var dit = dit || {};
dit.components = dit.components || {};

dit.components.cookieNotice = function() {
  var COOKIE_NOTICE_ID = 'header-cookie-notice';
  var COOKIE_CLOSE_BUTTON_ID = 'dismiss-cookie-notice';
  var COOKIE_DOMAIN = $('#privacyCookieDomain').attr('value');
  var cookiePreferencesName = 'cookie_preferences_set';
  var cookiePreferencesDurationDays = 365;
  var cookiesPolicyName = 'cookies_policy';
  var cookiesPolicyDurationDays = 365;
  var bannerClassName = '.cookie-notice';
  var acceptButtonClassName = '.button-accept';

  function setCookie (name, value, options) {
    if (typeof options === 'undefined') {
      options = {};
    }
    var cookieString = name + '=' + value + '; domain=' + COOKIE_DOMAIN + ';path=/;';
    if (options.days) {
      var date = new Date();
      date.setTime(date.getTime() + options.days * 24 * 60 * 60 * 1000);
      cookieString = cookieString + '; expires=' + date.toGMTString();
    }
    if (document.location.protocol === 'https:') {
      cookieString = cookieString + '; Secure';
    }
    document.cookie = cookieString;
  }

  function getCookie (name) {
    var nameEQ = name + '=';
    var cookies = document.cookie.split(';');
    for (var i = 0, len = cookies.length; i < len; i++) {
      var cookie = cookies[i];
      while (cookie.charAt(0) === ' ') {
        cookie = cookie.substring(1, cookie.length);
      }
      if (cookie.indexOf(nameEQ) === 0) {
        return decodeURIComponent(cookie.substring(nameEQ.length));
      }
    }
    return null;
  }

  function getDefaultPolicy () {
    return {
      essential: true,
      settings: false,
      usage: false,
      campaigns: false
    };
  }

  function getPolicyOrDefault () {
    var cookie = getCookie(cookiesPolicyName);
    var policy = getDefaultPolicy();
    if (!cookie) return policy;

    try {
      var parsed = JSON.parse(cookie);

      policy.campaigns = parsed.campaigns || false;
      policy.usage = parsed.usage || false;
      policy.settings = parsed.settings || false;

    } catch (e) {
      return policy;
    }

    return policy;

  }

  function createPoliciesCookie (settings, usage, campaigns) {
    var policy = getDefaultPolicy();
    policy.settings = settings || false;
    policy.usage = usage || false;
    policy.campaigns = campaigns || false;
    var json = JSON.stringify(policy);
    setCookie(cookiesPolicyName, json, { days: cookiesPolicyDurationDays });
    return policy;
  }

  function hideCookieBanner (className) {
    var banner = document.querySelectorAll(className)[0];
    banner.classList.remove('block', 'confirmation-message');
  }

  function displayCookieBannerAcceptAll () {
    var banner = document.querySelectorAll(bannerClassName)[0];
    banner.classList.add('confirmation-message');

    var hideButton = document.querySelectorAll('.cookie-close')[0];

    hideButton.addEventListener('click', function (e) {
      e.preventDefault();
      hideCookieBanner(bannerClassName);
      }, false);

    hideButton.addEventListener('keydown', function(e) {
      if(e.which === 13 || e.which === 32) {
        hideCookieBanner(bannerClassName);
      }
    });
  }

  function displayCookieBanner () {
    var banner = document.querySelectorAll(bannerClassName)[0];
    banner.classList.add('block');
  }

  function bindAcceptAllCookiesButton (callBack) {
    var button = document.querySelectorAll(acceptButtonClassName)[0];
    button.addEventListener('click', callBack, false);
  }

  function setPreferencesCookie () {
    setCookie(cookiePreferencesName, 'true', { days: cookiePreferencesDurationDays });
  }

  function getPreferencesCookie () {
    return getCookie(cookiePreferencesName);
  }

  function enableCookieBanner () {
    displayCookieBanner();
    bindAcceptAllCookiesButton(function(event) {
      acceptAllCookie(event);
      displayCookieBannerAcceptAll();
    })
  }

  function createCloseButton () {
    var $container = $('.cookie-notice-container');
    var $closeButton = $('<button>', {
      'class': 'cookie-close',
      'aria-controls': COOKIE_NOTICE_ID,
      'aria-label': 'Close this message',
      id: COOKIE_CLOSE_BUTTON_ID
    });
    $container.prepend($closeButton);
    return $closeButton;
  }

  function acceptAllCookies(event) {
    event.preventDefault();
    createPoliciesCookie(true, true, true);
    setPreferencesCookie();
    return false;
  }

  function acceptAllCookiesAndShowSuccess(event) {
    acceptAllCookies(event)
    createCloseButton()
    displayCookieBannerAcceptAll()
    displayCookieBanner()
  }

  function init (cookiesPolicyUrl) {
    var preferenceCookie = getPreferencesCookie();
    var isCookiesPage = document.URL.indexOf(cookiesPolicyUrl) !== -1;

    if ((!preferenceCookie) && !isCookiesPage) {
      enableCookieBanner();
      createCloseButton();
    }
  }

  return {
    init: init,
    getPolicyOrDefault: getPolicyOrDefault,
    createPoliciesCookie: createPoliciesCookie,
    setPreferencesCookie: setPreferencesCookie,
    acceptAllCookiesAndShowSuccess: acceptAllCookiesAndShowSuccess,
    getPreferencesCookie: getPreferencesCookie
  };
}();

if (typeof exports !== 'undefined') {
  if (typeof module !== 'undefined' && module.exports) {
    exports = module.exports = dit.components.cookieNotice
  }
}