Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions src/components/common/Composer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,10 @@ const MOBILE_KEYBOARD_HIDE_DELAY_MS = 100;
const SELECT_MODE_TRANSITION_MS = 200;
const SENDING_ANIMATION_DURATION = 350;
const MOUNT_ANIMATION_DURATION = 430;
const BROWSER_EMOJI_KEYWORD_LANG_FULL = typeof navigator !== 'undefined'
? navigator.language.toLowerCase()
: undefined;
const BROWSER_EMOJI_KEYWORD_LANG_SHORT = BROWSER_EMOJI_KEYWORD_LANG_FULL?.split('-')[0];

const Composer = ({
type,
Expand Down Expand Up @@ -2719,8 +2723,18 @@ export default memo(withGlobal<OwnProps>(
forwardMessages: { messageIds: forwardMessageIds },
shouldOpenMessageMediaEditor,
} = selectTabState(global);
const normalizedLanguage = language.toLowerCase();
const normalizedLanguageShort = normalizedLanguage.split('-')[0];
const baseEmojiKeywords = global.emojiKeywords[BASE_EMOJI_KEYWORD_LANG];
const emojiKeywords = language !== BASE_EMOJI_KEYWORD_LANG ? global.emojiKeywords[language] : undefined;
const languageCandidates = [
normalizedLanguage,
normalizedLanguageShort,
BROWSER_EMOJI_KEYWORD_LANG_FULL,
BROWSER_EMOJI_KEYWORD_LANG_SHORT,
].filter(Boolean);
const emojiKeywords = languageCandidates.find((langCode) => (
langCode !== BASE_EMOJI_KEYWORD_LANG && global.emojiKeywords[langCode]
));
const botKeyboardMessageId = messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined;
const keyboardMessage = botKeyboardMessageId ? selectChatMessage(global, chatId, botKeyboardMessageId) : undefined;
const { currentUserId } = global;
Expand Down Expand Up @@ -2829,7 +2843,7 @@ export default memo(withGlobal<OwnProps>(
shouldUpdateStickerSetOrder,
recentEmojis: global.recentEmojis,
baseEmojiKeywords: baseEmojiKeywords?.keywords,
emojiKeywords: emojiKeywords?.keywords,
emojiKeywords: emojiKeywords ? global.emojiKeywords[emojiKeywords]?.keywords : undefined,
inlineBots: tabState.inlineBots.byUsername,
isInlineBotLoading: tabState.inlineBots.isLoading,
botCommands: userFullInfo ? (userFullInfo.botInfo?.commands || false) : undefined,
Expand Down
28 changes: 24 additions & 4 deletions src/components/main/Main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ const Main = ({

const containerRef = useRef<HTMLDivElement>();
const leftColumnRef = useRef<HTMLDivElement>();
const requestedEmojiKeywordLangsRef = useRef<Set<string>>(new Set());

const { isDesktop } = useAppLayout();
useEffect(() => {
Expand Down Expand Up @@ -363,13 +364,32 @@ const Main = ({
// Language-based API calls
useEffect(() => {
if (isMasterTab) {
if (lang.code !== BASE_EMOJI_KEYWORD_LANG) {
loadEmojiKeywords({ language: lang.code });
}
const browserFullLanguageCode = typeof navigator !== 'undefined' ? navigator.language : undefined;
const languageCandidates = [
lang.code,
lang.code.split('-')[0],
lang.rawCode,
lang.rawCode.split('-')[0],
browserFullLanguageCode,
browserFullLanguageCode?.split('-')[0],
]
.filter(Boolean)
.map((value) => value.toLowerCase());

const uniqueLanguageCandidates = Array.from(new Set(languageCandidates));
uniqueLanguageCandidates.forEach((language) => {
if (
language !== BASE_EMOJI_KEYWORD_LANG
&& !requestedEmojiKeywordLangsRef.current.has(language)
) {
requestedEmojiKeywordLangsRef.current.add(language);
loadEmojiKeywords({ language });
}
});

loadCountryList({ langCode: lang.code });
}
}, [lang.code, isMasterTab]);
}, [lang.code, lang.rawCode, isMasterTab]);

// Re-fetch cached saved emoji for `localDb`
useEffect(() => {
Expand Down
18 changes: 16 additions & 2 deletions src/components/middle/composer/AttachmentModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,10 @@ const ATTACHMENT_MODAL_INPUT_ID = 'caption-input-text';
const DROP_LEAVE_TIMEOUT_MS = 150;
const MAX_LEFT_CHARS_TO_SHOW = 100;
const CLOSE_MENU_ANIMATION_DURATION = 200;
const BROWSER_EMOJI_KEYWORD_LANG_FULL = typeof navigator !== 'undefined'
? navigator.language.toLowerCase()
: undefined;
const BROWSER_EMOJI_KEYWORD_LANG_SHORT = BROWSER_EMOJI_KEYWORD_LANG_FULL?.split('-')[0];

const AttachmentModal = ({
chatId,
Expand Down Expand Up @@ -937,16 +941,26 @@ export default memo(withGlobal<OwnProps>(
const isChatWithSelf = selectIsChatWithSelf(global, chatId);
const { shouldSuggestCustomEmoji } = global.settings.byKey;
const { language } = selectSharedSettings(global);
const normalizedLanguage = language.toLowerCase();
const normalizedLanguageShort = normalizedLanguage.split('-')[0];
const baseEmojiKeywords = global.emojiKeywords[BASE_EMOJI_KEYWORD_LANG];
const emojiKeywords = language !== BASE_EMOJI_KEYWORD_LANG ? global.emojiKeywords[language] : undefined;
const languageCandidates = [
normalizedLanguage,
normalizedLanguageShort,
BROWSER_EMOJI_KEYWORD_LANG_FULL,
BROWSER_EMOJI_KEYWORD_LANG_SHORT,
].filter(Boolean) as string[];
const emojiKeywords = languageCandidates.find((langCode) => (
langCode !== BASE_EMOJI_KEYWORD_LANG && global.emojiKeywords[langCode]
));

return {
isChatWithSelf,
currentUserId,
groupChatMembers: chatFullInfo?.members,
recentEmojis,
baseEmojiKeywords: baseEmojiKeywords?.keywords,
emojiKeywords: emojiKeywords?.keywords,
emojiKeywords: emojiKeywords ? global.emojiKeywords[emojiKeywords]?.keywords : undefined,
shouldSuggestCustomEmoji,
customEmojiForEmoji: customEmojis.forEmoji.stickers,
captionLimit: selectCurrentLimit(global, 'captionLength'),
Expand Down
6 changes: 5 additions & 1 deletion src/components/middle/composer/EmojiButton.scss
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,15 @@
line-height: inherit;
}

&.focus,
&:hover {
background-color: var(--color-background-selected);
}

&.focus {
background-color: var(--color-background-selected);
box-shadow: inset 0 0 0 999px rgba(0, 0, 0, 0.08);
}

& > img {
width: 2rem;
height: 2rem;
Expand Down
3 changes: 2 additions & 1 deletion src/components/middle/composer/EmojiTooltip.scss
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
overflow-y: hidden;
display: flex;
padding: 0;
width: fit-content;
max-width: 100%;

.EmojiButton {
flex: 0 0 2.25rem;
margin-right: 0;
}
}
38 changes: 29 additions & 9 deletions src/components/middle/composer/EmojiTooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ const VIEWPORT_MARGIN = 8;
const EMOJI_BUTTON_WIDTH = 44;
const CLOSE_DURATION = 350;

function setItemVisible(index: number, containerRef: Record<string, any>) {
function setItemVisible(index: number, prevIndex: number | undefined, containerRef: Record<string, any>) {
const container = containerRef.current!;
if (!container) {
return;
Expand All @@ -41,15 +41,35 @@ function setItemVisible(index: number, containerRef: Record<string, any>) {
true,
);

if (!allElements.length || !allElements[index]) {
if (!allElements.length || !allElements[index] || !visibleIndexes.length) {
return;
}
const first = visibleIndexes[0];
if (!visibleIndexes.includes(index)
|| (index === first && !isFullyVisible(container, allElements[first], true))) {
const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';
const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;

if (prevIndex === undefined || prevIndex === -1 || Math.abs(index - prevIndex) !== 1) {
const first = visibleIndexes[0];
if (!visibleIndexes.includes(index)
|| (index === first && !isFullyVisible(container, allElements[first], true))) {
const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';
const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;
animateHorizontalScroll(container, newLeft);
}
return;
}

const middlePosition = Math.floor(visibleIndexes.length / 2);
const middleIndex = visibleIndexes[middlePosition];
const maxScrollLeft = Math.max(0, container.scrollWidth - container.clientWidth);

if (index > prevIndex) {
if (index >= middleIndex + 1) {
const newLeft = Math.min(maxScrollLeft, container.scrollLeft + EMOJI_BUTTON_WIDTH);
animateHorizontalScroll(container, newLeft);
}
return;
}

if (index <= middleIndex - 1) {
const newLeft = Math.max(0, container.scrollLeft - EMOJI_BUTTON_WIDTH);
animateHorizontalScroll(container, newLeft);
}
}
Expand Down Expand Up @@ -127,11 +147,11 @@ const EmojiTooltip: FC<OwnProps> = ({
});

useEffectWithPrevDeps(([prevSelectedIndex]) => {
if (prevSelectedIndex === undefined || prevSelectedIndex === -1) {
if (prevSelectedIndex === undefined) {
return;
}

setItemVisible(selectedIndex, containerRef);
setItemVisible(selectedIndex, prevSelectedIndex, containerRef);
}, [selectedIndex]);

const className = buildClassName(
Expand Down
Loading