|
| 1 | +import { AnalyticsPageObject, AnalyticsTag } from './AnalyticsPage'; |
| 2 | + |
| 3 | +export enum AnalyticsEvents { |
| 4 | + CLICK = 'click', |
| 5 | + DROPDOWN_CHANGE = 'dropdown_change', |
| 6 | + SWITCH_ON = 'switch_on', |
| 7 | + SWITCH_OFF = 'switch_off', |
| 8 | + DROPDOWN_SELECT = 'dropdown_select', |
| 9 | + CHECKBOX_ON = 'checkbox_on', |
| 10 | + CHECKBOX_OFF = 'checkbox_off', |
| 11 | + RADIOBUTTON_SELECT = 'radiobutton_select', |
| 12 | + DATEPICKER_CHANGE = 'datepicker_date_change', |
| 13 | + DAYPICKER_CHANGE = 'daypicker_date_change', |
| 14 | + KEYBOARD_EVENT = 'keyboard_event', |
| 15 | + FOCUS_OUT = 'focus_out', |
| 16 | +} |
| 17 | + |
| 18 | +export enum AnalyticsComponentType { |
| 19 | + BUTTON = 'button', |
| 20 | + DROPDOWN = 'dropdown', |
| 21 | + SWITCH = 'switch', |
| 22 | + PAGINATION = 'pagination', |
| 23 | + ICON = 'icon', |
| 24 | + LINK = 'link', |
| 25 | + CHECKBOX = 'checkbox', |
| 26 | + DATEPICKER = 'datepicker', |
| 27 | + DAYPICKER = 'daypicker', |
| 28 | + DATEPICKER_PRESET = 'datepicker_preset', |
| 29 | + TAB = 'tab', |
| 30 | + ACCORDION = 'accordion', |
| 31 | + MODAL = 'modal', |
| 32 | + INPUT = 'input', |
| 33 | + TEXTAREA = 'textarea', |
| 34 | + TAB_NAVIGATION = 'tab_navigation', |
| 35 | + RADIO = 'radio', |
| 36 | +} |
| 37 | + |
| 38 | +export interface TrackEvent { |
| 39 | + event: AnalyticsEvents; |
| 40 | + type: AnalyticsComponentType; |
| 41 | + tag: AnalyticsTag; |
| 42 | + pages: AnalyticsPageObject[]; |
| 43 | + merchantId: number; |
| 44 | + ip: string; |
| 45 | +} |
| 46 | + |
| 47 | +export type AnalyticsHandlerFn = (event: TrackEvent) => void; |
| 48 | + |
| 49 | +export default class AnalyticsTracker { |
| 50 | + handlers: AnalyticsHandlerFn[] = []; |
| 51 | + |
| 52 | + registerHandler = (fn: AnalyticsHandlerFn) => { |
| 53 | + this.handlers.push(fn); |
| 54 | + |
| 55 | + return () => { |
| 56 | + this.unregisterHandler(fn); |
| 57 | + }; |
| 58 | + }; |
| 59 | + |
| 60 | + unregisterHandler = (fn: AnalyticsHandlerFn) => { |
| 61 | + this.handlers = this.handlers.filter((handler) => handler !== fn); |
| 62 | + }; |
| 63 | + |
| 64 | + track = (event: TrackEvent) => { |
| 65 | + this.handlers.forEach((handler) => handler(event)); |
| 66 | + }; |
| 67 | +} |
0 commit comments