1- import React , { useCallback , useMemo } from 'react' ;
1+ import React , { useMemo } from 'react' ;
22
33import { 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' ;
1512import { useTheme } from '../../../../contexts/themeContext/ThemeContext' ;
16- import {
17- ThreadContextValue ,
18- useThreadContext ,
19- } from '../../../../contexts/threadContext/ThreadContext' ;
13+ import { useThreadContext } from '../../../../contexts/threadContext/ThreadContext' ;
2014import { useTranslationContext } from '../../../../contexts/translationContext/TranslationContext' ;
15+ import { useStableCallback } from '../../../../hooks' ;
2116import { ArrowUpRight } from '../../../../icons/ArrowUpRight' ;
2217import { 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
2832const 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-
9658const MemoizedSentToChannelHeader = React . memo (
9759 SentToChannelHeaderWithContext ,
98- areEqual ,
9960) as typeof SentToChannelHeaderWithContext ;
10061
10162export 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