From 1c0348ab6e85a7f9eda76153459150d94ad14d1d Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 25 Jul 2026 14:46:41 +0800 Subject: [PATCH] add delta sync for dm-v9 --- .idea/planningMode.xml | 1 + .../data/api/api_class/FriendRequest.kt | 4 +-- .../repository/basic/Friends_Repository.kt | 2 +- .../Message/UI/Detail/Message_contact_list.kt | 25 +++---------------- .../Message/ViewModel/Message_ViewModel.kt | 19 +++++++++----- 5 files changed, 21 insertions(+), 30 deletions(-) diff --git a/.idea/planningMode.xml b/.idea/planningMode.xml index 3298ef1..1d03a52 100644 --- a/.idea/planningMode.xml +++ b/.idea/planningMode.xml @@ -3,6 +3,7 @@ diff --git a/app/src/main/java/com/example/login_v3/data/api/api_class/FriendRequest.kt b/app/src/main/java/com/example/login_v3/data/api/api_class/FriendRequest.kt index 0812ca3..b799f9a 100644 --- a/app/src/main/java/com/example/login_v3/data/api/api_class/FriendRequest.kt +++ b/app/src/main/java/com/example/login_v3/data/api/api_class/FriendRequest.kt @@ -18,7 +18,7 @@ data class Friend( val username: String?, // 建議 username 也改可空 - @Json(name = "display_name") // 移除 field: 試試看 + @Json(name = "display_name") val displayName: String?, @Json(name = "avatar_url") @@ -35,7 +35,7 @@ val Friend.fullFriendsAvatarUrl: Any return when { url.isBlank() -> R.drawable.avatar_v1 url.startsWith("http") -> url - else -> "http://192.168.0.217$url" + else -> "https://tg.technologia-tw.com$url" } } diff --git a/app/src/main/java/com/example/login_v3/data/repository/basic/Friends_Repository.kt b/app/src/main/java/com/example/login_v3/data/repository/basic/Friends_Repository.kt index d66445a..f89c76d 100644 --- a/app/src/main/java/com/example/login_v3/data/repository/basic/Friends_Repository.kt +++ b/app/src/main/java/com/example/login_v3/data/repository/basic/Friends_Repository.kt @@ -26,7 +26,7 @@ class FriendsRepository @Inject constructor( username = entity.username, displayName = entity.displayName, avatarUrl = entity.avatarUrl, - status = entity.status, + status = entity.presenceStatus, acceptedAt = null // Sync API 目前沒給這個,先設為 null ) } diff --git a/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_contact_list.kt b/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_contact_list.kt index 076cfb1..7a17f1a 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_contact_list.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_contact_list.kt @@ -88,6 +88,8 @@ import com.example.login_v3.home.Message.ViewModel.Detail.ContactListViewModel import com.example.login_v3.navigation.BottomBarViewModel import androidx.compose.ui.text.input.ImeAction import com.example.login_v3.data.api.api_class.fullSearchedAvatarUrl +import com.example.login_v3.home.Message.UI.Detail.Message_Component.UserStatusDot +import com.example.login_v3.home.Message.ViewModel.UserStatus @Composable @@ -225,13 +227,6 @@ fun FriendRow( // 1. 定義展開狀態 var isExpanded by remember { mutableStateOf(false) } - // 定義狀態顏色 - val statusColor = when (friend.status?.lowercase()) { - "online" -> Color(0xFF4CAF50) // 鮮豔的綠色 - "busy" -> Color(0xFFF44336) // 紅色 - else -> Color(0xFF9E9E9E) // 灰色 (offline/away) - } - Card( modifier = Modifier .fillMaxWidth() @@ -308,20 +303,8 @@ fun FriendRow( ) } - val isOnline = friend.status?.lowercase() == "online" - // 定義圓點顏色 - val dotColor = if (isOnline) { - Color(0xFF4CAF50) // 綠色 (Online) - } else { - Color(0xFF9E9E9E) // 灰色 (Offline) - } - - // 實作圓點 - Box( - modifier = Modifier - .size(10.dp) // 圓點大小 - .clip(CircleShape) - .background(dotColor) + UserStatusDot( + status = UserStatus.fromString(friend.status) ) Spacer(modifier = Modifier.width(10.dp)) diff --git a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Message_ViewModel.kt b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Message_ViewModel.kt index 1c51071..aebec8e 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Message_ViewModel.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Message_ViewModel.kt @@ -49,9 +49,10 @@ class ChatRoomsViewModel @Inject constructor( } enum class UserStatus(val color: Color) { - ONLINE(Color.Green), - OFFLINE(Color.Gray), - UNKNOWN(Color.Transparent); // 或者是你原本設定的顏色 + ONLINE(Color(0xFF4CAF50)), + BUSY(Color(0xFFF44336)), + OFFLINE(Color(0xFF9E9E9E)), + UNKNOWN(Color.Transparent); companion object { fun fromString(status: String?): UserStatus { @@ -60,9 +61,15 @@ enum class UserStatus(val color: Color) { // 使用 try-catch 或者是 safe valueOf 確保絕對不閃退 return try { // uppercase() 預防後端一下給大寫一下給小寫 (例如 "online" vs "ONLINE") - valueOf(status.uppercase()) - } catch (e: IllegalArgumentException) { - UNKNOWN // 找不到對應的狀態就安全地回傳 UNKNOWN + val normalizedStatus = status.uppercase() + when (normalizedStatus) { + "ONLINE" -> ONLINE + "BUSY" -> BUSY + "OFFLINE" -> OFFLINE + else -> OFFLINE // 如果是其他自定義狀態,統一顯示為離線 (灰色) + } + } catch (e: Exception) { + OFFLINE } } }