{"version":3,"file":"tracker-0f2f195b.js","sources":["../../../app/javascript/analytics/OmniTracker/TrackingComponent.ts","../../../app/javascript/analytics/OmniTracker/TrackingIdProvider.ts","../../../app/javascript/shared/util/ArrayUtils.ts","../../../app/javascript/analytics/OmniTracker/index.ts","../../../app/javascript/analytics/tracker.ts"],"sourcesContent":["import { FunctionComponent } from 'react'\n\nconst DEFAULT_EXPORT_NAME = '_default'\n\nexport type TrackingComponent = string | FunctionComponent\n\nexport function componentNameFrom(component: TrackingComponent): string {\n const name = typeof component === 'string' ? component : (component.displayName || component.name)\n if (name.trim().length === 0 || name === DEFAULT_EXPORT_NAME) {\n throw new Error(`Invalid component name supplied: ${name}`)\n }\n\n return name\n}\n","import { componentNameFrom, TrackingComponent } from 'analytics/OmniTracker/TrackingComponent'\n\nexport interface TrackingIdProvider {\n /**\n * Generates the ID of an input field. This can be anything that conceptually is related to user\n * input - not just HTML `` or `\n * ```\n *\n * @param component The component the field is located within\n * @param fieldName The name of the field, such as `title`, `comment` or `slotType`\n * @return The resulting ID to be used on the element.\n */\n inputId(component: TrackingComponent, fieldName: string): string\n\n /**\n * Generates the ID of an action element.\n *\n * This can be a `\n * ```\n *\n * @param component The component the element is located within\n * @param action The action this element performs when clicked by the user.\n * Such as `next`, `submit`, `cancel`, `back`, ...\n * @return The resulting ID to be used on the element.\n */\n actionId(component: TrackingComponent, action: string): string\n}\n\nexport default class BaseTrackingIdProvider implements TrackingIdProvider {\n /**\n * Generates the ID of an input field. This can be anything that conceptually is related to user\n * input - not just HTML `` or `\n * ```\n *\n * @param component The component the field is located within\n * @param fieldName The name of the field, such as `title`, `comment` or `slotType`\n * @return The resulting ID to be used on the element.\n */\n inputId(component: TrackingComponent, fieldName: string): string {\n return `${componentNameFrom(component)}_${fieldName}`\n }\n\n /**\n * Generates the ID of an action element.\n *\n * This can be a `\n * ```\n *\n * @param component The component the element is located within\n * @param action The action this element performs when clicked by the user.\n * Such as `next`, `submit`, `cancel`, `back`, ...\n * @return The resulting ID to be used on the element.\n */\n actionId(component: TrackingComponent, action: string): string {\n return `${componentNameFrom(component)}_${action}`\n }\n}\n","import { Identified, Optional, requireNotNull } from 'shared/util/types.util'\nimport { isEmpty } from 'lodash'\n\nexport function filterMap(array: T[], mapper: (val: T, index: number) => Optional): R[] {\n return filterNullAndUndefined(array.map(mapper))\n}\n\nexport function findMapped(array: T[], mapper: (val: T, index: number) => Optional): R | undefined {\n for (let i = 0; i < array.length; i += 1) {\n const result = mapper(array[i], i)\n if (result != null) {\n return result\n }\n }\n return undefined\n}\n\nexport function filterNullAndUndefined(array: Optional[]): T[] {\n return array.filter((val) => val != null) as T[]\n}\n\nexport function findRequired(array: T[], predicate: (val: T) => boolean): T {\n return requireNotNull(array.find(predicate), 'Could not find required element')\n}\n\nexport function firstIfOneElement(array: T[]): T | undefined {\n return array.length === 1 ? array[0] : undefined\n}\n\nexport function moveItemInArray(array: T[], from: number, to: number): T[] {\n const result = [...array]\n const startIndex = to < 0 ? result.length + to : to\n const item = result.splice(from, 1)[0]\n result.splice(startIndex, 0, item)\n return result\n}\n\nexport function isArray(items: Optional | boolean): items is T[] {\n return Array.isArray(items)\n}\n\nexport function isNotEmpty(arr: T[] | undefined | null): arr is T[] {\n return !isEmpty(arr)\n}\n\nexport function arrayWithout(items: T[], item: T): T[] {\n return items.filter((i) => i !== item)\n}\n\nexport function reverseArray(items: T[]): T[] {\n return items.map((_, index) => items[items.length - 1 - index])\n}\n\nexport function idsToStringArray(items: T[]): string[] {\n return items.map(({ id }) => id.toString())\n}\n\nexport function wrapArray(item: T | T[]): T[] {\n return Array.isArray(item) ? item : [item]\n}\n","import Tracker, { TrackerWithAutoTracking } from 'analytics/OmniTracker/Tracker'\nimport { PlainObject } from 'shared/util/types.util'\nimport { pick, omitBy, isNil } from 'lodash'\nimport { componentNameFrom, TrackingComponent } from 'analytics/OmniTracker/TrackingComponent'\nimport BaseTrackingIdProvider, { TrackingIdProvider } from 'analytics/OmniTracker/TrackingIdProvider'\nimport { filterMap } from 'shared/util/ArrayUtils'\n\nexport enum AppName {\n CALENDAR = 'Calendar',\n OPERATOR = 'Operator',\n CONTRIBUTOR = 'Contributor',\n INSIGHTS = 'Insights',\n REPORTING = 'Reporting',\n CHECK_IN = 'Check-In',\n GENERAL_BOOKING_FLOW = 'ExternalBooking_General',\n ORDER_MANAGEMENT = 'OrderManagement',\n PARTNER_MANAGEMENT = 'Partner_Management',\n COMPANY_USER_MANAGEMENT = 'Company_User_Management',\n SETTINGS = 'Settings',\n SITE_PROFILE = 'Site_Profile',\n EMPTIES = 'Empties',\n}\n\nexport interface TrackingEvent {\n /**\n * An UpperCamelCase name of the object involved in the event. Technically, this refers to models or DTOs.\n *\n * E.g. `AvailableSlot`, `Advice` or `Slot`\n */\n object?: string\n\n /**\n * The action to record. This can either be a verb describing the action (e.g. `create`, `update`, `cancel`)\n * or the result of an action (e.g. `not found` or `success`)\n */\n action?: string\n\n /**\n * The react component emitting the event. UpperCamelCase name.\n */\n component?: TrackingComponent\n\n /**\n * The app (i.e. entry point) emitting the event.\n */\n app?: AppName\n\n /**\n * Whether the event was triggered automatically (via generic click tracking)\n * vs if it was generated manually.\n */\n automated?: boolean\n\n /**\n * Any custom data associated with the event.\n */\n payload?: PlainObject\n}\n\nexport type FixedAppTrackingEvent = Omit\n\ninterface BaseTracker {\n /**\n * Terminates the previous session and starts a new one.\n */\n resetSession(): void\n}\n\nexport interface FixedAppTracker extends TrackingIdProvider, BaseTracker {\n /**\n * Creates a new tracker that is associated with the given component. The `component` argument can thus\n * be omitted from method calls on this object.\n * @param component The component to set\n */\n forComponent(component: TrackingComponent): FixedComponentTracker\n\n trackEvent(event: FixedAppTrackingEvent): void\n}\n\nexport type FixedComponentTrackingEvent = Omit\n\n/**\n * A tracker that is tied to both a app and a component name and is thus easier to use\n */\nexport interface FixedComponentTracker extends BaseTracker {\n readonly componentName: string\n\n /**\n * Shorthand for tracking an event.\n * @param object The object name involved in the event. See {@link TrackingEvent.object}\n * @param action The action to be tracked. See {@link TrackingEvent.action}\n * @param payload Optional custom data to be associated with the event. See {@link TrackingEvent.payload}\n */\n track(object: string, action: string, payload?: object): void\n\n trackEvent(event: FixedComponentTrackingEvent): void\n\n /**\n * Tracks a page view event.\n */\n trackView(): void\n\n /**\n * Same as {@link OmniTracker.inputId}, but without the need to specify the component explicitly.\n * @param fieldName The name of the field to generate the ID of\n */\n inputId(fieldName: string): string\n\n /**\n * Same as {@link OmniTracker.actionId}, but without the need to specify the component explicitly.\n * @param action The action to be executed when the user interacts with the element\n */\n actionId(action: string): string\n\n /**\n * Creates a new FixedComponentTracker that appends the given component to the existing\n * components that are tracked.\n * @param component The component to add\n */\n forSubComponent(component: TrackingComponent): FixedComponentTracker\n}\n\n/**\n * Acts as an aggregate over many tracking technologies. Provides a tracking-technology-agnostic\n * interface for tracking user interactions within our app.\n */\nexport default class OmniTracker extends BaseTrackingIdProvider implements BaseTracker {\n private static FixedAppTracker = class extends BaseTrackingIdProvider implements FixedAppTracker {\n private readonly parent: OmniTracker\n\n private readonly appName: AppName\n\n constructor(parent: OmniTracker, appName: AppName) {\n super()\n this.parent = parent\n this.appName = appName\n }\n\n forComponent(component: string) {\n return this.parent.forComponent(this.appName, component)\n }\n\n trackEvent(event: FixedAppTrackingEvent): void {\n this.parent.trackEvent({ app: this.appName, ...event })\n }\n\n resetSession(): void {\n this.parent.resetSession()\n }\n }\n\n private static FixedComponentTracker = class implements FixedComponentTracker {\n private readonly parent: OmniTracker\n\n private readonly appName: AppName\n\n readonly componentName: string\n\n constructor(parent: OmniTracker, appName: AppName, component: TrackingComponent) {\n this.parent = parent\n this.appName = appName\n this.componentName = componentNameFrom(component)\n }\n\n track(object: string, action: string, payload?: PlainObject): void {\n this.trackEvent({ object, action, payload })\n }\n\n trackEvent(event: FixedComponentTrackingEvent): void {\n this.parent.trackEvent({ app: this.appName, component: this.componentName, ...event })\n }\n\n trackView() {\n this.parent.trackView()\n }\n\n resetSession(): void {\n this.parent.resetSession()\n }\n\n inputId(fieldName: string): string {\n return this.parent.inputId(this.componentName, fieldName)\n }\n\n actionId(action: string): string {\n return this.parent.actionId(this.componentName, action)\n }\n\n forSubComponent(component: TrackingComponent): FixedComponentTracker {\n return this.parent.forComponent(this.appName, `${this.componentName}_${component}`)\n }\n }\n\n private trackers: Tracker[] = []\n\n private readonly autoTrackers: TrackerWithAutoTracking[] = []\n\n private globalContext: PlainObject = {}\n\n private globalContextStack: PlainObject[] = []\n\n constructor(trackers: Tracker[] = []) {\n super()\n\n this.trackers = trackers\n this.autoTrackers = filterMap(\n trackers,\n (tracker) => (OmniTracker.isAutoTracker(tracker) ? tracker : null),\n )\n }\n\n private static eventName(object?: string, action?: string) {\n return [object, action].filter((s) => s).join(' ')\n }\n\n private static isAutoTracker(tracker: Tracker): tracker is TrackerWithAutoTracking {\n return 'setAutoTrackingProperties' in tracker\n }\n\n addTracker(tracker: Tracker): void {\n this.trackers.push(tracker)\n if (OmniTracker.isAutoTracker(tracker)) {\n this.autoTrackers.push(tracker)\n }\n }\n\n /**\n * Returns a tracker that is pinned to the given app. The app doesn't need to be specified again\n * for any of it's methods - i.e. the `app` parameter can be omitted on this object.\n * @param app The app name to pin the returned tracker to.\n */\n forApp(app: AppName): FixedAppTracker {\n return new OmniTracker.FixedAppTracker(this, app)\n }\n\n /**\n * Returns a tracker that is pinned to the given app and component. Neither of these parameters\n * need to be specified again for any of it's methods - i.e. the `app` and `component` parameter\n * can be omitted on this object.\n * @param app The app name to pin the returned tracker to.\n * @param component The component to pin the returned tracker to.\n */\n forComponent(app: AppName, component: TrackingComponent): FixedComponentTracker {\n return new OmniTracker.FixedComponentTracker(this, app, component)\n }\n\n /**\n * Tracks the given event using all active tracking systems\n * @param event The event to track\n */\n trackEvent(event: TrackingEvent): void {\n try {\n const name = OmniTracker.eventName(event.object, event.action)\n const payload = {\n ...this.globalContext,\n ...pick(event, 'component', 'app'),\n ...event.payload,\n }\n\n this.forEachTracker((tracker) => {\n // Auto-trackers capture their own events, thus we don't forward our automatic events to them.\n if (!(event.automated && OmniTracker.isAutoTracker(tracker))) {\n tracker.trackEvent(name, omitBy(payload, isNil))\n }\n })\n } catch (e) {\n // Just in case there are any errors... don't crash the app, tracking is always optional.\n console.warn('Error while tracking event in OmniTracker', e)\n }\n }\n\n trackView(): void {\n try {\n this.forEachTracker((tracker) => tracker.trackView(this.globalContext))\n } catch (e) {\n // Just in case there are any errors... don't crash the app, tracking is always optional.\n console.warn('Error while tracking page view in OmniTracker', e)\n }\n }\n\n trackError(error: Error): void {\n try {\n this.forEachTracker((tracker) => tracker.trackError(error))\n } catch (e) {\n // Just in case there are any errors... don't crash the app, tracking is always optional.\n console.warn('Error while tracking an error in OmniTracker', e)\n }\n }\n\n resetSession(): void {\n this.forEachTracker((tracker) => tracker.resetSession())\n }\n\n addGlobalContext(context: PlainObject): void {\n this.globalContextStack.push(context)\n this.updateGlobalContext()\n this.forEachTracker(\n (tracker) => tracker.setAutoTrackingProperties(this.globalContext),\n this.autoTrackers,\n )\n }\n\n removeGlobalContext(context: PlainObject): void {\n const existingIndex = this.globalContextStack.indexOf(context)\n if (existingIndex === -1) {\n console.warn('Trying to remove global context object that does not exist', context)\n return\n }\n\n this.globalContextStack.splice(existingIndex, 1)\n this.updateGlobalContext()\n this.forEachTracker(\n (tracker) => tracker.setAutoTrackingProperties(this.globalContext),\n this.autoTrackers,\n )\n }\n\n private updateGlobalContext() {\n this.globalContext = this.globalContextStack.reduce((acc, context) => ({ ...acc, ...context }), {})\n }\n\n private forEachTracker(\n callback: (tracker: T) => void, trackers: T[] = this.trackers as T[],\n ) {\n trackers.forEach((tracker) => {\n try {\n callback(tracker)\n } catch (e) {\n // Catch any errors that happen while tracking. We don't want to interrupt the user's\n // session just because our tracking might not work.\n\n console.warn(`Failed to run callback on tracker ${tracker.constructor.name}`, e)\n }\n })\n }\n}\n","import OmniTracker from 'analytics/OmniTracker'\nimport singleton from 'shared/util/singleton.util'\n\nexport type {\n TrackingEvent, FixedComponentTracker, FixedComponentTrackingEvent, FixedAppTracker, FixedAppTrackingEvent,\n} from 'analytics/OmniTracker'\nexport { AppName } from 'analytics/OmniTracker'\n\n/**\n * Root tracker object for the frontend. Abstracts away differences between tracking technologies\n * and provides a way to manually track events & generate standardized tracking IDs for buttons &\n * other elements. See {@link OmniTracker} for more info.\n *\n * Typical usage:\n * -------------\n *\n * In a file specific to the current app / entry point (e.g. `my_app/tracker`):\n *\n * ```js\n * import Tracker, { AppName } from 'analytics/tracker'\n *\n * export default Tracker.forApp(AppName.MY_APP)\n * ```\n *\n * In a component file:\n *\n * ```js\n * import Tracker from 'my_app/tracker'\n *\n * // Note that the tracker can (and should) be instantiated outside of the react component\n * const tracker = Tracker.forComponent(MyComponent)\n *\n * function MyComponent() {\n * const onSomethingHappened = useCallback(() => tracker.track('Something', 'happened'), [])\n * return \n * }\n * ```\n */\nconst Tracker = singleton('OmniTracker', () => new OmniTracker())\n\nexport default Tracker\n"],"names":["DEFAULT_EXPORT_NAME","componentNameFrom","component","name","BaseTrackingIdProvider","fieldName","action","filterMap","array","mapper","filterNullAndUndefined","findMapped","i","result","val","findRequired","predicate","requireNotNull","firstIfOneElement","moveItemInArray","from","to","startIndex","item","isArray","items","isNotEmpty","arr","isEmpty","arrayWithout","reverseArray","_","index","wrapArray","AppName","_OmniTracker","trackers","__publicField","tracker","object","s","app","event","payload","pick","omitBy","isNil","e","error","context","existingIndex","acc","callback","parent","appName","OmniTracker","Tracker","singleton"],"mappings":"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"}