-
Notifications
You must be signed in to change notification settings - Fork 298
Expand file tree
/
Copy pathMessageTranslationIndicator.tsx
More file actions
83 lines (74 loc) · 2.57 KB
/
MessageTranslationIndicator.tsx
File metadata and controls
83 lines (74 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import type { LocalMessage } from 'stream-chat';
import React, { useCallback, useMemo } from 'react';
import { IconTranslate } from '../Icons';
import {
getTranslatedMessageText,
useMessageContext,
useTranslationContext,
} from '../../context';
import { Button } from '../Button';
export type TranslationIndicatorProps = {
message?: LocalMessage;
};
export const MessageTranslationIndicator = ({
message: propMessage,
}: TranslationIndicatorProps) => {
const { t, userLanguage } = useTranslationContext();
const {
message: contextMessage,
setTranslationView,
translationView,
} = useMessageContext('MessageTranslationIndicator');
const message = propMessage ?? contextMessage;
const translatedTextForUser = useMemo(
() => getTranslatedMessageText({ language: userLanguage, message }),
[userLanguage, message],
);
const hasTranslationForUserLanguage = useMemo(
() =>
translatedTextForUser != null &&
message?.text !== undefined &&
translatedTextForUser !== message.text,
[translatedTextForUser, message?.text],
);
const viewingOriginal = useMemo(
() =>
translationView === 'original' ||
(translationView === undefined && !hasTranslationForUserLanguage),
[translationView, hasTranslationForUserLanguage],
);
const handleToggle = useCallback(() => {
setTranslationView?.(viewingOriginal ? 'translated' : 'original');
}, [setTranslationView, viewingOriginal]);
const sourceLanguageName = useMemo(() => {
const sourceLanguageCode = message?.i18n?.language;
if (!sourceLanguageCode) return '';
const languageKey = 'language/' + sourceLanguageCode;
const translatedName = t(languageKey);
return translatedName && translatedName !== languageKey
? translatedName
: sourceLanguageCode;
}, [message?.i18n?.language, t]);
if (!message?.i18n || !setTranslationView) return null;
if (!hasTranslationForUserLanguage) return null;
return (
<div className='str-chat__message-translation-indicator'>
<IconTranslate />
<span className='str-chat__message-translation-indicator__sign'>
{viewingOriginal
? t('Original')
: sourceLanguageName
? t('Translated from {{ language }}', { language: sourceLanguageName })
: t('Translated')}
</span>
<span> · </span>
<Button
className='str-chat__message-translation-indicator__translation-toggle'
onClick={handleToggle}
type='button'
>
{viewingOriginal ? t('View translation') : t('View original')}
</Button>
</div>
);
};