{"version":3,"file":"js/6136-091d1f1e994767cac22c.js","mappings":"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","sources":["webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/base_controller.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/custom_events/index.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/custom_events/swipe_event.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/extractors/index.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/extractors/link_extractor.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/extractors/text_extractor.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/interactions_controller.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/rules/index.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/rules/vertical_scroll_progress_rule.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/rules/video_progress_rule.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/utils/config_manager.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/utils/custom_event_manager.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/utils/event_listener_manager.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/utils/index.ts","webpack://bbc-maestro/./app/webpack/packs/controllers/analytics/utils/interaction_handler.ts"],"sourcesContent":["import { Controller } from \"@hotwired/stimulus\";\n\ninterface AnalyticsProperties {\n [key: string]: unknown;\n}\n\nexport default class extends Controller {\n declare readonly nameValue: string;\n declare readonly propertiesValue: Record;\n\n static values = {\n name: String,\n properties: Object,\n };\n\n trackEvent(\n eventName: string = this.nameValue,\n properties: AnalyticsProperties = {}\n ): void {\n if (!window.analytics) return;\n\n const globalProperties = window.analyticsProperties || {};\n const mergedProperties = {\n ...globalProperties,\n ...this.propertiesValue,\n ...properties,\n };\n\n window.analytics.track(eventName, mergedProperties);\n }\n}\n","import SwipeEvent from \"./swipe_event\";\nimport { CustomEvent } from \"../types\";\n\nexport const EventMap: Record = {\n swipe: new SwipeEvent(),\n};\n","import { CustomEvent as Event } from \"../types\";\nimport interact from \"interactjs\";\n\nexport default class SwipeEvent implements Event {\n addListener(target: string | HTMLElement): void {\n interact(target).draggable({\n listeners: {\n end: (event) => this.handleSwipe(event),\n },\n });\n }\n\n private handleSwipe(event: Interact.DragEvent): void {\n const { target, swipe } = event;\n\n if (!swipe) return;\n\n const { left, right, velocity } = swipe;\n const direction = left ? \"left\" : \"right\";\n\n if (left || right) {\n const swipedEvent = new CustomEvent(\"swipe\", {\n bubbles: true,\n detail: { direction, velocity },\n });\n\n target.dispatchEvent(swipedEvent);\n }\n }\n}\n","import TextExtractor from \"./text_extractor\";\nimport LinkExtractor from \"./link_extractor\";\nimport { Extractor } from \"./../types\";\n\nexport const ExtractorMap: Record = {\n text: new TextExtractor(),\n link: new LinkExtractor(),\n};\n","import { Extractor } from \"./../types\";\n\nexport default class LinkExtractor implements Extractor {\n extract(target: HTMLElement): Record {\n const anchor = target.closest(\"a\");\n if (anchor instanceof HTMLAnchorElement) {\n return {\n href: anchor.href,\n text: anchor.textContent?.trim(),\n };\n }\n\n return {};\n }\n}\n","import { Extractor } from \"./../types\";\n\nexport default class TextExtractor implements Extractor {\n extract(target: HTMLElement): Record {\n return {\n text: target.textContent?.trim(),\n };\n }\n}\n","import BaseAnalyticsController from \"./base_controller\";\nimport ConfigManager from \"./utils/config_manager\";\nimport EventListenerManager from \"./utils/event_listener_manager\";\nimport InteractionHandler from \"./utils/interaction_handler\";\nimport { createDebouncedFunction } from \"./utils\";\nimport { Config, InteractionConfig } from \"./types\";\nimport CustomEventManager from \"./utils/custom_event_manager\";\nimport createRule from \"./rules\";\n\nconst defaultConfig: Config = {\n prefix: null,\n debounce: true,\n once: false,\n interactions: [],\n};\n\nexport default class extends BaseAnalyticsController {\n declare readonly configValue: Config;\n\n static values = {\n config: Object as () => Config,\n };\n\n private readonly debounceDuration = 300;\n private readonly eventManager = new CustomEventManager();\n private readonly eventListenerManager = new EventListenerManager();\n private readonly debouncedTrackEvent = createDebouncedFunction(\n (trackEvent: () => void) => trackEvent(),\n this.debounceDuration\n );\n\n private configManager: ConfigManager;\n private interactionHandler: InteractionHandler;\n\n get config(): Config {\n return this.configManager.mergedConfig;\n }\n\n constructor(context) {\n super(context);\n\n this.configManager = new ConfigManager(defaultConfig, this.configValue);\n const { prefix } = this.configManager.mergedConfig;\n this.interactionHandler = new InteractionHandler(\n prefix || \"\",\n this.trackEvent.bind(this)\n );\n }\n\n connect(): void {\n try {\n this.setupInteractions();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n\n private setupInteractions(): void {\n const { interactions } = this.config;\n\n this.eventManager.initializeEvents(interactions);\n\n interactions.forEach((interaction) => {\n const { once } = interaction;\n interaction.once = once ?? this.config.once;\n\n this.eventListenerManager.addEventListener(\n this.element,\n interaction,\n (event: Event) =>\n this.eventListenerManager.processEvent(\n interaction,\n event,\n this.trackInteraction.bind(this)\n )\n );\n });\n }\n\n private trackInteraction(event: Event, interaction: InteractionConfig): void {\n const { debounce } = this.config;\n const { name, rule: ruleConfig, once } = interaction;\n\n try {\n if (ruleConfig) {\n const { name: ruleName, value: ruleValue } = ruleConfig;\n if (ruleName) {\n const rule = createRule(ruleName, event);\n if (!rule || !rule.validate(ruleValue)) return;\n }\n }\n\n const trackEvent = () =>\n this.interactionHandler.handleInteraction(event, interaction);\n\n if (once)\n this.eventListenerManager.removeEventListeners(this.element, name);\n\n debounce ? this.debouncedTrackEvent(trackEvent) : trackEvent();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","import VideoProgressRule from \"./video_progress_rule\";\nimport VerticalScrollProgress from \"./vertical_scroll_progress_rule\";\nimport { Rule } from \"./../types\";\n\nexport default function create(name: string, event: Event): Rule {\n return {\n verticalScrollProgress: new VerticalScrollProgress(event),\n videoProgress: new VideoProgressRule(event),\n }[name];\n}\n","import { Rule } from \"./../types\";\n\nexport default class VerticalScrollProgressRule implements Rule {\n private event: Event;\n\n constructor(event: Event) {\n this.event = event;\n }\n\n validate(value: number): boolean {\n const target = this.event.target as HTMLElement;\n const progress = this.calculateScrollProgress(target);\n\n return progress >= value;\n }\n\n private calculateScrollProgress(container: HTMLElement | Document): number {\n let scrollTop = 0;\n let scrollHeight = 0;\n let clientHeight = 0;\n\n if (\n container === document ||\n container === document.documentElement ||\n container === document.body\n ) {\n scrollTop = window.scrollY;\n scrollHeight = document.documentElement.scrollHeight;\n clientHeight = document.documentElement.clientHeight;\n } else if (container instanceof HTMLElement) {\n scrollTop = container.scrollTop;\n scrollHeight = container.scrollHeight;\n clientHeight = container.clientHeight;\n }\n\n return Math.min(1, scrollTop / (scrollHeight - clientHeight));\n }\n}\n","import { Rule } from \"./../types\";\n\nexport default class VideoProgressRule implements Rule {\n private event: Event;\n\n constructor(event: Event) {\n this.event = event;\n }\n\n validate(value: number): boolean {\n const target = this.event.target as HTMLVideoElement;\n const { currentTime, duration, tagName } = target;\n const progress = (currentTime / duration) * 100;\n\n if (tagName !== \"VIDEO\" || !duration) {\n return false;\n }\n\n return progress >= value;\n }\n}\n","export default class ConfigManager {\n constructor(private defaultConfig: T, private providedConfig: Partial) {}\n\n get mergedConfig(): T {\n return { ...this.defaultConfig, ...this.providedConfig };\n }\n}\n","import { EventMap } from \"../custom_events\";\nimport { InteractionConfig } from \"../types\";\n\nexport default class CustomEventManager {\n initializeEvents(interactions: InteractionConfig[]): void {\n interactions.forEach(({ type, selector }) => {\n const eventTypes = Array.isArray(type) ? type : [type];\n eventTypes.forEach((eventType) => {\n const listener = EventMap[eventType];\n if (listener) {\n listener.addListener(selector);\n }\n });\n });\n }\n}\n","import { InteractionConfig } from \"../types\";\n\nexport default class EventListenerManager {\n private readonly eventListeners = new Map<\n string,\n Record\n >();\n\n addEventListener(\n element: HTMLElement | Element,\n interaction: { name: string; type: string | string[] },\n handler: (event: Event) => void\n ): void {\n const { name, type } = interaction;\n const eventTypes = Array.isArray(type) ? type : [type];\n const listeners: Record = {};\n\n eventTypes.forEach((eventType) => {\n const listener = handler;\n element.addEventListener(eventType, listener, {\n passive: true,\n capture: true,\n });\n listeners[eventType] = listener;\n });\n\n this.eventListeners.set(name, listeners);\n }\n\n removeEventListeners(element: HTMLElement | Element, name: string): void {\n const listeners = this.eventListeners.get(name);\n if (!listeners) return;\n\n Object.entries(listeners).forEach(([eventType, listener]) => {\n element.removeEventListener(eventType, listener, {\n capture: true,\n });\n });\n\n this.eventListeners.delete(name);\n }\n\n processEvent(\n interaction: InteractionConfig,\n event: Event,\n callback: (event: Event, interaction: InteractionConfig) => void\n ): void {\n const { selector } = interaction;\n const eventTarget = event.target as HTMLElement;\n const matchingElement = eventTarget.matches(selector)\n ? eventTarget\n : eventTarget.closest(selector);\n\n if (matchingElement) {\n callback(event, interaction);\n }\n }\n}\n","import debounce from \"lodash/debounce\";\n\nexport const createDebouncedFunction = void>(\n fn: T,\n delay: number\n) => debounce(fn, delay);\n","import { ExtractorMap } from \"../extractors\";\n\nexport default class InteractionHandler {\n constructor(\n private prefix: string,\n private trackEvent: (name: string, props: object) => void\n ) {}\n\n handleInteraction(\n event: Event,\n interaction: { extractor: string; name: string; type: string }\n ): void {\n const eventTarget = event.target as HTMLElement;\n const { extractor, name } = interaction;\n\n const extractorInstance = ExtractorMap[extractor];\n const extractedProperties = extractorInstance?.extract(eventTarget) || {};\n\n const properties = {\n interaction_type: event.type,\n ...extractedProperties,\n };\n\n this.trackEvent(`${this.prefix || \"\"} ${name}`, properties);\n }\n}\n"],"names":["_default","_Controller","_inherits","_super","_createSuper","_classCallCheck","apply","arguments","key","value","eventName","length","undefined","this","nameValue","properties","window","analytics","mergedProperties","_objectSpread","analyticsProperties","propertiesValue","track","Controller","values","name","String","Object","EventMap","swipe","SwipeEvent","target","_this","interact","draggable","listeners","end","event","handleSwipe","left","right","velocity","swipedEvent","CustomEvent","bubbles","detail","direction","dispatchEvent","ExtractorMap","text","TextExtractor","link","LinkExtractor","_anchor$textContent","anchor","closest","HTMLAnchorElement","href","textContent","trim","_target$textContent","defaultConfig","prefix","debounce","once","interactions","_BaseAnalyticsControl","context","call","debounceDuration","eventManager","CustomEventManager","eventListenerManager","EventListenerManager","debouncedTrackEvent","createDebouncedFunction","trackEvent","configManager","interactionHandler","ConfigManager","configValue","mergedConfig","InteractionHandler","bind","_assertThisInitialized","get","setupInteractions","error","console","_this2","config","initializeEvents","forEach","interaction","addEventListener","element","processEvent","trackInteraction","_this3","ruleConfig","rule","ruleName","ruleValue","createRule","validate","handleInteraction","removeEventListeners","BaseAnalyticsController","create","verticalScrollProgress","VerticalScrollProgress","videoProgress","VideoProgressRule","VerticalScrollProgressRule","calculateScrollProgress","container","scrollTop","scrollHeight","clientHeight","document","documentElement","body","scrollY","HTMLElement","Math","min","currentTime","duration","tagName","providedConfig","_ref","type","selector","Array","isArray","eventType","listener","addListener","eventListeners","Map","handler","eventTypes","passive","capture","set","entries","_ref2","_slicedToArray","removeEventListener","callback","eventTarget","matches","fn","delay","extractor","extractorInstance","extractedProperties","extract","interaction_type","concat"],"sourceRoot":""}