diff --git a/app/src/main/java/com/rosetta/messenger/MainActivity.kt b/app/src/main/java/com/rosetta/messenger/MainActivity.kt index a94fcdf..5543520 100644 --- a/app/src/main/java/com/rosetta/messenger/MainActivity.kt +++ b/app/src/main/java/com/rosetta/messenger/MainActivity.kt @@ -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 } ) } diff --git a/app/src/main/java/com/rosetta/messenger/data/ForwardManager.kt b/app/src/main/java/com/rosetta/messenger/data/ForwardManager.kt index 1fab095..4026cde 100644 --- a/app/src/main/java/com/rosetta/messenger/data/ForwardManager.kt +++ b/app/src/main/java/com/rosetta/messenger/data/ForwardManager.kt @@ -42,6 +42,10 @@ object ForwardManager { private val _selectedChatPublicKey = MutableStateFlow(null) val selectedChatPublicKey: StateFlow = _selectedChatPublicKey.asStateFlow() + // 🔥 Счётчик для триггера перезагрузки диалога при forward + private val _forwardTrigger = MutableStateFlow(0) + val forwardTrigger: StateFlow = _forwardTrigger.asStateFlow() + /** * Установить сообщения для пересылки и показать выбор чата */ @@ -61,6 +65,8 @@ object ForwardManager { fun selectChat(publicKey: String) { _selectedChatPublicKey.value = publicKey _showChatPicker.value = false + // 🔥 Увеличиваем триггер чтобы ChatDetailScreen перезагрузил диалог + _forwardTrigger.value++ } /** diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt index 4988bdb..e7cab86 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt @@ -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, diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt index abe03a1..b6370a0 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt @@ -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 diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ForwardChatPickerBottomSheet.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ForwardChatPickerBottomSheet.kt index 16a99fd..087e186 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ForwardChatPickerBottomSheet.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ForwardChatPickerBottomSheet.kt @@ -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) } ) // Сепаратор между диалогами