From a35d4412f3032e7e1a0933b9d67c140f0493491f Mon Sep 17 00:00:00 2001 From: Eric85710 Date: Sat, 9 May 2026 16:53:08 +0800 Subject: [PATCH] auth to server-V76 --- .../data/api/api_class/FriendRequest.kt | 1 + .../repository/basic/Friends_Repository.kt | 1 + .../Message/UI/Detail/Message_contact_list.kt | 62 +++++++++++++++++++ .../Detail/Contact_list_ViewModel.kt | 2 - 4 files changed, 64 insertions(+), 2 deletions(-) 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 5178185..2020761 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 @@ -66,6 +66,7 @@ data class PendingFriendApiModel( val createdAt: String? ) //add friends +@JsonClass(generateAdapter = true) data class AddFriendRequest( @Json(name = "friend_id") val friendId: String ) 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 222e323..fbbf9bd 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 @@ -55,6 +55,7 @@ class FriendsRepository @Inject constructor( Result.failure(e) } } + //add friends suspend fun sendFriendRequest(friendId: String): Result { return safeApiCall { 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 9534c8a..56ba2f1 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 @@ -10,23 +10,29 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -72,6 +78,14 @@ fun Message_contact_list( // 頂部間距 item { Spacer(modifier = Modifier.height(60.dp)) } + //add friends + item { + AddUserBar( + isLoading = uiState.isLoading, + onSendRequest = { id -> contactListViewModel.sendFriendRequest(id) } + ) + } + // --- 區塊一:待處理好友 (只有在有資料時才顯示) --- if (uiState.pendingRequests.isNotEmpty()) { item { @@ -130,6 +144,7 @@ fun Message_contact_list( } +//friends list @Composable fun FriendRow(friend: Friend) { ListItem( @@ -196,4 +211,51 @@ fun PendingFriendRow( } } ) +} + +//add friends +@Composable + fun AddUserBar( + isLoading: Boolean, + onSendRequest: (String) -> Unit +) { + var userIdText by remember { mutableStateOf("") } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + OutlinedTextField( + value = userIdText, + onValueChange = { userIdText = it }, + label = { Text("輸入好友 ID") }, + modifier = Modifier.weight(1f), + singleLine = true, + enabled = !isLoading + ) + + Spacer(modifier = Modifier.width(8.dp)) + + Button( + onClick = { + if (userIdText.isNotBlank()) { + onSendRequest(userIdText) + userIdText = "" // 發送後清空輸入框 + } + }, + enabled = !isLoading && userIdText.isNotBlank() + ) { + if (isLoading) { + CircularProgressIndicator( + modifier = Modifier.size(16.dp), + color = MaterialTheme.colorScheme.onPrimary, + strokeWidth = 2.dp + ) + } else { + Text("新增") + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Contact_list_ViewModel.kt b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Contact_list_ViewModel.kt index 1aaa663..36b2c80 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Contact_list_ViewModel.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Contact_list_ViewModel.kt @@ -68,7 +68,6 @@ class ContactListViewModel @Inject constructor( // 關鍵:重新整理資料,讓 UI 自動更新 refreshAll() }.onFailure { error -> - Log.e("DEBUG_API", "接受請求錯誤: ${error.message}") _uiState.update { it.copy(error = "無法接受請求:${error.message}") } } } @@ -83,7 +82,6 @@ class ContactListViewModel @Inject constructor( result.onSuccess { refreshAll() // 刷新列表,該筆請求會消失 }.onFailure { error -> - Log.e("DEBUG_API", "拒絕請求錯誤: ${error.message}") _uiState.update { it.copy(error = "無法拒絕請求:${error.message}") } } }