From 0b8cc652eebbf21a1721047d61c280878fdc5a1e Mon Sep 17 00:00:00 2001 From: Eric85710 Date: Mon, 11 May 2026 16:16:29 +0800 Subject: [PATCH] auth to server-V84 --- .../Message/UI/Detail/Message_contact_list.kt | 181 +++++++----------- .../Detail/Contact_list_ViewModel.kt | 11 +- 2 files changed, 80 insertions(+), 112 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 d764285..71daa58 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 @@ -110,80 +110,90 @@ fun Message_contact_list( ) } - // --- 搜尋結果區塊 (僅在有結果時顯示) --- - if (uiState.searchResults.isNotEmpty()) { - item { - Text( - "搜尋結果", - style = MaterialTheme.typography.titleMedium, - modifier = Modifier.fillMaxWidth().padding(8.dp), - color = MaterialTheme.colorScheme.primary - ) - } - items(uiState.searchResults) { user -> - // 這裡你可以自定義搜尋結果的 Row - SearchResultRow( - user = user, - onAddFriend = { contactListViewModel.sendFriendRequest(user.id) } - ) - } - item { HorizontalDivider(modifier = Modifier.padding(vertical = 12.dp)) } - } + //is Searching or not + if (uiState.isSearching) { - // --- 區塊一:待處理好友 (只有在有資料時才顯示) --- - if (uiState.pendingRequests.isNotEmpty()) { + // --- 搜尋結果區塊 (僅在有結果時顯示) --- + if (uiState.searchResults.isNotEmpty()) { + item { + Text( + "搜尋結果", + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.fillMaxWidth().padding(8.dp), + color = MaterialTheme.colorScheme.primary + ) + } + items(uiState.searchResults) { user -> + // 這裡你可以自定義搜尋結果的 Row + SearchResultRow( + user = user, + onAddFriend = { contactListViewModel.sendFriendRequest(user.id) } + ) + } + } + + + //if not searching then display friends list + }else { + // --- 區塊一:待處理好友 (只有在有資料時才顯示) --- + 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, + isLoading = uiState.isLoading, + onAccept = { _ -> + request.fromUserId?.let { id -> contactListViewModel.acceptFriend(id) } + }, + onReject = { _ -> + request.fromUserId?.let { id -> contactListViewModel.rejectFriend(id) } + } + ) + } + item { HorizontalDivider(modifier = Modifier.padding(vertical = 12.dp)) } + } + + // --- 區塊二:正式好友標題 --- item { Text( - "好友請求 (${uiState.pendingRequests.size})", + "所有好友", style = MaterialTheme.typography.titleMedium, modifier = Modifier.fillMaxWidth().padding(8.dp) ) } - items(uiState.pendingRequests) { request -> - PendingFriendRow( - request, - isLoading = uiState.isLoading, - onAccept = { _ -> - request.fromUserId?.let { id -> contactListViewModel.acceptFriend(id) } - }, - onReject = { _ -> - request.fromUserId?.let { id -> contactListViewModel.rejectFriend(id) } - } - ) - } - item { HorizontalDivider(modifier = Modifier.padding(vertical = 12.dp)) } - } - // --- 區塊二:正式好友標題 --- - item { - Text( - "所有好友", - style = MaterialTheme.typography.titleMedium, - modifier = Modifier.fillMaxWidth().padding(8.dp) - ) - } - - // --- 區塊三:正式好友列表內容 --- - if (uiState.friends.isEmpty()) { - item { - Box( - modifier = Modifier - .fillParentMaxHeight(0.5f) // 佔據剩餘空間的一部分 - .fillMaxWidth(), - contentAlignment = Alignment.Center - ) { - if (uiState.isLoading) { - CircularProgressIndicator() - } else { - Text("目前沒有好友") + // --- 區塊三:正式好友列表內容 --- + if (uiState.friends.isEmpty()) { + item { + Box( + modifier = Modifier + .fillParentMaxHeight(0.5f) // 佔據剩餘空間的一部分 + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + if (uiState.isLoading) { + CircularProgressIndicator() + } else { + Text("目前沒有好友") + } } } - } - } else { - items(uiState.friends) { friends -> - FriendRow(friends) + } else { + items(uiState.friends) { friends -> + FriendRow(friends) + } } } + + + + } } @@ -332,53 +342,6 @@ fun PendingFriendRow( ) } -//add friends -@Composable - fun AddUserBar( - isLoading: Boolean, - onSendRequest: (String) -> Unit -) { - var userIdText by remember { mutableStateOf("") } - - Row( - modifier = Modifier - .fillMaxWidth() - .padding(8.dp), - verticalAlignment = Alignment.CenterVertically - ) { - OutlinedTextField( - value = userIdText, - onValueChange = { userIdText = it }, - label = { Text("輸入好友 ID") }, - modifier = Modifier.weight(1f), - singleLine = true, - enabled = !isLoading - ) - - Spacer(modifier = Modifier.width(8.dp)) - - Button( - onClick = { - if (userIdText.isNotBlank()) { - onSendRequest(userIdText) - userIdText = "" // 發送後清空輸入框 - } - }, - enabled = !isLoading && userIdText.isNotBlank() - ) { - if (isLoading) { - CircularProgressIndicator( - modifier = Modifier.size(16.dp), - color = MaterialTheme.colorScheme.onPrimary, - strokeWidth = 2.dp - ) - } else { - Text("新增") - } - } - } -} - //search user @Composable 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 14f2521..3b18327 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 @@ -22,10 +22,12 @@ data class ContactUiState( val isLoading: Boolean = false, val friends: List = emptyList(), val pendingRequests: List = emptyList(), - // 新增:搜尋結果與關鍵字 val searchResults: List = emptyList(), val searchQuery: String = "", - val error: String? = null + val error: String? = null, + + //UI state + val isSearching: Boolean = false ) @HiltViewModel class ContactListViewModel @Inject constructor( @@ -136,7 +138,10 @@ class ContactListViewModel @Inject constructor( //search user fun onSearchQueryChanged(newQuery: String) { // 1. 即時更新文字輸入,確保 UI TextField 顯示順暢 - _uiState.update { it.copy(searchQuery = newQuery) } + _uiState.update { it.copy( + searchQuery = newQuery, + isSearching = newQuery.isNotBlank() + ) } } fun performSearch() {