index.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import * as eventTracking from '../../infrastructure/event-tracking'
  2. import { debugConsole } from '@/utils/debugging'
  3. function setupEventTracking(el) {
  4. const key = el.getAttribute('event-tracking')
  5. const action = el.getAttribute('event-tracking-action') || key
  6. const label = el.getAttribute('event-tracking-label') || ''
  7. const gaCategory = el.getAttribute('event-tracking-ga')
  8. const sendMB = el.getAttribute('event-tracking-mb')
  9. const trigger = el.getAttribute('event-tracking-trigger')
  10. const sendOnce = el.getAttribute('event-tracking-send-once')
  11. const element = el.getAttribute('event-tracking-element')
  12. function submit() {
  13. if (key === 'menu-expand') {
  14. const expanded = el.getAttribute('aria-expanded')
  15. if (expanded === 'true') {
  16. // skip if the menu is already expanded
  17. return
  18. }
  19. }
  20. const segmentation = JSON.parse(
  21. el.getAttribute('event-segmentation') || '{}'
  22. )
  23. segmentation.page = window.location.pathname
  24. if (element === 'checkbox') {
  25. segmentation.checkbox = el.checked ? 'checked' : 'unchecked'
  26. } else if (element === 'select') {
  27. segmentation.selectValue = el.value
  28. }
  29. if (sendMB) {
  30. if (sendOnce) {
  31. eventTracking.sendMBOnce(key, segmentation)
  32. } else {
  33. eventTracking.sendMB(key, segmentation)
  34. }
  35. }
  36. if (gaCategory) {
  37. if (sendOnce) {
  38. eventTracking.sendOnce(gaCategory, action, label)
  39. } else {
  40. eventTracking.send(gaCategory, action, label)
  41. }
  42. }
  43. }
  44. let timer
  45. let timeoutAmt = 500
  46. switch (trigger) {
  47. case 'click':
  48. el.addEventListener('click', () => submit())
  49. break
  50. case 'hover':
  51. if (el.getAttribute('event-hover-amt')) {
  52. timeoutAmt = parseInt(el.getAttribute('event-hover-amt'), 10)
  53. }
  54. el.addEventListener('mouseenter', () => {
  55. timer = setTimeout(() => submit(), timeoutAmt)
  56. })
  57. el.addEventListener('mouseleave', () => clearTimeout(timer))
  58. break
  59. default:
  60. debugConsole.error(`unsupported event tracking action: ${trigger}`)
  61. }
  62. }
  63. document.querySelectorAll('[event-tracking]').forEach(setupEventTracking)