diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/labeledBookmarkLists/LabeledBookmarkListsState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/labeledBookmarkLists/LabeledBookmarkListsState.kt index e753fc751..b8686c695 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/labeledBookmarkLists/LabeledBookmarkListsState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/labeledBookmarkLists/LabeledBookmarkListsState.kt @@ -265,6 +265,23 @@ class LabeledBookmarkListsState( account.sendMyPublicAndPrivateOutbox(updatedList) } + suspend fun moveBookmarkInList( + bookmark: BookmarkIdTag, + bookmarkListIdentifier: String, + isBookmarkCurrentlyPrivate: Boolean, + account: Account, + ) { + val bookmarkList = getLabeledBookmarkListEvent(bookmarkListIdentifier) + val updatedList = + LabeledBookmarkListEvent.moveBookmark( + earlierVersion = bookmarkList, + bookmarkIdTag = bookmark, + isCurrentlyPrivate = isBookmarkCurrentlyPrivate, + signer = account.signer, + ) + account.sendMyPublicAndPrivateOutbox(updatedList) + } + suspend fun removeBookmarkFromList( bookmark: BookmarkIdTag, bookmarkListIdentifier: String, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/ArticleListView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/ArticleListView.kt index 11317e928..2280da6c1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/ArticleListView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/ArticleListView.kt @@ -43,6 +43,7 @@ fun RenderArticleList( bookmarkGroupViewModel: BookmarkGroupViewModel, pagerState: PagerState, accountViewModel: AccountViewModel, + moveArticleBookmark: (articleAddress: Address, fromPrivate: Boolean) -> Unit, deleteArticleBookmark: (articleAddress: Address, isPrivate: Boolean) -> Unit, nav: INav, modifier: Modifier = Modifier, @@ -56,6 +57,10 @@ fun RenderArticleList( ArticleList( modifier = Modifier.fillMaxSize(), articles = publicArticles, + isArticleBookmarkPrivate = false, + onMoveBookmarkToPrivate = { articleAddress -> + moveArticleBookmark(articleAddress, false) + }, onDeleteArticleBookmark = { articleAddress -> deleteArticleBookmark(articleAddress, false) }, @@ -66,6 +71,10 @@ fun RenderArticleList( ArticleList( modifier = Modifier.fillMaxSize(), articles = privateArticles, + isArticleBookmarkPrivate = true, + onMoveBookmarkToPublic = { articleAddress -> + moveArticleBookmark(articleAddress, true) + }, onDeleteArticleBookmark = { articleAddress -> deleteArticleBookmark(articleAddress, true) }, @@ -80,6 +89,9 @@ fun RenderArticleList( fun ArticleList( modifier: Modifier = Modifier, articles: List, + isArticleBookmarkPrivate: Boolean, + onMoveBookmarkToPublic: (articleAddress: Address) -> Unit = {}, + onMoveBookmarkToPrivate: (articleAddress: Address) -> Unit = {}, onDeleteArticleBookmark: (Address) -> Unit, accountViewModel: AccountViewModel, nav: INav, @@ -101,6 +113,9 @@ fun ArticleList( moreOptions = { BookmarkGroupItemOptions( baseNote = item, + isBookmarkItemPrivate = isArticleBookmarkPrivate, + onMoveBookmarkToPublic = { onMoveBookmarkToPublic(item.address) }, + onMoveBookmarkToPrivate = { onMoveBookmarkToPrivate(item.address) }, onDeleteBookmarkItem = { onDeleteArticleBookmark(item.address) }, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupItemOptions.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupItemOptions.kt index e734d78d9..78cc44273 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupItemOptions.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupItemOptions.kt @@ -60,6 +60,9 @@ import kotlinx.coroutines.launch @Composable fun BookmarkGroupItemOptions( baseNote: Note, + isBookmarkItemPrivate: Boolean, + onMoveBookmarkToPublic: () -> Unit, + onMoveBookmarkToPrivate: () -> Unit, onDeleteBookmarkItem: () -> Unit, editState: State>? = null, accountViewModel: AccountViewModel, @@ -76,7 +79,10 @@ fun BookmarkGroupItemOptions( if (popupExpanded.value) { BookmarkGroupItemOptionsMenu( note = baseNote, + isBookmarkItemPrivate = isBookmarkItemPrivate, onDismiss = { popupExpanded.value = false }, + onMoveBookmarkToPublic = onMoveBookmarkToPublic, + onMoveBookmarkToPrivate = onMoveBookmarkToPrivate, onDeleteBookmarkItem = onDeleteBookmarkItem, editState = editState, accountViewModel = accountViewModel, @@ -89,7 +95,10 @@ fun BookmarkGroupItemOptions( @Composable fun BookmarkGroupItemOptionsMenu( note: Note, + isBookmarkItemPrivate: Boolean, onDismiss: () -> Unit, + onMoveBookmarkToPublic: () -> Unit, + onMoveBookmarkToPrivate: () -> Unit, onDeleteBookmarkItem: () -> Unit, editState: State>? = null, accountViewModel: AccountViewModel, @@ -149,6 +158,10 @@ fun BookmarkGroupItemOptionsMenu( } val scope = rememberCoroutineScope() + DropdownMenuItem( + text = { Text(stringRes(if (isBookmarkItemPrivate) R.string.move_bookmark_to_public_label else R.string.move_bookmark_to_private_label)) }, + onClick = if (isBookmarkItemPrivate) onMoveBookmarkToPublic else onMoveBookmarkToPrivate, + ) DropdownMenuItem( text = { Text(stringRes(R.string.bookmark_remove_action_label)) }, onClick = { @@ -156,11 +169,6 @@ fun BookmarkGroupItemOptionsMenu( onDismiss() }, ) - // TODO: Work on moving feature below -// DropdownMenuItem( -// text = { Text("Move to Public") }, -// onClick = -// ) HorizontalDivider(thickness = DividerThickness) if (!state.isFollowingAuthor) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupScreen.kt index e06eaea47..e4ca1fc88 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupScreen.kt @@ -162,6 +162,15 @@ fun BookmarkGroupScreenView( bookmarkGroupViewModel, pagerState, accountViewModel, + movePostBookmark = { postId, isPrivate -> + accountViewModel.launchSigner { + bookmarkGroupViewModel.movePostBookmark( + groupIdentifier = bookmarkGroupViewModel.bookmarkGroupIdentifier, + postId = postId, + isCurrentlyPrivate = isPrivate, + ) + } + }, deletePostBookmark = { postId, isPrivate -> accountViewModel.launchSigner { bookmarkGroupViewModel.removePostBookmark( @@ -178,6 +187,15 @@ fun BookmarkGroupScreenView( bookmarkGroupViewModel, pagerState, accountViewModel, + moveArticleBookmark = { articleAddress, isPrivate -> + accountViewModel.launchSigner { + bookmarkGroupViewModel.moveArticleBookmark( + groupIdentifier = bookmarkGroupViewModel.bookmarkGroupIdentifier, + articleAddress = articleAddress, + isCurrentlyPrivate = isPrivate, + ) + } + }, deleteArticleBookmark = { articleAddress, isPrivate -> accountViewModel.launchSigner { bookmarkGroupViewModel.removeArticleBookmark( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupViewModel.kt index a0cd966be..d51cb49de 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/BookmarkGroupViewModel.kt @@ -69,8 +69,6 @@ class BookmarkGroupViewModel( .map { group -> group.privateArticleBookmarks.map { account.cache.getOrCreateAddressableNote(it.address) } } .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList()) - // TODO: Add implementations for Hashtag and Link bookmarks - suspend fun deleteBookmarkGroup(groupIdentifier: String) { account.labeledBookmarkLists.deleteBookmarkList(groupIdentifier, account) } @@ -88,6 +86,37 @@ class BookmarkGroupViewModel( ) } + suspend fun movePostBookmark( + groupIdentifier: String = bookmarkGroupIdentifier, + postId: String, + isCurrentlyPrivate: Boolean, + ) { + val eventBookmark = EventBookmark(postId) + moveBookmark(groupIdentifier, eventBookmark, isCurrentlyPrivate) + } + + suspend fun moveArticleBookmark( + groupIdentifier: String = bookmarkGroupIdentifier, + articleAddress: Address, + isCurrentlyPrivate: Boolean, + ) { + val eventBookmark = AddressBookmark(articleAddress) + moveBookmark(groupIdentifier, eventBookmark, isCurrentlyPrivate) + } + + suspend fun moveBookmark( + groupIdentifier: String = bookmarkGroupIdentifier, + bookmark: BookmarkIdTag, + isCurrentlyPrivate: Boolean, + ) { + account.labeledBookmarkLists.moveBookmarkInList( + bookmark, + groupIdentifier, + isCurrentlyPrivate, + account, + ) + } + suspend fun removePostBookmark( groupIdentifier: String = bookmarkGroupIdentifier, bookmarkPostId: String, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/PostListView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/PostListView.kt index d6976df7e..93562c8ef 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/PostListView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/display/PostListView.kt @@ -42,6 +42,7 @@ fun RenderPostList( bookmarkGroupViewModel: BookmarkGroupViewModel, pagerState: PagerState, accountViewModel: AccountViewModel, + movePostBookmark: (postId: String, fromPrivate: Boolean) -> Unit, deletePostBookmark: (postId: String, isPrivate: Boolean) -> Unit, nav: INav, modifier: Modifier = Modifier, @@ -55,6 +56,10 @@ fun RenderPostList( PostList( modifier = Modifier.fillMaxSize(), posts = publicPosts, + isPostBookmarkPrivate = false, + onMoveBookmarkToPrivate = { postId -> + movePostBookmark(postId, false) + }, onDeletePostBookmark = { postId -> deletePostBookmark(postId, false) }, @@ -65,6 +70,10 @@ fun RenderPostList( PostList( modifier = Modifier.fillMaxSize(), posts = privatePosts, + isPostBookmarkPrivate = true, + onMoveBookmarkToPublic = { postId -> + movePostBookmark(postId, true) + }, onDeletePostBookmark = { postId -> deletePostBookmark(postId, true) }, @@ -79,6 +88,9 @@ fun RenderPostList( private fun PostList( modifier: Modifier = Modifier, posts: List, + isPostBookmarkPrivate: Boolean, + onMoveBookmarkToPublic: (postId: String) -> Unit = {}, + onMoveBookmarkToPrivate: (postId: String) -> Unit = {}, onDeletePostBookmark: (postId: String) -> Unit, accountViewModel: AccountViewModel, nav: INav, @@ -100,6 +112,9 @@ private fun PostList( moreOptions = { BookmarkGroupItemOptions( baseNote = item, + isBookmarkItemPrivate = isPostBookmarkPrivate, + onMoveBookmarkToPublic = { onMoveBookmarkToPublic(item.idHex) }, + onMoveBookmarkToPrivate = { onMoveBookmarkToPrivate(item.idHex) }, onDeleteBookmarkItem = { onDeletePostBookmark(item.idHex) }, accountViewModel = accountViewModel, nav = nav, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/list/BookmarkGroupItem.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/list/BookmarkGroupItem.kt index 787241b0b..fe042574e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/list/BookmarkGroupItem.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/list/BookmarkGroupItem.kt @@ -32,8 +32,6 @@ import androidx.compose.foundation.layout.offset import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Article import androidx.compose.material.icons.outlined.CollectionsBookmark -import androidx.compose.material.icons.outlined.Lock -import androidx.compose.material.icons.outlined.Public import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.DropdownMenu @@ -70,6 +68,7 @@ import com.vitorpamplona.amethyst.ui.theme.Size40Modifier import com.vitorpamplona.amethyst.ui.theme.Size5dp import com.vitorpamplona.amethyst.ui.theme.SpacedBy2dp import com.vitorpamplona.amethyst.ui.theme.SpacedBy5dp +import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer @Composable fun BookmarkGroupItem( @@ -135,13 +134,12 @@ fun BookmarkGroupItem( contentDescription = stringRes(R.string.bookmark_list_icon_label), modifier = Size40Modifier, ) - // TODO: Fix the component below, with per-category stats -// Spacer(StdVertSpacer) -// BookmarkMembershipStatusAndNumberDisplay( -// modifier = Modifier.align(Alignment.CenterHorizontally), -// privateBookmarksSize = bookmarkList.privateBookmarks.size, -// publicBookmarksSize = bookmarkList.publicBookmarks.size, -// ) + Spacer(StdVertSpacer) + BookmarkMembershipStatusAndNumberDisplay( + modifier = Modifier.align(Alignment.CenterHorizontally), + postBookmarksSize = bookmarkList.publicPostBookmarks.size + bookmarkList.privatePostBookmarks.size, + articleBookmarksSize = bookmarkList.publicArticleBookmarks.size + bookmarkList.privateArticleBookmarks.size, + ) } }, ) @@ -193,49 +191,49 @@ private fun BookmarkGroupActions( @Composable fun BookmarkMembershipStatusAndNumberDisplay( - modifier: Modifier, - privateBookmarksSize: Int, - publicBookmarksSize: Int, + modifier: Modifier = Modifier, + postBookmarksSize: Int, + articleBookmarksSize: Int, ) { Row( modifier = modifier.offset(y = (-5).dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = SpacedBy5dp, ) { - if (privateBookmarksSize <= 0 && publicBookmarksSize <= 0) { + if (postBookmarksSize <= 0 && articleBookmarksSize <= 0) { Text( text = stringRes(R.string.follow_set_empty_label2), fontSize = Font10SP, ) } else { - if (privateBookmarksSize > 0) { + if (postBookmarksSize > 0) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = SpacedBy2dp, ) { Icon( - imageVector = Icons.Outlined.Lock, + painter = painterResource(R.drawable.post), modifier = Size10Modifier, contentDescription = null, ) Text( - text = privateBookmarksSize.toString(), + text = postBookmarksSize.toString(), fontSize = Font10SP, ) } } - if (publicBookmarksSize > 0) { + if (articleBookmarksSize > 0) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = SpacedBy2dp, ) { Icon( - imageVector = Icons.Outlined.Public, + imageVector = Icons.AutoMirrored.Outlined.Article, modifier = Size10Modifier, contentDescription = null, ) Text( - text = publicBookmarksSize.toString(), + text = articleBookmarksSize.toString(), fontSize = Font10SP, ) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/ArticleBookmarkListManagementScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/ArticleBookmarkListManagementScreen.kt index 82f697fb0..ec36b977e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/ArticleBookmarkListManagementScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/ArticleBookmarkListManagementScreen.kt @@ -110,6 +110,8 @@ private fun ListManagementView( listTitle = bookmarkList.title, isPublicMemberBookmark = maybePublicBookmark != null, isPrivateMemberBookmark = maybePrivateBookmark != null, + totalPostBookmarkSize = bookmarkList.publicPostBookmarks.size + bookmarkList.privatePostBookmarks.size, + totalArticleBookmarkSize = bookmarkList.publicArticleBookmarks.size + bookmarkList.privateArticleBookmarks.size, onClick = { nav.nav(Route.BookmarkGroupView(bookmarkList.identifier, BookmarkType.ArticleBookmark)) }, onAddBookmarkToGroup = { shouldBePrivate -> accountViewModel.launchSigner { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/BookmarkGroupManagementItem.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/BookmarkGroupManagementItem.kt index ae084ac4d..fd7b36c52 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/BookmarkGroupManagementItem.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/BookmarkGroupManagementItem.kt @@ -23,9 +23,9 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.bookmarkgroups.membershipM import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.BookmarkAdd @@ -48,11 +48,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.ui.screen.loggedIn.bookmarkgroups.list.BookmarkMembershipStatusAndNumberDisplay import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.theme.HalfHalfVertPadding import com.vitorpamplona.amethyst.ui.theme.Size15Modifier import com.vitorpamplona.amethyst.ui.theme.Size50Modifier import com.vitorpamplona.amethyst.ui.theme.SpacedBy5dp +import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer @Composable fun BookmarkGroupManagementItem( @@ -60,6 +62,8 @@ fun BookmarkGroupManagementItem( listTitle: String, isPrivateMemberBookmark: Boolean, isPublicMemberBookmark: Boolean, + totalPostBookmarkSize: Int, + totalArticleBookmarkSize: Int, onClick: () -> Unit, onAddBookmarkToGroup: (shouldBookmarkBePrivate: Boolean) -> Unit, onRemoveBookmarkFromGroup: () -> Unit, @@ -77,14 +81,20 @@ fun BookmarkGroupManagementItem( BookmarkStatusInList(isPublicMemberBookmark, isPrivateMemberBookmark) }, leadingContent = { - Box( - contentAlignment = Alignment.Center, + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, ) { Icon( imageVector = Icons.Outlined.CollectionsBookmark, contentDescription = stringRes(R.string.bookmark_list_icon_label), modifier = Size50Modifier, ) + Spacer(StdVertSpacer) + BookmarkMembershipStatusAndNumberDisplay( + postBookmarksSize = totalPostBookmarkSize, + articleBookmarksSize = totalArticleBookmarkSize, + ) } }, trailingContent = { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/PostBookmarkListManagementScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/PostBookmarkListManagementScreen.kt index 74fbcd494..14bb6478d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/PostBookmarkListManagementScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/bookmarkgroups/membershipManagement/PostBookmarkListManagementScreen.kt @@ -109,6 +109,8 @@ private fun ListManagementView( listTitle = bookmarkList.title, isPublicMemberBookmark = maybePublicBookmark != null, isPrivateMemberBookmark = maybePrivateBookmark != null, + totalPostBookmarkSize = bookmarkList.publicPostBookmarks.size + bookmarkList.privatePostBookmarks.size, + totalArticleBookmarkSize = bookmarkList.publicArticleBookmarks.size + bookmarkList.privateArticleBookmarks.size, onClick = { nav.nav(Route.BookmarkGroupView(bookmarkList.identifier, BookmarkType.PostBookmark)) }, onAddBookmarkToGroup = { shouldBePrivate -> accountViewModel.launchSigner { diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index e09c8d68a..85d3de401 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -422,6 +422,8 @@ Add as private bookmark Remove from Bookmark List Bookmark lists metadata can be seen by anyone on Nostr. Only your private members are encrypted. + Move to Public + Move to Private Wallet Connect Service Authorizes a Nostr Secret to pay zaps without leaving the app. Keep the secret safe and use a private relay if possible diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/labeledBookmarkList/LabeledBookmarkListEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/labeledBookmarkList/LabeledBookmarkListEvent.kt index 73b5684f6..02edaacab 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/labeledBookmarkList/LabeledBookmarkListEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/labeledBookmarkList/LabeledBookmarkListEvent.kt @@ -144,6 +144,31 @@ class LabeledBookmarkListEvent( ) } + suspend fun moveBookmark( + earlierVersion: LabeledBookmarkListEvent, + bookmarkIdTag: BookmarkIdTag, + isCurrentlyPrivate: Boolean, + signer: NostrSigner, + createdAt: Long = TimeUtils.now(), + ): LabeledBookmarkListEvent = + if (isCurrentlyPrivate) { + val privateTags = earlierVersion.privateTags(signer) ?: throw SignerExceptions.UnauthorizedDecryptionException() + resign( + privateTags = privateTags.remove(bookmarkIdTag.toTagArray()), + tags = earlierVersion.tags.plus(bookmarkIdTag.toTagArray()), + signer = signer, + createdAt = createdAt, + ) + } else { + val privateTags = earlierVersion.privateTags(signer) ?: throw SignerExceptions.UnauthorizedDecryptionException() + resign( + privateTags = privateTags.plus(bookmarkIdTag.toTagArray()), + tags = earlierVersion.tags.remove(bookmarkIdTag.toTagArray()), + signer = signer, + createdAt = createdAt, + ) + } + suspend fun removeBookmark( earlierVersion: LabeledBookmarkListEvent, bookmarkIdTag: BookmarkIdTag,