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
|
selectedOtherUser = user
|
||||||
showOtherProfileScreen = true
|
showOtherProfileScreen = true
|
||||||
},
|
},
|
||||||
onNavigateToChat = { publicKey ->
|
onNavigateToChat = { forwardUser ->
|
||||||
// 📨 Forward: переход в выбранный чат
|
// 📨 Forward: переход в выбранный чат с полными данными
|
||||||
// Нужно получить SearchUser из публичного ключа
|
selectedUser = forwardUser
|
||||||
// Используем минимальные данные - остальное подгрузится в
|
|
||||||
// ChatDetailScreen
|
|
||||||
selectedUser =
|
|
||||||
SearchUser(
|
|
||||||
title = "",
|
|
||||||
username = "",
|
|
||||||
publicKey = publicKey,
|
|
||||||
verified = 0,
|
|
||||||
online = 0
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,10 @@ object ForwardManager {
|
|||||||
private val _selectedChatPublicKey = MutableStateFlow<String?>(null)
|
private val _selectedChatPublicKey = MutableStateFlow<String?>(null)
|
||||||
val selectedChatPublicKey: StateFlow<String?> = _selectedChatPublicKey.asStateFlow()
|
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) {
|
fun selectChat(publicKey: String) {
|
||||||
_selectedChatPublicKey.value = publicKey
|
_selectedChatPublicKey.value = publicKey
|
||||||
_showChatPicker.value = false
|
_showChatPicker.value = false
|
||||||
|
// 🔥 Увеличиваем триггер чтобы ChatDetailScreen перезагрузил диалог
|
||||||
|
_forwardTrigger.value++
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -155,7 +155,8 @@ data class ReplyData(
|
|||||||
val messageId: String,
|
val messageId: String,
|
||||||
val senderName: String, // Имя отправителя цитируемого сообщения
|
val senderName: String, // Имя отправителя цитируемого сообщения
|
||||||
val text: String,
|
val text: String,
|
||||||
val isFromMe: Boolean // Цитируемое сообщение от меня?
|
val isFromMe: Boolean, // Цитируемое сообщение от меня?
|
||||||
|
val isForwarded: Boolean = false // Это пересланное сообщение?
|
||||||
)
|
)
|
||||||
|
|
||||||
/** Модель сообщения (Legacy - для совместимости) */
|
/** Модель сообщения (Legacy - для совместимости) */
|
||||||
@@ -238,7 +239,7 @@ fun ChatDetailScreen(
|
|||||||
isDarkTheme: Boolean,
|
isDarkTheme: Boolean,
|
||||||
onBack: () -> Unit,
|
onBack: () -> Unit,
|
||||||
onUserProfileClick: (SearchUser) -> Unit = {},
|
onUserProfileClick: (SearchUser) -> Unit = {},
|
||||||
onNavigateToChat: (String) -> Unit = {}, // 📨 Callback для навигации в другой чат (Forward)
|
onNavigateToChat: (SearchUser) -> Unit = {}, // 📨 Callback для навигации в другой чат (Forward)
|
||||||
viewModel: ChatViewModel = viewModel()
|
viewModel: ChatViewModel = viewModel()
|
||||||
) {
|
) {
|
||||||
// 🔥 ОПТИМИЗАЦИЯ: Убрано логирование из композиции чтобы не засорять logcat
|
// 🔥 ОПТИМИЗАЦИЯ: Убрано логирование из композиции чтобы не засорять logcat
|
||||||
@@ -534,8 +535,12 @@ fun ChatDetailScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 🔥 Подписываемся на forward trigger для перезагрузки при forward в тот же чат
|
||||||
|
val forwardTrigger by ForwardManager.forwardTrigger.collectAsState()
|
||||||
|
|
||||||
// Инициализируем ViewModel с ключами и открываем диалог
|
// Инициализируем ViewModel с ключами и открываем диалог
|
||||||
LaunchedEffect(user.publicKey) {
|
// forwardTrigger добавлен чтобы перезагрузить диалог при forward в тот же чат
|
||||||
|
LaunchedEffect(user.publicKey, forwardTrigger) {
|
||||||
viewModel.setUserKeys(currentUserPublicKey, currentUserPrivateKey)
|
viewModel.setUserKeys(currentUserPublicKey, currentUserPrivateKey)
|
||||||
viewModel.openDialog(user.publicKey, user.title, user.username)
|
viewModel.openDialog(user.publicKey, user.title, user.username)
|
||||||
// Подписываемся на онлайн статус собеседника
|
// Подписываемся на онлайн статус собеседника
|
||||||
@@ -2277,11 +2282,18 @@ fun ChatDetailScreen(
|
|||||||
showForwardPicker = false
|
showForwardPicker = false
|
||||||
ForwardManager.clear()
|
ForwardManager.clear()
|
||||||
},
|
},
|
||||||
onChatSelected = { selectedPublicKey ->
|
onChatSelected = { selectedDialog ->
|
||||||
showForwardPicker = false
|
showForwardPicker = false
|
||||||
// Переходим в выбранный чат
|
// Переходим в выбранный чат с полными данными
|
||||||
ForwardManager.selectChat(selectedPublicKey)
|
ForwardManager.selectChat(selectedDialog.opponentKey)
|
||||||
onNavigateToChat(selectedPublicKey)
|
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
|
bottom = 4.dp
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
// 🔥 TELEGRAM: Имя 14sp, Medium weight
|
// 🔥 TELEGRAM: Имя или "Forwarded message" 14sp, Medium weight
|
||||||
Text(
|
Text(
|
||||||
text = replyData.senderName,
|
text = if (replyData.isForwarded) "Forwarded message" else replyData.senderName,
|
||||||
color = nameColor,
|
color = nameColor,
|
||||||
fontSize = 14.sp,
|
fontSize = 14.sp,
|
||||||
fontWeight = FontWeight.Medium,
|
fontWeight = FontWeight.Medium,
|
||||||
|
|||||||
@@ -1043,13 +1043,15 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
val timestamp = System.currentTimeMillis()
|
val timestamp = System.currentTimeMillis()
|
||||||
|
|
||||||
// 🔥 Формируем ReplyData для отображения в UI (только первое сообщение)
|
// 🔥 Формируем ReplyData для отображения в UI (только первое сообщение)
|
||||||
val replyData: ReplyData? = if (replyMsgs.isNotEmpty() && !isForward) {
|
// Работает и для reply, и для forward
|
||||||
|
val replyData: ReplyData? = if (replyMsgs.isNotEmpty()) {
|
||||||
val firstReply = replyMsgs.first()
|
val firstReply = replyMsgs.first()
|
||||||
ReplyData(
|
ReplyData(
|
||||||
messageId = firstReply.messageId,
|
messageId = firstReply.messageId,
|
||||||
senderName = if (firstReply.isOutgoing) "You" else opponentTitle.ifEmpty { opponentUsername.ifEmpty { "User" } },
|
senderName = if (firstReply.isOutgoing) "You" else opponentTitle.ifEmpty { opponentUsername.ifEmpty { "User" } },
|
||||||
text = firstReply.text,
|
text = firstReply.text,
|
||||||
isFromMe = firstReply.isOutgoing
|
isFromMe = firstReply.isOutgoing,
|
||||||
|
isForwarded = isForward
|
||||||
)
|
)
|
||||||
} else null
|
} else null
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ fun ForwardChatPickerBottomSheet(
|
|||||||
isDarkTheme: Boolean,
|
isDarkTheme: Boolean,
|
||||||
currentUserPublicKey: String,
|
currentUserPublicKey: String,
|
||||||
onDismiss: () -> Unit,
|
onDismiss: () -> Unit,
|
||||||
onChatSelected: (String) -> Unit
|
onChatSelected: (DialogUiModel) -> Unit
|
||||||
) {
|
) {
|
||||||
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = false)
|
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = false)
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
@@ -170,7 +170,7 @@ fun ForwardChatPickerBottomSheet(
|
|||||||
dialog = dialog,
|
dialog = dialog,
|
||||||
isDarkTheme = isDarkTheme,
|
isDarkTheme = isDarkTheme,
|
||||||
isSavedMessages = dialog.opponentKey == currentUserPublicKey,
|
isSavedMessages = dialog.opponentKey == currentUserPublicKey,
|
||||||
onClick = { onChatSelected(dialog.opponentKey) }
|
onClick = { onChatSelected(dialog) }
|
||||||
)
|
)
|
||||||
|
|
||||||
// Сепаратор между диалогами
|
// Сепаратор между диалогами
|
||||||
|
|||||||
Reference in New Issue
Block a user