import React, { memo, useEffect, useMemo, useState, } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; import type { FC } from '../../lib/teact/teact'; import { selectLanguageCode, selectRequestedTranslationLanguage, selectTabState } from '../../global/selectors'; import { SUPPORTED_TRANSLATION_LANGUAGES } from '../../config'; import buildClassName from '../../util/buildClassName'; import renderText from '../common/helpers/renderText'; import useLastCallback from '../../hooks/useLastCallback'; import useLang from '../../hooks/useLang'; import Modal from '../ui/Modal'; import ListItem from '../ui/ListItem'; import InputText from '../ui/InputText'; import styles from './MessageLanguageModal.module.scss'; type LanguageItem = { langCode: string; translatedName: string; originalName: string; }; export type OwnProps = { isOpen?: boolean; }; type StateProps = { chatId?: string; messageId?: number; activeTranslationLanguage?: string; currentLanguageCode: string; }; const MessageLanguageModal: FC = ({ isOpen, chatId, messageId, activeTranslationLanguage, currentLanguageCode, }) => { const { requestMessageTranslation, closeMessageLanguageModal } = getActions(); const [search, setSearch] = useState(''); const lang = useLang(); const handleSelect = useLastCallback((toLanguageCode: string) => { if (!chatId || !messageId) return; requestMessageTranslation({ chatId, id: messageId, toLanguageCode }); closeMessageLanguageModal(); }); const handleSearch = useLastCallback((e: React.ChangeEvent) => { setSearch(e.target.value); }); const translateLanguages = useMemo(() => SUPPORTED_TRANSLATION_LANGUAGES.map((langCode: string) => { const translatedNames = new Intl.DisplayNames([currentLanguageCode], { type: 'language' }); const translatedName = translatedNames.of(langCode)!; const originalNames = new Intl.DisplayNames([langCode], { type: 'language' }); const originalName = originalNames.of(langCode)!; return { langCode, translatedName, originalName, } satisfies LanguageItem; }), [currentLanguageCode]); useEffect(() => { if (!isOpen) setSearch(''); }, [isOpen]); const filteredDisplayedLanguages = useMemo(() => { if (!search.trim()) { return translateLanguages; } return translateLanguages.filter(({ langCode, translatedName, originalName }) => ( translatedName.toLowerCase().includes(search.toLowerCase()) || originalName.toLowerCase().includes(search.toLowerCase()) || langCode.toLowerCase().includes(search.toLowerCase()) )); }, [translateLanguages, search]); return (
{filteredDisplayedLanguages.map(({ langCode, originalName, translatedName }) => ( handleSelect(langCode)} > {renderText(originalName, ['highlight'], { highlight: search })} {renderText(translatedName, ['highlight'], { highlight: search })} ))}
); }; export default memo(withGlobal( (global): StateProps => { const { chatId, messageId } = selectTabState(global).messageLanguageModal || {}; const currentLanguageCode = selectLanguageCode(global); const activeTranslationLanguage = chatId && messageId ? selectRequestedTranslationLanguage(global, chatId, messageId) : undefined; return { chatId, messageId, activeTranslationLanguage, currentLanguageCode, }; }, )(MessageLanguageModal));