Message: Do not detect language while animating Message List

This commit is contained in:
Alexander Zinchuk 2023-07-23 10:08:07 +02:00
parent f900ae285c
commit 3b17344a1a
3 changed files with 26 additions and 20 deletions

View File

@ -600,9 +600,12 @@ const Message: FC<OwnProps & StateProps> = ({
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(

View File

@ -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<string, LimitedMap<number, MessageMetadata>>();
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<boolean>,
) {
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);

View File

@ -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<boolean>) {
const [language, setLanguage] = useState<string | undefined>();
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;
}