Skip to content

Commit abf6cd8

Browse files
authored
fix: thread reaction list rerender and add prop to enable/disable press on parent message (#2575)
1 parent 8d0e5a4 commit abf6cd8

File tree

7 files changed

+55
-13
lines changed

7 files changed

+55
-13
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Boolean to enable/disable parent message press.
2+
3+
| Type | Default |
4+
| ------- | ------- |
5+
| Boolean | `true` |

docusaurus/docs/reactnative/contexts/thread-context.mdx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Thread from '../common-content/ui-components/channel/props/thread.mdx';
99
import CloseThread from '../common-content/contexts/thread-context/close_thread.mdx';
1010
import LoadMoreThread from '../common-content/contexts/thread-context/load_more_thread.mdx';
1111
import OpenThread from '../common-content/contexts/thread-context/open_thread.mdx';
12+
import ParentMessagePreventPress from '../common-content/contexts/thread-context/parent_message_prevent_press.mdx';
1213
import ReloadThread from '../common-content/contexts/thread-context/reload_thread.mdx';
1314
import SetThreadLoadingMore from '../common-content/contexts/thread-context/set_thread_loading_more.mdx';
1415
import ThreadHasMore from '../common-content/contexts/thread-context/thread_has_more.mdx';
@@ -38,7 +39,7 @@ const value = useThreadContext();
3839

3940
## Value
4041

41-
### <div class="label description">_forwarded from [Channel](../../core-components/channel#allowthreadmessagesinchannel)_ props</div> allowThreadMessagesInChannel {#allowthreadmessagesinchannel}
42+
### <div class="label description">_forwarded from [Channel](../../core-components/channel#allowthreadmessagesinchannel)_ props</div> allowThreadMessagesInChannel `{#allowthreadmessagesinchannel}`
4243

4344
<AllowThreadMessagesInChannel />
4445

@@ -54,6 +55,10 @@ const value = useThreadContext();
5455

5556
<OpenThread />
5657

58+
### `parentMessagePreventPress`
59+
60+
<ParentMessagePreventPress />
61+
5762
### `reloadThread`
5863

5964
<ReloadThread />

docusaurus/docs/reactnative/ui-components/thread.mdx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Thread from '../common-content/ui-components/channel/props/thread.mdx';
99

1010
import CloseThread from '../common-content/contexts/thread-context/close_thread.mdx';
1111
import LoadMoreThread from '../common-content/contexts/thread-context/load_more_thread.mdx';
12+
import ParentMessagePreventPress from '../common-content/contexts/thread-context/parent_message_prevent_press.mdx';
1213
import ReloadThread from '../common-content/contexts/thread-context/reload_thread.mdx';
1314

1415
Component to render thread replies for a message, along with and input box for adding new thread replies. This component internally uses `MessageList` and `MessageInput` components.
@@ -70,7 +71,7 @@ Closes thread on dismount, defaults to `true`.
7071

7172
<Client />
7273

73-
### <div class="label description">overrides the value from [ThreadContext](../../contexts/thread-context#closeThread)</div> `closeThread` {#closeThread}
74+
### <div class="label description">overrides the value from [ThreadContext](../../contexts/thread-context#closethread)</div> `closeThread` {#closeThread}
7475

7576
<CloseThread />
7677

@@ -82,7 +83,7 @@ When true, the underlying input box will be disabled.
8283
| ------- | ------- |
8384
| Boolean | `false` |
8485

85-
### <div class="label description">overrides the value from [ThreadContext](../../contexts/thread-context#loadMoreThread)</div> `loadMoreThread` {#loadMoreThread}
86+
### <div class="label description">overrides the value from [ThreadContext](../../contexts/thread-context#loadmorethread)</div> `loadMoreThread` {#loadMoreThread}
8687

8788
<LoadMoreThread />
8889

@@ -94,7 +95,11 @@ Function which gets called when Thread component un-mounts.
9495
| -------- |
9596
| Function |
9697

97-
### <div class="label description">overrides the value from [ThreadContext](../../contexts/thread-context#reloadThread)</div> `reloadThread` {#reloadThread}
98+
### <div class="label description">overrides the value from [ThreadContext](../../contexts/thread-context#parentmessagepreventpress)</div> `parentMessagePreventPress` {#parentMessagePreventPress}
99+
100+
<ParentMessagePreventPress />
101+
102+
### <div class="label description">overrides the value from [ThreadContext](../../contexts/thread-context#reloadthread)</div> `reloadthread` {#reloadThread}
98103

99104
<ReloadThread />
100105

package/src/components/Channel/hooks/useCreateThreadContext.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const useCreateThreadContext = <
2020
}: ThreadContextValue<StreamChatGenerics>) => {
2121
const threadId = thread?.id;
2222
const threadReplyCount = thread?.reply_count;
23+
const threadLatestReactions = thread?.latest_reactions;
2324
const threadMessagesStr = reduceMessagesToString(threadMessages);
2425

2526
const threadContext: ThreadContextValue<StreamChatGenerics> = useMemo(
@@ -42,6 +43,7 @@ export const useCreateThreadContext = <
4243
threadLoadingMore,
4344
threadMessagesStr,
4445
threadReplyCount,
46+
threadLatestReactions,
4547
],
4648
);
4749

