Skip to content

Commit 900154e

Browse files
committed
fix: sent to channel header memo issues
1 parent e032bc6 commit 900154e

File tree

1 file changed

+45
-67
lines changed

1 file changed

+45
-67
lines changed

package/src/components/Message/MessageSimple/Headers/SentToChannelHeader.tsx

Lines changed: 45 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useCallback, useMemo } from 'react';
1+
import React, { useMemo } from 'react';
22

33
import { Pressable, StyleSheet, Text, View } from 'react-native';
44

@@ -8,71 +8,45 @@ import {
88
ChannelContextValue,
99
useChannelContext,
1010
} from '../../../../contexts/channelContext/ChannelContext';
11-
import {
12-
MessageContextValue,
13-
useMessageContext,
14-
} from '../../../../contexts/messageContext/MessageContext';
11+
import { useMessageContext } from '../../../../contexts/messageContext/MessageContext';
1512
import { useTheme } from '../../../../contexts/themeContext/ThemeContext';
16-
import {
17-
ThreadContextValue,
18-
useThreadContext,
19-
} from '../../../../contexts/threadContext/ThreadContext';
13+
import { useThreadContext } from '../../../../contexts/threadContext/ThreadContext';
2014
import { useTranslationContext } from '../../../../contexts/translationContext/TranslationContext';
15+
import { useStableCallback } from '../../../../hooks';
2116
import { ArrowUpRight } from '../../../../icons/ArrowUpRight';
2217
import { primitives } from '../../../../theme';
2318

24-
type SentToChannelHeaderPropsWithContext = Pick<ThreadContextValue, 'onBackPressThread'> &
25-
Pick<ChannelContextValue, 'threadList' | 'channel' | 'setTargetedMessage'> &
26-
Pick<MessageContextValue, 'onThreadSelect' | 'message'>;
19+
type SentToChannelHeaderPropsWithContext = Pick<ChannelContextValue, 'threadList'> & {
20+
/**
21+
* Function to handle press on the sent to channel header
22+
* @returns void
23+
*/
24+
onPress: () => void;
25+
/**
26+
* Boolean to show the view text
27+
* @default false
28+
*/
29+
showViewText?: boolean;
30+
};
2731

2832
const SentToChannelHeaderWithContext = (props: SentToChannelHeaderPropsWithContext) => {
29-
const { onBackPressThread, threadList, onThreadSelect, message, channel, setTargetedMessage } =
30-
props;
33+
const { threadList, onPress, showViewText } = props;
3134
const {
3235
theme: { semantics },
3336
} = useTheme();
3437
const { t } = useTranslationContext();
3538
const styles = useStyles();
3639

37-
const handleOnPress = useCallback(async () => {
38-
if (!threadList) {
39-
return await channel
40-
.getClient()
41-
.search({ cid: channel.cid }, { id: message.parent_id })
42-
.then(({ results }) => {
43-
if (!results.length) {
44-
return;
45-
}
46-
const targetMessage = formatMessage(results[0].message);
47-
onThreadSelect?.(targetMessage, message.id);
48-
})
49-
.catch((error) => {
50-
console.error('Error querying parent message:', error);
51-
});
52-
} else {
53-
setTargetedMessage(message.id);
54-
onBackPressThread?.(message.id);
55-
}
56-
}, [
57-
channel,
58-
message.id,
59-
message.parent_id,
60-
onBackPressThread,
61-
onThreadSelect,
62-
setTargetedMessage,
63-
threadList,
64-
]);
65-
6640
return (
6741
<View accessibilityLabel='Message Saved For Later Header' style={styles.container}>
6842
<ArrowUpRight height={16} width={16} stroke={semantics.textPrimary} />
6943
<Text style={styles.label}>
7044
{threadList ? t('Also sent in channel') : t('Replied to a thread')}
7145
</Text>
72-
{(!threadList && onThreadSelect) || (threadList && onBackPressThread) ? (
46+
{showViewText ? (
7347
<>
7448
<Text style={styles.dot}>·</Text>
75-
<Pressable onPress={handleOnPress}>
49+
<Pressable onPress={onPress}>
7650
<Text style={styles.link}>{t('View')}</Text>
7751
</Pressable>
7852
</>
@@ -81,21 +55,8 @@ const SentToChannelHeaderWithContext = (props: SentToChannelHeaderPropsWithConte
8155
);
8256
};
8357

84-
const areEqual = (
85-
prevProps: SentToChannelHeaderPropsWithContext,
86-
nextProps: SentToChannelHeaderPropsWithContext,
87-
) => {
88-
const { threadList: prevThreadList } = prevProps;
89-
const { threadList: nextThreadList } = nextProps;
90-
if (prevThreadList !== nextThreadList) {
91-
return false;
92-
}
93-
return true;
94-
};
95-
9658
const MemoizedSentToChannelHeader = React.memo(
9759
SentToChannelHeaderWithContext,
98-
areEqual,
9960
) as typeof SentToChannelHeaderWithContext;
10061

10162
export type SentToChannelHeaderProps = Partial<SentToChannelHeaderPropsWithContext>;
@@ -105,16 +66,33 @@ export const SentToChannelHeader = (props: SentToChannelHeaderProps) => {
10566
const { threadList, channel, setTargetedMessage } = useChannelContext();
10667
const { onThreadSelect, message } = useMessageContext();
10768

69+
const handleOnPress = useStableCallback(async () => {
70+
if (!threadList) {
71+
return await channel
72+
.getClient()
73+
.search({ cid: channel.cid }, { id: message.parent_id })
74+
.then(({ results }) => {
75+
if (!results.length) {
76+
return;
77+
}
78+
const targetMessage = formatMessage(results[0].message);
79+
onThreadSelect?.(targetMessage, message.id);
80+
})
81+
.catch((error) => {
82+
console.error('Error querying parent message:', error);
83+
});
84+
} else {
85+
setTargetedMessage(message.id);
86+
onBackPressThread?.(message.id);
87+
}
88+
});
89+
90+
const showViewText = useMemo(() => {
91+
return !!((!threadList && onThreadSelect) || (threadList && onBackPressThread));
92+
}, [threadList, onThreadSelect, onBackPressThread]);
93+
10894
return (
109-
<MemoizedSentToChannelHeader
110-
onBackPressThread={onBackPressThread}
111-
threadList={threadList}
112-
onThreadSelect={onThreadSelect}
113-
message={message}
114-
channel={channel}
115-
setTargetedMessage={setTargetedMessage}
116-
{...props}
117-
/>
95+
<MemoizedSentToChannelHeader onPress={handleOnPress} showViewText={showViewText} {...props} />
11896
);
11997
};
12098

0 commit comments

Comments
 (0)