Skip to content

Commit 47f6476

Browse files
committed
feat(fc): round out message deletion
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 137d9dc commit 47f6476

5 files changed

Lines changed: 67 additions & 22 deletions

File tree

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import com.getcode.utils.CurrencyUtils
3232
import com.getcode.utils.ErrorUtils
3333
import com.getcode.utils.TraceType
3434
import com.getcode.utils.base58
35+
import com.getcode.utils.base64
3536
import com.getcode.utils.network.retryable
3637
import com.getcode.utils.timestamp
3738
import com.getcode.utils.trace
@@ -835,8 +836,9 @@ class ConversationViewModel @Inject constructor(
835836
contents: MessageContent
836837
): List<MessageControlAction> {
837838
return mutableListOf<MessageControlAction>().apply {
838-
if (stateFlow.value.isHost) {
839-
if (betaFeatures.get(Lab.DeleteMessage)) {
839+
// delete message
840+
if (betaFeatures.get(Lab.DeleteMessage)) {
841+
if (stateFlow.value.isHost || contents.isFromSelf) {
840842
add(
841843
MessageControlAction.Delete {
842844
confirmMessageDelete(
@@ -846,7 +848,10 @@ class ConversationViewModel @Inject constructor(
846848
}
847849
)
848850
}
851+
}
852+
849853

854+
if (stateFlow.value.isHost) {
850855
if (member?.memberName?.isNotEmpty() == true && !contents.isFromSelf) {
851856
// add(
852857
// MessageControlAction.RemoveUser(member.memberName.orEmpty()) {
@@ -1011,7 +1016,7 @@ class ConversationViewModel @Inject constructor(
10111016
}
10121017

10131018
is Event.DeleteMessage -> {
1014-
Timber.d("Delete Message => ${event.messageId.base58}")
1019+
Timber.d("Delete Message => ${event.messageId.uuid.toString()}")
10151020
}
10161021

10171022
else -> Timber.d("event=${event}")
@@ -1032,11 +1037,11 @@ class ConversationViewModel @Inject constructor(
10321037
val members = event.conversationWithPointers.members
10331038
val host = members.firstOrNull { it.isHost }
10341039

1035-
val cardTitle = if (conversation.title.startsWith("Room")) {
1036-
"#${conversation.roomNumber}"
1037-
} else {
1038-
conversation.title
1039-
}
1040+
// val cardTitle = if (conversation.title.startsWith("Room")) {
1041+
// "#${conversation.roomNumber}"
1042+
// } else {
1043+
// conversation.title
1044+
// }
10401045

10411046
state.copy(
10421047
conversationId = conversation.id,
@@ -1056,7 +1061,7 @@ class ConversationViewModel @Inject constructor(
10561061
roomInfoArgs = RoomInfoArgs(
10571062
roomId = conversation.id,
10581063
roomNumber = conversation.roomNumber,
1059-
roomTitle = cardTitle,
1064+
roomTitle = conversation.title,
10601065
ownerId = conversation.ownerId,
10611066
hostName = host?.memberName,
10621067
memberCount = members.count(),

services/flipchat/chat/src/main/kotlin/xyz/flipchat/services/internal/db/ConversationDao.kt

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,35 @@ interface ConversationDao {
3030
@RewriteQueriesToDropUnusedColumns
3131
@Query(
3232
"""
33-
SELECT * FROM conversations
34-
WHERE roomNumber > 0
35-
ORDER BY lastActivity DESC
33+
SELECT c.*,
34+
JSON_GROUP_ARRAY(
35+
JSON_OBJECT(
36+
'idBase58', cm.conversationIdBase58,
37+
'name', cm.memberName
38+
)
39+
) AS members,
40+
JSON_OBJECT(
41+
'idBase58', lm.idBase58,
42+
'dateMillis', lm.dateMillis,
43+
'senderIdBase58', lm.senderIdBase58,
44+
'type', lm.type,
45+
'content', lm.content
46+
) AS lastMessage
47+
FROM conversations c
48+
LEFT JOIN members cm
49+
ON c.idBase58 = cm.conversationIdBase58
50+
LEFT JOIN messages lm
51+
ON c.idBase58 = lm.conversationIdBase58
52+
AND lm.type IN (1, 4, 8)
53+
AND lm.dateMillis = (
54+
SELECT MAX(dateMillis)
55+
FROM messages
56+
WHERE conversationIdBase58 = c.idBase58
57+
AND type IN (1, 4, 8)
58+
)
59+
WHERE c.roomNumber > 0
60+
GROUP BY c.idBase58
61+
ORDER BY c.lastActivity DESC
3662
LIMIT :limit OFFSET :offset
3763
"""
3864
)

services/flipchat/chat/src/main/kotlin/xyz/flipchat/services/internal/db/ConversationMessageDao.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ interface ConversationMessageDao {
3232
messages.dateMillis AS dateMillis,
3333
messages.conversationIdBase58 AS conversationIdBase58,
3434
messages.type AS type,
35+
messages.deleted AS deleted,
3536
messages.content AS content,
3637
members.memberIdBase58 AS memberIdBase58,
3738
members.memberName AS memberName

services/flipchat/chat/src/main/kotlin/xyz/flipchat/services/internal/network/repository/messaging/RealMessagingRepository.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,20 @@ internal class RealMessagingRepository @Inject constructor(
106106
val data = result.getOrNull() ?: return@stream
107107
val messages = data.map { lastMessageMapper.map(userId to it) }
108108
val messagesWithContents = messages.map { messageMapper.map(chatId to it) }
109-
val deletions = messagesWithContents.mapNotNull {
109+
val deletions = messagesWithContents.filter {
110110
MessageContent.fromData(
111111
it.type, it.content, it.senderId == userManager.userId
112-
) as? MessageContent.DeletedMessage
113-
}.map { it.originalMessageId }
112+
) as? MessageContent.DeletedMessage != null
113+
}
114114

115-
onMessagesUpdated(messagesWithContents)
116-
onMessagesDeleted(deletions)
115+
onMessagesUpdated(messagesWithContents.subtract(deletions.toSet()).toList())
116+
onMessagesDeleted(
117+
deletions.map {
118+
MessageContent.fromData(
119+
it.type, it.content, it.senderId == userManager.userId
120+
) as MessageContent.DeletedMessage
121+
}.map { it.originalMessageId }
122+
)
117123
} else {
118124
result.exceptionOrNull()?.let {
119125
ErrorUtils.handleError(it)

services/flipchat/sdk/src/main/kotlin/xyz/flipchat/controllers/ChatsController.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -217,19 +217,26 @@ class ChatsController @Inject constructor(
217217
conversationMessageMapper.map(conversationId to it)
218218
}
219219

220-
val deletions = messagesWithContent.mapNotNull {
220+
val deletions = messagesWithContent.filter {
221221
MessageContent.fromData(
222222
it.type, it.content, it.senderId == userManager.userId
223-
) as? MessageContent.DeletedMessage
224-
}.map { it.originalMessageId }
223+
) as? MessageContent.DeletedMessage != null
224+
}
225+
226+
val withoutDeletions = messagesWithContent.subtract(deletions.toSet())
225227

228+
val deletionIds = deletions.map {
229+
MessageContent.fromData(
230+
it.type, it.content, it.senderId == userManager.userId
231+
) as MessageContent.DeletedMessage
232+
}.map { it.originalMessageId }
226233
withContext(Dispatchers.IO) {
227-
deletions.onEach { messageId ->
234+
deletionIds.onEach { messageId ->
228235
db.conversationMessageDao().markDeleted(messageId)
229236
}
230237

231238
db.conversationMessageDao().upsertMessages(
232-
*(messagesWithContent).toTypedArray()
239+
*(withoutDeletions).toTypedArray()
233240
)
234241
}
235242

0 commit comments

Comments
 (0)