package/src/components/Thread/Thread.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type ThreadPropsWithContext<
2323
Pick<MessagesContextValue<StreamChatGenerics>, 'MessageList'> &
2424
Pick<
2525
ThreadContextValue<StreamChatGenerics>,
26-
'closeThread' | 'loadMoreThread' | 'reloadThread' | 'thread'
26+
'closeThread' | 'loadMoreThread' | 'parentMessagePreventPress' | 'reloadThread' | 'thread'
2727
> & {
2828
/**
2929
* Additional props for underlying MessageInput component.
@@ -68,6 +68,7 @@ const ThreadWithContext = <
6868
MessageInput = DefaultMessageInput,
6969
MessageList,
7070
onThreadDismount,
71+
parentMessagePreventPress = true,
7172
thread,
7273
} = props;
7374

@@ -98,7 +99,9 @@ const ThreadWithContext = <
9899
return (
99100
<React.Fragment key={`thread-${thread.id}`}>
100101
<MessageList
101-
FooterComponent={ThreadFooterComponent}
102+
FooterComponent={() => (
103+
<ThreadFooterComponent parentMessagePreventPress={parentMessagePreventPress} />
104+
)}
102105
threadList
103106
{...additionalMessageListProps}
104107
/>

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

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@ const styles = StyleSheet.create({
3838
type ThreadFooterComponentPropsWithContext<
3939
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
4040
> = Pick<MessagesContextValue<StreamChatGenerics>, 'Message'> &
41-
Pick<ThreadContextValue<StreamChatGenerics>, 'thread'>;
41+
Pick<ThreadContextValue<StreamChatGenerics>, 'parentMessagePreventPress' | 'thread'>;
4242

4343
const ThreadFooterComponentWithContext = <
4444
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
4545
>(
4646
props: ThreadFooterComponentPropsWithContext<StreamChatGenerics>,
4747
) => {
48-
const { Message, thread } = props;
48+
const { Message, parentMessagePreventPress, thread } = props;
4949
const { t } = useTranslationContext();
5050
const { vw } = useViewport();
5151

@@ -71,7 +71,12 @@ const ThreadFooterComponentWithContext = <
7171
return (
7272
<View style={styles.threadHeaderContainer} testID='thread-footer-component'>
7373
<View style={styles.messagePadding}>
74-
<Message groupStyles={['single']} message={thread} preventPress threadList />
74+
<Message
75+
groupStyles={['single']}
76+
message={thread}
77+
preventPress={parentMessagePreventPress}
78+
threadList
79+
/>
7580
</View>
7681
<View style={[styles.newThread, newThread]}>
7782
<Svg height={threadHeight ?? 24} style={styles.absolute} width={vw(100)}>
@@ -114,8 +119,12 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
114119
prevProps: ThreadFooterComponentPropsWithContext<StreamChatGenerics>,
115120
nextProps: ThreadFooterComponentPropsWithContext<StreamChatGenerics>,
116121
) => {
117-
const { thread: prevThread } = prevProps;
118-
const { thread: nextThread } = nextProps;
122+
const { parentMessagePreventPress: prevParentMessagePreventPress, thread: prevThread } =
123+
prevProps;
124+
const { parentMessagePreventPress: nextParentMessagePreventPress, thread: nextThread } =
125+
nextProps;
126+
127+
if (prevParentMessagePreventPress !== nextParentMessagePreventPress) return false;
119128

120129
const threadEqual =
121130
prevThread?.id === nextThread?.id &&
@@ -143,18 +152,27 @@ const MemoizedThreadFooter = React.memo(
143152
areEqual,
144153
) as typeof ThreadFooterComponentWithContext;
145154

155+
export type ThreadFooterComponentProps<
156+
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
157+
> = Partial<Pick<MessagesContextValue<StreamChatGenerics>, 'Message'>> &
158+
Partial<Pick<ThreadContextValue<StreamChatGenerics>, 'parentMessagePreventPress' | 'thread'>>;
159+
146160
export const ThreadFooterComponent = <
147161
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
148-
>() => {
162+
>(
163+
props: ThreadFooterComponentProps<StreamChatGenerics>,
164+
) => {
149165
const { Message } = useMessagesContext<StreamChatGenerics>();
150-
const { thread } = useThreadContext<StreamChatGenerics>();
166+
const { parentMessagePreventPress, thread } = useThreadContext<StreamChatGenerics>();
151167

152168
return (
153169
<MemoizedThreadFooter
154170
{...{
155171
Message,
172+
parentMessagePreventPress,
156173
thread,
157174
}}
175+
{...props}
158176
/>
159177
);
160178
};

package/src/contexts/threadContext/ThreadContext.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ export type ThreadContextValue<
2222
threadHasMore: boolean;
2323
threadLoadingMore: boolean;
2424
threadMessages: ChannelState<StreamChatGenerics>['threads'][string];
25+
/**
26+
* Boolean to enable/disable parent message press
27+
*/
28+
parentMessagePreventPress?: boolean;
2529
};
2630

2731
export const ThreadContext = React.createContext(DEFAULT_BASE_CONTEXT_VALUE as ThreadContextValue);

0 commit comments

Comments
 (0)