legacy-editor-warning.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { memo, useCallback, useEffect, useState } from 'react'
  2. import { Button } from 'react-bootstrap'
  3. import customLocalStorage from '../../../infrastructure/local-storage'
  4. import useScopeValue from '../../../shared/hooks/use-scope-value'
  5. import * as eventTracking from '../../../infrastructure/event-tracking'
  6. export const LegacyEditorWarning = memo(function LegacyEditorWarning({
  7. delay,
  8. }: {
  9. delay: number
  10. }) {
  11. const [show, setShow] = useState(false)
  12. const [newSourceEditor] = useScopeValue('editor.newSourceEditor')
  13. const hasDismissedLegacyEditor = customLocalStorage.getItem(
  14. 'editor.has_dismissed_legacy_editor_warning'
  15. )
  16. useEffect(() => {
  17. const showLegacyEditor =
  18. !hasDismissedLegacyEditor && newSourceEditor === false
  19. let timeoutId: number | undefined
  20. if (showLegacyEditor) {
  21. timeoutId = window.setTimeout(() => {
  22. eventTracking.sendMB('legacy-editor-warning-prompt')
  23. setShow(true)
  24. }, delay)
  25. }
  26. return () => {
  27. window.clearTimeout(timeoutId)
  28. }
  29. }, [hasDismissedLegacyEditor, newSourceEditor, delay])
  30. const handleClose = useCallback(() => {
  31. setShow(false)
  32. customLocalStorage.setItem(
  33. 'editor.has_dismissed_legacy_editor_warning',
  34. true
  35. )
  36. eventTracking.sendMB('legacy-editor-warning-dismiss')
  37. }, [])
  38. const handleClick = useCallback(() => {
  39. eventTracking.sendMB('legacy-editor-warning-link-click')
  40. }, [])
  41. if (!show) {
  42. return null
  43. }
  44. return (
  45. <div className="alert alert-info legacy-editor-warning" role="alert">
  46. <Button
  47. className="close"
  48. data-dismiss="alert"
  49. aria-label="Close"
  50. onClick={handleClose}
  51. bsStyle={null}
  52. >
  53. <span aria-hidden="true">&times;</span>
  54. </Button>
  55. <div className="warning-content">
  56. <div>We're retiring our Source (legacy) editor in late May 2023.</div>
  57. <div>
  58. <a
  59. className="warning-link"
  60. href="https://www.overleaf.com/blog/were-retiring-our-legacy-source-editor"
  61. target="_blank"
  62. rel="noreferrer"
  63. onClick={handleClick}
  64. >
  65. Read the blog post
  66. </a>{' '}
  67. to learn more and find out how to report any problems.
  68. </div>
  69. </div>
  70. </div>
  71. )
  72. })