feat: Integrate ChatsListViewModel for user block/unblock functionality in OtherProfileScreen
This commit is contained in:
@@ -47,6 +47,12 @@ interface BlacklistDao {
|
|||||||
@Query("SELECT COUNT(*) > 0 FROM blacklist WHERE public_key = :publicKey AND account = :account")
|
@Query("SELECT COUNT(*) > 0 FROM blacklist WHERE public_key = :publicKey AND account = :account")
|
||||||
suspend fun isUserBlocked(publicKey: String, account: String): Boolean
|
suspend fun isUserBlocked(publicKey: String, account: String): Boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Наблюдать за статусом блокировки пользователя (Flow)
|
||||||
|
*/
|
||||||
|
@Query("SELECT COUNT(*) > 0 FROM blacklist WHERE public_key = :publicKey AND account = :account")
|
||||||
|
fun observeUserBlocked(publicKey: String, account: String): Flow<Boolean>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Получить все заблокированные аккаунты для данного пользователя
|
* Получить все заблокированные аккаунты для данного пользователя
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -244,14 +244,10 @@ fun ChatDetailScreen(
|
|||||||
var showBlockConfirm by remember { mutableStateOf(false) }
|
var showBlockConfirm by remember { mutableStateOf(false) }
|
||||||
var showUnblockConfirm by remember { mutableStateOf(false) }
|
var showUnblockConfirm by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
// Проверяем, заблокирован ли пользователь (отложенно, не блокирует UI)
|
// Наблюдаем за статусом блокировки в реальном времени через Flow
|
||||||
var isBlocked by remember { mutableStateOf(false) }
|
val isBlocked by database.blacklistDao()
|
||||||
LaunchedEffect(user.publicKey, currentUserPublicKey) {
|
.observeUserBlocked(user.publicKey, currentUserPublicKey)
|
||||||
// 🔥 ОПТИМИЗАЦИЯ: Отложенная проверка - не блокирует анимацию
|
.collectAsState(initial = false)
|
||||||
kotlinx.coroutines.delay(100) // Даём анимации завершиться
|
|
||||||
isBlocked =
|
|
||||||
database.blacklistDao().isUserBlocked(user.publicKey, currentUserPublicKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Подключаем к ViewModel
|
// Подключаем к ViewModel
|
||||||
val messages by viewModel.messages.collectAsState()
|
val messages by viewModel.messages.collectAsState()
|
||||||
@@ -1901,7 +1897,6 @@ fun ChatDetailScreen(
|
|||||||
currentUserPublicKey
|
currentUserPublicKey
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
isBlocked = true
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
// Error blocking user
|
// Error blocking user
|
||||||
}
|
}
|
||||||
@@ -1948,7 +1943,6 @@ fun ChatDetailScreen(
|
|||||||
account =
|
account =
|
||||||
currentUserPublicKey
|
currentUserPublicKey
|
||||||
)
|
)
|
||||||
isBlocked = false
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
// Error unblocking user
|
// Error unblocking user
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.rosetta.messenger.crypto.CryptoManager
|
|||||||
import com.rosetta.messenger.data.MessageRepository
|
import com.rosetta.messenger.data.MessageRepository
|
||||||
import com.rosetta.messenger.database.DialogEntity
|
import com.rosetta.messenger.database.DialogEntity
|
||||||
import com.rosetta.messenger.database.RosettaDatabase
|
import com.rosetta.messenger.database.RosettaDatabase
|
||||||
|
import com.rosetta.messenger.database.BlacklistEntity
|
||||||
import com.rosetta.messenger.network.PacketOnlineSubscribe
|
import com.rosetta.messenger.network.PacketOnlineSubscribe
|
||||||
import com.rosetta.messenger.network.PacketSearch
|
import com.rosetta.messenger.network.PacketSearch
|
||||||
import com.rosetta.messenger.network.ProtocolManager
|
import com.rosetta.messenger.network.ProtocolManager
|
||||||
|
|||||||
@@ -228,8 +228,8 @@ fun MessageInputBar(
|
|||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(horizontal = 12.dp, vertical = 8.dp)
|
.padding(horizontal = 12.dp, vertical = 16.dp)
|
||||||
.padding(bottom = 16.dp)
|
.padding(bottom = 20.dp)
|
||||||
.navigationBarsPadding(),
|
.navigationBarsPadding(),
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
horizontalArrangement = Arrangement.Center
|
horizontalArrangement = Arrangement.Center
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
|
|||||||
import com.rosetta.messenger.data.MessageRepository
|
import com.rosetta.messenger.data.MessageRepository
|
||||||
import com.rosetta.messenger.database.RosettaDatabase
|
import com.rosetta.messenger.database.RosettaDatabase
|
||||||
import com.rosetta.messenger.ui.chats.ChatViewModel
|
import com.rosetta.messenger.ui.chats.ChatViewModel
|
||||||
|
import com.rosetta.messenger.ui.chats.ChatsListViewModel
|
||||||
import com.rosetta.messenger.ui.onboarding.PrimaryBlue
|
import com.rosetta.messenger.ui.onboarding.PrimaryBlue
|
||||||
import com.rosetta.messenger.ui.components.VerifiedBadge
|
import com.rosetta.messenger.ui.components.VerifiedBadge
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
@@ -78,6 +79,15 @@ fun OtherProfileScreen(
|
|||||||
// 🔥 Получаем тот же ChatViewModel что и в ChatDetailScreen для очистки истории
|
// 🔥 Получаем тот же ChatViewModel что и в ChatDetailScreen для очистки истории
|
||||||
val viewModel: ChatViewModel = viewModel(key = "chat_${user.publicKey}")
|
val viewModel: ChatViewModel = viewModel(key = "chat_${user.publicKey}")
|
||||||
|
|
||||||
|
// 🔥 ChatsListViewModel для блокировки/разблокировки
|
||||||
|
val chatsListViewModel: ChatsListViewModel = viewModel()
|
||||||
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
|
// 🔥 Загружаем статус блокировки при открытии экрана
|
||||||
|
LaunchedEffect(user.publicKey) {
|
||||||
|
isBlocked = chatsListViewModel.isUserBlocked(user.publicKey)
|
||||||
|
}
|
||||||
|
|
||||||
// 🎹 Для закрытия клавиатуры
|
// 🎹 Для закрытия клавиатуры
|
||||||
val keyboardController = LocalSoftwareKeyboardController.current
|
val keyboardController = LocalSoftwareKeyboardController.current
|
||||||
val focusManager = LocalFocusManager.current
|
val focusManager = LocalFocusManager.current
|
||||||
@@ -201,7 +211,17 @@ fun OtherProfileScreen(
|
|||||||
showAvatarMenu = showAvatarMenu,
|
showAvatarMenu = showAvatarMenu,
|
||||||
onAvatarMenuChange = { showAvatarMenu = it },
|
onAvatarMenuChange = { showAvatarMenu = it },
|
||||||
isBlocked = isBlocked,
|
isBlocked = isBlocked,
|
||||||
onBlockToggle = { isBlocked = !isBlocked },
|
onBlockToggle = {
|
||||||
|
coroutineScope.launch {
|
||||||
|
if (isBlocked) {
|
||||||
|
chatsListViewModel.unblockUser(user.publicKey)
|
||||||
|
} else {
|
||||||
|
chatsListViewModel.blockUser(user.publicKey)
|
||||||
|
}
|
||||||
|
// Обновляем локальное состояние
|
||||||
|
isBlocked = !isBlocked
|
||||||
|
}
|
||||||
|
},
|
||||||
avatarRepository = avatarRepository,
|
avatarRepository = avatarRepository,
|
||||||
onClearChat = {
|
onClearChat = {
|
||||||
viewModel.clearChatHistory()
|
viewModel.clearChatHistory()
|
||||||
|
|||||||
Reference in New Issue
Block a user