@@ -57,6 +57,7 @@ import kotlinx.coroutines.flow.mapNotNull
5757import kotlinx.coroutines.flow.onEach
5858import kotlinx.coroutines.flow.take
5959import kotlinx.coroutines.launch
60+ import kotlinx.datetime.Clock
6061import kotlinx.datetime.Instant
6162import timber.log.Timber
6263import xyz.flipchat.app.R
@@ -78,6 +79,7 @@ import xyz.flipchat.services.domain.model.chat.ConversationMember
7879import xyz.flipchat.services.domain.model.chat.ConversationMessage
7980import xyz.flipchat.services.domain.model.chat.ConversationWithMembersAndLastPointers
8081import xyz.flipchat.services.extensions.titleOrFallback
82+ import xyz.flipchat.services.internal.data.mapper.nullIfEmpty
8183import xyz.flipchat.services.user.AuthState
8284import xyz.flipchat.services.user.UserManager
8385import java.util.UUID
@@ -818,67 +820,63 @@ class ConversationViewModel @Inject constructor(
818820 .filterNotNull()
819821 .distinctUntilChanged()
820822 .flatMapLatest { roomController.messages(it).flow }
823+ .distinctUntilChanged()
821824 .map { page ->
822825 val currentState = stateFlow.value // Cache state upfront
823826 val pointerRefs = currentState.pointerRefs // cache expensive pointer ref map upfront
824827 val enableReply =
825828 currentState.replyEnabled && currentState.chattableState is ChattableState .Enabled
826829
827830 page.map { indice ->
828- val (message, member, contents) = indice
831+ val (message, member, contents, reply, tipInfo ) = indice
829832
830833 val status = findClosestMessageStatus(
831834 timestamp = message.id.uuid?.timestamp,
832835 statusMap = pointerRefs,
833836 fallback = if (contents.isFromSelf) MessageStatus .Sent else MessageStatus .Unknown
834837 )
835838
836- val anchor = if (contents is MessageContent .Reply ) {
837- val originalMessage = roomController.getMessage(contents.originalMessageId)
838- originalMessage?.let { container ->
839- ReplyMessageAnchor (
840- id = contents.originalMessageId,
841- message = container.content,
842- isDeleted = container.message.isDeleted,
843- deletedBy = container.message.deletedBy?.let { id ->
844- Deleter (
845- id = id,
846- isSelf = userManager.isSelf(id),
847- isHost = currentState.hostId == message.deletedBy
848- )
849- },
850- sender = Sender (
851- id = container.message.senderId,
852- profileImage = container.member?.imageUri.takeIf {
853- it.orEmpty().isNotEmpty()
854- },
855- displayName = container.member?.memberName ? : " Deleted" ,
856- isSelf = container.content.isFromSelf,
857- isBlocked = container.member?.isBlocked == true ,
858- isHost = container.message.senderId == currentState.hostId && ! contents.isFromSelf,
839+ val anchor = if (reply != null ) {
840+ ReplyMessageAnchor (
841+ id = reply.message.id,
842+ message = reply.content,
843+ isDeleted = reply.message.isDeleted,
844+ deletedBy = reply.message.deletedBy?.let { id ->
845+ Deleter (
846+ id = id,
847+ isSelf = userManager.isSelf(id),
848+ isHost = currentState.hostId == message.deletedBy
859849 )
850+ },
851+ sender = Sender (
852+ id = reply.message.senderId,
853+ profileImage = reply.member?.imageUri.takeIf {
854+ it.orEmpty().isNotEmpty()
855+ },
856+ displayName = reply.member?.memberName ? : " Deleted" ,
857+ isSelf = reply.content.isFromSelf,
858+ isBlocked = reply.member?.isBlocked == true ,
859+ isHost = reply.message.senderId == currentState.hostId && ! contents.isFromSelf,
860860 )
861- }
861+ )
862862 } else {
863863 null
864864 }
865865
866866 val tippingEnabled =
867867 currentState.isTippingEnabled && ! userManager.isSelf(message.senderId)
868868
869- val tips = if (currentState.isTippingEnabled) {
870- roomController.getTipsForMessage(message.id).map { tip ->
871- val amount = KinAmount .fromQuarks(tip.amountInQuarks)
872- val tipper = roomController.getMemberForId(tip.tipperId)
869+ val tips = if (currentState.isTippingEnabled && tipInfo.isNotEmpty()) {
870+ tipInfo.map { (amount, member) ->
873871 MessageTip (
874872 amount = amount,
875873 tipper = Sender (
876- id = tip.tipperId ,
877- profileImage = tipper ?.imageUri,
878- displayName = tipper ?.memberName,
879- isHost = tipper ?.isHost ? : false ,
880- isSelf = userManager.isSelf(tip.tipperId ),
881- isBlocked = tipper ?.isBlocked ? : false ,
874+ id = member?.id ,
875+ profileImage = member ?.imageUri.nullIfEmpty() ,
876+ displayName = member ?.memberName,
877+ isHost = member ?.isHost ? : false ,
878+ isSelf = userManager.isSelf(member?.id ),
879+ isBlocked = member ?.isBlocked ? : false ,
882880 )
883881 )
884882 }
@@ -911,7 +909,7 @@ class ConversationViewModel @Inject constructor(
911909 profileImage = member?.imageUri.takeIf { it.orEmpty().isNotEmpty() },
912910 displayName = member?.memberName ? : " Deleted" ,
913911 isSelf = contents.isFromSelf,
914- isHost = message.senderId == currentState.hostId && ! contents.isFromSelf ,
912+ isHost = member?.isHost ? : false ,
915913 isBlocked = member?.isBlocked == true ,
916914 ),
917915 originalMessage = anchor,
0 commit comments