grammarly-warning.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { useCallback, useEffect, useState } from 'react'
  2. import { Button } from 'react-bootstrap'
  3. import { Nullable } from '../../../../../types/utils'
  4. import customLocalStorage from '../../../infrastructure/local-storage'
  5. import useScopeValue from '../../../shared/hooks/use-scope-value'
  6. import grammarlyExtensionPresent from '../../../shared/utils/grammarly'
  7. type GrammarlyWarningProps = {
  8. delay: number
  9. }
  10. export default function GrammarlyWarning({ delay }: GrammarlyWarningProps) {
  11. const [show, setShow] = useState(false)
  12. const [newSourceEditor] = useScopeValue('editor.newSourceEditor')
  13. const grammarly = grammarlyExtensionPresent()
  14. const hasDismissedGrammarlyWarning = customLocalStorage.getItem(
  15. 'editor.has_dismissed_grammarly_warning'
  16. )
  17. useEffect(() => {
  18. const showGrammarlyWarning =
  19. !hasDismissedGrammarlyWarning && grammarly && newSourceEditor
  20. let timeoutID: Nullable<number>
  21. if (showGrammarlyWarning) {
  22. const timeout = window.setTimeout(() => {
  23. setShow(true)
  24. timeoutID = null
  25. }, delay)
  26. timeoutID = timeout
  27. }
  28. return () => {
  29. if (timeoutID) {
  30. clearTimeout(timeoutID)
  31. }
  32. }
  33. }, [grammarly, hasDismissedGrammarlyWarning, newSourceEditor, delay])
  34. const handleClose = useCallback(() => {
  35. setShow(false)
  36. customLocalStorage.setItem('editor.has_dismissed_grammarly_warning', true)
  37. }, [])
  38. if (!show) {
  39. return null
  40. }
  41. return (
  42. <div className="alert alert-info grammarly-warning" role="alert">
  43. <Button
  44. className="close"
  45. data-dismiss="alert"
  46. aria-label="Close"
  47. onClick={handleClose}
  48. bsStyle={null}
  49. >
  50. <span aria-hidden="true">&times;</span>
  51. </Button>
  52. <div className="warning-content">
  53. A browser extension, for example Grammarly, may be slowing down
  54. Overleaf.{' '}
  55. <a
  56. className="warning-link"
  57. href="/learn/how-to/Use_Grammarly_with_Overleaf#Performance_issues"
  58. target="_blank"
  59. >
  60. Find out how to avoid this
  61. </a>
  62. </div>
  63. </div>
  64. )
  65. }