feat: Update chat navigation to use full user data for improved context
This commit is contained in:
@@ -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
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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++
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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) }
|
||||
)
|
||||
|
||||
// Сепаратор между диалогами
|
||||
|
||||
Reference in New Issue
Block a user