From 6a7a82636d37f41a84984ed202d3e84eb3fd9270 Mon Sep 17 00:00:00 2001 From: Infi Date: Fri, 1 Dec 2023 16:42:45 +0100 Subject: [PATCH] feat: show online and rest friends in friends screen Signed-off-by: Infi --- .../revolt/api/internals/FriendRequests.kt | 20 +++--- .../screens/chat/views/FriendsScreen.kt | 72 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 83 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/chat/revolt/api/internals/FriendRequests.kt b/app/src/main/java/chat/revolt/api/internals/FriendRequests.kt index 81264a13..5d70a146 100644 --- a/app/src/main/java/chat/revolt/api/internals/FriendRequests.kt +++ b/app/src/main/java/chat/revolt/api/internals/FriendRequests.kt @@ -10,27 +10,27 @@ object FriendRequests { } } - fun getIncomingCount(): Int { - return getIncoming().size - } - fun getOutgoing(): List { return RevoltAPI.userCache.values.filter { user -> user.relationship == "Outgoing" } } - fun getOutgoingCount(): Int { - return getOutgoing().size - } - fun getBlocked(): List { return RevoltAPI.userCache.values.filter { user -> user.relationship == "Blocked" } } - fun getBlockedCount(): Int { - return getBlocked().size + fun getOnlineFriends(): List { + return RevoltAPI.userCache.values.filter { user -> + user.relationship == "Friend" && user.online == true + } + } + + fun getFriends(excludeOnline: Boolean = false): List { + return RevoltAPI.userCache.values.filter { user -> + user.relationship == "Friend" && (excludeOnline && user.online == false) + } } } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/screens/chat/views/FriendsScreen.kt b/app/src/main/java/chat/revolt/screens/chat/views/FriendsScreen.kt index ae0792b4..bffd7988 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/FriendsScreen.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/FriendsScreen.kt @@ -199,6 +199,78 @@ fun FriendsScreen(useDrawer: Boolean, onDrawerClicked: () -> Unit) { }) } + stickyHeader(key = "online") { + Text( + text = AnnotatedString.Builder().apply { + pushStyle(SpanStyle(fontWeight = FontWeight.Bold)) + append(stringResource(id = R.string.status_online)) + pop() + + pushStyle( + SpanStyle( + fontWeight = FontWeight.Medium, + fontSize = LocalTextStyle.current.fontSize * 0.8, + color = LocalContentColor.current.copy(alpha = 0.6f) + ) + ) + append("—${FriendRequests.getOnlineFriends().size}") + pop() + }.toAnnotatedString(), + style = MaterialTheme.typography.labelLarge, + modifier = Modifier + .fillMaxWidth() + .background(MaterialTheme.colorScheme.background) + .padding(10.dp) + ) + } + + items(FriendRequests.getOnlineFriends().size) { + val item = FriendRequests.getOnlineFriends()[it] + UserItem(item, onClick = { + scope.launch { + item.id?.let { userId -> + ActionChannel.send(Action.OpenUserSheet(userId, null)) + } + } + }) + } + + stickyHeader(key = "not_online") { + Text( + text = AnnotatedString.Builder().apply { + pushStyle(SpanStyle(fontWeight = FontWeight.Bold)) + append(stringResource(id = R.string.friends_all)) + pop() + + pushStyle( + SpanStyle( + fontWeight = FontWeight.Medium, + fontSize = LocalTextStyle.current.fontSize * 0.8, + color = LocalContentColor.current.copy(alpha = 0.6f) + ) + ) + append("—${FriendRequests.getFriends(true).size}") + pop() + }.toAnnotatedString(), + style = MaterialTheme.typography.labelLarge, + modifier = Modifier + .fillMaxWidth() + .background(MaterialTheme.colorScheme.background) + .padding(10.dp) + ) + } + + items(FriendRequests.getFriends(true).size) { + val item = FriendRequests.getFriends(true)[it] + UserItem(item, onClick = { + scope.launch { + item.id?.let { userId -> + ActionChannel.send(Action.OpenUserSheet(userId, null)) + } + } + }) + } + stickyHeader(key = "blocked") { Text( text = AnnotatedString.Builder().apply { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c861b9db..e107af65 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -126,6 +126,7 @@ Friends Incoming Requests Outgoing Requests + All Blocked Clear all incoming requests