auth to server-V67

This commit is contained in:
Eric85710 2026-05-07 17:04:42 +08:00
parent e346444e97
commit 4948388928
2 changed files with 72 additions and 88 deletions

View file

@ -15,6 +15,7 @@ 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.CircularProgressIndicator
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@ -50,86 +51,65 @@ fun Message_contact_list(
contactListViewModel: ContactListViewModel = hiltViewModel(),
bottomBarViewModel: BottomBarViewModel
) {
// 統一觀察 uiState 即可,避免觀察多個 Flow 導致狀態不同步
val uiState by contactListViewModel.uiState.collectAsStateWithLifecycle()
val friends by contactListViewModel.friends.collectAsStateWithLifecycle()
val friends = uiState.friends // 直接從 uiState 裡面取
DisposableEffect(Unit) {
bottomBarViewModel.setVisible(false)
onDispose {
bottomBarViewModel.setVisible(true)
}
onDispose { bottomBarViewModel.setVisible(true) }
}
Column(
modifier = Modifier
.fillMaxSize()
,
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(modifier = Modifier.height(60.dp))
//pending friends list
Column(
modifier = Modifier
.fillMaxWidth()
) {
if (uiState.pendingRequests.isNotEmpty()) {
// 使用單一 LazyColumn 處理所有內容
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(6.dp)
.padding(horizontal = 6.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
// 頂部間距
item { Spacer(modifier = Modifier.height(60.dp)) }
// --- 區塊一:待處理好友 (只有在有資料時才顯示) ---
if (uiState.pendingRequests.isNotEmpty()) {
item {
Text(
"好友請求 (${uiState.pendingRequests.size})",
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(vertical = 8.dp)
modifier = Modifier.fillMaxWidth().padding(8.dp)
)
}
items(uiState.pendingRequests) { request ->
PendingFriendRow(request)
}
item { HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) }
}
item { HorizontalDivider(modifier = Modifier.padding(vertical = 12.dp)) }
}
}
//friends list
Column(
modifier = Modifier
.fillMaxWidth()
) {
if (friends.isEmpty()) {
// 如果列表是空的,顯示提示(或載入指示器)
Box(
modifier = Modifier.fillMaxSize().padding(6.dp),
contentAlignment = Alignment.Center
) {
Text("目前沒有好友")
}
} else {
// 顯示好友列表
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(6.dp)
) {
// --- 區塊二:正式好友標題 ---
item {
Text(
"所有好友",
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(vertical = 8.dp)
modifier = Modifier.fillMaxWidth().padding(8.dp)
)
}
if (uiState.friends.isEmpty() && !uiState.isLoading) {
// --- 區塊三:正式好友列表內容 ---
if (uiState.friends.isEmpty()) {
item {
Box(modifier = Modifier.fillMaxWidth().padding(32.dp), contentAlignment = Alignment.Center) {
Box(
modifier = Modifier
.fillParentMaxHeight(0.5f) // 佔據剩餘空間的一部分
.fillMaxWidth(),
contentAlignment = Alignment.Center
) {
if (uiState.isLoading) {
CircularProgressIndicator()
} else {
Text("目前沒有好友")
}
}
}
} else {
items(uiState.friends) { friend ->
FriendRow(friend)
@ -137,9 +117,6 @@ fun Message_contact_list(
}
}
}
}
}
}
@Composable

View file

@ -1,5 +1,6 @@
package com.example.login_v3.home.Message.ViewModel.Detail
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.login_v3.data.api.api_class.Friend
@ -25,42 +26,48 @@ class ContactListViewModel @Inject constructor(
private val repository: FriendsRepository
) : ViewModel() {
private val _uiState = MutableStateFlow(ContactUiState())
val uiState: StateFlow<ContactUiState> = _uiState.asStateFlow()
private val _friends = MutableStateFlow<List<Friend>>(emptyList())
val friends: StateFlow<List<Friend>> = _friends
// 🚩 建議刪除獨立的 _friends,全部統一使用 _uiState
init {
// 畫面一建立就自動抓取資料
refreshAll()
}
fun refreshAll() {
fetchFriends()
fetchPendingRequests()
}
//friends list
fun fetchFriends() {
viewModelScope.launch {
_uiState.update { it.copy(isLoading = true) }
repository.getFriendList()
.onSuccess { list ->
val result = repository.getFriendList()
result.onSuccess { list ->
Log.d("DEBUG_API", "好友列表抓取成功,數量: ${list.size}")
_uiState.update { it.copy(isLoading = false, friends = list) }
}
.onFailure { error ->
}.onFailure { error ->
Log.e("DEBUG_API", "好友列表抓取失敗: ${error.message}")
_uiState.update { it.copy(isLoading = false, error = error.message) }
}
}
}
// 獲取待處理請求 (API: /api/friends/pending)
fun fetchPendingRequests() {
viewModelScope.launch {
repository.getPendingRequests()
.onSuccess { requests ->
val result = repository.getPendingRequests()
result.onSuccess { requests ->
Log.d("DEBUG_API", "待處理請求抓取成功,數量: ${requests.size}")
_uiState.update { it.copy(pendingRequests = requests) }
}
.onFailure { /* 處理錯誤 */ }
}.onFailure { error ->
// 🚩 這裡一定要加 Log,否則 API 壞了你不知道
Log.e("DEBUG_API", "待處理請求抓取失敗: ${error.message}")
_uiState.update { it.copy(error = error.message) }
}
}
}
}