diff --git a/app/src/main/java/com/example/login_v3/data/api/Main_API_Service.kt b/app/src/main/java/com/example/login_v3/data/api/Main_API_Service.kt index c7f86d8..82b2222 100644 --- a/app/src/main/java/com/example/login_v3/data/api/Main_API_Service.kt +++ b/app/src/main/java/com/example/login_v3/data/api/Main_API_Service.kt @@ -53,8 +53,14 @@ interface TecnologiaApi { suspend fun getFriends(): FriendListResponse @GET("api/friends/pending") suspend fun getFriendsPending(): PendingFriendsResponse + + //accept and reject @POST("api/friends/{id}/accept") suspend fun acceptFriendRequest( @Path("id") friendshipId: String ): Response + @POST("api/friends/{id}/reject") + suspend fun rejectFriendRequest( + @Path("id") friendshipId: String + ): Response } \ No newline at end of file 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 de89fc2..a9fae7f 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 @@ -3,6 +3,7 @@ package com.example.login_v3.data.repository.basic import com.example.login_v3.data.api.TecnologiaApi import com.example.login_v3.data.api.api_class.Friend import com.example.login_v3.data.api.api_class.PendingFriendApiModel +import retrofit2.Response import javax.inject.Inject class FriendsRepository @Inject constructor( @@ -33,14 +34,22 @@ class FriendsRepository @Inject constructor( } } - suspend fun acceptFriendRequest(friendshipId: String): Result { + // 接受 + suspend fun acceptFriendRequest(id: String) = safeApiCall { + apiService.acceptFriendRequest(id) + } + + // 拒絕 + suspend fun rejectFriendRequest(id: String) = safeApiCall { + apiService.rejectFriendRequest(id) + } + + // 統一處理 Response 的工具函式 + private suspend fun safeApiCall(call: suspend () -> Response): Result { return try { - val response = apiService.acceptFriendRequest(friendshipId) - if (response.isSuccessful) { - Result.success(Unit) - } else { - Result.failure(Exception("接受失敗: ${response.code()}")) - } + val response = call() + if (response.isSuccessful) Result.success(Unit) + else Result.failure(Exception("API 錯誤: ${response.code()}")) } catch (e: Exception) { Result.failure(e) } 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 c77bdb3..afe1a81 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 @@ -82,7 +82,11 @@ fun Message_contact_list( ) } items(uiState.pendingRequests) { request -> - PendingFriendRow(request) + PendingFriendRow( + request, + onAccept = { id -> contactListViewModel.acceptFriend(id) }, + onReject = { id -> /* 實作邏輯同 accept */ } + ) } item { HorizontalDivider(modifier = Modifier.padding(vertical = 12.dp)) } } @@ -152,7 +156,11 @@ fun FriendRow(friend: Friend) { } @Composable -fun PendingFriendRow(request: PendingFriendApiModel) { +fun PendingFriendRow( + request: PendingFriendApiModel, + onAccept: (String) -> Unit, // 增加回呼 + onReject: (String) -> Unit // 增加回呼 +) { ListItem( headlineContent = { Text("${request.displayName}") }, supportingContent = { Text("想加你為好友") }, @@ -167,10 +175,14 @@ fun PendingFriendRow(request: PendingFriendApiModel) { }, trailingContent = { Row { - IconButton(onClick = { /* TODO: 呼叫 ViewModel 拒絕 */ }) { + IconButton(onClick = { + request.friendshipId?.let { onReject(it) } + }) { Icon(Icons.Default.Close, contentDescription = "拒絕", tint = Color.Red) } - IconButton(onClick = { /* TODO: 呼叫 ViewModel 接受 */ }) { + IconButton(onClick = { + request.friendshipId?.let { onAccept(it) } + }) { Icon(Icons.Default.Check, contentDescription = "接受", tint = Color.Green) } } 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 6bea42e..37010cd 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 @@ -53,4 +53,33 @@ class ContactListViewModel @Inject constructor( } } } + + + //accept and reject + fun acceptFriend(friendshipId: String) { + viewModelScope.launch { + // 這裡可以選擇性開啟 loading + val result = repository.acceptFriendRequest(friendshipId) + + result.onSuccess { + // 關鍵:重新整理資料,讓 UI 自動更新 + refreshAll() + }.onFailure { error -> + Log.e("DEBUG_API", "接受請求錯誤: ${error.message}") + _uiState.update { it.copy(error = "無法接受請求:${error.message}") } + } + } + } + fun rejectFriend(friendshipId: String) { + viewModelScope.launch { + val result = repository.rejectFriendRequest(friendshipId) + + result.onSuccess { + refreshAll() // 刷新列表,該筆請求會消失 + }.onFailure { error -> + Log.e("DEBUG_API", "拒絕請求錯誤: ${error.message}") + _uiState.update { it.copy(error = "無法拒絕請求:${error.message}") } + } + } + } } \ No newline at end of file