- 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:
@@ -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) }
|
||||||
|
|||||||
+3
-15
@@ -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
|
||||||
|
|||||||
+103
-10
@@ -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(
|
||||||
|
|||||||
@@ -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 1–3 relays that host this group.
|
<string name="public_chat_relays_explainer">Insert between 1–3 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>
|
||||||
|
|||||||
Reference in New Issue
Block a user