import { useCallback, useEffect, useState } from 'react' import { Button } from 'react-bootstrap' import { Nullable } from '../../../../../types/utils' import customLocalStorage from '../../../infrastructure/local-storage' import useScopeValue from '../../../shared/hooks/use-scope-value' import grammarlyExtensionPresent from '../../../shared/utils/grammarly' type GrammarlyWarningProps = { delay: number } export default function GrammarlyWarning({ delay }: GrammarlyWarningProps) { const [show, setShow] = useState(false) const [newSourceEditor] = useScopeValue('editor.newSourceEditor') const [showRichText] = useScopeValue('editor.showRichText') const grammarly = grammarlyExtensionPresent() const hasDismissedGrammarlyWarning = customLocalStorage.getItem( 'editor.has_dismissed_grammarly_warning' ) useEffect(() => { const showGrammarlyWarning = !hasDismissedGrammarlyWarning && grammarly && newSourceEditor && !showRichText let timeoutID: Nullable if (showGrammarlyWarning) { const timeout = window.setTimeout(() => { setShow(true) timeoutID = null }, delay) timeoutID = timeout } return () => { if (timeoutID) { clearTimeout(timeoutID) } } }, [ grammarly, hasDismissedGrammarlyWarning, newSourceEditor, showRichText, delay, ]) const handleClose = useCallback(() => { setShow(false) customLocalStorage.setItem('editor.has_dismissed_grammarly_warning', true) }, []) if (!show) { return null } return (
A browser extension, for example Grammarly, may be slowing down Overleaf.{' '} Find out how to avoid this
) }