Skip to content

Commit 95b631e

Browse files
authored
Merge pull request #19445 from wireapp/chore/merge_dev_again
chore: merge dev branch into master
2 parents 361cec3 + 491a4fa commit 95b631e

File tree

6 files changed

+39
-24
lines changed

6 files changed

+39
-24
lines changed

.github/workflows/pull_translations.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ jobs:
2828
run: yarn --immutable
2929

3030
- name: Sync translations
31-
uses: crowdin/github-action@v2.9.1
31+
uses: crowdin/github-action@v2.10.0
3232
env:
3333
GITHUB_TOKEN: ${{secrets.OTTO_THE_BOT_GH_TOKEN}}
3434
GITHUB_ACTOR: otto-the-bot

.github/workflows/sync_translations.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ jobs:
3737
run: yarn translate:merge
3838

3939
- name: Download translations
40-
uses: crowdin/github-action@v2.9.1
40+
uses: crowdin/github-action@v2.10.0
4141
env:
4242
GITHUB_TOKEN: ${{secrets.OTTO_THE_BOT_GH_TOKEN}}
4343
CROWDIN_PROJECT_ID: 342359

src/i18n/de-DE.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -910,7 +910,7 @@
910910
"dataSharingModalDecline": "Ablehnen",
911911
"dataSharingModalDescription": "Helfen Sie mit, Wire zu verbessern, indem Sie Ihre Nutzungsdaten über eine pseudonyme ID mit uns teilen. Die Daten werden weder mit Ihren persönlichen Informationen verknüpft noch an Dritte außer der Wire Gruppe weitergegeben. Sie beinhalten zum Beispiel, wann Sie eine Funktion nutzen, Ihre App-Version, den Gerätetyp oder Ihr Betriebssystem. Diese Daten werden spätestens nach 365 Tagen gelöscht.<br />Weitere Einzelheiten finden Sie in unserer [link]Datenschutzerklärung[/link]. Sie können Ihre Zustimmung jederzeit widerrufen.",
912912
"dataSharingModalTitle": "Einwilligung zum Teilen von Nutzungsdaten",
913-
"deletedUser": "Deleted User",
913+
"deletedUser": "Gelöschter Nutzer",
914914
"downloadLatestMLS": "Laden Sie die neueste MLS-Wire-Version herunter",
915915
"enumerationAnd": " und ",
916916
"ephemeralRemaining": "verbleibend",
@@ -1981,7 +1981,7 @@
19811981
"videoCallOverlayShareScreen": "Bildschirm teilen",
19821982
"videoCallOverlayShowParticipantsList": "Teilnehmerliste anzeigen",
19831983
"videoCallOverlayViewModeAll": "Alle Teilnehmer anzeigen",
1984-
"videoCallOverlayViewModeLabel": "View mode",
1984+
"videoCallOverlayViewModeLabel": "Ansicht",
19851985
"videoCallOverlayViewModeSpeakers": "Nur aktive Sprecher anzeigen",
19861986
"videoCallParticipantConnecting": "Verbinden…",
19871987
"videoCallParticipantLowerYourHand": "Hand senken",
@@ -1992,9 +1992,9 @@
19921992
"videoCallParticipantRaisedSortByTime": "Die erste Person auf der Liste hob zuerst die Hand.",
19931993
"videoCallParticipantRaisedTheirHandUp": "{name} hat die Hand gehoben",
19941994
"videoCallPaused": "Video wurde angehalten",
1995-
"videoCallScreenShareEndConfirm": "End screen share",
1996-
"videoCallScreenShareEndConfirmDescription": "If you minimize the window, your screen share will end.",
1997-
"videoCallScreenShareEnded": "Your screen share has ended.",
1995+
"videoCallScreenShareEndConfirm": "Bildschirmfreigabe beenden",
1996+
"videoCallScreenShareEndConfirmDescription": "Wenn Sie das Anruf-Fenster verkleinern, endet die Bildschirmfreigabe.",
1997+
"videoCallScreenShareEnded": "Ihre Bildschirmfreigabe wurde beendet.",
19981998
"videoCallScreenShareNotSupported": "Bildschirmfreigabe wird von diesem Browser nicht unterstützt",
19991999
"videoCallaudioInputMicrophone": "Mikrofon",
20002000
"videoCallaudioOutputSpeaker": "Lautsprecher",

src/script/components/MessagesList/VirtualizedMessagesList/VirtualizedMessagesList.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*
1818
*/
1919

20-
import {MutableRefObject, useEffect, useState} from 'react';
20+
import {MutableRefObject, useEffect, useMemo, useState} from 'react';
2121

2222
import {useVirtualizer} from '@tanstack/react-virtual';
2323
import cx from 'classnames';
@@ -38,7 +38,7 @@ import {useKoSubscribableChildren} from 'Util/ComponentUtil';
3838

3939
import {VirtualizedJumpToLastMessageButton} from '../VirtualizedJumpToLastMessageButton';
4040

41-
const ESTIMATED_ELEMENT_SIZE = 36;
41+
const ESTIMATED_ELEMENT_SIZE = 48;
4242

4343
interface Props extends Omit<MessagesListParams, 'isRightSidebarOpen' | 'onLoading' | 'isConversationLoaded'> {
4444
parentElement: HTMLDivElement;
@@ -87,7 +87,10 @@ export const VirtualizedMessagesList = ({
8787
]);
8888

8989
const filteredMessages = filterMessages(allMessages);
90-
const groupedMessages = groupMessagesBySenderAndTime(filteredMessages, conversationLastReadTimestamp.current);
90+
91+
const groupedMessages = useMemo(() => {
92+
return groupMessagesBySenderAndTime(filteredMessages, conversationLastReadTimestamp.current);
93+
}, [conversationLastReadTimestamp, filteredMessages]);
9194

9295
const initialMessageId = conversation.initialMessage()?.id;
9396

@@ -223,9 +226,9 @@ export const VirtualizedMessagesList = ({
223226

224227
return (
225228
<div
229+
key={virtualItem.key}
226230
data-index={virtualItem.index}
227231
ref={virtualizer.measureElement}
228-
key={virtualItem.index}
229232
style={{
230233
position: 'absolute',
231234
width: '100%',

src/script/components/MessagesList/VirtualizedMessagesList/useLoadMessages.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {Conversation} from 'Repositories/entity/Conversation';
2626
import {useKoSubscribableChildren} from 'Util/ComponentUtil';
2727
import {isLastReceivedMessage} from 'Util/conversationMessages';
2828

29-
const SCROLL_THRESHOLD = 30;
29+
const SCROLL_THRESHOLD = 10;
3030

3131
interface Props {
3232
conversation: Conversation;

src/script/components/MessagesList/VirtualizedMessagesList/useScrollMessages.ts

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,28 @@ interface Props {
3232
setAlreadyScrolledToLastMessage: (scrolled: boolean) => void;
3333
}
3434

35+
function shouldStickToBottomFromPrev(
36+
virtualizer: Virtualizer<HTMLDivElement, Element>,
37+
prevTotalSize: number,
38+
threshold = 100,
39+
) {
40+
const el = virtualizer.options.getScrollElement?.();
41+
if (!el) {
42+
return false;
43+
}
44+
45+
const scrollBottomPosition = (virtualizer.scrollOffset || 0) + el.clientHeight;
46+
const distanceFromPrevBottom = Math.max(0, prevTotalSize - scrollBottomPosition);
47+
48+
return distanceFromPrevBottom < threshold;
49+
}
50+
3551
export const useScrollMessages = (
3652
virtualizer: Virtualizer<HTMLDivElement, Element>,
3753
{messages, highlightedMessage, userId, conversationLastReadTimestamp, setAlreadyScrolledToLastMessage}: Props,
3854
) => {
3955
const prevNbMessages = useRef(0);
40-
const newNbMessages = messages.length;
56+
const prevTotalSizeRef = useRef(0);
4157

4258
const initiallyScrolled = useRef(false);
4359
const newMessagesCount = useRef(messages.length);
@@ -82,25 +98,19 @@ export const useScrollMessages = (
8298
const [scrollToHighlightedMessage, setScrollToHighlightedMessage] = useState(false);
8399

84100
useLayoutEffect(() => {
85-
if (messages.length === 0) {
101+
if (!initiallyScrolled.current && messages.length === 0) {
86102
return;
87103
}
88104

89-
const lastMessageItem = messages[newNbMessages - 1];
105+
const lastMessageItem = messages[messages.length - 1];
90106

91107
if (isMarker(lastMessageItem)) {
92108
return;
93109
}
94110

95111
const lastMessage = lastMessageItem?.message;
96112

97-
const element = virtualizer.scrollElement;
98-
const scrollTop = element?.scrollTop || 0;
99-
const scrollHeight = element?.scrollHeight || 0;
100-
const clientHeight = element?.clientHeight || 0;
101-
102-
const distanceFromBottom = scrollHeight - scrollTop - clientHeight;
103-
const shouldStickToBottom = distanceFromBottom < 100;
113+
const shouldStickToBottom = shouldStickToBottomFromPrev(virtualizer, prevTotalSizeRef.current, 100);
104114

105115
if (highlightedMessage && !scrollToHighlightedMessage) {
106116
// If we have an element we want to focus
@@ -114,7 +124,8 @@ export const useScrollMessages = (
114124
}
115125
} else if (shouldStickToBottom) {
116126
// We only want to animate the scroll if there are new messages in the list
117-
const nbNewMessages = newNbMessages - prevNbMessages.current;
127+
const nbNewMessages = messages.length - prevNbMessages.current;
128+
118129
if (nbNewMessages >= 1) {
119130
// Simple content update, we just scroll to bottom if we are in the stick to bottom threshold
120131
const index = messages.findIndex(message => !isMarker(message) && message.message.id === lastMessage.id);
@@ -135,5 +146,6 @@ export const useScrollMessages = (
135146
}
136147

137148
prevNbMessages.current = messages.length;
138-
}, [highlightedMessage, messages, virtualizer, userId, newNbMessages, scrollToHighlightedMessage]);
149+
prevTotalSizeRef.current = virtualizer.getTotalSize();
150+
}, [highlightedMessage, messages, virtualizer, userId, scrollToHighlightedMessage]);
139151
};

0 commit comments

Comments
 (0)