feat: Update chat navigation to use full user data for improved context

This commit is contained in:
2026-01-22 03:30:59 +05:00
parent bebab34359
commit 7adfe1ce86
5 changed files with 36 additions and 26 deletions

View File

@@ -694,19 +694,9 @@ fun MainScreen(
selectedOtherUser = user
showOtherProfileScreen = true
},
onNavigateToChat = { publicKey ->
// 📨 Forward: переход в выбранный чат
// Нужно получить SearchUser из публичного ключа
// Используем минимальные данные - остальное подгрузится в
// ChatDetailScreen
selectedUser =
SearchUser(
title = "",
username = "",
publicKey = publicKey,
verified = 0,
online = 0
)
onNavigateToChat = { forwardUser ->
// 📨 Forward: переход в выбранный чат с полными данными
selectedUser = forwardUser
}
)
}

View File

@@ -42,6 +42,10 @@ object ForwardManager {
private val _selectedChatPublicKey = MutableStateFlow<String?>(null)
val selectedChatPublicKey: StateFlow<String?> = _selectedChatPublicKey.asStateFlow()
// 🔥 Счётчик для триггера перезагрузки диалога при forward
private val _forwardTrigger = MutableStateFlow(0)
val forwardTrigger: StateFlow<Int> = _forwardTrigger.asStateFlow()
/**
* Установить сообщения для пересылки и показать выбор чата
*/
@@ -61,6 +65,8 @@ object ForwardManager {
fun selectChat(publicKey: String) {
_selectedChatPublicKey.value = publicKey
_showChatPicker.value = false
// 🔥 Увеличиваем триггер чтобы ChatDetailScreen перезагрузил диалог
_forwardTrigger.value++
}
/**

View File

@@ -155,7 +155,8 @@ data class ReplyData(
val messageId: String,
val senderName: String, // Имя отправителя цитируемого сообщения
val text: String,
val isFromMe: Boolean // Цитируемое сообщение от меня?
val isFromMe: Boolean, // Цитируемое сообщение от меня?
val isForwarded: Boolean = false // Это пересланное сообщение?
)
/** Модель сообщения (Legacy - для совместимости) */
@@ -238,7 +239,7 @@ fun ChatDetailScreen(
isDarkTheme: Boolean,
onBack: () -> Unit,
onUserProfileClick: (SearchUser) -> Unit = {},
onNavigateToChat: (String) -> Unit = {}, // 📨 Callback для навигации в другой чат (Forward)
onNavigateToChat: (SearchUser) -> Unit = {}, // 📨 Callback для навигации в другой чат (Forward)
viewModel: ChatViewModel = viewModel()
) {
// 🔥 ОПТИМИЗАЦИЯ: Убрано логирование из композиции чтобы не засорять logcat
@@ -534,8 +535,12 @@ fun ChatDetailScreen(
}
}
// 🔥 Подписываемся на forward trigger для перезагрузки при forward в тот же чат
val forwardTrigger by ForwardManager.forwardTrigger.collectAsState()
// Инициализируем ViewModel с ключами и открываем диалог
LaunchedEffect(user.publicKey) {
// forwardTrigger добавлен чтобы перезагрузить диалог при forward в тот же чат
LaunchedEffect(user.publicKey, forwardTrigger) {
viewModel.setUserKeys(currentUserPublicKey, currentUserPrivateKey)
viewModel.openDialog(user.publicKey, user.title, user.username)
// Подписываемся на онлайн статус собеседника
@@ -2277,11 +2282,18 @@ fun ChatDetailScreen(
showForwardPicker = false
ForwardManager.clear()
},
onChatSelected = { selectedPublicKey ->
onChatSelected = { selectedDialog ->
showForwardPicker = false
// Переходим в выбранный чат
ForwardManager.selectChat(selectedPublicKey)
onNavigateToChat(selectedPublicKey)
// Переходим в выбранный чат с полными данными
ForwardManager.selectChat(selectedDialog.opponentKey)
val searchUser = SearchUser(
title = selectedDialog.opponentTitle,
username = selectedDialog.opponentUsername,
publicKey = selectedDialog.opponentKey,
verified = selectedDialog.verified,
online = selectedDialog.isOnline
)
onNavigateToChat(searchUser)
}
)
}
@@ -2852,9 +2864,9 @@ private fun ReplyBubble(
bottom = 4.dp
)
) {
// 🔥 TELEGRAM: Имя 14sp, Medium weight
// 🔥 TELEGRAM: Имя или "Forwarded message" 14sp, Medium weight
Text(
text = replyData.senderName,
text = if (replyData.isForwarded) "Forwarded message" else replyData.senderName,
color = nameColor,
fontSize = 14.sp,
fontWeight = FontWeight.Medium,

View File

@@ -1043,13 +1043,15 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
val timestamp = System.currentTimeMillis()
// 🔥 Формируем ReplyData для отображения в UI (только первое сообщение)
val replyData: ReplyData? = if (replyMsgs.isNotEmpty() && !isForward) {
// Работает и для reply, и для forward
val replyData: ReplyData? = if (replyMsgs.isNotEmpty()) {
val firstReply = replyMsgs.first()
ReplyData(
messageId = firstReply.messageId,
senderName = if (firstReply.isOutgoing) "You" else opponentTitle.ifEmpty { opponentUsername.ifEmpty { "User" } },
text = firstReply.text,
isFromMe = firstReply.isOutgoing
isFromMe = firstReply.isOutgoing,
isForwarded = isForward
)
} else null

View File

@@ -40,7 +40,7 @@ fun ForwardChatPickerBottomSheet(
isDarkTheme: Boolean,
currentUserPublicKey: String,
onDismiss: () -> Unit,
onChatSelected: (String) -> Unit
onChatSelected: (DialogUiModel) -> Unit
) {
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = false)
val scope = rememberCoroutineScope()
@@ -170,7 +170,7 @@ fun ForwardChatPickerBottomSheet(
dialog = dialog,
isDarkTheme = isDarkTheme,
isSavedMessages = dialog.opponentKey == currentUserPublicKey,
onClick = { onChatSelected(dialog.opponentKey) }
onClick = { onChatSelected(dialog) }
)
// Сепаратор между диалогами