Skip to content

Commit ef46aac

Browse files
authored
fix: thread list variety bugs (#3033)
* fix: double thread message upsertion * fix: thread footer not updating reply count in realtime
1 parent 2a9d168 commit ef46aac

File tree

4 files changed

+40
-19
lines changed

4 files changed

+40
-19
lines changed

package/expo-package/yarn.lock

+4-4
Original file line numberDiff line numberDiff line change
@@ -4733,10 +4733,10 @@ stream-buffers@2.2.x, stream-buffers@~2.2.0:
47334733
resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4"
47344734
integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==
47354735

4736-
stream-chat-react-native-core@6.6.8:
4737-
version "6.6.8"
4738-
resolved "https://registry.yarnpkg.com/stream-chat-react-native-core/-/stream-chat-react-native-core-6.6.8.tgz#483ade63ba051426480ab2dfd8ab3b248b90ae88"
4739-
integrity sha512-F8S70DHaiit6BEdKOkSMHq2bjMONhrouvJ+szBQuE430EJDgUlc2VErHk3yJCzqIt5lwfVZktjHuqSIOGVg5LQ==
4736+
stream-chat-react-native-core@6.7.0:
4737+
version "6.7.0"
4738+
resolved "https://registry.yarnpkg.com/stream-chat-react-native-core/-/stream-chat-react-native-core-6.7.0.tgz#d9e8c8ca57db93f148ef8acab93d3552f425eb36"
4739+
integrity sha512-Ue/euBMJ2h/H33hp58znfOMFzocgyW+dqvS8qiCooO5RZ26zQYGSDvmp8TeYyiBpqwM927vqfrPmPqOeXb12IQ==
47404740
dependencies:
47414741
"@gorhom/bottom-sheet" "^5.1.1"
47424742
dayjs "1.10.5"

package/native-package/yarn.lock

+4-4
Original file line numberDiff line numberDiff line change
@@ -3409,10 +3409,10 @@ statuses@~1.5.0:
34093409
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
34103410
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
34113411

3412-
stream-chat-react-native-core@6.6.8:
3413-
version "6.6.8"
3414-
resolved "https://registry.yarnpkg.com/stream-chat-react-native-core/-/stream-chat-react-native-core-6.6.8.tgz#483ade63ba051426480ab2dfd8ab3b248b90ae88"
3415-
integrity sha512-F8S70DHaiit6BEdKOkSMHq2bjMONhrouvJ+szBQuE430EJDgUlc2VErHk3yJCzqIt5lwfVZktjHuqSIOGVg5LQ==
3412+
stream-chat-react-native-core@6.7.0:
3413+
version "6.7.0"
3414+
resolved "https://registry.yarnpkg.com/stream-chat-react-native-core/-/stream-chat-react-native-core-6.7.0.tgz#d9e8c8ca57db93f148ef8acab93d3552f425eb36"
3415+
integrity sha512-Ue/euBMJ2h/H33hp58znfOMFzocgyW+dqvS8qiCooO5RZ26zQYGSDvmp8TeYyiBpqwM927vqfrPmPqOeXb12IQ==
34163416
dependencies:
34173417
"@gorhom/bottom-sheet" "^5.1.1"
34183418
dayjs "1.10.5"

package/src/components/Channel/Channel.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -1382,8 +1382,6 @@ const ChannelWithContext = <
13821382
} else {
13831383
updateMessage(messageResponse.message);
13841384
}
1385-
1386-
threadInstance?.upsertReplyLocally?.({ message: messageResponse.message });
13871385
}
13881386
} catch (err) {
13891387
console.log(err);

package/src/components/Thread/components/ThreadFooterComponent.tsx

+32-9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import React from 'react';
22
import { ActivityIndicator, StyleSheet, Text, View } from 'react-native';
33
import Svg, { Defs, LinearGradient, Rect, Stop } from 'react-native-svg';
44

5+
import type { ThreadState } from 'stream-chat';
6+
57
import {
68
MessagesContextValue,
79
useMessagesContext,
@@ -12,6 +14,7 @@ import {
1214
useThreadContext,
1315
} from '../../../contexts/threadContext/ThreadContext';
1416
import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext';
17+
import { useStateStore } from '../../../hooks';
1518
import { useViewport } from '../../../hooks/useViewport';
1619
import type { DefaultStreamChatGenerics } from '../../../types/types';
1720

@@ -42,7 +45,10 @@ const styles = StyleSheet.create({
4245
type ThreadFooterComponentPropsWithContext<
4346
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
4447
> = Pick<MessagesContextValue<StreamChatGenerics>, 'Message'> &
45-
Pick<ThreadContextValue<StreamChatGenerics>, 'parentMessagePreventPress' | 'thread'>;
48+
Pick<
49+
ThreadContextValue<StreamChatGenerics>,
50+
'parentMessagePreventPress' | 'thread' | 'threadInstance'
51+
>;
4652

4753
export const InlineLoadingMoreThreadIndicator = () => {
4854
const { threadLoadingMore } = useThreadContext();
@@ -63,12 +69,17 @@ export const InlineLoadingMoreThreadIndicator = () => {
6369
);
6470
};
6571

72+
const selector = (nextValue: ThreadState) =>
73+
({
74+
replyCount: nextValue.replyCount,
75+
}) as const;
76+
6677
const ThreadFooterComponentWithContext = <
6778
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
6879
>(
6980
props: ThreadFooterComponentPropsWithContext<StreamChatGenerics>,
7081
) => {
71-
const { Message, parentMessagePreventPress, thread } = props;
82+
const { Message, parentMessagePreventPress, thread, threadInstance } = props;
7283
const { t } = useTranslationContext();
7384
const { vw } = useViewport();
7485

@@ -87,12 +98,12 @@ const ThreadFooterComponentWithContext = <
8798
},
8899
} = useTheme();
89100

101+
const { replyCount = thread?.reply_count } = useStateStore(threadInstance?.state, selector) ?? {};
102+
90103
if (!thread) {
91104
return null;
92105
}
93106

94-
const replyCount = thread.reply_count;
95-
96107
return (
97108
<View style={styles.threadHeaderContainer} testID='thread-footer-component'>
98109
<View style={styles.messagePadding}>
@@ -145,10 +156,16 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
145156
prevProps: ThreadFooterComponentPropsWithContext<StreamChatGenerics>,
146157
nextProps: ThreadFooterComponentPropsWithContext<StreamChatGenerics>,
147158
) => {
148-
const { parentMessagePreventPress: prevParentMessagePreventPress, thread: prevThread } =
149-
prevProps;
150-
const { parentMessagePreventPress: nextParentMessagePreventPress, thread: nextThread } =
151-
nextProps;
159+
const {
160+
parentMessagePreventPress: prevParentMessagePreventPress,
161+
thread: prevThread,
162+
threadInstance: prevThreadInstance,
163+
} = prevProps;
164+
const {
165+
parentMessagePreventPress: nextParentMessagePreventPress,
166+
thread: nextThread,
167+
threadInstance: nextThreadInstance,
168+
} = nextProps;
152169

153170
if (prevParentMessagePreventPress !== nextParentMessagePreventPress) {
154171
return false;
@@ -158,10 +175,15 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
158175
prevThread?.id === nextThread?.id &&
159176
prevThread?.text === nextThread?.text &&
160177
prevThread?.reply_count === nextThread?.reply_count;
178+
161179
if (!threadEqual) {
162180
return false;
163181
}
164182

183+
if (prevThreadInstance !== nextThreadInstance) {
184+
return false;
185+
}
186+
165187
const latestReactionsEqual =
166188
prevThread &&
167189
nextThread &&
@@ -195,7 +217,7 @@ export const ThreadFooterComponent = <
195217
props: ThreadFooterComponentProps<StreamChatGenerics>,
196218
) => {
197219
const { Message } = useMessagesContext<StreamChatGenerics>();
198-
const { parentMessagePreventPress, thread, threadLoadingMore } =
220+
const { parentMessagePreventPress, thread, threadInstance, threadLoadingMore } =
199221
useThreadContext<StreamChatGenerics>();
200222

201223
return (
@@ -204,6 +226,7 @@ export const ThreadFooterComponent = <
204226
Message,
205227
parentMessagePreventPress,
206228
thread,
229+
threadInstance,
207230
threadLoadingMore,
208231
}}
209232
{...props}

0 commit comments

Comments
 (0)