From 494838892841eaf9b8019457373ca50f5d5aa060 Mon Sep 17 00:00:00 2001 From: Eric85710 Date: Thu, 7 May 2026 17:04:42 +0800 Subject: [PATCH] auth to server-V67 --- .../Message/UI/Detail/Message_contact_list.kt | 113 +++++++----------- .../Detail/Contact_list_ViewModel.kt | 47 ++++---- 2 files changed, 72 insertions(+), 88 deletions(-) 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 4864043..0735b5a 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 @@ -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) + } } } } 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 49be749..2c1bdb0 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 @@ -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 = _uiState.asStateFlow() - private val _friends = MutableStateFlow>(emptyList()) - val friends: StateFlow> = _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) } + } } } } \ No newline at end of file