index.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import getMeta from '../../../utils/meta'
  2. import { swapModal } from '../../utils/swapModal'
  3. import * as eventTracking from '../../../infrastructure/event-tracking'
  4. import {
  5. createLocalizedGroupPlanPrice,
  6. formatCurrencyDefault,
  7. } from '../utils/group-plan-pricing'
  8. import { getSplitTestVariant } from '@/utils/splitTestUtils'
  9. import { formatCurrencyLocalized } from '@/shared/utils/currency'
  10. function getFormValues() {
  11. const modalEl = document.querySelector('[data-ol-group-plan-modal]')
  12. const planCode = modalEl.querySelector(
  13. 'input[name="plan_code"]:checked'
  14. ).value
  15. const size = modalEl.querySelector('#size').value
  16. const currency = modalEl.querySelector('#currency').value
  17. const usage = modalEl.querySelector('#usage').checked
  18. ? 'educational'
  19. : 'enterprise'
  20. return { planCode, size, currency, usage }
  21. }
  22. export function updateGroupModalPlanPricing() {
  23. const modalEl = document.querySelector('[data-ol-group-plan-modal]')
  24. const { planCode, size, currency, usage } = getFormValues()
  25. const localCcyVariant = getSplitTestVariant('local-ccy-format-v2')
  26. const { localizedPrice, localizedPerUserPrice } =
  27. createLocalizedGroupPlanPrice({
  28. plan: planCode,
  29. licenseSize: size,
  30. currency,
  31. usage,
  32. formatCurrency:
  33. localCcyVariant === 'enabled'
  34. ? formatCurrencyLocalized
  35. : formatCurrencyDefault,
  36. })
  37. modalEl.querySelectorAll('[data-ol-group-plan-plan-code]').forEach(el => {
  38. el.hidden = el.getAttribute('data-ol-group-plan-plan-code') !== planCode
  39. })
  40. modalEl.querySelectorAll('[data-ol-group-plan-usage]').forEach(el => {
  41. el.hidden = el.getAttribute('data-ol-group-plan-usage') !== usage
  42. })
  43. modalEl.querySelector('[data-ol-group-plan-display-price]').innerText =
  44. localizedPrice
  45. modalEl
  46. .querySelectorAll('[data-ol-group-plan-price-per-user]')
  47. .forEach(el => {
  48. el.innerText = `${localizedPerUserPrice} ${el.getAttribute(
  49. 'data-ol-group-plan-price-per-user'
  50. )}`
  51. })
  52. modalEl.querySelector('[data-ol-group-plan-educational-discount]').hidden =
  53. usage !== 'educational'
  54. modalEl.querySelector(
  55. '[data-ol-group-plan-educational-discount-applied]'
  56. ).hidden = size < 10
  57. modalEl.querySelector(
  58. '[data-ol-group-plan-educational-discount-ineligible]'
  59. ).hidden = size >= 10
  60. }
  61. const modalEl = $('[data-ol-group-plan-modal]')
  62. modalEl
  63. .on('shown.bs.modal', function () {
  64. const path = `${window.location.pathname}${window.location.search}`
  65. history.replaceState(null, document.title, path + '#groups')
  66. eventTracking.sendMB('form-submitted-groups-modal-open')
  67. })
  68. .on('hidden.bs.modal', function () {
  69. const path = `${window.location.pathname}${window.location.search}`
  70. history.replaceState(null, document.title, path)
  71. })
  72. function showGroupPlanModal() {
  73. modalEl.modal()
  74. eventTracking.send(
  75. 'subscription-funnel',
  76. 'plans-page',
  77. 'group-inquiry-potential'
  78. ) // deprecated by plans-page-click
  79. }
  80. document
  81. .querySelectorAll('[data-ol-group-plan-form] select')
  82. .forEach(el => el.addEventListener('change', updateGroupModalPlanPricing))
  83. document
  84. .querySelectorAll('[data-ol-group-plan-form] input')
  85. .forEach(el => el.addEventListener('change', updateGroupModalPlanPricing))
  86. document.querySelectorAll('[data-ol-purchase-group-plan]').forEach(el =>
  87. el.addEventListener('click', e => {
  88. e.preventDefault()
  89. const { planCode, size, currency, usage } = getFormValues()
  90. const queryParams = new URLSearchParams(
  91. Object.entries({
  92. planCode: `group_${planCode}_${size}_${usage}`,
  93. currency,
  94. itm_campaign: 'groups',
  95. })
  96. )
  97. const itmContent = getMeta('ol-itm_content')
  98. if (itmContent) {
  99. queryParams.set('itm_content', itmContent)
  100. }
  101. eventTracking.sendMB('groups-modal-click', {
  102. plan: planCode,
  103. users: size,
  104. currency,
  105. type: usage,
  106. })
  107. const url = new URL('/user/subscription/new', window.origin)
  108. url.search = queryParams.toString()
  109. window.location = url.toString()
  110. })
  111. )
  112. document.querySelectorAll('[data-ol-open-group-plan-modal]').forEach(el => {
  113. const location = el.getAttribute('data-ol-location')
  114. el.addEventListener('click', function (e) {
  115. e.preventDefault()
  116. eventTracking.sendMB('plans-page-click', {
  117. button: 'group',
  118. location,
  119. 'billing-period': 'annual',
  120. })
  121. showGroupPlanModal()
  122. })
  123. })
  124. document
  125. .querySelectorAll('[data-ol-open-contact-form-for-more-than-50-licenses]')
  126. .forEach(el => {
  127. el.addEventListener('click', function (e) {
  128. e.preventDefault()
  129. swapModal(
  130. '[data-ol-group-plan-modal]',
  131. '[data-ol-contact-form-modal="general"]'
  132. )
  133. })
  134. })
  135. function updateGroupModalPlanPricingIfAvailable() {
  136. const isGroupPlanModalAvailable = document.querySelector(
  137. '[data-ol-group-plan-modal]'
  138. )
  139. if (isGroupPlanModalAvailable) {
  140. updateGroupModalPlanPricing()
  141. }
  142. }
  143. updateGroupModalPlanPricingIfAvailable()
  144. // When using browser back buttons, we need to update the pricing plan
  145. // after the page has fully loaded as we need to wait for the previously
  146. // selected values to load for e.g. size.
  147. window.addEventListener('load', () => {
  148. updateGroupModalPlanPricingIfAvailable()
  149. })
  150. if (window.location.hash === '#groups') {
  151. showGroupPlanModal()
  152. }