Introduce FollowSetItem, with funny defaults for now.

This commit is contained in:
KotlinGeekDev
2024-11-07 20:20:48 +01:00
parent 276b6cbf46
commit 732ce790c2
@@ -55,6 +55,7 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.CornerSize import androidx.compose.foundation.shape.CornerSize
import androidx.compose.foundation.shape.CutCornerShape import androidx.compose.foundation.shape.CutCornerShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.text.ClickableText
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -77,6 +78,7 @@ import androidx.compose.material3.ScrollableTabRow
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Tab import androidx.compose.material3.Tab
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect 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.LocalLifecycleOwner
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign 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.tooling.preview.Preview
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.PopupProperties
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver 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.Size25Modifier
import com.vitorpamplona.amethyst.ui.theme.Size35dp import com.vitorpamplona.amethyst.ui.theme.Size35dp
import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer 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.ZeroPadding
import com.vitorpamplona.amethyst.ui.theme.placeholderText import com.vitorpamplona.amethyst.ui.theme.placeholderText
import com.vitorpamplona.amethyst.ui.theme.userProfileBorderModifier import com.vitorpamplona.amethyst.ui.theme.userProfileBorderModifier
@@ -910,9 +914,8 @@ private fun ProfileActions(
} else { } else {
DisplayFollowUnfollowButton(baseUser, accountViewModel) DisplayFollowUnfollowButton(baseUser, accountViewModel)
} }
FollowSetsActionMenu(baseUser.pubkeyHex)
} }
FollowSetsActionMenu()
} }
@Composable @Composable
@@ -1000,66 +1003,85 @@ fun WatchIsHiddenUser(
} }
@Composable @Composable
fun FollowSetsActionMenu(modifier: Modifier = Modifier) { fun FollowSetsActionMenu(
val isMenuOpen = remember { mutableStateOf(false) } userHex: String,
modifier: Modifier = Modifier,
) {
var isMenuOpen by remember { mutableStateOf(false) }
Box { Box {
// TextButton( TextButton(
// onClick = { onClick = {
// isMenuOpen.value = !isMenuOpen.value isMenuOpen = !isMenuOpen
// }, },
// shape = ButtonBorder.copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)), shape = ButtonBorder.copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)),
// colors = colors =
// ButtonDefaults ButtonDefaults
// .buttonColors(containerColor = MaterialTheme.colorScheme.primary), .buttonColors(containerColor = MaterialTheme.colorScheme.primary),
// contentPadding = ZeroPadding, contentPadding = ZeroPadding,
// ) { ) {
// Icon( Icon(
// imageVector = if (isMenuOpen.value) Icons.Default.ArrowDropUp else Icons.Default.ArrowDropDown, imageVector = if (isMenuOpen) Icons.Default.ArrowDropUp else Icons.Default.ArrowDropDown,
// contentDescription = "", contentDescription = "",
// ) )
// } }
Icon(
imageVector = if (isMenuOpen.value) Icons.Default.ArrowDropUp else Icons.Default.ArrowDropDown, // Icon(
contentDescription = "", // imageVector = if (isMenuOpen.value) Icons.Default.ArrowDropUp else Icons.Default.ArrowDropDown,
modifier = // contentDescription = "",
Modifier // modifier =
.fillMaxHeight() // Modifier
.background( // .fillMaxHeight()
color = MaterialTheme.colorScheme.primary, // .background(
shape = ButtonBorder.copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)), // color = MaterialTheme.colorScheme.primary,
).border( // shape = ButtonBorder.copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)),
width = Dp.Hairline, // ).border(
color = MaterialTheme.colorScheme.primary, // width = Dp.Hairline,
shape = // color = MaterialTheme.colorScheme.primary,
ButtonBorder // shape =
.copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)), // ButtonBorder
).clickable(role = Role.DropdownList) { // .copy(topStart = CornerSize(0f), bottomStart = CornerSize(0f)),
isMenuOpen.value = !isMenuOpen.value // ).clickable(role = Role.DropdownList) {
}, // isMenuOpen.value = !isMenuOpen.value
) // },
// )
DropdownMenu( DropdownMenu(
expanded = isMenuOpen.value, expanded = isMenuOpen,
onDismissRequest = { onDismissRequest = {
isMenuOpen.value = !isMenuOpen.value isMenuOpen = !isMenuOpen
}, },
modifier = Modifier.fillMaxWidth(),
properties = PopupProperties(usePlatformDefaultWidth = true),
) { ) {
DropDownMenuHeader(headerText = "Add to lists") DropDownMenuHeader(headerText = "Add to lists")
DropdownMenuItem( DropdownMenuItem(
text = { text = {
Text(text = "List 1") FollowSetItem(
}, modifier = Modifier.fillMaxWidth(),
onClick = { listHeader = "LOLZ List",
listIsPublic = true,
isUserInList = false,
) {
}
}, },
onClick = {},
modifier = Modifier.fillMaxWidth(),
) )
Spacer(StdVertSpacer)
DropdownMenuItem( DropdownMenuItem(
text = { text = {
Text(text = "List 2") FollowSetItem(
}, modifier = Modifier.fillMaxWidth(),
onClick = { 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 = fun getIdentityClaimIcon(identity: IdentityClaim): Int =
when (identity) { when (identity) {
is TwitterIdentity -> R.drawable.x is TwitterIdentity -> R.drawable.x