index.js 5.3 KB

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