diff --git a/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt b/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt index b389128..1636cb0 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt @@ -45,24 +45,16 @@ fun MessageMessaging( onBackClick: () -> Unit, viewModel: ChatViewModel = hiltViewModel() ) { - // 加上 collectAsStateWithLifecycle() 轉換它 val uiState by viewModel.uiState.collectAsStateWithLifecycle() - LaunchedEffect(roomId) { viewModel.loadMessages(roomId) - Log.d("ChatDebug", "UI State 變更為: ${uiState::class.simpleName}") } Scaffold( topBar = { TopAppBar( title = { Text("聊天室 ($roomId)") }, - navigationIcon = { - IconButton(onClick = onBackClick) { - Text("<") - } - } ) } ) { innerPadding -> @@ -96,7 +88,7 @@ fun MessageMessaging( @Composable fun MessageList( - messages: List, // 這裡是正確的 Message + messages: List, modifier: Modifier = Modifier ) { val currentUserId = "user_123" @@ -106,7 +98,6 @@ fun MessageList( contentPadding = PaddingValues(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { - // items 內部拿到的 message 會依循 List 的型態 items(messages) { message -> val isMe = message.senderId == currentUserId MessageRow(message = message, isMe = isMe) @@ -116,7 +107,7 @@ fun MessageList( @Composable fun MessageRow( - message: Message, // ✅ 修正這裡:將 Screen.Message 改為 Message + message: Message, isMe: Boolean ) { Row( @@ -140,13 +131,13 @@ fun MessageRow( Column { if (!isMe) { Text( - text = message.senderId, // ✅ 這樣型態對了,就能抓到欄位了! + text = message.senderId, style = MaterialTheme.typography.labelSmall, color = Color.Gray ) } Text( - text = message.content, // ✅ 這樣型態對了,就能抓到欄位了! + text = message.content, style = MaterialTheme.typography.bodyMedium ) } diff --git a/app/src/main/java/com/example/login_v3/home/Message/UI/Message.kt b/app/src/main/java/com/example/login_v3/home/Message/UI/Message.kt index fd6e554..d5bb098 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/UI/Message.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/UI/Message.kt @@ -89,9 +89,8 @@ sealed class Screen(val route: String) { object ScanQRcode : Screen("scan_QRcode") object MessageMessaging : Screen("message_messaging?roomId={roomId}") { fun createRoute(roomId: String): String { - val encodedId = java.net.URLEncoder.encode(roomId, "UTF-8") - // 2. 修改這裡:帶入對應的格式 - return "message_messaging?roomId=$encodedId" + // 🚀 修正:直接帶入原始 roomId,不進行 URL Encode + return "message_messaging?roomId=$roomId" } } } @@ -139,23 +138,17 @@ fun Tg_Message( //Message detail composable( - route = Screen.MessageMessaging.route, // 現在是 "message_messaging?roomId={roomId}" + route = Screen.MessageMessaging.route, arguments = listOf( navArgument("roomId") { type = NavType.StringType - nullable = true // 查詢參數建議改為允許為空 - defaultValue = "" // 給予預設值 + nullable = true + defaultValue = "" } ) ) { backStackEntry -> - // 這裡維持你寫好的安全解碼邏輯 - val encodedRoomId = backStackEntry.arguments?.getString("roomId").orEmpty() - - val roomId = try { - java.net.URLDecoder.decode(encodedRoomId, "UTF-8") - } catch (e: Exception) { - encodedRoomId - } + // 🚀 修正:直接抓取 arguments 的字串,不再進行 URL Decode + val roomId = backStackEntry.arguments?.getString("roomId").orEmpty() MessageMessaging( roomId = roomId, diff --git a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt index 4b5c1c3..bdc7878 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt @@ -29,22 +29,16 @@ class ChatViewModel @Inject constructor( val uiState: StateFlow = _uiState.asStateFlow() fun loadMessages(roomId: String) { - // 🔴 Debug 1: 檢查傳進來的 roomId 是不是正確的,還是空的、被錯誤編碼的? - Log.d("ChatDebug", "ViewModel: loadMessages 開始執行, roomId = '$roomId'") viewModelScope.launch { _uiState.value = MessagesUiState.Loading repository.getChatMessages(roomId) .onSuccess { response -> - // 🔴 Debug 2: 檢查後端有沒有正確回傳,數量是多少? - Log.d("ChatDebug", "ViewModel: API 請求成功, 訊息數量 = ${response.messages.size}") _uiState.value = MessagesUiState.Success(messages = response.messages) } .onFailure { exception -> - // 🔴 Debug 3: 檢查是不是 API 報錯(例如 404, 500)或是解析 JSON 失敗 - Log.e("ChatDebug", "ViewModel: API 請求失敗", exception) _uiState.value = MessagesUiState.Error(message = exception.message ?: "未知錯誤") }