plans.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import '../../../marketing'
  2. import '../../../features/plans/group-plan-modal'
  3. import * as eventTracking from '../../../infrastructure/event-tracking'
  4. import getMeta from '../../../utils/meta'
  5. const PLANS_PAGE_LAYOUT_V2 = 'plans-page-layout-v2'
  6. let currentView = 'monthly'
  7. let currentCurrencyCode = getMeta('ol-recommendedCurrency')
  8. function selectView(view) {
  9. document.querySelectorAll('[data-ol-view-tab]').forEach(el => {
  10. if (el.getAttribute('data-ol-view-tab') === view) {
  11. el.classList.add('active')
  12. } else {
  13. el.classList.remove('active')
  14. }
  15. })
  16. document.querySelectorAll('[data-ol-view]').forEach(el => {
  17. el.hidden = el.getAttribute('data-ol-view') !== view
  18. })
  19. updateAnnualSavingBanner(view)
  20. currentView = view
  21. updateLinkTargets()
  22. }
  23. function setUpViewSwitching(liEl) {
  24. const plansPageV2SplitTestVariant =
  25. getMeta('ol-splitTestVariants')?.[PLANS_PAGE_LAYOUT_V2] ?? 'default'
  26. const view = liEl.getAttribute('data-ol-view-tab')
  27. liEl.querySelector('a').addEventListener('click', function (e) {
  28. e.preventDefault()
  29. eventTracking.send('subscription-funnel', 'plans-page', `${view}-prices`)
  30. eventTracking.sendMB('plans-page-toggle', {
  31. button: view,
  32. PLANS_PAGE_LAYOUT_V2: plansPageV2SplitTestVariant,
  33. })
  34. selectView(view)
  35. })
  36. }
  37. function setUpCurrencySwitching(linkEl) {
  38. const currencyCode = linkEl.getAttribute('data-ol-currencyCode-switch')
  39. linkEl.addEventListener('click', function (e) {
  40. e.preventDefault()
  41. document.querySelectorAll('[data-ol-currencyCode]').forEach(el => {
  42. el.hidden = el.getAttribute('data-ol-currencyCode') !== currencyCode
  43. })
  44. currentCurrencyCode = currencyCode
  45. eventTracking.sendMB('plans-page-currency', { currency: currencyCode })
  46. updateLinkTargets()
  47. })
  48. }
  49. function setUpSubscriptionTracking(linkEl) {
  50. const plansPageV2SplitTestVariant =
  51. getMeta('ol-splitTestVariants')?.[PLANS_PAGE_LAYOUT_V2] ?? 'default'
  52. const plan =
  53. linkEl.getAttribute('data-ol-tracking-plan') ||
  54. linkEl.getAttribute('data-ol-start-new-subscription')
  55. const location = linkEl.getAttribute('data-ol-location')
  56. const period = linkEl.getAttribute('data-ol-item-view') || currentView
  57. linkEl.addEventListener('click', function () {
  58. const customLabel = linkEl.getAttribute('data-ol-tracking-label')
  59. const computedLabel = currentView === 'annual' ? `${plan}_annual` : plan
  60. const label = customLabel || computedLabel
  61. eventTracking.sendMB('plans-page-start-trial') // deprecated by plans-page-click
  62. eventTracking.send('subscription-funnel', 'sign_up_now_button', label) // deprecated by plans-page-click
  63. eventTracking.sendMB('plans-page-click', {
  64. button: plan,
  65. location,
  66. period,
  67. PLANS_PAGE_LAYOUT_V2: plansPageV2SplitTestVariant,
  68. })
  69. })
  70. }
  71. export function updateLinkTargets() {
  72. document.querySelectorAll('[data-ol-start-new-subscription]').forEach(el => {
  73. if (el.hasAttribute('data-ol-has-custom-href')) return
  74. const plan = el.getAttribute('data-ol-start-new-subscription')
  75. const view = el.getAttribute('data-ol-item-view') || currentView
  76. const suffix = view === 'annual' ? `-annual` : `_free_trial_7_days`
  77. const planCode = `${plan}${suffix}`
  78. const location = el.getAttribute('data-ol-location')
  79. el.href = `/user/subscription/new?planCode=${planCode}&currency=${currentCurrencyCode}&itm_campaign=plans&itm_content=${location}`
  80. })
  81. }
  82. function updateAnnualSavingBanner(view) {
  83. const tooltipEl = document.querySelector('[data-ol-annual-saving-tooltip]')
  84. if (view === 'annual') {
  85. tooltipEl.classList.add('annual-selected')
  86. } else {
  87. tooltipEl.classList.remove('annual-selected')
  88. }
  89. }
  90. function selectViewFromHash() {
  91. try {
  92. const params = new URLSearchParams(window.location.hash.substring(1))
  93. const view = params.get('view')
  94. if (view) {
  95. // make sure the selected view is valid
  96. if (document.querySelector(`[data-ol-view-tab="${view}"]`)) {
  97. selectView(view)
  98. // clear the hash so it doesn't persist when switching plans
  99. window.location.hash = ''
  100. }
  101. }
  102. } catch {
  103. // do nothing
  104. }
  105. }
  106. document.querySelectorAll('[data-ol-view-tab]').forEach(setUpViewSwitching)
  107. document
  108. .querySelectorAll('[data-ol-currencyCode-switch]')
  109. .forEach(setUpCurrencySwitching)
  110. document
  111. .querySelectorAll('[data-ol-start-new-subscription]')
  112. .forEach(setUpSubscriptionTracking)
  113. updateLinkTargets()
  114. selectViewFromHash()
  115. window.addEventListener('hashchange', selectViewFromHash)