grammarly-advert.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { useCallback, useEffect, useState } from 'react'
  2. import { Button } from 'react-bootstrap'
  3. import { useTranslation } from 'react-i18next'
  4. import Notification from '@/shared/components/notification'
  5. import useRemindMeLater from '@/shared/hooks/use-remind-me-later'
  6. import GrammarlyLogo from '@/shared/svgs/grammarly-logo'
  7. import * as eventTracking from '../../../infrastructure/event-tracking'
  8. import useWaitForGrammarlyCheck from '@/shared/hooks/use-wait-for-grammarly-check'
  9. import getMeta from '@/utils/meta'
  10. import { ExposedSettings } from '../../../../../types/exposed-settings'
  11. export default function GrammarlyAdvert() {
  12. const { isOverleaf } = getMeta('ol-ExposedSettings') as ExposedSettings
  13. const [show, setShow] = useState(false)
  14. const { t } = useTranslation()
  15. // grammarly can take some time to load, we should assume its installed and hide until we know for sure
  16. const grammarlyInstalled = useWaitForGrammarlyCheck({ initialState: false })
  17. const { stillDissmissed, remindThemLater, saveDismissed } =
  18. useRemindMeLater('grammarly_advert')
  19. useEffect(() => {
  20. const showGrammarlyAdvert = grammarlyInstalled && !stillDissmissed
  21. if (showGrammarlyAdvert) {
  22. eventTracking.sendMB('grammarly-advert-shown')
  23. setShow(true)
  24. }
  25. }, [stillDissmissed, grammarlyInstalled, setShow])
  26. const handleDismiss = useCallback(() => {
  27. setShow(false)
  28. saveDismissed()
  29. eventTracking.sendMB('grammarly-advert-dismissed')
  30. }, [saveDismissed])
  31. const handleClickClaim = useCallback(() => {
  32. eventTracking.sendMB('promo-click', {
  33. location: 'notification',
  34. name: 'grammarly-advert',
  35. type: 'click',
  36. })
  37. saveDismissed()
  38. setShow(false)
  39. window.open(
  40. 'https://grammarly.go2cloud.org/aff_c?offer_id=373&aff_id=142242'
  41. )
  42. }, [saveDismissed])
  43. const handleLater = useCallback(() => {
  44. eventTracking.sendMB('promo-click', {
  45. location: 'notification',
  46. name: 'grammarly-advert',
  47. type: 'pause',
  48. })
  49. setShow(false)
  50. remindThemLater()
  51. }, [remindThemLater])
  52. if (!isOverleaf || !show) {
  53. return null
  54. }
  55. const actions = (
  56. <div>
  57. <Button
  58. bsStyle={null}
  59. className="btn-secondary"
  60. onClick={handleClickClaim}
  61. >
  62. {t('claim_discount')}
  63. </Button>
  64. <Button className="btn-bg-ghost" bsStyle={null} onClick={handleLater}>
  65. {t('maybe_later')}
  66. </Button>
  67. </div>
  68. )
  69. return (
  70. <Notification
  71. action={actions}
  72. ariaLive="polite"
  73. className="editor-notification ol-overlay hidden-xs-container"
  74. content={
  75. <div>
  76. <p>
  77. Get 25% off Grammarly Premium with this exclusive offer for Overleaf
  78. users.
  79. </p>
  80. </div>
  81. }
  82. customIcon={
  83. <div>
  84. <GrammarlyLogo width="50" height="50" background="#fff" />
  85. </div>
  86. }
  87. isActionBelowContent
  88. isDismissible
  89. onDismiss={handleDismiss}
  90. title="Love Grammarly? Then you're in luck!"
  91. type="offer"
  92. />
  93. )
  94. }