Skip to content

Commit 095df45

Browse files
committed
feat(fc): update message content actions to interface; update CTAs and reaction sheet
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 0e5ac00 commit 095df45

File tree

7 files changed

+165
-176
lines changed

7 files changed

+165
-176
lines changed

flipchatApp/src/main/kotlin/xyz/flipchat/app/features/chat/conversation/ConversationMessages.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,9 @@ internal fun ConversationMessages(
101101
Box(
102102
modifier = modifier,
103103
) {
104-
CompositionLocalProvider(LocalAnnouncementActionResolver provides {
105-
resolveAnnouncementAction(
106-
it
107-
)
108-
}) {
104+
CompositionLocalProvider(
105+
LocalAnnouncementActionResolver provides { resolveAnnouncementAction(it) }
106+
) {
109107
MessageList(
110108
modifier = Modifier
111109
.fillMaxSize()

flipchatApp/src/main/kotlin/xyz/flipchat/app/features/chat/conversation/MessageReactionsSheet.kt

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,11 @@ private sealed interface Feedback {
5959
data class All(override val data: FeedbackData.All) : Feedback
6060
}
6161

62+
private typealias GroupedTips = List<Pair<Sender, KinAmount>>
6263
private sealed interface FeedbackData {
63-
data class Tips(val tips: List<Pair<Sender, KinAmount>>) : FeedbackData
64+
data class Tips(val tips: GroupedTips) : FeedbackData
6465
data class Senders(val senders: List<Sender>) : FeedbackData
65-
data class All(val tips: List<MessageTip>, val reactions: List<MessageReaction>) : FeedbackData {
66+
data class All(val tips: List<Pair<Sender, KinAmount>>, val reactions: List<MessageReaction>) : FeedbackData {
6667
val totalCount: Int
6768
get() = reactions.count() + tips.count()
6869
}
@@ -77,9 +78,9 @@ internal data class MessageReactionsSheet(
7778
override fun Content() {
7879
val feedback = remember(tips, reactions) {
7980
val items = mutableListOf<Feedback>()
80-
81+
var groupedTips: GroupedTips = emptyList()
8182
if (tips.isNotEmpty()) {
82-
val groupedTips = tips.groupBy { it.tipper }
83+
groupedTips = tips.groupBy { it.tipper }
8384
.mapValues { it.value.map { it.amount }.sum() }
8485
.toList().sortedByDescending { it.second.fiat }
8586
items.add(Feedback.Tips(FeedbackData.Tips(groupedTips)))
@@ -91,8 +92,8 @@ internal data class MessageReactionsSheet(
9192
items.add(Feedback.Emoji(it.key, FeedbackData.Senders(it.value)))
9293
}
9394

94-
if ((tips.isNotEmpty() || reactions.isNotEmpty()) && items.count() > 1) {
95-
items.add(0, Feedback.All(FeedbackData.All(tips, reactions)))
95+
if ((groupedTips.isNotEmpty() || reactions.isNotEmpty()) && items.count() > 1) {
96+
items.add(0, Feedback.All(FeedbackData.All(groupedTips, reactions)))
9697
}
9798

9899
return@remember items
@@ -107,12 +108,14 @@ internal data class MessageReactionsSheet(
107108
.fillMaxWidth()
108109
.fillMaxHeight(0.5f)
109110
) {
110-
TabIndicator(
111-
pagerState = pagerState,
112-
feedback = feedback,
113-
) {
114-
composeScope.launch {
115-
pagerState.animateScrollToPage(it)
111+
if (pagerState.pageCount > 1) {
112+
TabIndicator(
113+
pagerState = pagerState,
114+
feedback = feedback,
115+
) {
116+
composeScope.launch {
117+
pagerState.animateScrollToPage(it)
118+
}
116119
}
117120
}
118121
HorizontalPager(
@@ -236,10 +239,11 @@ private fun FeedbackContent(
236239
emoji = i.emoji
237240
)
238241
}
239-
is MessageTip -> {
242+
is Pair<*, *> -> {
243+
val row = i as Pair<Sender, KinAmount>
240244
TipReactionRow(
241-
tipper = i.tipper,
242-
tip = i.amount,
245+
tipper = row.first,
246+
tip = i.second,
243247
imageModifier = imageModifier,
244248
modifier = Modifier.fillParentMaxWidth(),
245249
)

ui/components/src/main/kotlin/com/getcode/ui/components/chat/MessageList.kt

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.getcode.ui.components.chat
22

3+
import androidx.compose.animation.AnimatedVisibility
4+
import androidx.compose.animation.EnterTransition
35
import androidx.compose.foundation.layout.Arrangement
46
import androidx.compose.foundation.layout.PaddingValues
57
import androidx.compose.foundation.layout.fillMaxWidth
@@ -18,6 +20,7 @@ import androidx.compose.runtime.setValue
1820
import androidx.compose.runtime.snapshotFlow
1921
import androidx.compose.runtime.snapshots.Snapshot
2022
import androidx.compose.ui.Modifier
23+
import androidx.compose.ui.geometry.Offset
2124
import androidx.compose.ui.text.TextStyle
2225
import androidx.compose.ui.unit.dp
2326
import androidx.compose.ui.util.fastForEach
@@ -29,6 +32,7 @@ import com.getcode.model.ID
2932
import com.getcode.model.chat.MessageContent
3033
import com.getcode.model.chat.MessageStatus
3134
import com.getcode.theme.CodeTheme
35+
import com.getcode.ui.components.chat.messagecontents.MessageContentActionHandler
3236
import com.getcode.ui.components.chat.messagecontents.MessageContextAction
3337
import com.getcode.ui.components.chat.utils.ChatItem
3438
import com.getcode.ui.components.chat.utils.MessageReaction
@@ -159,6 +163,47 @@ fun MessageList(
159163
val updatedSender by rememberUpdatedState(item.sender)
160164
val updatedActions by rememberUpdatedState(item.messageControls)
161165

166+
val actionHandler = remember(item) {
167+
object : MessageContentActionHandler {
168+
override fun openMessageControls() {
169+
dispatch(
170+
MessageListEvent.OpenMessageActions(item.chatMessageId, updatedActions.actions)
171+
)
172+
}
173+
174+
override fun giveTip() {
175+
dispatch(MessageListEvent.TipMessage(item))
176+
}
177+
178+
override fun addReaction(emoji: String) {
179+
dispatch(MessageListEvent.AddReaction(item.chatMessageId, emoji))
180+
}
181+
182+
override fun removeReaction(reactionMessageId: ID) {
183+
dispatch(MessageListEvent.RemoveReaction(reactionMessageId))
184+
}
185+
186+
override fun viewReactions() {
187+
dispatch(MessageListEvent.ShowMessageReactions(item.tips, item.reactions))
188+
}
189+
190+
override fun startReply() {
191+
dispatch(MessageListEvent.ReplyToMessage(item))
192+
}
193+
194+
override fun viewOriginalMessage() {
195+
item.originalMessage?.id?.let {
196+
dispatch(MessageListEvent.ViewOriginalMessage(item.chatMessageId, it))
197+
}
198+
}
199+
200+
override fun openUserProfile() {
201+
item.sender.id?.let {
202+
dispatch(MessageListEvent.ViewUserProfile(it))
203+
}
204+
}
205+
}
206+
}
162207
MessageNode(
163208
modifier = Modifier
164209
.fillMaxWidth()
@@ -184,32 +229,10 @@ fun MessageList(
184229
} else null,
185230
contentStyle = contentStyle,
186231
),
187-
wasSentAsFullMember = item.wasSentAsFullMember,
188232
tips = item.tips,
189233
reactions = item.reactions,
190-
openMessageControls = {
191-
dispatch(
192-
MessageListEvent.OpenMessageActions(item.chatMessageId, updatedActions.actions)
193-
)
194-
},
195-
showTipSelection = { dispatch(MessageListEvent.TipMessage(item)) },
196-
onReply = { dispatch(MessageListEvent.ReplyToMessage(item)) },
197234
originalMessage = item.originalMessage,
198-
onViewOriginalMessage = {
199-
dispatch(MessageListEvent.ViewOriginalMessage(item.chatMessageId, it))
200-
},
201-
onAddReaction = {
202-
dispatch(MessageListEvent.AddReaction(item.chatMessageId, it))
203-
},
204-
onRemoveReaction = {
205-
dispatch(MessageListEvent.RemoveReaction(it))
206-
},
207-
openUserProfile = {
208-
dispatch(MessageListEvent.ViewUserProfile(item.sender.id!!))
209-
},
210-
showReactions = {
211-
dispatch(MessageListEvent.ShowMessageReactions(item.tips, item.reactions))
212-
}
235+
actionHandler = actionHandler,
213236
)
214237
}
215238

0 commit comments

Comments
 (0)