From 732ce790c2c64bd8ac66f3b4d51825fcc0099a91 Mon Sep 17 00:00:00 2001 From: KotlinGeekDev Date: Thu, 7 Nov 2024 20:20:48 +0100 Subject: [PATCH] Introduce FollowSetItem, with funny defaults for now. --- .../screen/loggedIn/profile/ProfileScreen.kt | 179 +++++++++++++----- 1 file changed, 132 insertions(+), 47 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/ProfileScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/ProfileScreen.kt index 0264ef40e..0603d1a93 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/ProfileScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/ProfileScreen.kt @@ -55,6 +55,7 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CornerSize import androidx.compose.foundation.shape.CutCornerShape +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons @@ -77,6 +78,7 @@ import androidx.compose.material3.ScrollableTabRow import androidx.compose.material3.Surface import androidx.compose.material3.Tab import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect @@ -105,15 +107,16 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource -import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.PopupProperties import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver @@ -181,6 +184,7 @@ import com.vitorpamplona.amethyst.ui.theme.Size16Modifier import com.vitorpamplona.amethyst.ui.theme.Size25Modifier import com.vitorpamplona.amethyst.ui.theme.Size35dp import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer +import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer import com.vitorpamplona.amethyst.ui.theme.ZeroPadding import com.vitorpamplona.amethyst.ui.theme.placeholderText import com.vitorpamplona.amethyst.ui.theme.userProfileBorderModifier @@ -910,9 +914,8 @@ private fun ProfileActions( } else { DisplayFollowUnfollowButton(baseUser, accountViewModel) } + FollowSetsActionMenu(baseUser.pubkeyHex) } - - FollowSetsActionMenu() } @Composable @@ -1000,66 +1003,85 @@ fun WatchIsHiddenUser( } @Composable -fun FollowSetsActionMenu(modifier: Modifier = Modifier) { - val isMenuOpen = remember { mutableStateOf(false) } +fun FollowSetsActionMenu( + userHex: String, + modifier: Modifier = Modifier, +) { + var isMenuOpen by remember { mutableStateOf(false) } Box { -// TextButton( -// onClick = { -// isMenuOpen.value = !isMenuOpen.value -// }, -// shape = ButtonBorder.copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)), -// colors = -// ButtonDefaults -// .buttonColors(containerColor = MaterialTheme.colorScheme.primary), -// contentPadding = ZeroPadding, -// ) { -// Icon( -// imageVector = if (isMenuOpen.value) Icons.Default.ArrowDropUp else Icons.Default.ArrowDropDown, -// contentDescription = "", -// ) -// } - Icon( - imageVector = if (isMenuOpen.value) Icons.Default.ArrowDropUp else Icons.Default.ArrowDropDown, - contentDescription = "", - modifier = - Modifier - .fillMaxHeight() - .background( - color = MaterialTheme.colorScheme.primary, - shape = ButtonBorder.copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)), - ).border( - width = Dp.Hairline, - color = MaterialTheme.colorScheme.primary, - shape = - ButtonBorder - .copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)), - ).clickable(role = Role.DropdownList) { - isMenuOpen.value = !isMenuOpen.value - }, - ) + TextButton( + onClick = { + isMenuOpen = !isMenuOpen + }, + shape = ButtonBorder.copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)), + colors = + ButtonDefaults + .buttonColors(containerColor = MaterialTheme.colorScheme.primary), + contentPadding = ZeroPadding, + ) { + Icon( + imageVector = if (isMenuOpen) Icons.Default.ArrowDropUp else Icons.Default.ArrowDropDown, + contentDescription = "", + ) + } + +// Icon( +// imageVector = if (isMenuOpen.value) Icons.Default.ArrowDropUp else Icons.Default.ArrowDropDown, +// contentDescription = "", +// modifier = +// Modifier +// .fillMaxHeight() +// .background( +// color = MaterialTheme.colorScheme.primary, +// shape = ButtonBorder.copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)), +// ).border( +// width = Dp.Hairline, +// color = MaterialTheme.colorScheme.primary, +// shape = +// ButtonBorder +// .copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)), +// ).clickable(role = Role.DropdownList) { +// isMenuOpen.value = !isMenuOpen.value +// }, +// ) DropdownMenu( - expanded = isMenuOpen.value, + expanded = isMenuOpen, onDismissRequest = { - isMenuOpen.value = !isMenuOpen.value + isMenuOpen = !isMenuOpen }, + modifier = Modifier.fillMaxWidth(), + properties = PopupProperties(usePlatformDefaultWidth = true), ) { DropDownMenuHeader(headerText = "Add to lists") DropdownMenuItem( text = { - Text(text = "List 1") - }, - onClick = { + FollowSetItem( + modifier = Modifier.fillMaxWidth(), + listHeader = "LOLZ List", + listIsPublic = true, + isUserInList = false, + ) { + } }, + onClick = {}, + modifier = Modifier.fillMaxWidth(), ) + Spacer(StdVertSpacer) DropdownMenuItem( text = { - Text(text = "List 2") - }, - onClick = { + FollowSetItem( + modifier = Modifier.fillMaxWidth(), + listHeader = "Private List", + listIsPublic = false, + isUserInList = true, + ) { + } }, + onClick = {}, + modifier = Modifier.fillMaxWidth(), ) } } @@ -1082,6 +1104,69 @@ private fun DropDownMenuHeader( } } +@Composable +fun FollowSetItem( + modifier: Modifier = Modifier, + listHeader: String, + listIsPublic: Boolean, + isUserInList: Boolean, + onAddUser: () -> Unit, +) { + Row( + modifier = + modifier + .border( + width = Dp.Hairline, + color = Color.Gray, + shape = RoundedCornerShape(percent = 20), + ).padding(all = 10.dp) + .clickable(onClick = onAddUser), + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + modifier = modifier.weight(1f), + verticalArrangement = Arrangement.Center, + ) { + Text(listHeader, fontWeight = FontWeight.Bold) + Spacer(modifier = StdVertSpacer) + Text( + if (isUserInList) "Present in List" else "Not present", + overflow = TextOverflow.Ellipsis, + fontWeight = if (isUserInList) FontWeight.Bold else FontWeight.Normal, + maxLines = 3, + modifier = + Modifier + .background( + color = + if (isUserInList) { + MaterialTheme.colorScheme.primary + } else { + MaterialTheme.colorScheme.background + }, + shape = ButtonBorder, + ), + ) + } + + listIsPublic.let { + val text by derivedStateOf { if (!it) "Private" else "Public" } + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Icon( + painter = + painterResource( + if (!it) R.drawable.incognito else R.drawable.ic_public, + ), + contentDescription = "Icon for $text List", + ) + Text(text, color = Color.Gray) + } + } + } +} + fun getIdentityClaimIcon(identity: IdentityClaim): Int = when (identity) { is TwitterIdentity -> R.drawable.x