From e97a30fcb19c0b10f590fb6be41e79a6924980e3 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 5 Feb 2026 15:01:43 -0500 Subject: [PATCH] Migrates to use "title" instead of "name" tags for NIP-51 lists. --- .../blockPeopleList/BlockPeopleListState.kt | 2 +- .../LabeledBookmarkListsState.kt | 8 +++--- .../nip51Lists/peopleList/PeopleListsState.kt | 4 +-- .../navigation/topbars/FeedFilterSpinner.kt | 2 +- .../amethyst/ui/note/types/PeopleList.kt | 2 +- .../amethyst/ui/screen/TopNavFilterState.kt | 2 +- .../bookmarkList/BookmarkListEvent.kt | 12 ++++----- .../bookmarkList/TagArrayBuilderExt.kt | 4 +++ .../LabeledBookmarkListEvent.kt | 23 ++++++++-------- .../labeledBookmarkList/TagArrayBuilderExt.kt | 4 +++ .../nip51Lists/peopleList/PeopleListEvent.kt | 26 +++++++++---------- .../peopleList/TagArrayBuilderExt.kt | 4 +++ .../nip51Lists/relaySets/RelaySetEvent.kt | 4 +-- 13 files changed, 55 insertions(+), 42 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/blockPeopleList/BlockPeopleListState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/blockPeopleList/BlockPeopleListState.kt index f4db82512..273623282 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/blockPeopleList/BlockPeopleListState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/blockPeopleList/BlockPeopleListState.kt @@ -81,7 +81,7 @@ class BlockPeopleListState( ) } else { PeopleListEvent.create( - name = PeopleListEvent.BLOCK_LIST_D_TAG, + title = PeopleListEvent.BLOCK_LIST_D_TAG, person = UserTag(pubkeyHex), isPrivate = true, signer = signer, 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 55f02b4e3..739b74dc1 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 @@ -87,7 +87,7 @@ class LabeledBookmarkListsState( suspend fun LabeledBookmarkListEvent.toLabeledBookmarkList() = LabeledBookmarkList( identifier = dTag(), - title = nameOrTitle() ?: dTag(), + title = titleOrName() ?: dTag(), description = description(), image = image(), privateBookmarks = privateBookmarks(signer)?.toSet() ?: emptySet(), @@ -160,7 +160,7 @@ class LabeledBookmarkListsState( ) { val newList = LabeledBookmarkListEvent.create( - name = listName, + title = listName, description = listDescription, image = listImage, publicBookmarks = if (!isBookmarkPrivate && firstBookmark != null) listOf(firstBookmark) else emptyList(), @@ -200,7 +200,7 @@ class LabeledBookmarkListsState( val renamedList = LabeledBookmarkListEvent.modifyName( earlierVersion = listEvent, - newName = newName, + newTitle = newName, signer = account.signer, ) account.sendMyPublicAndPrivateOutbox(renamedList) @@ -229,7 +229,7 @@ class LabeledBookmarkListsState( ) { val clonedList = LabeledBookmarkListEvent.create( - name = customCloneName ?: currentBookmarkList.title, + title = customCloneName ?: currentBookmarkList.title, description = customCloneDescription ?: currentBookmarkList.description, publicBookmarks = currentBookmarkList.publicBookmarks.toList(), privateBookmarks = currentBookmarkList.privateBookmarks.toList(), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/peopleList/PeopleListsState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/peopleList/PeopleListsState.kt index 9f8076c60..99a3fb668 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/peopleList/PeopleListsState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip51Lists/peopleList/PeopleListsState.kt @@ -118,7 +118,7 @@ class PeopleListsState( suspend fun PeopleListEvent.toUI() = PeopleList( identifierTag = this.dTag(), - title = this.nameOrTitle() ?: this.dTag(), + title = this.titleOrName() ?: this.dTag(), description = this.description(), image = this.image(), privateMembers = cache.load(decryptionCache.privateUserIdSet(this)), @@ -197,7 +197,7 @@ class PeopleListsState( val newListTemplate = PeopleListEvent.build( dTag = dTag, - name = listName, + title = listName, publicMembers = if (!isPrivate && member != null) listOf(member.toUserTag()) else emptyList(), privateMembers = if (isPrivate && member != null) listOf(member.toUserTag()) else emptyList(), signer = account.signer, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/topbars/FeedFilterSpinner.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/topbars/FeedFilterSpinner.kt index 163011d9c..07feeee55 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/topbars/FeedFilterSpinner.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/topbars/FeedFilterSpinner.kt @@ -282,7 +282,7 @@ fun RenderOption( val name = when (noteEvent) { is PeopleListEvent -> { - noteEvent.nameOrTitle() ?: option.note.dTag() + noteEvent.titleOrName() ?: option.note.dTag() } is FollowListEvent -> { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/PeopleList.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/PeopleList.kt index 8d818b56c..1ca838244 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/PeopleList.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/PeopleList.kt @@ -81,7 +81,7 @@ fun DisplayPeopleList( members.take(3) } - val name by remember { derivedStateOf { "#${noteEvent.nameOrTitle() ?: noteEvent.dTag()}" } } + val name by remember { derivedStateOf { "#${noteEvent.titleOrName() ?: noteEvent.dTag()}" } } Text( text = name, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/TopNavFilterState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/TopNavFilterState.kt index 9ee0b0632..2848a916a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/TopNavFilterState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/TopNavFilterState.kt @@ -316,7 +316,7 @@ class PeopleListName( override fun name(): String { val noteEvent = note.event return if (noteEvent is PeopleListEvent) { - noteEvent.nameOrTitle() ?: note.dTag() + noteEvent.titleOrName() ?: note.dTag() } else if (noteEvent is FollowListEvent) { noteEvent.title() ?: note.dTag() } else { diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/bookmarkList/BookmarkListEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/bookmarkList/BookmarkListEvent.kt index 3c4e2ba5d..825007c4a 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/bookmarkList/BookmarkListEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/bookmarkList/BookmarkListEvent.kt @@ -40,7 +40,7 @@ import com.vitorpamplona.quartz.nip51Lists.bookmarkList.tags.BookmarkIdTag import com.vitorpamplona.quartz.nip51Lists.bookmarkList.tags.EventBookmark import com.vitorpamplona.quartz.nip51Lists.encryption.PrivateTagsInContent import com.vitorpamplona.quartz.nip51Lists.remove -import com.vitorpamplona.quartz.nip51Lists.tags.NameTag +import com.vitorpamplona.quartz.nip51Lists.tags.TitleTag import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -62,7 +62,7 @@ class BookmarkListEvent( override fun linkedAddressIds() = tags.mapNotNull(AddressBookmark::parseAddressId) - fun name() = tags.firstNotNullOfOrNull(NameTag::parse) + fun title() = tags.firstNotNullOfOrNull(TitleTag::parse) fun countBookmarks() = tags.count(BookmarkIdTag::isTagged) @@ -192,19 +192,19 @@ class BookmarkListEvent( } suspend fun create( - name: String = "", + title: String = "", publicBookmarks: List = emptyList(), privateBookmarks: List = emptyList(), dTag: String = DEFAULT_D_TAG_BOOKMARKS, signer: NostrSigner, createdAt: Long = TimeUtils.now(), ): BookmarkListEvent { - val template = build(name, publicBookmarks, privateBookmarks, signer, dTag, createdAt) + val template = build(title, publicBookmarks, privateBookmarks, signer, dTag, createdAt) return signer.sign(template) } suspend fun build( - name: String = "", + title: String = "", publicBookmarks: List = emptyList(), privateBookmarks: List = emptyList(), signer: NostrSigner, @@ -218,7 +218,7 @@ class BookmarkListEvent( ) { dTag(dTag) alt(ALT) - name(name) + title(title) bookmarks(publicBookmarks) initializer() diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/bookmarkList/TagArrayBuilderExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/bookmarkList/TagArrayBuilderExt.kt index 3fc8ebe46..f09353291 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/bookmarkList/TagArrayBuilderExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/bookmarkList/TagArrayBuilderExt.kt @@ -23,7 +23,11 @@ package com.vitorpamplona.quartz.nip51Lists.bookmarkList import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip51Lists.bookmarkList.tags.BookmarkIdTag import com.vitorpamplona.quartz.nip51Lists.tags.NameTag +import com.vitorpamplona.quartz.nip51Lists.tags.TitleTag +@Deprecated("NIP-51 has deprecated name. Use title instead", ReplaceWith("title()")) fun TagArrayBuilder.name(name: String) = addUnique(NameTag.assemble(name)) +fun TagArrayBuilder.title(title: String) = addUnique(TitleTag.assemble(title)) + fun TagArrayBuilder.bookmarks(bookmarks: List) = addAll(bookmarks.map { it.toTagArray() }) 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 02edaacab..342ef5f83 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 @@ -68,11 +68,12 @@ class LabeledBookmarkListEvent( override fun linkedAddressIds() = tags.mapNotNull(AddressBookmark::parseAddressId) + @Deprecated("NIP-51 has deprecated name. Use title instead", ReplaceWith("title()")) fun name() = tags.firstNotNullOfOrNull(NameTag::parse) fun title() = tags.firstNotNullOfOrNull(TitleTag::parse) - fun nameOrTitle() = name() ?: title() + fun titleOrName() = title() ?: name() fun description() = tags.firstNotNullOfOrNull(DescriptionTag::parse) @@ -93,7 +94,7 @@ class LabeledBookmarkListEvent( fun createBookmarkAddress(pubKey: HexKey) = Address(KIND, pubKey, Uuid.random().toString()) suspend fun create( - name: String = "", + title: String = "", bookmarkIdTag: BookmarkIdTag, isPrivate: Boolean, optionalListDescription: String? = null, @@ -102,7 +103,7 @@ class LabeledBookmarkListEvent( ): LabeledBookmarkListEvent = if (isPrivate) { create( - name = name, + title = title, description = optionalListDescription, publicBookmarks = emptyList(), privateBookmarks = listOf(bookmarkIdTag), @@ -111,7 +112,7 @@ class LabeledBookmarkListEvent( ) } else { create( - name = name, + title = title, description = optionalListDescription, publicBookmarks = listOf(bookmarkIdTag), privateBookmarks = emptyList(), @@ -195,7 +196,7 @@ class LabeledBookmarkListEvent( suspend fun modifyName( earlierVersion: LabeledBookmarkListEvent, - newName: String, + newTitle: String, signer: NostrSigner, createdAt: Long = TimeUtils.now(), ): LabeledBookmarkListEvent { @@ -203,9 +204,9 @@ class LabeledBookmarkListEvent( val currentTitle = earlierVersion.tags.first { it[0] == NameTag.TAG_NAME || it[0] == TitleTag.TAG_NAME } val newTitleTag = if (currentTitle[0] == NameTag.TAG_NAME) { - NameTag.assemble(newName) + NameTag.assemble(newTitle) } else { - TitleTag.assemble(newName) + TitleTag.assemble(newTitle) } return resign( @@ -287,7 +288,7 @@ class LabeledBookmarkListEvent( @OptIn(ExperimentalUuidApi::class) suspend fun create( - name: String = "", + title: String = "", description: String? = null, image: String? = null, publicBookmarks: List = emptyList(), @@ -297,7 +298,7 @@ class LabeledBookmarkListEvent( createdAt: Long = TimeUtils.now(), ): LabeledBookmarkListEvent { val template = - build(name, publicBookmarks, privateBookmarks, signer, dTag, createdAt) { + build(title, publicBookmarks, privateBookmarks, signer, dTag, createdAt) { if (description != null) description(description) if (image != null) image(image) } @@ -306,7 +307,7 @@ class LabeledBookmarkListEvent( @OptIn(ExperimentalUuidApi::class) suspend fun build( - name: String = "", + title: String = "", publicBookmarks: List = emptyList(), privateBookmarks: List = emptyList(), signer: NostrSigner, @@ -320,7 +321,7 @@ class LabeledBookmarkListEvent( ) { dTag(dTag) alt(ALT) - name(name) + title(title) bookmarks(publicBookmarks) initializer() diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/labeledBookmarkList/TagArrayBuilderExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/labeledBookmarkList/TagArrayBuilderExt.kt index 8f42feca5..4928c4b48 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/labeledBookmarkList/TagArrayBuilderExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/labeledBookmarkList/TagArrayBuilderExt.kt @@ -25,9 +25,13 @@ import com.vitorpamplona.quartz.nip51Lists.bookmarkList.tags.BookmarkIdTag import com.vitorpamplona.quartz.nip51Lists.tags.DescriptionTag import com.vitorpamplona.quartz.nip51Lists.tags.ImageTag import com.vitorpamplona.quartz.nip51Lists.tags.NameTag +import com.vitorpamplona.quartz.nip51Lists.tags.TitleTag +@Deprecated("NIP-51 has deprecated name. Use title instead", ReplaceWith("title()")) fun TagArrayBuilder.name(name: String) = addUnique(NameTag.assemble(name)) +fun TagArrayBuilder.title(title: String) = addUnique(TitleTag.assemble(title)) + fun TagArrayBuilder.bookmarks(bookmarks: List) = addAll(bookmarks.map { it.toTagArray() }) fun TagArrayBuilder.description(listDescription: String) = addUnique(DescriptionTag.assemble(listDescription)) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/peopleList/PeopleListEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/peopleList/PeopleListEvent.kt index 9e6aa6041..a99572c7b 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/peopleList/PeopleListEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/peopleList/PeopleListEvent.kt @@ -61,11 +61,11 @@ class PeopleListEvent( override fun linkedPubKeys() = tags.mapNotNull(UserTag::parseKey) + @Deprecated("NIP-51 has deprecated name. Use title instead", ReplaceWith("title()")) fun name() = tags.firstNotNullOfOrNull(NameTag::parse) - fun nameOrTitle() = name() ?: title() + fun titleOrName() = title() ?: name() - @Deprecated("NIP-51 has deprecated Title. Use name instead", ReplaceWith("name()")) fun title() = tags.firstNotNullOfOrNull(TitleTag::parse) fun description() = tags.firstNotNullOfOrNull(DescriptionTag::parse) @@ -103,7 +103,7 @@ class PeopleListEvent( @OptIn(ExperimentalUuidApi::class) suspend fun create( - name: String, + title: String, person: UserTag, isPrivate: Boolean, signer: NostrSigner, @@ -112,7 +112,7 @@ class PeopleListEvent( ): PeopleListEvent = if (isPrivate) { create( - name = name, + title = title, publicMembers = emptyList(), privateMembers = listOf(person), signer = signer, @@ -121,7 +121,7 @@ class PeopleListEvent( ) } else { create( - name = name, + title = title, publicMembers = listOf(person), privateMembers = emptyList(), signer = signer, @@ -249,20 +249,20 @@ class PeopleListEvent( @OptIn(ExperimentalUuidApi::class) suspend fun create( - name: String, + title: String, publicMembers: List = emptyList(), privateMembers: List = emptyList(), signer: NostrSigner, dTag: String = Uuid.random().toString(), createdAt: Long = TimeUtils.now(), ): PeopleListEvent { - val template = build(name, publicMembers, privateMembers, signer, dTag, createdAt) + val template = build(title, publicMembers, privateMembers, signer, dTag, createdAt) return signer.sign(template) } @OptIn(ExperimentalUuidApi::class) suspend fun build( - name: String, + title: String, publicMembers: List = emptyList(), privateMembers: List = emptyList(), signer: NostrSigner, @@ -276,7 +276,7 @@ class PeopleListEvent( ) { dTag(dTag) alt(ALT) - name(name) + title(title) peoples(publicMembers) initializer() @@ -293,7 +293,7 @@ class PeopleListEvent( ): PeopleListEvent { val newListTemplate = build( - name = title, + title = title, publicMembers = publicMembers, privateMembers = privateMembers, signer = signer, @@ -316,7 +316,7 @@ class PeopleListEvent( ): PeopleListEvent { val cloneTemplate = build( - name = title, + title = title, publicMembers = publicMembers, privateMembers = privateMembers, signer = signer, @@ -330,14 +330,14 @@ class PeopleListEvent( } suspend fun createListWithUser( - name: String, + title: String, pubKeyHex: String, isPrivate: Boolean, signer: NostrSigner, createdAt: Long = TimeUtils.now(), ): PeopleListEvent = create( - name = name, + title = title, person = UserTag(pubKey = pubKeyHex), isPrivate = isPrivate, signer = signer, diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/peopleList/TagArrayBuilderExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/peopleList/TagArrayBuilderExt.kt index b3e67ad42..1b2633d30 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/peopleList/TagArrayBuilderExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/peopleList/TagArrayBuilderExt.kt @@ -25,9 +25,13 @@ import com.vitorpamplona.quartz.nip51Lists.muteList.tags.UserTag import com.vitorpamplona.quartz.nip51Lists.tags.DescriptionTag import com.vitorpamplona.quartz.nip51Lists.tags.ImageTag import com.vitorpamplona.quartz.nip51Lists.tags.NameTag +import com.vitorpamplona.quartz.nip51Lists.tags.TitleTag +@Deprecated("NIP-51 has deprecated name. Use title instead", ReplaceWith("title()")) fun TagArrayBuilder.name(name: String) = addUnique(NameTag.assemble(name)) +fun TagArrayBuilder.title(name: String) = addUnique(TitleTag.assemble(name)) + fun TagArrayBuilder.description(desc: String) = addUnique(DescriptionTag.assemble(desc)) fun TagArrayBuilder.image(url: String) = addUnique(ImageTag.assemble(url)) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/relaySets/RelaySetEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/relaySets/RelaySetEvent.kt index 7580d314a..6c6b2ca80 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/relaySets/RelaySetEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/relaySets/RelaySetEvent.kt @@ -37,8 +37,8 @@ import com.vitorpamplona.quartz.nip51Lists.relayLists.tags.relaySet import com.vitorpamplona.quartz.nip51Lists.remove import com.vitorpamplona.quartz.nip51Lists.tags.DescriptionTag import com.vitorpamplona.quartz.nip51Lists.tags.ImageTag -import com.vitorpamplona.quartz.nip51Lists.tags.NameTag import com.vitorpamplona.quartz.nip51Lists.tags.RelayTag +import com.vitorpamplona.quartz.nip51Lists.tags.TitleTag import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -52,7 +52,7 @@ class RelaySetEvent( ) : PrivateTagArrayEvent(id, pubKey, createdAt, KIND, tags, content, sig) { fun relays(): List = tags.mapNotNull(RelayTag.Companion::parse) - fun name() = tags.firstNotNullOfOrNull(NameTag::parse) + fun title() = tags.firstNotNullOfOrNull(TitleTag::parse) fun description() = tags.firstNotNullOfOrNull(DescriptionTag::parse)