in AzureCommunicationUI/sdk/AzureCommunicationUIChat/Sources/Presentation/SwiftUI/Chat/ChatViewComponents/MessageListViewModel.swift [121:181]
func update(chatState: ChatState, repositoryState: RepositoryState) {
// Update messages
if self.repositoryUpdatedTimestamp < repositoryState.lastUpdatedTimestamp {
self.repositoryUpdatedTimestamp = repositoryState.lastUpdatedTimestamp
messages = messageRepositoryManager.messages
// Scroll to new received message
if self.lastReceivedMessageTimestamp < chatState.lastReceivedMessageTimestamp {
self.lastReceivedMessageTimestamp = chatState.lastReceivedMessageTimestamp
shouldScrollToId = !isAtBottom()
}
// Check if initial messages have been fetched
if self.hasFetchedInitialMessages != repositoryState.hasFetchedInitialMessages {
self.hasFetchedInitialMessages = repositoryState.hasFetchedInitialMessages
// Assume all messages are seen by others when re-joining the chat
if let latestSeenMessage = messages.last(where: {$0.isLocalUser}) {
latestSeenMessageId = latestSeenMessage.id
}
}
// Check if previous messages have been fetched
if self.hasFetchedPreviousMessages != repositoryState.hasFetchedPreviousMessages {
self.hasFetchedPreviousMessages = repositoryState.hasFetchedPreviousMessages
}
// Check if no more messages to be fetched
if self.hasFetchedAllMessages != repositoryState.hasFetchedAllMessages {
self.hasFetchedAllMessages = repositoryState.hasFetchedAllMessages
}
// Scroll to new sending message and get latest sending message id
if let lastSendingMessageTimestamp = chatState.lastSendingMessageTimestamp,
self.lastSendingMessageTimestamp < lastSendingMessageTimestamp {
self.lastSendingMessageTimestamp = lastSendingMessageTimestamp
shouldScrollToBottom = true
if let latestSendingMessage = messages.last(where: {$0.sendStatus == .sending}) {
latestSendingOrSentMessageId = latestSendingMessage.id
}
}
// Get latest sent message id
if self.lastSentOrFailedMessageTimestamp < chatState.lastSentOrFailedMessageTimestamp {
self.lastSentOrFailedMessageTimestamp = chatState.lastSentOrFailedMessageTimestamp
if let latestSentMessage = messages.last(where: {$0.sendStatus == .sent}) {
latestSendingOrSentMessageId = latestSentMessage.id
}
}
// Get latest seen message
if self.lastReadReceiptReceivedTimestamp < chatState.lastReadReceiptReceivedTimestamp {
self.lastReadReceiptReceivedTimestamp = chatState.lastReadReceiptReceivedTimestamp
if let latestSeenMessage = messages.last(where: {$0.sendStatus == .seen}) {
latestSeenMessageId = latestSeenMessage.id
}
}
updateJumpToNewMessages()
}
}