auth to server-V67
This commit is contained in:
parent
e346444e97
commit
4948388928
2 changed files with 72 additions and 88 deletions
|
|
@ -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
|
||||
|
|
@ -49,94 +50,70 @@ fun Message_contact_list(
|
|||
navController: NavController,
|
||||
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(
|
||||
// 使用單一 LazyColumn 處理所有內容
|
||||
LazyColumn(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
,
|
||||
.padding(horizontal = 6.dp),
|
||||
horizontalAlignment = Alignment.CenterHorizontally
|
||||
) {
|
||||
Spacer(modifier = Modifier.height(60.dp))
|
||||
|
||||
//pending friends list
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
) {
|
||||
if (uiState.pendingRequests.isNotEmpty()) {
|
||||
LazyColumn(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(6.dp)
|
||||
) {
|
||||
item {
|
||||
Text(
|
||||
"好友請求 (${uiState.pendingRequests.size})",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
modifier = Modifier.padding(vertical = 8.dp)
|
||||
)
|
||||
}
|
||||
items(uiState.pendingRequests) { request ->
|
||||
PendingFriendRow(request)
|
||||
}
|
||||
item { HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) }
|
||||
}
|
||||
}
|
||||
// 頂部間距
|
||||
item { Spacer(modifier = Modifier.height(60.dp)) }
|
||||
|
||||
// --- 區塊一:待處理好友 (只有在有資料時才顯示) ---
|
||||
if (uiState.pendingRequests.isNotEmpty()) {
|
||||
item {
|
||||
Text(
|
||||
"好友請求 (${uiState.pendingRequests.size})",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
modifier = Modifier.fillMaxWidth().padding(8.dp)
|
||||
)
|
||||
}
|
||||
items(uiState.pendingRequests) { request ->
|
||||
PendingFriendRow(request)
|
||||
}
|
||||
item { HorizontalDivider(modifier = Modifier.padding(vertical = 12.dp)) }
|
||||
}
|
||||
|
||||
//friends list
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
) {
|
||||
if (friends.isEmpty()) {
|
||||
// 如果列表是空的,顯示提示(或載入指示器)
|
||||
// --- 區塊二:正式好友標題 ---
|
||||
item {
|
||||
Text(
|
||||
"所有好友",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
modifier = Modifier.fillMaxWidth().padding(8.dp)
|
||||
)
|
||||
}
|
||||
|
||||
// --- 區塊三:正式好友列表內容 ---
|
||||
if (uiState.friends.isEmpty()) {
|
||||
item {
|
||||
Box(
|
||||
modifier = Modifier.fillMaxSize().padding(6.dp),
|
||||
modifier = Modifier
|
||||
.fillParentMaxHeight(0.5f) // 佔據剩餘空間的一部分
|
||||
.fillMaxWidth(),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Text("目前沒有好友")
|
||||
}
|
||||
} else {
|
||||
// 顯示好友列表
|
||||
LazyColumn(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(6.dp)
|
||||
) {
|
||||
item {
|
||||
Text(
|
||||
"所有好友",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
modifier = Modifier.padding(vertical = 8.dp)
|
||||
)
|
||||
}
|
||||
|
||||
if (uiState.friends.isEmpty() && !uiState.isLoading) {
|
||||
item {
|
||||
Box(modifier = Modifier.fillMaxWidth().padding(32.dp), contentAlignment = Alignment.Center) {
|
||||
Text("目前沒有好友")
|
||||
}
|
||||
}
|
||||
if (uiState.isLoading) {
|
||||
CircularProgressIndicator()
|
||||
} else {
|
||||
items(uiState.friends) { friend ->
|
||||
FriendRow(friend)
|
||||
}
|
||||
Text("目前沒有好友")
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
items(uiState.friends) { friend ->
|
||||
FriendRow(friend)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ->
|
||||
_uiState.update { it.copy(isLoading = false, friends = list) }
|
||||
}
|
||||
.onFailure { error ->
|
||||
_uiState.update { it.copy(isLoading = false, error = error.message) }
|
||||
}
|
||||
|
||||
val result = repository.getFriendList()
|
||||
|
||||
result.onSuccess { list ->
|
||||
Log.d("DEBUG_API", "好友列表抓取成功,數量: ${list.size}")
|
||||
_uiState.update { it.copy(isLoading = false, friends = list) }
|
||||
}.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 ->
|
||||
_uiState.update { it.copy(pendingRequests = requests) }
|
||||
}
|
||||
.onFailure { /* 處理錯誤 */ }
|
||||
val result = repository.getPendingRequests()
|
||||
|
||||
result.onSuccess { requests ->
|
||||
Log.d("DEBUG_API", "待處理請求抓取成功,數量: ${requests.size}")
|
||||
_uiState.update { it.copy(pendingRequests = requests) }
|
||||
}.onFailure { error ->
|
||||
// 🚩 這裡一定要加 Log,否則 API 壞了你不知道
|
||||
Log.e("DEBUG_API", "待處理請求抓取失敗: ${error.message}")
|
||||
_uiState.update { it.copy(error = error.message) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue