upgrade-track-changes-modal.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { useTranslation } from 'react-i18next'
  2. import { useProjectContext } from '@/shared/context/project-context'
  3. import { useUserContext } from '@/shared/context/user-context'
  4. import teaserVideo from '../images/teaser-track-changes.mp4'
  5. import teaserImage from '../images/teaser-track-changes.gif'
  6. import { startFreeTrial, upgradePlan } from '@/main/account-upgrade'
  7. import { sendMB } from '@/infrastructure/event-tracking'
  8. import { memo, useEffect } from 'react'
  9. import {
  10. OLModal,
  11. OLModalBody,
  12. OLModalFooter,
  13. OLModalHeader,
  14. OLModalTitle,
  15. } from '@/shared/components/ol/ol-modal'
  16. import OLButton from '@/shared/components/ol/ol-button'
  17. import OLRow from '@/shared/components/ol/ol-row'
  18. import OLCol from '@/shared/components/ol/ol-col'
  19. import MaterialIcon from '@/shared/components/material-icon'
  20. import { useEditorContext } from '@/shared/context/editor-context'
  21. import { useFeatureFlag } from '@/shared/context/split-test-context'
  22. function UpgradeTrackChangesModal() {
  23. const { t } = useTranslation()
  24. const { project } = useProjectContext()
  25. const user = useUserContext()
  26. const plans2026 = useFeatureFlag('plans-2026-phase-1')
  27. const {
  28. upgradeTrackChangesModal: { show, location = 'unknown' },
  29. setUpgradeTrackChangesModal,
  30. } = useEditorContext()
  31. const handleClose = () => {
  32. sendMB('paywall-dismiss', {
  33. 'paywall-type': 'track-changes',
  34. location,
  35. })
  36. setUpgradeTrackChangesModal({ show: false })
  37. }
  38. useEffect(() => {
  39. if (show) {
  40. sendMB('paywall-prompt', {
  41. 'paywall-type': 'track-changes',
  42. location,
  43. })
  44. }
  45. }, [show, location])
  46. if (!show) {
  47. return null
  48. }
  49. return (
  50. <OLModal show={show} onHide={handleClose}>
  51. <OLModalHeader>
  52. <OLModalTitle>{t('upgrade_to_review')}</OLModalTitle>
  53. </OLModalHeader>
  54. <OLModalBody className="upgrade-track-changes-modal">
  55. <div className="teaser-video-container">
  56. {/* eslint-disable-next-line jsx-a11y/media-has-caption */}
  57. <video className="teaser-video" autoPlay loop>
  58. <source src={teaserVideo} type="video/mp4" />
  59. <img
  60. src={teaserImage}
  61. alt={t('demonstrating_track_changes_feature')}
  62. />
  63. </video>
  64. </div>
  65. <h4 className="teaser-title">{t('get_real_time_track_changes')}</h4>
  66. <OLRow>
  67. <OLCol lg={{ span: 10, offset: 1 }}>
  68. <ul className="list-unstyled">
  69. {[
  70. t('see_suggestions_from_collaborators'),
  71. t('accept_or_reject_individual_edits'),
  72. plans2026
  73. ? t('access_all_premium_features_ai')
  74. : t('access_all_premium_features'),
  75. ].map(translation => (
  76. <li key={translation}>
  77. <MaterialIcon type="check" className="check-icon" />
  78. <span>{translation}</span>
  79. </li>
  80. ))}
  81. </ul>
  82. </OLCol>
  83. </OLRow>
  84. {Boolean(project?.owner) && (
  85. <div className="text-center">
  86. {project?.owner._id === user.id ? (
  87. user.allowedFreeTrial ? (
  88. <OLButton
  89. variant="premium"
  90. onClick={() =>
  91. startFreeTrial('track-changes', undefined, {
  92. location,
  93. })
  94. }
  95. >
  96. {plans2026 ? t('try_for_free') : t('try_it_for_free')}
  97. </OLButton>
  98. ) : (
  99. <OLButton
  100. variant="premium"
  101. onClick={() => {
  102. sendMB('paywall-click', {
  103. 'paywall-type': 'track-changes',
  104. location,
  105. })
  106. upgradePlan('project-sharing')
  107. }}
  108. >
  109. {t('upgrade')}
  110. </OLButton>
  111. )
  112. ) : (
  113. <p>
  114. <strong>
  115. {t(
  116. 'please_ask_the_project_owner_to_upgrade_to_track_changes'
  117. )}
  118. </strong>
  119. </p>
  120. )}
  121. </div>
  122. )}
  123. </OLModalBody>
  124. <OLModalFooter>
  125. <OLButton variant="secondary" onClick={handleClose}>
  126. {t('close')}
  127. </OLButton>
  128. </OLModalFooter>
  129. </OLModal>
  130. )
  131. }
  132. export default memo(UpgradeTrackChangesModal)