- Adds reactions and zap settings to the settings screen

- Creates a better distinction between settings for the user and for the whole app.
This commit is contained in:
Vitor Pamplona
2026-03-01 19:25:13 -05:00
parent 69e061e4c4
commit 7fd163d6d4
4 changed files with 118 additions and 32 deletions
@@ -163,7 +163,7 @@ fun AppNavigation(
composableFromBottomArgs<Route.EditProfile> { NewUserMetadataScreen(nav, accountViewModel) } composableFromBottomArgs<Route.EditProfile> { NewUserMetadataScreen(nav, accountViewModel) }
composable<Route.Search> { SearchScreen(accountViewModel, nav) } composable<Route.Search> { SearchScreen(accountViewModel, nav) }
composableFromEnd<Route.AllSettings> { AllSettingsScreen(nav) } composableFromEnd<Route.AllSettings> { AllSettingsScreen(accountViewModel, nav) }
composableFromEnd<Route.SecurityFilters> { SecurityFiltersScreen(accountViewModel, nav) } composableFromEnd<Route.SecurityFilters> { SecurityFiltersScreen(accountViewModel, nav) }
composableFromEnd<Route.PrivacyOptions> { PrivacyOptionsScreen(Amethyst.instance.torPrefs.value, nav) } composableFromEnd<Route.PrivacyOptions> { PrivacyOptionsScreen(Amethyst.instance.torPrefs.value, nav) }
composableFromEnd<Route.Bookmarks> { BookmarkListScreen(accountViewModel, nav) } composableFromEnd<Route.Bookmarks> { BookmarkListScreen(accountViewModel, nav) }
@@ -49,7 +49,6 @@ import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.outlined.CollectionsBookmark import androidx.compose.material.icons.outlined.CollectionsBookmark
import androidx.compose.material.icons.outlined.Drafts import androidx.compose.material.icons.outlined.Drafts
import androidx.compose.material.icons.outlined.GroupAdd import androidx.compose.material.icons.outlined.GroupAdd
import androidx.compose.material.icons.outlined.Key
import androidx.compose.material.icons.outlined.Settings import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
@@ -102,7 +101,6 @@ import com.vitorpamplona.amethyst.ui.navigation.routes.Route
import com.vitorpamplona.amethyst.ui.navigation.routes.routeFor import com.vitorpamplona.amethyst.ui.navigation.routes.routeFor
import com.vitorpamplona.amethyst.ui.painterRes import com.vitorpamplona.amethyst.ui.painterRes
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.keyBackup.AccountBackupDialog
import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.stringRes
import com.vitorpamplona.amethyst.ui.theme.DividerThickness import com.vitorpamplona.amethyst.ui.theme.DividerThickness
import com.vitorpamplona.amethyst.ui.theme.DoubleHorzSpacer import com.vitorpamplona.amethyst.ui.theme.DoubleHorzSpacer
@@ -433,8 +431,6 @@ fun ListContent(
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
nav: INav, nav: INav,
) { ) {
var backupDialogOpen by remember { mutableStateOf(false) }
Column(modifier) { Column(modifier) {
NavigationRow( NavigationRow(
title = R.string.profile, title = R.string.profile,
@@ -477,17 +473,13 @@ fun ListContent(
route = Route.Chess, route = Route.Chess,
) )
accountViewModel.account.settings.keyPair.privKey?.let { IconRowRelays(
IconRow( accountViewModel = accountViewModel,
title = R.string.backup_keys,
icon = Icons.Outlined.Key,
tint = MaterialTheme.colorScheme.onBackground,
onClick = { onClick = {
nav.closeDrawer() nav.closeDrawer()
backupDialogOpen = true nav.nav(Route.EditRelays)
}, },
) )
}
NavigationRow( NavigationRow(
title = R.string.settings, title = R.string.settings,
@@ -506,10 +498,6 @@ fun ListContent(
onClick = openSheet, onClick = openSheet,
) )
} }
if (backupDialogOpen) {
AccountBackupDialog(accountViewModel, onClose = { backupDialogOpen = false })
}
} }
@Composable @Composable
@@ -27,7 +27,10 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Bolt
import androidx.compose.material.icons.outlined.CloudUpload import androidx.compose.material.icons.outlined.CloudUpload
import androidx.compose.material.icons.outlined.FavoriteBorder
import androidx.compose.material.icons.outlined.Key
import androidx.compose.material.icons.outlined.Security import androidx.compose.material.icons.outlined.Security
import androidx.compose.material.icons.outlined.Settings import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material.icons.outlined.Translate import androidx.compose.material.icons.outlined.Translate
@@ -37,29 +40,75 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
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.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
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 com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.ui.navigation.navs.EmptyNav
import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.navigation.routes.Route import com.vitorpamplona.amethyst.ui.navigation.routes.Route
import com.vitorpamplona.amethyst.ui.navigation.topbars.TopBarWithBackButton import com.vitorpamplona.amethyst.ui.navigation.topbars.TopBarWithBackButton
import com.vitorpamplona.amethyst.ui.note.UpdateReactionTypeDialog
import com.vitorpamplona.amethyst.ui.note.UpdateZapAmountDialog
import com.vitorpamplona.amethyst.ui.painterRes import com.vitorpamplona.amethyst.ui.painterRes
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.keyBackup.AccountBackupDialog
import com.vitorpamplona.amethyst.ui.screen.loggedIn.mockAccountViewModel
import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.stringRes
import com.vitorpamplona.amethyst.ui.theme.ThemeComparisonColumn
@Preview
@Composable
fun AllSettingsScreenPreview() {
ThemeComparisonColumn {
AllSettingsScreen(
mockAccountViewModel(),
EmptyNav(),
)
}
}
@Composable @Composable
fun AllSettingsScreen(nav: INav) { fun AllSettingsScreen(
accountViewModel: AccountViewModel,
nav: INav,
) {
val tint = MaterialTheme.colorScheme.onBackground val tint = MaterialTheme.colorScheme.onBackground
var showReactionDialog by remember { mutableStateOf(false) }
var wantsToChangeZapAmount by remember { mutableStateOf(false) }
if (showReactionDialog) {
UpdateReactionTypeDialog(
onClose = { showReactionDialog = false },
accountViewModel = accountViewModel,
nav = nav,
)
}
if (wantsToChangeZapAmount) {
UpdateZapAmountDialog(
onClose = { wantsToChangeZapAmount = false },
accountViewModel = accountViewModel,
)
}
Scaffold( Scaffold(
topBar = { topBar = {
TopBarWithBackButton(stringRes(id = R.string.settings), nav::popBack) TopBarWithBackButton(stringRes(id = R.string.settings), nav::popBack)
}, },
) { padding -> ) { padding ->
Column(Modifier.padding(padding)) { Column(Modifier.padding(padding)) {
SettingsSectionHeader(R.string.account_settings)
SettingsNavigationRow( SettingsNavigationRow(
title = R.string.relay_setup, title = R.string.relay_setup,
iconPainter = R.drawable.relays, iconPainter = R.drawable.relays,
@@ -75,6 +124,20 @@ fun AllSettingsScreen(nav: INav) {
onClick = { nav.nav(Route.EditMediaServers) }, onClick = { nav.nav(Route.EditMediaServers) },
) )
HorizontalDivider() HorizontalDivider()
SettingsNavigationRow(
title = R.string.reactions,
icon = Icons.Outlined.FavoriteBorder,
tint = tint,
onClick = { showReactionDialog = true },
)
HorizontalDivider()
SettingsNavigationRow(
title = R.string.zaps,
icon = Icons.Outlined.Bolt,
tint = tint,
onClick = { wantsToChangeZapAmount = true },
)
HorizontalDivider()
SettingsNavigationRow( SettingsNavigationRow(
title = R.string.security_filters, title = R.string.security_filters,
icon = Icons.Outlined.Security, icon = Icons.Outlined.Security,
@@ -82,6 +145,32 @@ fun AllSettingsScreen(nav: INav) {
onClick = { nav.nav(Route.SecurityFilters) }, onClick = { nav.nav(Route.SecurityFilters) },
) )
HorizontalDivider() HorizontalDivider()
SettingsNavigationRow(
title = R.string.translations,
icon = Icons.Outlined.Translate,
tint = tint,
onClick = { nav.nav(Route.UserSettings) },
)
accountViewModel.account.settings.keyPair.privKey?.let {
var backupDialogOpen by remember { mutableStateOf(false) }
HorizontalDivider()
SettingsNavigationRow(
title = R.string.backup_keys,
icon = Icons.Outlined.Key,
tint = tint,
onClick = {
nav.closeDrawer()
backupDialogOpen = true
},
)
if (backupDialogOpen) {
AccountBackupDialog(accountViewModel, onClose = { backupDialogOpen = false })
}
}
HorizontalDivider(thickness = 4.dp)
SettingsSectionHeader(R.string.app_settings)
SettingsNavigationRow( SettingsNavigationRow(
title = R.string.privacy_options, title = R.string.privacy_options,
iconPainter = R.drawable.ic_tor, iconPainter = R.drawable.ic_tor,
@@ -91,21 +180,25 @@ fun AllSettingsScreen(nav: INav) {
) )
HorizontalDivider() HorizontalDivider()
SettingsNavigationRow( SettingsNavigationRow(
title = R.string.preferences, title = R.string.ui_preferences,
icon = Icons.Outlined.Settings, icon = Icons.Outlined.Settings,
tint = tint, tint = tint,
onClick = { nav.nav(Route.Settings) }, onClick = { nav.nav(Route.Settings) },
) )
HorizontalDivider() }
SettingsNavigationRow( }
title = R.string.user_preferences, }
icon = Icons.Outlined.Translate,
tint = tint, @Composable
onClick = { nav.nav(Route.UserSettings) }, private fun SettingsSectionHeader(title: Int) {
Text(
text = stringRes(title),
fontSize = 12.sp,
fontWeight = FontWeight.SemiBold,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(start = 24.dp, end = 24.dp, top = 16.dp, bottom = 4.dp),
) )
} }
}
}
@Composable @Composable
private fun SettingsNavigationRow( private fun SettingsNavigationRow(
+8 -3
View File
@@ -123,7 +123,7 @@
<string name="optional_picture_url">Picture Url(Optional)</string> <string name="optional_picture_url">Picture Url(Optional)</string>
<string name="description">Description</string> <string name="description">Description</string>
<string name="no_description">Description not found</string> <string name="no_description">Description not found</string>
<string name="about_us">"About us.. "</string> <string name="about_us">"About us "</string>
<string name="what_s_on_your_mind">What\'s on your mind?</string> <string name="what_s_on_your_mind">What\'s on your mind?</string>
<string name="write_a_message">Write a message…</string> <string name="write_a_message">Write a message…</string>
<string name="post">Post</string> <string name="post">Post</string>
@@ -191,7 +191,7 @@
<string name="voice_anonymize_title">Anonymize</string> <string name="voice_anonymize_title">Anonymize</string>
<string name="voice_anonymize_description">Alters your voice pitch. Note: basic pitch changes can potentially be reversed by determined listeners.</string> <string name="voice_anonymize_description">Alters your voice pitch. Note: basic pitch changes can potentially be reversed by determined listeners.</string>
<string name="user_does_not_have_a_lightning_address_setup_to_receive_sats">User does not have a lightning address set up to receive sats</string> <string name="user_does_not_have_a_lightning_address_setup_to_receive_sats">User does not have a lightning address set up to receive sats</string>
<string name="reply_here">"reply here.. "</string> <string name="reply_here">"reply here "</string>
<string name="copies_the_note_id_to_the_clipboard_for_sharing">Copies the Note ID to the clipboard for sharing in Nostr</string> <string name="copies_the_note_id_to_the_clipboard_for_sharing">Copies the Note ID to the clipboard for sharing in Nostr</string>
<string name="copy_channel_id_note_to_the_clipboard">Copy Channel ID (Note) to the Clipboard</string> <string name="copy_channel_id_note_to_the_clipboard">Copy Channel ID (Note) to the Clipboard</string>
<string name="edits_the_channel_metadata">Edits the Channel Metadata</string> <string name="edits_the_channel_metadata">Edits the Channel Metadata</string>
@@ -281,7 +281,7 @@
<string name="public_chat_title">Public Chat Metadata</string> <string name="public_chat_title">Public Chat Metadata</string>
<string name="public_chat_explainer">Public chats are visible to everyone on Nostr and anyone <string name="public_chat_explainer">Public chats are visible to everyone on Nostr and anyone
can participate on them. They are great for open communities around specific topics. can participate on them. They are great for open communities around specific topics.
Moderation can be controlled by deleting posts on the its relays</string> Moderation can be controlled by deleting posts on its relays</string>
<string name="public_chat_relays_title">Relays</string> <string name="public_chat_relays_title">Relays</string>
<string name="public_chat_relays_explainer">Insert between 13 relays that host this group. <string name="public_chat_relays_explainer">Insert between 13 relays that host this group.
@@ -871,10 +871,15 @@
<string name="add_sensitive_content_label">Sensitive Content</string> <string name="add_sensitive_content_label">Sensitive Content</string>
<string name="add_sensitive_content_description">Adds sensitive content warning before showing this content</string> <string name="add_sensitive_content_description">Adds sensitive content warning before showing this content</string>
<string name="ui_preferences">UI Preferences</string>
<string name="preferences">App Preferences</string> <string name="preferences">App Preferences</string>
<string name="user_preferences">User Preferences</string> <string name="user_preferences">User Preferences</string>
<string name="translations">Translations</string>
<string name="reactions">Reactions</string>
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="account_settings">Account Settings</string>
<string name="app_settings">App Settings</string>
<string name="connectivity_type_always">Always</string> <string name="connectivity_type_always">Always</string>
<string name="connectivity_type_wifi_only">Wifi-only</string> <string name="connectivity_type_wifi_only">Wifi-only</string>
<string name="connectivity_type_unmetered_wifi_only">Unmetered WiFi</string> <string name="connectivity_type_unmetered_wifi_only">Unmetered WiFi</string>