Disable chat deletion

This commit is contained in:
sevenhill
2026-07-06 22:46:55 +03:00
parent 52ae43c25d
commit 183ec8d90f
11 changed files with 95 additions and 253 deletions
@@ -324,8 +324,7 @@ private fun LoginScreen(vm: QMaxViewModel) {
}
private enum class ChatBulkUiAction {
ClearHistory,
Delete
ClearHistory
}
private enum class MainTab {
@@ -389,10 +388,6 @@ private fun ChatListScreen(vm: QMaxViewModel) {
onClearSelectedHistory = {
selectionMenuOpen = false
pendingBulkAction = ChatBulkUiAction.ClearHistory
},
onDeleteSelectedChats = {
selectionMenuOpen = false
pendingBulkAction = ChatBulkUiAction.Delete
}
)
@@ -404,7 +399,6 @@ private fun ChatListScreen(vm: QMaxViewModel) {
Text(
when (action) {
ChatBulkUiAction.ClearHistory -> "Очистить историю"
ChatBulkUiAction.Delete -> "Удалить чаты"
}
)
},
@@ -412,7 +406,6 @@ private fun ChatListScreen(vm: QMaxViewModel) {
Text(
when (action) {
ChatBulkUiAction.ClearHistory -> "Очистить историю в выбранных чатах: $selectedCount?"
ChatBulkUiAction.Delete -> "Удалить выбранные чаты: $selectedCount?"
}
)
},
@@ -422,14 +415,12 @@ private fun ChatListScreen(vm: QMaxViewModel) {
pendingBulkAction = null
when (action) {
ChatBulkUiAction.ClearHistory -> vm.clearSelectedChatHistories()
ChatBulkUiAction.Delete -> vm.deleteSelectedChats()
}
}
) {
Text(
when (action) {
ChatBulkUiAction.ClearHistory -> "Очистить"
ChatBulkUiAction.Delete -> "Удалить"
}
)
}
@@ -616,8 +607,7 @@ private fun TelegramChatListContent(
onClearSelection: () -> Unit,
onToggleChatSelection: (String) -> Unit,
onBeginChatSelection: (String) -> Unit,
onClearSelectedHistory: () -> Unit,
onDeleteSelectedChats: () -> Unit
onClearSelectedHistory: () -> Unit
) {
val selectedCount = state.selectedChatIds.size
val listTab = activeTab != MainTab.Settings
@@ -646,8 +636,7 @@ private fun TelegramChatListContent(
menuOpen = selectionMenuOpen,
onMenuOpenChange = onSelectionMenuOpenChange,
onClearSelection = onClearSelection,
onClearHistory = onClearSelectedHistory,
onDelete = onDeleteSelectedChats
onClearHistory = onClearSelectedHistory
)
} else {
TelegramLikeHeader(
@@ -815,8 +804,7 @@ private fun ChatSelectionHeader(
menuOpen: Boolean,
onMenuOpenChange: (Boolean) -> Unit,
onClearSelection: () -> Unit,
onClearHistory: () -> Unit,
onDelete: () -> Unit
onClearHistory: () -> Unit
) {
Row(
modifier = Modifier
@@ -865,20 +853,6 @@ private fun ChatSelectionHeader(
onClearHistory()
}
)
DropdownMenuItem(
text = { Text("Удалить") },
leadingIcon = {
Icon(
Icons.Filled.Delete,
contentDescription = null,
tint = Color(0xFFD84343)
)
},
onClick = {
onMenuOpenChange(false)
onDelete()
}
)
}
}
}
@@ -136,20 +136,6 @@ class QMaxRepository(
}
}
suspend fun deleteChats(session: QMaxSession, chatIds: Collection<String>) {
val ids = chatIds.filter(String::isNotBlank).distinct()
if (ids.isEmpty()) {
return
}
messageCache.clearMessages(session, ids)
val updatedChats = cachedChats(session).filterNot { it.id in ids }
messageCache.saveChats(session, orderedChats(updatedChats))
withFreshSession(session) {
api.deleteChats(it.serverUrl, it.accessToken, ids)
}
}
suspend fun searchMessages(session: QMaxSession, chatId: String, query: String): List<MessageDto> {
val messages = withFreshSession(session) { api.searchMessages(it.serverUrl, it.accessToken, chatId, query) }
messages.forEach { messageCache.upsertMessage(session, it) }
@@ -91,10 +91,6 @@ class QMaxApi {
postNoContent(sessionServerUrl, "/api/chats/clear-history", token, ChatBulkActionRequest(chatIds))
}
suspend fun deleteChats(sessionServerUrl: String, token: String, chatIds: List<String>) {
postNoContent(sessionServerUrl, "/api/chats/delete", token, ChatBulkActionRequest(chatIds))
}
suspend fun searchMessages(sessionServerUrl: String, token: String, chatId: String, query: String): List<MessageDto> {
val encodedQuery = URLEncoder.encode(query, StandardCharsets.UTF_8.toString())
return get(sessionServerUrl, "/api/chats/$chatId/search?q=$encodedQuery", token)
@@ -433,35 +433,6 @@ class QMaxViewModel(private val repository: QMaxRepository) : ViewModel() {
refreshChats(showLoading = false)
}
fun deleteSelectedChats() = launchLoading(false) {
val session = requireSession()
val ids = state.value.selectedChatIds
if (ids.isEmpty()) return@launchLoading
val selectedChatId = state.value.selectedChat?.id
val selectedChatDeleted = selectedChatId != null && selectedChatId in ids
val updatedChats = normalizeChats(state.value.chats.filterNot { it.id in ids })
state.value = state.value.copy(
selectedChat = if (selectedChatDeleted) null else state.value.selectedChat,
chats = updatedChats,
messages = if (selectedChatDeleted) emptyList() else state.value.messages,
chatPresenceText = if (selectedChatDeleted) null else state.value.chatPresenceText,
replyTarget = if (selectedChatDeleted) null else state.value.replyTarget,
editTarget = if (selectedChatDeleted) null else state.value.editTarget,
forwardTarget = if (selectedChatDeleted) null else state.value.forwardTarget,
composerText = if (selectedChatDeleted) "" else state.value.composerText,
selectedChatIds = emptySet()
)
if (selectedChatDeleted) {
messagePollJob?.cancel()
presencePollJob?.cancel()
realtime.joinChat(null)
}
persistCurrentChats()
repository.deleteChats(session, ids)
refreshChats(showLoading = false)
}
fun loadMessages(showLoading: Boolean = true, forceHydrate: Boolean = false) = launchLoading(showLoading) {
if (!showLoading && state.value.sendingMessage) {
return@launchLoading