Заготовка
This commit is contained in:
@@ -51,10 +51,51 @@ class ChatListViewModel @Inject constructor(
|
||||
signalrClient.connect(baseUrl.removeSuffix("/api/"), token)
|
||||
}
|
||||
|
||||
loadChats()
|
||||
// Single Source of Truth - подписываемся на Flow из Room
|
||||
observeChatsFromLocal()
|
||||
|
||||
// Запускаем периодическую синхронизацию
|
||||
viewModelScope.launch {
|
||||
repository.schedulePeriodicSync()
|
||||
}
|
||||
|
||||
observeSignalREvents()
|
||||
}
|
||||
|
||||
/**
|
||||
* Подписка на локальные чаты из Room (Single Source of Truth)
|
||||
*/
|
||||
private fun observeChatsFromLocal() {
|
||||
repository.getChatsFlow()
|
||||
.onEach { chats ->
|
||||
_state.update { currentState ->
|
||||
currentState.copy(
|
||||
chats = sortChats(chats),
|
||||
isLoading = false
|
||||
)
|
||||
}
|
||||
}
|
||||
.catch { e ->
|
||||
android.util.Log.e("ChatListVM", "Error observing chats", e)
|
||||
_state.update { it.copy(isLoading = false, error = e.message) }
|
||||
}
|
||||
.launchIn(viewModelScope)
|
||||
}
|
||||
|
||||
/**
|
||||
* Принудительная синхронизация чатов с сервером
|
||||
*/
|
||||
fun loadChats() {
|
||||
viewModelScope.launch {
|
||||
_state.update { it.copy(isLoading = true) }
|
||||
try {
|
||||
repository.syncChats()
|
||||
} catch (e: Exception) {
|
||||
_state.update { it.copy(isLoading = false, error = e.message) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun updatePushToken() {
|
||||
com.google.firebase.messaging.FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
|
||||
if (task.isSuccessful) {
|
||||
@@ -70,21 +111,8 @@ class ChatListViewModel @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun getCurrentUserId(): String = tokenManager.getUserId() ?: ""
|
||||
|
||||
fun loadChats() {
|
||||
viewModelScope.launch {
|
||||
_state.update { it.copy(isLoading = true) }
|
||||
try {
|
||||
val chats = repository.getChats()
|
||||
_state.update { it.copy(chats = sortChats(chats), isLoading = false) }
|
||||
} catch (e: Exception) {
|
||||
_state.update { it.copy(isLoading = false, error = e.message) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun sortChats(chats: List<Chat>): List<Chat> {
|
||||
return chats.sortedWith(compareByDescending<Chat> {
|
||||
it.name.equals("Избранное", ignoreCase = true) || it.name.equals("Saved Messages", ignoreCase = true)
|
||||
@@ -121,7 +149,6 @@ class ChatListViewModel @Inject constructor(
|
||||
.launchIn(viewModelScope)
|
||||
}
|
||||
|
||||
|
||||
private fun updateChatsWithNewMessage(event: ChatEvent.NewMessage) {
|
||||
val baseUrl = serverConfig.getBaseUrl().removeSuffix("/api/")
|
||||
val currentUserId = getCurrentUserId()
|
||||
|
||||
Reference in New Issue
Block a user