From 1b568fc151b49372e57f6e64a45c43e2e0aaef86 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Thu, 1 Jul 2021 02:17:22 +0300 Subject: [PATCH] Save draft on app unload --- src/components/main/Main.tsx | 36 ++--- src/components/middle/composer/Composer.tsx | 6 +- .../middle/composer/MessageInput.tsx | 28 ++-- .../middle/composer/hooks/useDraft.ts | 20 ++- src/global/cache.ts | 130 +++++++++++------- src/hooks/useBackgroundMode.ts | 24 +++- src/hooks/useBeforeUnload.ts | 9 ++ src/util/schedulers.ts | 22 +++ 8 files changed, 165 insertions(+), 110 deletions(-) create mode 100644 src/hooks/useBeforeUnload.ts diff --git a/src/components/main/Main.tsx b/src/components/main/Main.tsx index 8d7372937..ea2d15334 100644 --- a/src/components/main/Main.tsx +++ b/src/components/main/Main.tsx @@ -1,4 +1,6 @@ -import React, { FC, useEffect, memo } from '../../lib/teact/teact'; +import React, { + FC, useEffect, memo, useCallback, +} from '../../lib/teact/teact'; import { getGlobal, withGlobal } from '../../lib/teact/teactn'; import { GlobalActions } from '../../global/types'; @@ -20,6 +22,7 @@ import { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck' import buildClassName from '../../util/buildClassName'; import useShowTransition from '../../hooks/useShowTransition'; import useBackgroundMode from '../../hooks/useBackgroundMode'; +import useBeforeUnload from '../../hooks/useBeforeUnload'; import LeftColumn from '../left/LeftColumn'; import MiddleColumn from '../middle/MiddleColumn'; @@ -131,26 +134,9 @@ const Main: FC = ({ } }, [animationLevel, isRightColumnShown]); - useBackgroundMode(() => { + const handleBlur = useCallback(() => { updateIsOnline(false); - }, () => { - updateIsOnline(true); - }); - useEffect(() => { - function handleUnload() { - updateIsOnline(false); - } - - window.addEventListener('beforeunload', handleUnload); - - return () => { - window.removeEventListener('beforeunload', handleUnload); - }; - }, [updateIsOnline]); - - // Browser tab indicators - useBackgroundMode(() => { const initialUnread = selectCountNotMutedUnread(getGlobal()); let index = 0; @@ -174,7 +160,11 @@ const Main: FC = ({ index++; }, NOTIFICATION_INTERVAL); - }, () => { + }, [updateIsOnline]); + + const handleFocus = useCallback(() => { + updateIsOnline(true); + clearInterval(notificationInterval); notificationInterval = undefined; @@ -183,7 +173,11 @@ const Main: FC = ({ } updateIcon(false); - }); + }, [updateIsOnline]); + + // Online status and browser tab indicators + useBackgroundMode(handleBlur, handleFocus); + useBeforeUnload(handleBlur); function stopEvent(e: React.MouseEvent) { e.preventDefault(); diff --git a/src/components/middle/composer/Composer.tsx b/src/components/middle/composer/Composer.tsx index 9b0f35eb8..89f055673 100644 --- a/src/components/middle/composer/Composer.tsx +++ b/src/components/middle/composer/Composer.tsx @@ -777,11 +777,11 @@ const Composer: FC = ({ activeVoiceRecording && window.innerWidth <= SCREEN_WIDTH_TO_HIDE_PLACEHOLDER ? '' : lang('Message') } shouldSetFocus={isSymbolMenuOpen} - shouldSupressFocus={IS_SINGLE_COLUMN_LAYOUT && isSymbolMenuOpen} - shouldSupressTextFormatter={isEmojiTooltipOpen || isMentionTooltipOpen} + shouldSuppressFocus={IS_SINGLE_COLUMN_LAYOUT && isSymbolMenuOpen} + shouldSuppressTextFormatter={isEmojiTooltipOpen || isMentionTooltipOpen} onUpdate={setHtml} onSend={onSend} - onSupressedFocus={closeSymbolMenu} + onSuppressedFocus={closeSymbolMenu} /> {withScheduledButton && (