dm-16
This commit is contained in:
parent
8bbf1cfb27
commit
7f0047033a
3 changed files with 11 additions and 33 deletions
|
|
@ -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>, // 這裡是正確的 Message
|
||||
messages: List<Message>,
|
||||
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<Message> 的型態
|
||||
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
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -29,22 +29,16 @@ class ChatViewModel @Inject constructor(
|
|||
val uiState: StateFlow<MessagesUiState> = _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 ?: "未知錯誤")
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue