UNPKG

digitalmarketplace-frontend

Version:

Digital Marketplace Frontend contains assets and components used in Digital Marketplace projects

229 lines (221 loc) 8.62 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.DigitalMarketplaceFrontend = {})); })(this, (function (exports) { 'use strict'; function assign(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (key === '__proto__') continue; target[key] = source[key]; } } return target; } var defaultConverter = { read: function read(value) { if (value[0] === '"') { value = value.slice(1, -1); } return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent); }, write: function write(value) { return encodeURIComponent(value).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent); } }; function init(converter, defaultAttributes) { function set(name, value, attributes) { if (typeof document === 'undefined') { return; } attributes = assign({}, defaultAttributes, attributes); if (typeof attributes.expires === 'number') { attributes.expires = new Date(Date.now() + attributes.expires * 864e5); } if (attributes.expires) { attributes.expires = attributes.expires.toUTCString(); } name = encodeURIComponent(name).replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent).replace(/[()]/g, escape); var stringifiedAttributes = ''; for (var attributeName in attributes) { if (!attributes[attributeName]) { continue; } stringifiedAttributes += '; ' + attributeName; if (attributes[attributeName] === true) { continue; } stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]; } return document.cookie = name + '=' + converter.write(value, name) + stringifiedAttributes; } function get(name) { if (typeof document === 'undefined' || arguments.length && !name) { return; } var cookies = document.cookie ? document.cookie.split('; ') : []; var jar = {}; for (var i = 0; i < cookies.length; i++) { var parts = cookies[i].split('='); var value = parts.slice(1).join('='); try { var found = decodeURIComponent(parts[0]); if (!(found in jar)) jar[found] = converter.read(value, found); if (name === found) { break; } } catch (_unused) {} } return name ? jar[name] : jar; } return Object.create({ set: set, get: get, remove: function remove(name, attributes) { set(name, '', assign({}, attributes, { expires: -1 })); }, withAttributes: function withAttributes(attributes) { return init(this.converter, assign({}, this.attributes, attributes)); }, withConverter: function withConverter(converter) { return init(assign({}, this.converter, converter), this.attributes); } }, { attributes: { value: Object.freeze(defaultAttributes) }, converter: { value: Object.freeze(converter) } }); } var api = init(defaultConverter, { path: '/' }); var GrantType; (function (GrantType) { GrantType["GRANTED"] = "granted"; GrantType["NOT_GRANTED"] = "not granted"; })(GrantType || (GrantType = {})); const getGrantedText = (state) => state ? GrantType.GRANTED : GrantType.NOT_GRANTED; const updateDataLayer = (cookiePreferences) => { window.dataLayer.push({ event: 'gtm_consent_update', usage_consent: getGrantedText(cookiePreferences.usage), glassbox_consent: getGrantedText(cookiePreferences.glassbox), marketing_consent: GrantType.NOT_GRANTED }); }; const cookieUpdateOptions = [ { cookieName: 'usage', cookiePrefixes: ['_ga', '_gi'] }, { cookieName: 'glassbox', cookiePrefixes: ['_cls'] } ]; const DOMAINS = [ '.marketplace.team', '.digitalmarketplace.service.gov.uk', 'www.applytosupply.digitalmarketplace.service.gov.uk' ]; // When not in production we want to delete cookies in localhost too const getDomains = () => { if (window.location.hostname === 'localhost') { return DOMAINS.concat(['localhost']); } return DOMAINS; }; const getCookiePreferences = () => { const defaultCookieSettings = '{"usage":false,"glassbox":false}'; return JSON.parse(api.get('cookie_preferences_dmp') ?? defaultCookieSettings); }; const setCookiePreferences = (usage) => { const cookiePreferences = getCookiePreferences(); cookiePreferences.usage = usage; cookiePreferences.settings_viewed = true; api.set('cookie_preferences_dmp', JSON.stringify(cookiePreferences), { expires: 365 }); updateDataLayer(cookiePreferences); removeUnwantedCookies(); }; const removeUnwantedCookies = () => { const cookieList = Object.keys(api.get()); const cookiesToRemove = ['digitalmarketplace_cookie_settings_viewed', 'digitalmarketplace_google_analytics_enabled', 'digitalmarketplace_cookie_options_v1', 'dm_cookies_policy']; const cookiePreferences = getCookiePreferences(); const cookiePrefixes = []; cookieUpdateOptions.forEach((cookieUpdateOption) => { if (!cookiePreferences[cookieUpdateOption.cookieName]) cookiePrefixes.push(...cookieUpdateOption.cookiePrefixes); }); for (let i = 0; i < cookieList.length; i++) { const cookieName = cookieList[i]; if (cookiePrefixes.some((cookiePrefix) => cookieName.startsWith(cookiePrefix))) cookiesToRemove.push(cookieName); } getDomains().forEach((domain) => { cookiesToRemove.forEach((cookieName) => { api.remove(cookieName, { path: '/', domain: domain }); }); }); }; class CookieBanner { static moduleName = 'dm-cookie-banner'; $module; $cookieBannerMainContent; $cookieBannerConfirmationContent; $cookieBannerConfirmationMessage; $hideLink; $acceptCookiesLink; $rejectCookiesLink; constructor($module) { this.$module = $module; this.$cookieBannerMainContent = this.$module.find('.dm-cookie-banner__button--main'); this.$cookieBannerConfirmationContent = this.$module.find('.dm-cookie-banner--selection-made'); this.$cookieBannerConfirmationMessage = this.$module.find('.dm-cookie-banner__confirmation-message'); this.$hideLink = this.$module.find('button[data-hide-cookie-banner]'); this.$acceptCookiesLink = this.$module.find('button[data-accept-cookies=true]'); this.$rejectCookiesLink = this.$module.find('button[data-accept-cookies=false]'); } init() { this.$hideLink.on('click', (event) => { this.hideCookieMessage(event); }); this.$acceptCookiesLink.on('click', () => { this.setCookieConsent(true); }); this.$rejectCookiesLink.on('click', () => { this.setCookieConsent(false); }); this.showCookieMessage(); } setCookieConsent(analyticsConsent) { setCookiePreferences(analyticsConsent); this.showConfirmationMessage(analyticsConsent); this.$cookieBannerConfirmationContent.trigger('focus'); } showCookieMessage() { // Show the cookie banner if policy cookie not set const cookiePreferences = getCookiePreferences(); if (this.$module && !cookiePreferences.settings_viewed) { this.$module.css('display', 'block'); } } hideCookieMessage(event) { this.$module.css('display', 'none'); if (event.target) { event.preventDefault(); } } showConfirmationMessage(analyticsConsent) { const messagePrefix = analyticsConsent ? 'You’ve accepted analytics cookies.' : 'You told us not to use analytics cookies.'; this.$cookieBannerMainContent.attr('hidden', 'hidden'); this.$cookieBannerConfirmationMessage.prepend(messagePrefix); this.$cookieBannerConfirmationContent.removeAttr('hidden'); } } exports.CookieBanner = CookieBanner; })); //# sourceMappingURL=cookie-banner.bundle.js.map