diff --git a/src/components/middle/message/Message.tsx b/src/components/middle/message/Message.tsx index 2abc3727d..7ff3081cd 100644 --- a/src/components/middle/message/Message.tsx +++ b/src/components/middle/message/Message.tsx @@ -600,9 +600,12 @@ const Message: FC = ({ text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice, location, action, game, } = getMessageContent(message); - useDetectChatLanguage(message, !shouldDetectChatLanguage); - - const detectedLanguage = useTextLanguage(areTranslationsEnabled ? text?.text : undefined); + const detectedLanguage = useTextLanguage( + text?.text, + !(areTranslationsEnabled || shouldDetectChatLanguage), + getIsMessageListReady, + ); + useDetectChatLanguage(message, detectedLanguage, !shouldDetectChatLanguage, getIsMessageListReady); const shouldTranslate = isMessageTranslatable(message, !requestedChatTranslationLanguage); const { isPending: isTranslationPending, translatedText } = useMessageTranslation( diff --git a/src/components/middle/message/hooks/useDetectChatLanguage.ts b/src/components/middle/message/hooks/useDetectChatLanguage.ts index a4b6736f0..b9aabf6da 100644 --- a/src/components/middle/message/hooks/useDetectChatLanguage.ts +++ b/src/components/middle/message/hooks/useDetectChatLanguage.ts @@ -1,9 +1,10 @@ import type { ApiMessage } from '../../../../api/types'; -import { SERVICE_NOTIFICATIONS_USER_ID } from '../../../../config'; +import type { Signal } from '../../../../util/signals'; + import { getActions } from '../../../../global'; -import useTextLanguage from '../../../../hooks/useTextLanguage'; import LimitedMap from '../../../../util/primitives/LimitedMap'; import { throttle } from '../../../../util/schedulers'; +import { useEffect } from '../../../../lib/teact/teact'; // https://github.com/DrKLO/Telegram/blob/dfd74f809e97d1ecad9672fc7388cb0223a95dfc/TMessagesProj/src/main/java/org/telegram/messenger/TranslateController.java#L35 const MIN_MESSAGES_CHECKED = 8; @@ -21,15 +22,15 @@ type MessageMetadata = { const CHAT_STATS = new Map>(); -export default function useDetectChatLanguage(message: ApiMessage, isDisabled?: boolean) { - const canProcess = !isDisabled && message.chatId !== SERVICE_NOTIFICATIONS_USER_ID; +export default function useDetectChatLanguage( + message: ApiMessage, detectedLanguage?: string, isDisabled?: boolean, getIsReady?: Signal, +) { + useEffect(() => { + if (isDisabled || (getIsReady && !getIsReady())) return; - const isTranslatable = Boolean(message.content.text?.text.length); - const detectedLanguage = useTextLanguage(message.content.text?.text, !canProcess); - - if (!canProcess) return; - - processMessageMetadata(message.chatId, message.id, isTranslatable, detectedLanguage); + const isTranslatable = Boolean(message.content.text?.text.length); + processMessageMetadata(message.chatId, message.id, isTranslatable, detectedLanguage); + }, [message, detectedLanguage, isDisabled, getIsReady]); } const throttledMakeChatDecision = throttle(makeChatDecision, THROTTLE_DELAY); diff --git a/src/hooks/useTextLanguage.ts b/src/hooks/useTextLanguage.ts index 998bb6e6a..08c97c011 100644 --- a/src/hooks/useTextLanguage.ts +++ b/src/hooks/useTextLanguage.ts @@ -1,19 +1,21 @@ -import { useState } from '../lib/teact/teact'; +import { useEffect, useState } from '../lib/teact/teact'; + +import type { Signal } from '../util/signals'; import { detectLanguage } from '../util/languageDetection'; -import useSyncEffect from './useSyncEffect'; - -export default function useTextLanguage(text?: string, isDisabled?: boolean) { +export default function useTextLanguage(text?: string, isDisabled?: boolean, getIsReady?: Signal) { const [language, setLanguage] = useState(); - useSyncEffect(() => { - if (text && !isDisabled) { + useEffect(() => { + if (isDisabled || (getIsReady && !getIsReady())) return; + + if (text) { detectLanguage(text).then(setLanguage); } else { setLanguage(undefined); } - }, [isDisabled, text]); + }, [isDisabled, text, getIsReady]); return language; }