Use stringResources. Implement the necessary callbacks in BookmarkGroupScreen. Disable component stats display in BookmarkGroupItem until Link/Hashtag support is implemented.
This commit is contained in:
+1
-1
@@ -453,7 +453,7 @@ fun ListContent(
|
|||||||
)
|
)
|
||||||
|
|
||||||
NavigationRow(
|
NavigationRow(
|
||||||
title = R.string.bookmark_groups,
|
title = R.string.bookmark_lists,
|
||||||
icon = Icons.Outlined.CollectionsBookmark,
|
icon = Icons.Outlined.CollectionsBookmark,
|
||||||
tint = MaterialTheme.colorScheme.onBackground,
|
tint = MaterialTheme.colorScheme.onBackground,
|
||||||
nav = nav,
|
nav = nav,
|
||||||
|
|||||||
+89
-36
@@ -28,6 +28,7 @@ import androidx.compose.foundation.layout.fillMaxSize
|
|||||||
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.size
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.foundation.pager.PagerState
|
||||||
import androidx.compose.foundation.pager.rememberPagerState
|
import androidx.compose.foundation.pager.rememberPagerState
|
||||||
import androidx.compose.material3.ButtonDefaults
|
import androidx.compose.material3.ButtonDefaults
|
||||||
import androidx.compose.material3.DropdownMenu
|
import androidx.compose.material3.DropdownMenu
|
||||||
@@ -44,6 +45,7 @@ import androidx.compose.material3.Text
|
|||||||
import androidx.compose.material3.TopAppBar
|
import androidx.compose.material3.TopAppBar
|
||||||
import androidx.compose.material3.TopAppBarDefaults
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
@@ -54,12 +56,14 @@ import androidx.compose.ui.unit.Dp
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
|
import com.vitorpamplona.amethyst.R
|
||||||
import com.vitorpamplona.amethyst.ui.components.ClickableBox
|
import com.vitorpamplona.amethyst.ui.components.ClickableBox
|
||||||
import com.vitorpamplona.amethyst.ui.navigation.navs.INav
|
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.note.VerticalDotsIcon
|
import com.vitorpamplona.amethyst.ui.note.VerticalDotsIcon
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.bookmarkgroups.BookmarkType
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.bookmarkgroups.BookmarkType
|
||||||
|
import com.vitorpamplona.amethyst.ui.stringRes
|
||||||
import com.vitorpamplona.amethyst.ui.theme.ButtonBorder
|
import com.vitorpamplona.amethyst.ui.theme.ButtonBorder
|
||||||
import com.vitorpamplona.amethyst.ui.theme.DividerThickness
|
import com.vitorpamplona.amethyst.ui.theme.DividerThickness
|
||||||
import com.vitorpamplona.amethyst.ui.theme.StdPadding
|
import com.vitorpamplona.amethyst.ui.theme.StdPadding
|
||||||
@@ -91,8 +95,9 @@ fun BookmarkGroupScreen(
|
|||||||
},
|
},
|
||||||
deleteBookmarkGroup = {
|
deleteBookmarkGroup = {
|
||||||
accountViewModel.launchSigner {
|
accountViewModel.launchSigner {
|
||||||
bookmarkGroupViewModel.deleteBookmarkGroup()
|
bookmarkGroupViewModel.deleteBookmarkGroup(bookmarkIdentifier)
|
||||||
}
|
}
|
||||||
|
nav.popBack()
|
||||||
},
|
},
|
||||||
accountViewModel,
|
accountViewModel,
|
||||||
nav,
|
nav,
|
||||||
@@ -110,21 +115,6 @@ fun BookmarkGroupScreenView(
|
|||||||
nav: INav,
|
nav: INav,
|
||||||
) {
|
) {
|
||||||
val pagerState = rememberPagerState { 2 }
|
val pagerState = rememberPagerState { 2 }
|
||||||
val privateItemTypeLabel =
|
|
||||||
when (bookmarkType) {
|
|
||||||
BookmarkType.ArticleBookmark -> "Private Articles"
|
|
||||||
BookmarkType.HashtagBookmark -> "Private Hashtags"
|
|
||||||
BookmarkType.LinkBookmark -> "Private Links"
|
|
||||||
BookmarkType.PostBookmark -> "Private Posts"
|
|
||||||
}
|
|
||||||
|
|
||||||
val publicItemTypeLabel =
|
|
||||||
when (bookmarkType) {
|
|
||||||
BookmarkType.ArticleBookmark -> "Public Articles"
|
|
||||||
BookmarkType.HashtagBookmark -> "Public Hashtags"
|
|
||||||
BookmarkType.LinkBookmark -> "Public Links"
|
|
||||||
BookmarkType.PostBookmark -> "Public Posts"
|
|
||||||
}
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
Column {
|
Column {
|
||||||
@@ -148,24 +138,11 @@ fun BookmarkGroupScreenView(
|
|||||||
containerColor = MaterialTheme.colorScheme.surface,
|
containerColor = MaterialTheme.colorScheme.surface,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
TabRow(
|
BookmarkGroupHeaderTabs(
|
||||||
containerColor = Color.Transparent,
|
bookmarkGroupViewModel,
|
||||||
contentColor = MaterialTheme.colorScheme.onBackground,
|
bookmarkType,
|
||||||
selectedTabIndex = pagerState.currentPage,
|
pagerState,
|
||||||
modifier = TabRowHeight,
|
)
|
||||||
) {
|
|
||||||
val scope = rememberCoroutineScope()
|
|
||||||
Tab(
|
|
||||||
selected = pagerState.currentPage == 0,
|
|
||||||
onClick = { scope.launch { pagerState.animateScrollToPage(0) } },
|
|
||||||
text = { Text(text = publicItemTypeLabel) },
|
|
||||||
)
|
|
||||||
Tab(
|
|
||||||
selected = pagerState.currentPage == 1,
|
|
||||||
onClick = { scope.launch { pagerState.animateScrollToPage(1) } },
|
|
||||||
text = { Text(text = privateItemTypeLabel) },
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
) { padding ->
|
) { padding ->
|
||||||
@@ -185,6 +162,15 @@ fun BookmarkGroupScreenView(
|
|||||||
bookmarkGroupViewModel,
|
bookmarkGroupViewModel,
|
||||||
pagerState,
|
pagerState,
|
||||||
accountViewModel,
|
accountViewModel,
|
||||||
|
deletePostBookmark = { postId, isPrivate ->
|
||||||
|
accountViewModel.launchSigner {
|
||||||
|
bookmarkGroupViewModel.removePostBookmark(
|
||||||
|
bookmarkGroupViewModel.bookmarkGroupIdentifier,
|
||||||
|
postId,
|
||||||
|
isPrivate,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
nav,
|
nav,
|
||||||
)
|
)
|
||||||
BookmarkType.ArticleBookmark ->
|
BookmarkType.ArticleBookmark ->
|
||||||
@@ -192,6 +178,15 @@ fun BookmarkGroupScreenView(
|
|||||||
bookmarkGroupViewModel,
|
bookmarkGroupViewModel,
|
||||||
pagerState,
|
pagerState,
|
||||||
accountViewModel,
|
accountViewModel,
|
||||||
|
deleteArticleBookmark = { articleAddress, isPrivate ->
|
||||||
|
accountViewModel.launchSigner {
|
||||||
|
bookmarkGroupViewModel.removeArticleBookmark(
|
||||||
|
bookmarkGroupViewModel.bookmarkGroupIdentifier,
|
||||||
|
articleAddress,
|
||||||
|
isPrivate,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
nav,
|
nav,
|
||||||
)
|
)
|
||||||
BookmarkType.HashtagBookmark -> RenderHashtagList(bookmarkGroupViewModel, pagerState)
|
BookmarkType.HashtagBookmark -> RenderHashtagList(bookmarkGroupViewModel, pagerState)
|
||||||
@@ -226,6 +221,64 @@ private fun TitleAndDescription(viewModel: BookmarkGroupViewModel) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun BookmarkGroupHeaderTabs(
|
||||||
|
bookmarkGroupViewModel: BookmarkGroupViewModel,
|
||||||
|
bookmarkType: BookmarkType,
|
||||||
|
pagerState: PagerState,
|
||||||
|
) {
|
||||||
|
val bookmarkGroup by bookmarkGroupViewModel.selectedBookmarkGroupFlow.collectAsStateWithLifecycle()
|
||||||
|
val privateItemTypeLabel =
|
||||||
|
when (bookmarkType) {
|
||||||
|
BookmarkType.PostBookmark ->
|
||||||
|
bookmarkGroup?.let {
|
||||||
|
stringRes(R.string.private_posts_count, it.privatePostBookmarks.size)
|
||||||
|
} ?: stringRes(R.string.private_posts_label)
|
||||||
|
BookmarkType.ArticleBookmark ->
|
||||||
|
bookmarkGroup?.let {
|
||||||
|
stringRes(R.string.private_articles_count, it.privateArticleBookmarks.size)
|
||||||
|
} ?: stringRes(R.string.private_posts_label)
|
||||||
|
|
||||||
|
// TODO: Match the implementations in the pair below to the pair above.
|
||||||
|
BookmarkType.HashtagBookmark -> stringRes(R.string.private_hashtags_label)
|
||||||
|
BookmarkType.LinkBookmark -> stringRes(R.string.private_links_label)
|
||||||
|
}
|
||||||
|
|
||||||
|
val publicItemTypeLabel =
|
||||||
|
when (bookmarkType) {
|
||||||
|
BookmarkType.PostBookmark ->
|
||||||
|
bookmarkGroup?.let {
|
||||||
|
stringRes(R.string.public_posts_count, it.publicPostBookmarks.size)
|
||||||
|
} ?: stringRes(R.string.public_posts_label)
|
||||||
|
BookmarkType.ArticleBookmark ->
|
||||||
|
bookmarkGroup?.let {
|
||||||
|
stringRes(R.string.public_articles_count, it.publicArticleBookmarks.size)
|
||||||
|
} ?: stringRes(R.string.public_articles_label)
|
||||||
|
// TODO: Match the implementations in the pair below to the pair above.
|
||||||
|
BookmarkType.HashtagBookmark -> stringRes(R.string.public_hashtags_label)
|
||||||
|
BookmarkType.LinkBookmark -> stringRes(R.string.public_links_label)
|
||||||
|
}
|
||||||
|
|
||||||
|
TabRow(
|
||||||
|
containerColor = Color.Transparent,
|
||||||
|
contentColor = MaterialTheme.colorScheme.onBackground,
|
||||||
|
selectedTabIndex = pagerState.currentPage,
|
||||||
|
modifier = TabRowHeight,
|
||||||
|
) {
|
||||||
|
val scope = rememberCoroutineScope()
|
||||||
|
Tab(
|
||||||
|
selected = pagerState.currentPage == 0,
|
||||||
|
onClick = { scope.launch { pagerState.animateScrollToPage(0) } },
|
||||||
|
text = { Text(text = publicItemTypeLabel) },
|
||||||
|
)
|
||||||
|
Tab(
|
||||||
|
selected = pagerState.currentPage == 1,
|
||||||
|
onClick = { scope.launch { pagerState.animateScrollToPage(1) } },
|
||||||
|
text = { Text(text = privateItemTypeLabel) },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookmarkGroupActionsMenuButton(
|
fun BookmarkGroupActionsMenuButton(
|
||||||
onBroadcastList: () -> Unit,
|
onBroadcastList: () -> Unit,
|
||||||
@@ -270,7 +323,7 @@ fun BookmarkGroupActionsMenu(
|
|||||||
) {
|
) {
|
||||||
DropdownMenuItem(
|
DropdownMenuItem(
|
||||||
text = {
|
text = {
|
||||||
Text("Broadcast Bookmark Group")
|
Text(stringRes(R.string.bookmark_list_broadcast_btn_label))
|
||||||
},
|
},
|
||||||
onClick = {
|
onClick = {
|
||||||
onBroadcastList()
|
onBroadcastList()
|
||||||
@@ -280,7 +333,7 @@ fun BookmarkGroupActionsMenu(
|
|||||||
HorizontalDivider(thickness = DividerThickness)
|
HorizontalDivider(thickness = DividerThickness)
|
||||||
DropdownMenuItem(
|
DropdownMenuItem(
|
||||||
text = {
|
text = {
|
||||||
Text("Delete Bookmark Group")
|
Text(stringRes(R.string.bookmark_list_delete_btn_label))
|
||||||
},
|
},
|
||||||
onClick = {
|
onClick = {
|
||||||
onDeleteList()
|
onDeleteList()
|
||||||
|
|||||||
+13
-13
@@ -75,7 +75,6 @@ import com.vitorpamplona.amethyst.ui.theme.Size40Modifier
|
|||||||
import com.vitorpamplona.amethyst.ui.theme.Size5dp
|
import com.vitorpamplona.amethyst.ui.theme.Size5dp
|
||||||
import com.vitorpamplona.amethyst.ui.theme.SpacedBy2dp
|
import com.vitorpamplona.amethyst.ui.theme.SpacedBy2dp
|
||||||
import com.vitorpamplona.amethyst.ui.theme.SpacedBy5dp
|
import com.vitorpamplona.amethyst.ui.theme.SpacedBy5dp
|
||||||
import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookmarkGroupItem(
|
fun BookmarkGroupItem(
|
||||||
@@ -138,15 +137,16 @@ fun BookmarkGroupItem(
|
|||||||
) {
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
imageVector = Icons.Outlined.CollectionsBookmark,
|
imageVector = Icons.Outlined.CollectionsBookmark,
|
||||||
contentDescription = "Icon for bookmark group",
|
contentDescription = stringRes(R.string.bookmark_list_icon_label),
|
||||||
modifier = Size40Modifier,
|
modifier = Size40Modifier,
|
||||||
)
|
)
|
||||||
Spacer(StdVertSpacer)
|
// TODO: Fix the component below, with per-category stats
|
||||||
BookmarkMembershipStatusAndNumberDisplay(
|
// Spacer(StdVertSpacer)
|
||||||
modifier = Modifier.align(Alignment.CenterHorizontally),
|
// BookmarkMembershipStatusAndNumberDisplay(
|
||||||
privateBookmarksSize = bookmarkList.privateBookmarks.size,
|
// modifier = Modifier.align(Alignment.CenterHorizontally),
|
||||||
publicBookmarksSize = bookmarkList.publicBookmarks.size,
|
// privateBookmarksSize = bookmarkList.privateBookmarks.size,
|
||||||
)
|
// publicBookmarksSize = bookmarkList.publicBookmarks.size,
|
||||||
|
// )
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@@ -184,7 +184,7 @@ private fun BookmarkGroupActions(
|
|||||||
painter = painterResource(R.drawable.post),
|
painter = painterResource(R.drawable.post),
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
)
|
)
|
||||||
Text("View Posts")
|
Text(stringRes(R.string.bookmark_list_posts_btn_label))
|
||||||
}
|
}
|
||||||
FilledTonalButton(
|
FilledTonalButton(
|
||||||
onClick = openArticleBookmarks,
|
onClick = openArticleBookmarks,
|
||||||
@@ -193,7 +193,7 @@ private fun BookmarkGroupActions(
|
|||||||
imageVector = Icons.AutoMirrored.Outlined.Article,
|
imageVector = Icons.AutoMirrored.Outlined.Article,
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
)
|
)
|
||||||
Text("View Articles")
|
Text(stringRes(R.string.bookmark_list_articles_btn_label))
|
||||||
}
|
}
|
||||||
FilledTonalButton(
|
FilledTonalButton(
|
||||||
onClick = openLinkBookmarks,
|
onClick = openLinkBookmarks,
|
||||||
@@ -202,7 +202,7 @@ private fun BookmarkGroupActions(
|
|||||||
imageVector = Icons.Outlined.Link,
|
imageVector = Icons.Outlined.Link,
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
)
|
)
|
||||||
Text("View Links")
|
Text(stringRes(R.string.bookmark_list_links_btn_label))
|
||||||
}
|
}
|
||||||
FilledTonalButton(
|
FilledTonalButton(
|
||||||
onClick = openHashtagBookmarks,
|
onClick = openHashtagBookmarks,
|
||||||
@@ -211,7 +211,7 @@ private fun BookmarkGroupActions(
|
|||||||
imageVector = Icons.Outlined.Numbers,
|
imageVector = Icons.Outlined.Numbers,
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
)
|
)
|
||||||
Text("View Hashtags")
|
Text(stringRes(R.string.bookmark_list_hashtags_btn_label))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -542,7 +542,7 @@ private fun GroupCloneDialog(
|
|||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
text = "Clone Bookmark Group",
|
text = stringRes(R.string.bookmark_list_clone_btn_label),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
+1
-1
@@ -57,7 +57,7 @@ fun ListOfBookmarkGroupsFeedView(
|
|||||||
val bookmarkGroupFeedState by groupListFeedSource.collectAsStateWithLifecycle()
|
val bookmarkGroupFeedState by groupListFeedSource.collectAsStateWithLifecycle()
|
||||||
|
|
||||||
if (bookmarkGroupFeedState.isEmpty()) {
|
if (bookmarkGroupFeedState.isEmpty()) {
|
||||||
BookmarkGroupsFeedEmpty(message = "You do not have any bookmark groups yet. Tap the new button below to make one.")
|
BookmarkGroupsFeedEmpty(message = stringRes(R.string.bookmark_list_feed_empty_msg))
|
||||||
} else {
|
} else {
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
state = rememberLazyListState(),
|
state = rememberLazyListState(),
|
||||||
|
|||||||
+2
-2
@@ -95,7 +95,7 @@ fun ListOfBookmarkGroupsScreen(
|
|||||||
deleteBookmarkGroup = { bookmarkGroup ->
|
deleteBookmarkGroup = { bookmarkGroup ->
|
||||||
accountViewModel.launchSigner {
|
accountViewModel.launchSigner {
|
||||||
accountViewModel.account.labeledBookmarkLists.deleteBookmarkList(
|
accountViewModel.account.labeledBookmarkLists.deleteBookmarkList(
|
||||||
bookmarkList = bookmarkGroup,
|
bookmarkListIdentifier = bookmarkGroup.identifier,
|
||||||
account = accountViewModel.account,
|
account = accountViewModel.account,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -117,7 +117,7 @@ fun ListOfBookmarkGroupsFeed(
|
|||||||
) {
|
) {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
TopBarWithBackButton(caption = "Bookmark Groups", nav::popBack)
|
TopBarWithBackButton(caption = stringRes(R.string.bookmark_lists), nav::popBack)
|
||||||
},
|
},
|
||||||
floatingActionButton = {
|
floatingActionButton = {
|
||||||
BookmarkGroupFabAndMenu(onAddGroup = addBookmarkGroup)
|
BookmarkGroupFabAndMenu(onAddGroup = addBookmarkGroup)
|
||||||
|
|||||||
@@ -387,7 +387,32 @@
|
|||||||
<string name="remove_from_private_bookmarks">Remove from Private Bookmarks</string>
|
<string name="remove_from_private_bookmarks">Remove from Private Bookmarks</string>
|
||||||
<string name="remove_from_public_bookmarks">Remove from Public Bookmarks</string>
|
<string name="remove_from_public_bookmarks">Remove from Public Bookmarks</string>
|
||||||
|
|
||||||
<string name="bookmark_groups">Bookmark Groups</string>
|
<string name="bookmark_lists">Bookmark Lists</string>
|
||||||
|
<string name="bookmark_list_icon_label">Icon for bookmark list</string>
|
||||||
|
<string name="bookmark_list_clone_btn_label">Clone Bookmark List</string>
|
||||||
|
<string name="bookmark_list_broadcast_btn_label">Broadcast Bookmark List</string>
|
||||||
|
<string name="bookmark_list_delete_btn_label">Delete Bookmark List</string>
|
||||||
|
<string name="bookmark_list_posts_btn_label">View Posts</string>
|
||||||
|
<string name="bookmark_list_articles_btn_label">View Articles</string>
|
||||||
|
<string name="bookmark_list_links_btn_label">View Links</string>
|
||||||
|
<string name="bookmark_list_hashtags_btn_label">View Hashtags</string>
|
||||||
|
<string name="bookmark_list_feed_empty_msg">You do not have any bookmark lists yet. Tap the new button below to make one.</string>
|
||||||
|
<string name="private_posts_label">Private Posts</string>
|
||||||
|
<string name="private_posts_count">Private Posts(%1$s)</string>
|
||||||
|
<string name="public_posts_label">Public Posts</string>
|
||||||
|
<string name="public_posts_count">Public Posts(%1$s)</string>
|
||||||
|
<string name="private_articles_label">Private Articles</string>
|
||||||
|
<string name="private_articles_count">Private Articles(%1$s)</string>
|
||||||
|
<string name="public_articles_label">Public Articles</string>
|
||||||
|
<string name="public_articles_count">Public Articles(%1$s)</string>
|
||||||
|
<string name="private_hashtags_label">Private Hashtags</string>
|
||||||
|
<string name="private_hashtags_count">Private Hashtags(%1$s)</string>
|
||||||
|
<string name="public_hashtags_label">Public Hashtags</string>
|
||||||
|
<string name="public_hashtags_count">Public Hashtags(%1$s)</string>
|
||||||
|
<string name="private_links_label">Private Links</string>
|
||||||
|
<string name="private_links_count">Private Links(%1$s)</string>
|
||||||
|
<string name="public_links_label">Public Links</string>
|
||||||
|
<string name="public_links_count">Public Links(%1$s)</string>
|
||||||
|
|
||||||
<string name="wallet_connect_service">Wallet Connect Service</string>
|
<string name="wallet_connect_service">Wallet Connect Service</string>
|
||||||
<string name="wallet_connect_service_explainer">Authorizes a Nostr Secret to pay zaps without leaving the app. Keep the secret safe and use a private relay if possible</string>
|
<string name="wallet_connect_service_explainer">Authorizes a Nostr Secret to pay zaps without leaving the app. Keep the secret safe and use a private relay if possible</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user