plans.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. let currentView = 'monthly'
  6. let currentCurrencyCode = getMeta('ol-recommendedCurrency')
  7. function selectView(view) {
  8. document.querySelectorAll('[data-ol-view-tab]').forEach(el => {
  9. if (el.getAttribute('data-ol-view-tab') === view) {
  10. el.classList.add('active')
  11. } else {
  12. el.classList.remove('active')
  13. }
  14. })
  15. document.querySelectorAll('[data-ol-view]').forEach(el => {
  16. el.hidden = el.getAttribute('data-ol-view') !== view
  17. })
  18. updateAnnualSavingBanner(view)
  19. currentView = view
  20. updateLinkTargets()
  21. }
  22. function setUpViewSwitching(liEl) {
  23. const plansPageLayoutV3Variant =
  24. getMeta('ol-splitTestVariants')?.['plans-page-layout-v3'] ?? 'default'
  25. const view = liEl.getAttribute('data-ol-view-tab')
  26. liEl.querySelector('button').addEventListener('click', function (e) {
  27. e.preventDefault()
  28. eventTracking.send('subscription-funnel', 'plans-page', `${view}-prices`)
  29. eventTracking.sendMB('plans-page-toggle', {
  30. button: view,
  31. 'plans-page-layout-v3': plansPageLayoutV3Variant,
  32. })
  33. selectView(view)
  34. })
  35. }
  36. function setUpCurrencySwitching(linkEl) {
  37. const currencyCode = linkEl.getAttribute('data-ol-currencyCode-switch')
  38. linkEl.addEventListener('click', function (e) {
  39. e.preventDefault()
  40. document.querySelectorAll('[data-ol-currencyCode]').forEach(el => {
  41. el.hidden = el.getAttribute('data-ol-currencyCode') !== currencyCode
  42. })
  43. currentCurrencyCode = currencyCode
  44. eventTracking.sendMB('plans-page-currency', { currency: currencyCode })
  45. updateLinkTargets()
  46. })
  47. }
  48. function setUpSubscriptionTracking(linkEl) {
  49. const plansPageLayoutV3Variant =
  50. getMeta('ol-splitTestVariants')?.['plans-page-layout-v3'] ?? 'default'
  51. const plan =
  52. linkEl.getAttribute('data-ol-tracking-plan') ||
  53. linkEl.getAttribute('data-ol-start-new-subscription')
  54. const location = linkEl.getAttribute('data-ol-location')
  55. const period = linkEl.getAttribute('data-ol-item-view') || currentView
  56. const DEFAULT_EVENT_TRACKING_KEY = 'plans-page-click'
  57. const eventTrackingKey =
  58. linkEl.getAttribute('data-ol-event-tracking-key') ||
  59. DEFAULT_EVENT_TRACKING_KEY
  60. const eventTrackingSegmentation = {
  61. button: plan,
  62. location,
  63. period,
  64. }
  65. if (eventTrackingKey === DEFAULT_EVENT_TRACKING_KEY) {
  66. eventTrackingSegmentation['plans-page-layout-v3'] = plansPageLayoutV3Variant
  67. }
  68. linkEl.addEventListener('click', function () {
  69. const customLabel = linkEl.getAttribute('data-ol-tracking-label')
  70. const computedLabel = currentView === 'annual' ? `${plan}_annual` : plan
  71. const label = customLabel || computedLabel
  72. eventTracking.sendMB('plans-page-start-trial') // deprecated by plans-page-click
  73. eventTracking.send('subscription-funnel', 'sign_up_now_button', label) // deprecated by plans-page-click
  74. eventTracking.sendMB(eventTrackingKey, eventTrackingSegmentation)
  75. })
  76. }
  77. const searchParams = new URLSearchParams(window.location.search)
  78. export function updateLinkTargets() {
  79. document.querySelectorAll('[data-ol-start-new-subscription]').forEach(el => {
  80. if (el.hasAttribute('data-ol-has-custom-href')) return
  81. const plan = el.getAttribute('data-ol-start-new-subscription')
  82. const view = el.getAttribute('data-ol-item-view') || currentView
  83. const suffix = view === 'annual' ? `-annual` : `_free_trial_7_days`
  84. const planCode = `${plan}${suffix}`
  85. const location = el.getAttribute('data-ol-location')
  86. const itmCampaign = searchParams.get('itm_campaign') || 'plans'
  87. const itmContent =
  88. itmCampaign === 'plans' ? location : searchParams.get('itm_content')
  89. const queryString = new URLSearchParams({
  90. planCode,
  91. currency: currentCurrencyCode,
  92. itm_campaign: itmCampaign,
  93. })
  94. if (itmContent) {
  95. queryString.set('itm_content', itmContent)
  96. }
  97. if (searchParams.get('itm_referrer')) {
  98. queryString.set('itm_referrer', searchParams.get('itm_referrer'))
  99. }
  100. el.href = `/user/subscription/new?${queryString.toString()}`
  101. })
  102. }
  103. function updateAnnualSavingBanner(view) {
  104. const tooltipEl = document.querySelector('[data-ol-annual-saving-tooltip]')
  105. if (view === 'annual') {
  106. tooltipEl.classList.add('annual-selected')
  107. } else {
  108. tooltipEl.classList.remove('annual-selected')
  109. }
  110. }
  111. function makeAnnualViewAsDefault() {
  112. const plansPageLayoutV3Variant =
  113. getMeta('ol-splitTestVariants')?.['plans-page-layout-v3'] ?? 'default'
  114. // there are a handful of html elements that will switch between monthly and annual view
  115. // with the `hidden` attribute.
  116. // On the variant `old-plans-page-annual`, we want annual as the default.
  117. // So, instead of changing the pugfiles directly, we change the default with this
  118. if (plansPageLayoutV3Variant === 'old-plans-page-annual') {
  119. document.querySelectorAll('[data-ol-view]').forEach(el => {
  120. const view = el.getAttribute('data-ol-view')
  121. el.hidden = view !== 'annual'
  122. })
  123. }
  124. }
  125. function selectViewFromHash() {
  126. try {
  127. const params = new URLSearchParams(window.location.hash.substring(1))
  128. const view = params.get('view')
  129. if (view) {
  130. // make sure the selected view is valid
  131. if (document.querySelector(`[data-ol-view-tab="${view}"]`)) {
  132. selectView(view)
  133. // clear the hash so it doesn't persist when switching plans
  134. window.location.hash = ''
  135. }
  136. }
  137. } catch {
  138. // do nothing
  139. }
  140. }
  141. document.querySelectorAll('[data-ol-view-tab]').forEach(setUpViewSwitching)
  142. document
  143. .querySelectorAll('[data-ol-currencyCode-switch]')
  144. .forEach(setUpCurrencySwitching)
  145. document
  146. .querySelectorAll('[data-ol-start-new-subscription]')
  147. .forEach(setUpSubscriptionTracking)
  148. updateLinkTargets()
  149. selectViewFromHash()
  150. window.addEventListener('hashchange', selectViewFromHash)
  151. // only for `old-plans-page-annual` variant of the `plans-page-layout-v3` split test
  152. makeAnnualViewAsDefault()