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.Icons
|
||||||
import androidx.compose.material.icons.filled.Check
|
import androidx.compose.material.icons.filled.Check
|
||||||
import androidx.compose.material.icons.filled.Close
|
import androidx.compose.material.icons.filled.Close
|
||||||
|
import androidx.compose.material3.CircularProgressIndicator
|
||||||
import androidx.compose.material3.HorizontalDivider
|
import androidx.compose.material3.HorizontalDivider
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
|
|
@ -50,86 +51,65 @@ fun Message_contact_list(
|
||||||
contactListViewModel: ContactListViewModel = hiltViewModel(),
|
contactListViewModel: ContactListViewModel = hiltViewModel(),
|
||||||
bottomBarViewModel: BottomBarViewModel
|
bottomBarViewModel: BottomBarViewModel
|
||||||
) {
|
) {
|
||||||
|
// 統一觀察 uiState 即可,避免觀察多個 Flow 導致狀態不同步
|
||||||
val uiState by contactListViewModel.uiState.collectAsStateWithLifecycle()
|
val uiState by contactListViewModel.uiState.collectAsStateWithLifecycle()
|
||||||
val friends by contactListViewModel.friends.collectAsStateWithLifecycle()
|
val friends = uiState.friends // 直接從 uiState 裡面取
|
||||||
|
|
||||||
DisposableEffect(Unit) {
|
DisposableEffect(Unit) {
|
||||||
bottomBarViewModel.setVisible(false)
|
bottomBarViewModel.setVisible(false)
|
||||||
onDispose {
|
onDispose { bottomBarViewModel.setVisible(true) }
|
||||||
bottomBarViewModel.setVisible(true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Column(
|
// 使用單一 LazyColumn 處理所有內容
|
||||||
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
|
modifier = Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.padding(6.dp)
|
.padding(horizontal = 6.dp),
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally
|
||||||
) {
|
) {
|
||||||
|
// 頂部間距
|
||||||
|
item { Spacer(modifier = Modifier.height(60.dp)) }
|
||||||
|
|
||||||
|
// --- 區塊一:待處理好友 (只有在有資料時才顯示) ---
|
||||||
|
if (uiState.pendingRequests.isNotEmpty()) {
|
||||||
item {
|
item {
|
||||||
Text(
|
Text(
|
||||||
"好友請求 (${uiState.pendingRequests.size})",
|
"好友請求 (${uiState.pendingRequests.size})",
|
||||||
style = MaterialTheme.typography.titleMedium,
|
style = MaterialTheme.typography.titleMedium,
|
||||||
modifier = Modifier.padding(vertical = 8.dp)
|
modifier = Modifier.fillMaxWidth().padding(8.dp)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
items(uiState.pendingRequests) { request ->
|
items(uiState.pendingRequests) { request ->
|
||||||
PendingFriendRow(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 {
|
item {
|
||||||
Text(
|
Text(
|
||||||
"所有好友",
|
"所有好友",
|
||||||
style = MaterialTheme.typography.titleMedium,
|
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 {
|
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("目前沒有好友")
|
Text("目前沒有好友")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
items(uiState.friends) { friend ->
|
items(uiState.friends) { friend ->
|
||||||
FriendRow(friend)
|
FriendRow(friend)
|
||||||
|
|
@ -137,9 +117,6 @@ fun Message_contact_list(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.example.login_v3.home.Message.ViewModel.Detail
|
package com.example.login_v3.home.Message.ViewModel.Detail
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.example.login_v3.data.api.api_class.Friend
|
import com.example.login_v3.data.api.api_class.Friend
|
||||||
|
|
@ -25,42 +26,48 @@ class ContactListViewModel @Inject constructor(
|
||||||
private val repository: FriendsRepository
|
private val repository: FriendsRepository
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
|
|
||||||
private val _uiState = MutableStateFlow(ContactUiState())
|
private val _uiState = MutableStateFlow(ContactUiState())
|
||||||
val uiState: StateFlow<ContactUiState> = _uiState.asStateFlow()
|
val uiState: StateFlow<ContactUiState> = _uiState.asStateFlow()
|
||||||
private val _friends = MutableStateFlow<List<Friend>>(emptyList())
|
|
||||||
val friends: StateFlow<List<Friend>> = _friends
|
// 🚩 建議刪除獨立的 _friends,全部統一使用 _uiState
|
||||||
|
|
||||||
init {
|
init {
|
||||||
// 畫面一建立就自動抓取資料
|
refreshAll()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun refreshAll() {
|
||||||
fetchFriends()
|
fetchFriends()
|
||||||
fetchPendingRequests()
|
fetchPendingRequests()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//friends list
|
|
||||||
fun fetchFriends() {
|
fun fetchFriends() {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
_uiState.update { it.copy(isLoading = true) }
|
_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) }
|
_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) }
|
_uiState.update { it.copy(isLoading = false, error = error.message) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 獲取待處理請求 (API: /api/friends/pending)
|
|
||||||
fun fetchPendingRequests() {
|
fun fetchPendingRequests() {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
repository.getPendingRequests()
|
val result = repository.getPendingRequests()
|
||||||
.onSuccess { requests ->
|
|
||||||
|
result.onSuccess { requests ->
|
||||||
|
Log.d("DEBUG_API", "待處理請求抓取成功,數量: ${requests.size}")
|
||||||
_uiState.update { it.copy(pendingRequests = requests) }
|
_uiState.update { it.copy(pendingRequests = requests) }
|
||||||
}
|
}.onFailure { error ->
|
||||||
.onFailure { /* 處理錯誤 */ }
|
// 🚩 這裡一定要加 Log,否則 API 壞了你不知道
|
||||||
|
Log.e("DEBUG_API", "待處理請求抓取失敗: ${error.message}")
|
||||||
|
_uiState.update { it.copy(error = error.message) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in a new issue