diff --git a/services/web/app/views/project/editor.pug b/services/web/app/views/project/editor.pug index 2d5543483f..4cc2bd0175 100644 --- a/services/web/app/views/project/editor.pug +++ b/services/web/app/views/project/editor.pug @@ -60,20 +60,18 @@ block content ng-controller="SystemMessageController" ng-hide="hidden" ) - button(ng-hide="protected",ng-click="hide()").close.pull-right + button(ng-hide="protected" ng-click="hide()").close.pull-right span(aria-hidden="true") × span.sr-only #{translate("close")} .system-message-content | {{htmlContent}} - grammarly-advert() - if hasFeature('saas') legacy-editor-warning(delay=10000) include ./editor/main - script(type="text/ng-template", id="genericMessageModalTemplate") + script(type="text/ng-template" id="genericMessageModalTemplate") .modal-header button.close( type="button" @@ -87,7 +85,7 @@ block content .modal-footer button.btn.btn-info(ng-click="done()") #{translate("ok")} - script(type="text/ng-template", id="outOfSyncModalTemplate") + script(type="text/ng-template" id="outOfSyncModalTemplate") .modal-header button.close( type="button" @@ -112,7 +110,7 @@ block content .modal-footer button.btn.btn-info(ng-click="done()") #{translate("reload_editor")} - script(type="text/ng-template", id="lockEditorModalTemplate") + script(type="text/ng-template" id="lockEditorModalTemplate") .modal-header h3 {{ title }} .modal-body(ng-bind-html="message") diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index 2d90cf658f..723d1f27d0 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -149,6 +149,7 @@ "checking_project_github_status": "", "choose_a_custom_color": "", "choose_from_group_members": "", + "claim_discount": "", "clear_cached_files": "", "clear_search": "", "click_here_to_view_sl_in_lng": "", diff --git a/services/web/frontend/js/features/source-editor/components/grammarly-advert.tsx b/services/web/frontend/js/features/source-editor/components/grammarly-advert.tsx index 67608144f5..bf795d7d25 100644 --- a/services/web/frontend/js/features/source-editor/components/grammarly-advert.tsx +++ b/services/web/frontend/js/features/source-editor/components/grammarly-advert.tsx @@ -1,91 +1,104 @@ import { useCallback, useEffect, useState } from 'react' -import MaterialIcon from '@/shared/components/material-icon' +import { Button } from 'react-bootstrap' +import { useTranslation } from 'react-i18next' +import Notification from '@/shared/components/notification' +import useRemindMeLater from '@/shared/hooks/use-remind-me-later' +import GrammarlyLogo from '@/shared/svgs/grammarly-logo' import * as eventTracking from '../../../infrastructure/event-tracking' -import customLocalStorage from '../../../infrastructure/local-storage' import useWaitForGrammarlyCheck from '@/shared/hooks/use-wait-for-grammarly-check' + export default function GrammarlyAdvert() { const [show, setShow] = useState(false) + const { t } = useTranslation() // grammarly can take some time to load, we should assume its installed and hide until we know for sure const grammarlyInstalled = useWaitForGrammarlyCheck({ initialState: false }) - useEffect(() => { - const hasDismissedGrammarlyAdvert = customLocalStorage.getItem( - 'editor.has_dismissed_grammarly_advert' - ) + const { stillDissmissed, remindThemLater, saveDismissed } = + useRemindMeLater('grammarly_advert') - const showGrammarlyAdvert = - grammarlyInstalled && !hasDismissedGrammarlyAdvert + useEffect(() => { + const showGrammarlyAdvert = grammarlyInstalled && !stillDissmissed if (showGrammarlyAdvert) { eventTracking.sendMB('grammarly-advert-shown') setShow(true) } - }, [grammarlyInstalled, setShow]) + }, [stillDissmissed, grammarlyInstalled, setShow]) - const handleClose = useCallback(() => { + const handleDismiss = useCallback(() => { setShow(false) - customLocalStorage.setItem('editor.has_dismissed_grammarly_advert', true) + saveDismissed() eventTracking.sendMB('grammarly-advert-dismissed') - }, []) + }, [saveDismissed]) + + const handleClickClaim = useCallback(() => { + eventTracking.sendMB('promo-click', { + location: 'notification', + name: 'grammarly-advert', + type: 'click', + }) + + saveDismissed() + setShow(false) + + window.open( + 'https://grammarly.go2cloud.org/aff_c?offer_id=372&aff_id=142242' + ) + }, [saveDismissed]) + + const handleLater = useCallback(() => { + eventTracking.sendMB('promo-click', { + location: 'notification', + name: 'grammarly-advert', + type: 'pause', + }) + setShow(false) + remindThemLater() + }, [remindThemLater]) if (!show) { return null } - // promotion ends on december 16th, 2023 at 00:00 UTC - const promotionEnded = new Date() > new Date(Date.UTC(2023, 11, 16, 0, 0, 0)) - const permanentOffer = ( -
- Love Grammarly? Then you're in luck! Get 25% off Grammarly Premium - with this exclusive offer for Overleaf users. -
- eventTracking.sendMB('grammarly-advert-clicked')} - href="https://grammarly.go2cloud.org/aff_c?offer_id=373&aff_id=142242" - target="_blank" - rel="noopener" - > - Claim my discount - -- Overleafers get a limited-time 30% discount on Grammarly Premium. - (Hurry! Offer ends December 15.) + Get 25% off Grammarly Premium with this exclusive offer for Overleaf + users.
- eventTracking.sendMB('grammarly-advert-clicked')} - href="https://grammarly.go2cloud.org/aff_c?offer_id=372&aff_id=142242" - target="_blank" - rel="noopener" - > - Claim my discount -