Introduce FollowSetItem, with funny defaults for now.
This commit is contained in:
+132
-47
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user