Skip to content

Commit 72bd5ff

Browse files
style(convo-list): mark convos as read/unread optimistically but reset+show error snackbar on failure
AI-assistant: Claude Code v2.1.140 (Claude Sonnet 4.6) Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
1 parent 9d1107b commit 72bd5ff

4 files changed

Lines changed: 27 additions & 7 deletions

File tree

app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -462,9 +462,6 @@ class ConversationsListActivity : BaseActivity() {
462462
conversationsListViewModel.readUnreadState.collect { state ->
463463
when (state) {
464464
is ConversationsListViewModel.ConversationReadUnreadUiState.Success -> {
465-
fetchRooms()
466-
val resId = if (state.isMarkedRead) R.string.marked_as_read else R.string.marked_as_unread
467-
showSnackbar(String.format(resources.getString(resId), state.conversationDisplayName))
468465
conversationsListViewModel.resetReadUnreadState()
469466
}
470467
is ConversationsListViewModel.ConversationReadUnreadUiState.Error -> {

app/src/main/java/com/nextcloud/talk/conversationlist/data/OfflineConversationsRepository.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ interface OfflineConversationsRepository {
4444

4545
suspend fun updateConversation(conversationModel: ConversationModel)
4646

47+
suspend fun updateConversationLocallyAndEmit(user: User, conversation: ConversationModel)
48+
4749
@Deprecated("use observeConversation")
4850
suspend fun getLocallyStoredConversation(user: User, roomToken: String): ConversationModel?
4951

app/src/main/java/com/nextcloud/talk/conversationlist/data/network/OfflineFirstConversationsRepository.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,12 @@ class OfflineFirstConversationsRepository @Inject constructor(
127127
dao.updateConversation(entity)
128128
}
129129

130+
override suspend fun updateConversationLocallyAndEmit(user: User, conversation: ConversationModel) {
131+
dao.updateConversation(conversation.asEntity())
132+
val updatedList = getListOfConversations(user.id!!)
133+
_roomListFlow.emit(updatedList)
134+
}
135+
130136
override suspend fun getLocallyStoredConversation(user: User, roomToken: String): ConversationModel? {
131137
val id = user.id!!
132138
return getConversation(id, roomToken)

app/src/main/java/com/nextcloud/talk/conversationlist/viewmodels/ConversationsListViewModel.kt

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,7 @@ class ConversationsListViewModel @Inject constructor(
108108

109109
sealed class ConversationReadUnreadUiState {
110110
data object None : ConversationReadUnreadUiState()
111-
data class Success(val conversationDisplayName: String, val isMarkedRead: Boolean) :
112-
ConversationReadUnreadUiState()
111+
data object Success : ConversationReadUnreadUiState()
113112
data object Error : ConversationReadUnreadUiState()
114113
}
115114

@@ -582,38 +581,54 @@ class ConversationsListViewModel @Inject constructor(
582581

583582
@Suppress("Detekt.TooGenericExceptionCaught")
584583
fun markConversationAsRead(conversation: ConversationModel) {
584+
val original = conversation.copy()
585+
val optimistic = conversation.copy(unreadMessages = 0, unreadMention = false, unreadMentionDirect = false)
585586
val messageId = if (conversation.remoteServer.isNullOrEmpty()) conversation.lastMessage?.id?.toInt() else null
586587
val apiVersion = ApiUtils.getChatApiVersion(
587588
currentUser.capabilities?.spreedCapability!!,
588589
intArrayOf(ApiUtils.API_V1)
589590
)
590591
val url = ApiUtils.getUrlForChatReadMarker(apiVersion, currentUser.baseUrl, conversation.token)
591592
viewModelScope.launch {
593+
withContext(Dispatchers.IO) {
594+
repository.updateConversationLocallyAndEmit(currentUser, optimistic)
595+
}
592596
try {
593597
withContext(Dispatchers.IO) {
594598
withRetry(1) { conversationsRepository.markConversationAsRead(credentials, url, messageId) }
595599
}
596-
_readUnreadState.value = ConversationReadUnreadUiState.Success(conversation.displayName, true)
600+
_readUnreadState.value = ConversationReadUnreadUiState.Success
597601
} catch (e: Exception) {
602+
withContext(Dispatchers.IO) {
603+
repository.updateConversationLocallyAndEmit(currentUser, original)
604+
}
598605
_readUnreadState.value = ConversationReadUnreadUiState.Error
599606
}
600607
}
601608
}
602609

603610
@Suppress("Detekt.TooGenericExceptionCaught")
604611
fun markConversationAsUnread(conversation: ConversationModel) {
612+
val original = conversation.copy()
613+
val optimistic = conversation.copy(unreadMessages = 1)
605614
val apiVersion = ApiUtils.getChatApiVersion(
606615
currentUser.capabilities?.spreedCapability!!,
607616
intArrayOf(ApiUtils.API_V1)
608617
)
609618
val url = ApiUtils.getUrlForChatReadMarker(apiVersion, currentUser.baseUrl, conversation.token)
610619
viewModelScope.launch {
620+
withContext(Dispatchers.IO) {
621+
repository.updateConversationLocallyAndEmit(currentUser, optimistic)
622+
}
611623
try {
612624
withContext(Dispatchers.IO) {
613625
withRetry(1) { conversationsRepository.markConversationAsUnread(credentials, url) }
614626
}
615-
_readUnreadState.value = ConversationReadUnreadUiState.Success(conversation.displayName, false)
627+
_readUnreadState.value = ConversationReadUnreadUiState.Success
616628
} catch (e: Exception) {
629+
withContext(Dispatchers.IO) {
630+
repository.updateConversationLocallyAndEmit(currentUser, original)
631+
}
617632
_readUnreadState.value = ConversationReadUnreadUiState.Error
618633
}
619634
}

0 commit comments

Comments
 (0)