auth to server-V84
This commit is contained in:
parent
17b2e9d272
commit
0b8cc652ee
2 changed files with 80 additions and 112 deletions
|
|
@ -110,80 +110,90 @@ fun Message_contact_list(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- 搜尋結果區塊 (僅在有結果時顯示) ---
|
//is Searching or not
|
||||||
if (uiState.searchResults.isNotEmpty()) {
|
if (uiState.isSearching) {
|
||||||
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)) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- 區塊一:待處理好友 (只有在有資料時才顯示) ---
|
// --- 搜尋結果區塊 (僅在有結果時顯示) ---
|
||||||
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 {
|
item {
|
||||||
Text(
|
Text(
|
||||||
"好友請求 (${uiState.pendingRequests.size})",
|
"所有好友",
|
||||||
style = MaterialTheme.typography.titleMedium,
|
style = MaterialTheme.typography.titleMedium,
|
||||||
modifier = Modifier.fillMaxWidth().padding(8.dp)
|
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 {
|
if (uiState.friends.isEmpty()) {
|
||||||
Text(
|
item {
|
||||||
"所有好友",
|
Box(
|
||||||
style = MaterialTheme.typography.titleMedium,
|
modifier = Modifier
|
||||||
modifier = Modifier.fillMaxWidth().padding(8.dp)
|
.fillParentMaxHeight(0.5f) // 佔據剩餘空間的一部分
|
||||||
)
|
.fillMaxWidth(),
|
||||||
}
|
contentAlignment = Alignment.Center
|
||||||
|
) {
|
||||||
// --- 區塊三:正式好友列表內容 ---
|
if (uiState.isLoading) {
|
||||||
if (uiState.friends.isEmpty()) {
|
CircularProgressIndicator()
|
||||||
item {
|
} else {
|
||||||
Box(
|
Text("目前沒有好友")
|
||||||
modifier = Modifier
|
}
|
||||||
.fillParentMaxHeight(0.5f) // 佔據剩餘空間的一部分
|
|
||||||
.fillMaxWidth(),
|
|
||||||
contentAlignment = Alignment.Center
|
|
||||||
) {
|
|
||||||
if (uiState.isLoading) {
|
|
||||||
CircularProgressIndicator()
|
|
||||||
} else {
|
|
||||||
Text("目前沒有好友")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
} else {
|
items(uiState.friends) { friends ->
|
||||||
items(uiState.friends) { friends ->
|
FriendRow(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
|
//search user
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,12 @@ data class ContactUiState(
|
||||||
val isLoading: Boolean = false,
|
val isLoading: Boolean = false,
|
||||||
val friends: List<Friend> = emptyList(),
|
val friends: List<Friend> = emptyList(),
|
||||||
val pendingRequests: List<PendingFriendApiModel> = emptyList(),
|
val pendingRequests: List<PendingFriendApiModel> = emptyList(),
|
||||||
// 新增:搜尋結果與關鍵字
|
|
||||||
val searchResults: List<UserDetail> = emptyList(),
|
val searchResults: List<UserDetail> = emptyList(),
|
||||||
val searchQuery: String = "",
|
val searchQuery: String = "",
|
||||||
val error: String? = null
|
val error: String? = null,
|
||||||
|
|
||||||
|
//UI state
|
||||||
|
val isSearching: Boolean = false
|
||||||
)
|
)
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class ContactListViewModel @Inject constructor(
|
class ContactListViewModel @Inject constructor(
|
||||||
|
|
@ -136,7 +138,10 @@ class ContactListViewModel @Inject constructor(
|
||||||
//search user
|
//search user
|
||||||
fun onSearchQueryChanged(newQuery: String) {
|
fun onSearchQueryChanged(newQuery: String) {
|
||||||
// 1. 即時更新文字輸入,確保 UI TextField 顯示順暢
|
// 1. 即時更新文字輸入,確保 UI TextField 顯示順暢
|
||||||
_uiState.update { it.copy(searchQuery = newQuery) }
|
_uiState.update { it.copy(
|
||||||
|
searchQuery = newQuery,
|
||||||
|
isSearching = newQuery.isNotBlank()
|
||||||
|
) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun performSearch() {
|
fun performSearch() {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue