@@ -48,24 +48,32 @@ private val previewWaveform = listOf(
4848private const val QUOTE_HIGHLIGHT_HOLD_MILLIS = 700L
4949private const val QUOTE_HIGHLIGHT_FADE_OUT_MILLIS = 1500
5050
51+ data class ChatMessageContext (
52+ val isOneToOneConversation : Boolean = false ,
53+ val conversationThreadId : Long? = null ,
54+ val hasChatPermission : Boolean = true
55+ )
56+
57+ class ChatMessageCallbacks (
58+ val onLongClick : ((Int ) -> Unit? )? = null ,
59+ val onSwipeReply : ((Int ) -> Unit )? = null ,
60+ val onFileClick : (Int ) -> Unit = {},
61+ val onPollClick : (String , String ) -> Unit = { _, _ -> },
62+ val onVoicePlayPauseClick : (Int ) -> Unit = {},
63+ val onVoiceSeek : (Int , Int ) -> Unit = { _, _ -> },
64+ val onVoiceSpeedClick : (Int ) -> Unit = {},
65+ val onReactionClick : (Int , String ) -> Unit = { _, _ -> },
66+ val onReactionLongClick : (Int ) -> Unit = {},
67+ val onOpenThreadClick : (Int ) -> Unit = {},
68+ val onQuotedMessageClick : (Int ) -> Unit = {}
69+ )
70+
5171@Composable
5272fun ChatMessageView (
5373 message : ChatMessageUi ,
5474 highlightTriggerKey : Long? = null,
55- isOneToOneConversation : Boolean = false,
56- conversationThreadId : Long? = null,
57- onLongClick : ((Int ) -> Unit? )? = null,
58- onSwipeReply : ((Int ) -> Unit )? = null,
59- hasChatPermission : Boolean = true,
60- onFileClick : (Int ) -> Unit = {},
61- onPollClick : (pollId: String , pollName: String ) -> Unit = { _, _ -> },
62- onVoicePlayPauseClick : (Int ) -> Unit = {},
63- onVoiceSeek : (messageId: Int , progress: Int ) -> Unit = { _, _ -> },
64- onVoiceSpeedClick : (Int ) -> Unit = {},
65- onReactionClick : (messageId: Int , emoji: String ) -> Unit = { _, _ -> },
66- onReactionLongClick : (messageId: Int ) -> Unit = {},
67- onOpenThreadClick : (messageId: Int ) -> Unit = {},
68- onQuotedMessageClick : (messageId: Int ) -> Unit = {}
75+ context : ChatMessageContext = ChatMessageContext (),
76+ callbacks : ChatMessageCallbacks = ChatMessageCallbacks ()
6977) {
7078 val interactionSource = remember { MutableInteractionSource () }
7179 val lastHandledHighlightKey = rememberSaveable(message.id) { mutableStateOf<Long ?>(null ) }
@@ -84,30 +92,30 @@ fun ChatMessageView(
8492 }
8593
8694 CompositionLocalProvider (
87- LocalReactionClickHandler provides onReactionClick,
88- LocalReactionLongClickHandler provides onReactionLongClick,
89- LocalOpenThreadHandler provides onOpenThreadClick,
90- LocalQuotedMessageClickHandler provides onQuotedMessageClick
95+ LocalReactionClickHandler provides callbacks. onReactionClick,
96+ LocalReactionLongClickHandler provides callbacks. onReactionLongClick,
97+ LocalOpenThreadHandler provides callbacks. onOpenThreadClick,
98+ LocalQuotedMessageClickHandler provides callbacks. onQuotedMessageClick
9199 ) {
92100 SwipeToReplyContainer (
93- replyable = message.replyable && hasChatPermission,
94- onSwipeReply = { onSwipeReply?.invoke(message.id) }
101+ replyable = message.replyable && context. hasChatPermission,
102+ onSwipeReply = { callbacks. onSwipeReply?.invoke(message.id) }
95103 ) {
96104 Box (
97105 modifier = Modifier
98106 .combinedClickable(
99107 interactionSource = interactionSource,
100108 indication = ripple(),
101- onClick = { onLongClick?.invoke(message.id) },
102- onLongClick = { onLongClick?.invoke(message.id) }
109+ onClick = { callbacks. onLongClick?.invoke(message.id) },
110+ onLongClick = { callbacks. onLongClick?.invoke(message.id) }
103111 )
104112 ) {
105113 when (val content = message.content) {
106114 MessageTypeContent .RegularText -> {
107115 TextMessage (
108116 uiMessage = message,
109- isOneToOneConversation = isOneToOneConversation,
110- conversationThreadId = conversationThreadId
117+ isOneToOneConversation = context. isOneToOneConversation,
118+ conversationThreadId = context. conversationThreadId
111119 )
112120 }
113121
@@ -119,58 +127,58 @@ fun ChatMessageView(
119127 MediaMessage (
120128 typeContent = content,
121129 message = message,
122- isOneToOneConversation = isOneToOneConversation,
123- conversationThreadId = conversationThreadId,
124- onImageClick = onFileClick
130+ isOneToOneConversation = context. isOneToOneConversation,
131+ conversationThreadId = context. conversationThreadId,
132+ onImageClick = callbacks. onFileClick
125133 )
126134 }
127135
128136 is MessageTypeContent .LinkPreview -> {
129137 LinkMessage (
130138 typeContent = content,
131139 message = message,
132- isOneToOneConversation = isOneToOneConversation,
133- conversationThreadId = conversationThreadId
140+ isOneToOneConversation = context. isOneToOneConversation,
141+ conversationThreadId = context. conversationThreadId
134142 )
135143 }
136144
137145 is MessageTypeContent .Geolocation -> {
138146 GeolocationMessage (
139147 typeContent = content,
140148 message = message,
141- isOneToOneConversation = isOneToOneConversation,
142- conversationThreadId = conversationThreadId
149+ isOneToOneConversation = context. isOneToOneConversation,
150+ conversationThreadId = context. conversationThreadId
143151 )
144152 }
145153
146154 is MessageTypeContent .Voice -> {
147155 VoiceMessage (
148156 typeContent = content,
149157 message = message,
150- isOneToOneConversation = isOneToOneConversation,
151- conversationThreadId = conversationThreadId,
152- onPlayPauseClick = onVoicePlayPauseClick,
153- onSeek = onVoiceSeek,
154- onSpeedClick = onVoiceSpeedClick
158+ isOneToOneConversation = context. isOneToOneConversation,
159+ conversationThreadId = context. conversationThreadId,
160+ onPlayPauseClick = callbacks. onVoicePlayPauseClick,
161+ onSeek = callbacks. onVoiceSeek,
162+ onSpeedClick = callbacks. onVoiceSpeedClick
155163 )
156164 }
157165
158166 is MessageTypeContent .Poll -> {
159167 PollMessage (
160168 typeContent = content,
161169 message = message,
162- isOneToOneConversation = isOneToOneConversation,
163- conversationThreadId = conversationThreadId,
164- onPollClick = onPollClick
170+ isOneToOneConversation = context. isOneToOneConversation,
171+ conversationThreadId = context. conversationThreadId,
172+ onPollClick = callbacks. onPollClick
165173 )
166174 }
167175
168176 is MessageTypeContent .Deck -> {
169177 DeckMessage (
170178 typeContent = content,
171179 message = message,
172- isOneToOneConversation = isOneToOneConversation,
173- conversationThreadId = conversationThreadId
180+ isOneToOneConversation = context. isOneToOneConversation,
181+ conversationThreadId = context. conversationThreadId
174182 )
175183 }
176184
0 commit comments