Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 4.13 KB | None | 0 0
  1. override fun oneOnOneChatMessagesFromConversationDescending(
  2.         oneOnOneChatConversationId: String
  3.     ): Flow<State<List<OneOnOneChatMessage<ChatMessageContent>>>> =
  4.         channelFlow<State<List<OneOnOneChatMessage<ChatMessageContent>>>> {
  5.             offer(State.Loading)
  6.  
  7.             val chatMessageHistoryDataState: State.Data<List<OneOnOneChatMessage<ChatMessageContent>>> = run {
  8.                 val chatMessageHistory: List<OneOnOneChatMessage<ChatMessageContent>> = run {
  9.                     when (val getChatMessageHistoryResult =
  10.                         getChatMessagesFromOneOnOneChatConversation(oneOnOneChatConversationId)) {
  11.  
  12.                         is Result.Failure -> {
  13.                             offer(State.Error(getChatMessageHistoryResult.exception))
  14.                             close()
  15.                             return@channelFlow
  16.                         }
  17.                         is Result.Success -> getChatMessageHistoryResult.data
  18.                     }
  19.                 }
  20.                 State.Data(chatMessageHistory)
  21.             }
  22.             offer(chatMessageHistoryDataState)
  23.  
  24.             val chatMessageStatusUpdates: Flow<OneOnOneChatMessageStatusUpdate> =
  25.                 chatMessageStatusUpdatesFromConversation(oneOnOneChatConversationId)
  26.  
  27.             val incomingChatMessageResults: Flow<Result<OneOnOneChatMessage<ChatMessageContent>>> =
  28.                 incomingChatMessagesFromOneOnOneConversation(
  29.                     quickbloxChatService = QBChatService.getInstance(),
  30.                     oneOnOneChatConversationId = oneOnOneChatConversationId
  31.                 )
  32.  
  33.             val incomingFailedChatMessageResults = incomingChatMessageResults.filterIsInstance<Result.Failure>()
  34.  
  35.             val incomingSuccessfulChatMessageResults = incomingChatMessageResults
  36.                 .filterIsInstance<Result.Success<OneOnOneChatMessage<ChatMessageContent>>>()
  37.  
  38.             val currentChatMessages = chatMessageHistoryDataState.data.toMutableList()
  39.  
  40.             // Update state to error on incoming failed chat message
  41.             incomingFailedChatMessageResults.onEach {
  42.                 if (isClosedForSend) return@onEach
  43.                 offer(State.Error(it.exception))
  44.                 close()
  45.                 return@onEach
  46.             }.launchIn(this)
  47.  
  48.             // Update state to data with new incoming message
  49.             incomingSuccessfulChatMessageResults.onEach { incomingSuccessfulChatMessageResult ->
  50.                 if (isClosedForSend) return@onEach
  51.                 currentChatMessages.add(0, incomingSuccessfulChatMessageResult.data)
  52.                 offer(State.Data(currentChatMessages))
  53.             }.launchIn(this)
  54.  
  55.             // Update state to data with new sent message
  56.             sentChatMessages.onEach { sentChatMessage ->
  57.                 if (isClosedForSend) return@onEach
  58.                 currentChatMessages.add(0, sentChatMessage)
  59.                 offer(State.Data(currentChatMessages))
  60.             }.launchIn(this)
  61.  
  62.             // Update state on chat message status update
  63.             chatMessageStatusUpdates.onEach { chatMessageStatusUpdate ->
  64.                 if (isClosedForSend) return@onEach
  65.                 val toBeUpdatedMessageIndex = currentChatMessages.indexOfFirst {
  66.                     it.id == chatMessageStatusUpdate.oneOnOneChatMessageId
  67.                 }
  68.                 if (toBeUpdatedMessageIndex == -1) {
  69.                     val exception = IllegalStateException(
  70.                         "$chatMessageStatusUpdate is not applicable to $currentChatMessages. ID not found"
  71.                     )
  72.                     offer(State.Error(exception))
  73.                     close()
  74.                     return@onEach
  75.                 }
  76.  
  77.                 val updatedMessage = run {
  78.                     val toBeUpdatedMessage = currentChatMessages[toBeUpdatedMessageIndex]
  79.                     toBeUpdatedMessage.copy(status = chatMessageStatusUpdate.newStatus)
  80.                 }
  81.                 currentChatMessages[toBeUpdatedMessageIndex] = updatedMessage
  82.                 offer(State.Data(currentChatMessages))
  83.             }.launchIn(this)
  84.  
  85.         }.conflate()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement