Make a different menu style for new list creation in FollowSetsManagementDialog. Use toBestDisplayName() instead of manual method(which was the same anyways).

This commit is contained in:
KotlinGeekDev
2025-09-22 14:24:15 +01:00
parent a07ebc6e12
commit 9f5301d30a
@@ -23,6 +23,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.lists.followsets
import android.util.Log import android.util.Log
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -33,7 +34,9 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.recalculateWindowInsets import androidx.compose.foundation.layout.recalculateWindowInsets
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.PlaylistAddCheck import androidx.compose.material.icons.automirrored.filled.PlaylistAddCheck
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
@@ -42,9 +45,11 @@ import androidx.compose.material3.AlertDialogDefaults
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilterChip import androidx.compose.material3.FilterChip
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
@@ -53,14 +58,19 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.Role
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.TextOverflow
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.LocalCache
@@ -68,6 +78,7 @@ import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.note.ArrowBackIcon import com.vitorpamplona.amethyst.ui.note.ArrowBackIcon
import com.vitorpamplona.amethyst.ui.screen.loggedIn.lists.FollowSetState import com.vitorpamplona.amethyst.ui.screen.loggedIn.lists.FollowSetState
import com.vitorpamplona.amethyst.ui.screen.loggedIn.lists.ListVisibility import com.vitorpamplona.amethyst.ui.screen.loggedIn.lists.ListVisibility
import com.vitorpamplona.amethyst.ui.screen.loggedIn.lists.NewListCreationDialog
import com.vitorpamplona.amethyst.ui.screen.loggedIn.lists.NostrUserListFeedViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.lists.NostrUserListFeedViewModel
import com.vitorpamplona.amethyst.ui.theme.ButtonBorder import com.vitorpamplona.amethyst.ui.theme.ButtonBorder
import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer
@@ -119,10 +130,23 @@ fun FollowSetsManagementDialog(
), ),
) )
}, },
floatingActionButton = {
OutlinedButton(
onClick = {
navigator.popBack()
},
shape = ButtonBorder,
colors = ButtonDefaults.filledTonalButtonColors(),
elevation = ButtonDefaults.elevatedButtonElevation(defaultElevation = 6.0.dp),
) {
Text(text = "Cancel", fontWeight = FontWeight.SemiBold)
}
},
) { contentPadding -> ) { contentPadding ->
Column( Column(
modifier = modifier =
Modifier Modifier
.verticalScroll(rememberScrollState())
.padding( .padding(
start = 10.dp, start = 10.dp,
end = 10.dp, end = 10.dp,
@@ -137,7 +161,7 @@ fun FollowSetsManagementDialog(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
listHeader = list.title, listHeader = list.title,
listVisibility = list.visibility, listVisibility = list.visibility,
userName = userInfo.info?.bestName() ?: userInfo.pubkeyDisplayHex(), userName = userInfo.toBestDisplayName(),
isUserInList = list.profileList.contains(userHex), isUserInList = list.profileList.contains(userHex),
onRemoveUser = { onRemoveUser = {
Log.d( Log.d(
@@ -167,6 +191,18 @@ fun FollowSetsManagementDialog(
}, },
) )
} }
FollowSetsCreationMenu(
userName = userInfo.toBestDisplayName(),
onSetCreate = { setName, setIsPrivate, description ->
followSetsViewModel.addFollowSet(
setName = setName,
setDescription = description,
isListPrivate = setIsPrivate,
optionalFirstMemberHex = userHex,
account = account,
)
},
)
} }
} }
} }
@@ -187,7 +223,6 @@ fun FollowSetItem(
Row( Row(
modifier = modifier =
modifier modifier
// .clickable(onClick = onAddUser)
.border( .border(
width = Dp.Hairline, width = Dp.Hairline,
color = Color.Gray, color = Color.Gray,
@@ -290,3 +325,107 @@ fun FollowSetItem(
} }
} }
} }
@Composable
fun FollowSetsCreationMenu(
modifier: Modifier = Modifier,
userName: String,
onSetCreate: (setName: String, setIsPrivate: Boolean, description: String?) -> Unit,
) {
val isListAdditionDialogOpen = remember { mutableStateOf(false) }
val isPrivateOptionTapped = remember { mutableStateOf(false) }
Column(
modifier = modifier.padding(vertical = 30.dp),
) {
Text(
"Make New List",
fontSize = 18.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Start,
)
HorizontalDivider(
modifier = Modifier.fillMaxWidth(0.5f),
thickness = 3.dp,
color = MaterialTheme.colorScheme.onBackground,
)
Spacer(modifier = StdVertSpacer)
FollowSetCreationItem(
setIsPrivate = false,
userName = userName,
onClick = {
isListAdditionDialogOpen.value = true
},
)
FollowSetCreationItem(
setIsPrivate = true,
userName = userName,
onClick = {
isPrivateOptionTapped.value = true
isListAdditionDialogOpen.value = true
},
)
}
if (isListAdditionDialogOpen.value) {
NewListCreationDialog(
onDismiss = {
isListAdditionDialogOpen.value = false
isPrivateOptionTapped.value = false
},
shouldBePrivate = isPrivateOptionTapped.value,
onCreateList = { name, description ->
onSetCreate(name, isPrivateOptionTapped.value, description)
},
)
}
}
@Composable
fun FollowSetCreationItem(
modifier: Modifier = Modifier,
setIsPrivate: Boolean,
userName: String,
onClick: () -> Unit,
) {
HorizontalDivider()
Column(
modifier =
modifier
.fillMaxWidth()
.background(
color =
ButtonDefaults
.filledTonalButtonColors()
.containerColor
.copy(alpha = 0.2f),
).padding(vertical = 15.dp)
.clickable(role = Role.Button, onClick = onClick),
) {
Row(
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = "Create new ${if (setIsPrivate) "Private" else "Public"} list with user",
fontWeight = FontWeight.SemiBold,
)
Spacer(modifier = StdHorzSpacer)
Icon(
painter =
painterResource(
if (setIsPrivate) R.drawable.lock_plus else R.drawable.earth_plus,
),
contentDescription = null,
)
}
Spacer(modifier = StdVertSpacer)
Text(
"Creates a ${if (setIsPrivate) "private" else "public"} follow set, and adds $userName to it.",
fontWeight = FontWeight.Light,
overflow = TextOverflow.Ellipsis,
maxLines = 2,
color = Color.Gray,
)
}
HorizontalDivider()
}