Migrates to use "title" instead of "name" tags for NIP-51 lists.

This commit is contained in:
Vitor Pamplona
2026-02-05 15:01:43 -05:00
parent 4ced055035
commit e97a30fcb1
13 changed files with 55 additions and 42 deletions
@@ -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,
@@ -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(),
@@ -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,
@@ -282,7 +282,7 @@ fun RenderOption(
val name =
when (noteEvent) {
is PeopleListEvent -> {
noteEvent.nameOrTitle() ?: option.note.dTag()
noteEvent.titleOrName() ?: option.note.dTag()
}
is FollowListEvent -> {
@@ -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,
@@ -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 {
@@ -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<BookmarkIdTag> = emptyList(),
privateBookmarks: List<BookmarkIdTag> = 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<BookmarkIdTag> = emptyList(),
privateBookmarks: List<BookmarkIdTag> = emptyList(),
signer: NostrSigner,
@@ -218,7 +218,7 @@ class BookmarkListEvent(
) {
dTag(dTag)
alt(ALT)
name(name)
title(title)
bookmarks(publicBookmarks)
initializer()
@@ -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<BookmarkListEvent>.name(name: String) = addUnique(NameTag.assemble(name))
fun TagArrayBuilder<BookmarkListEvent>.title(title: String) = addUnique(TitleTag.assemble(title))
fun TagArrayBuilder<BookmarkListEvent>.bookmarks(bookmarks: List<BookmarkIdTag>) = addAll(bookmarks.map { it.toTagArray() })
@@ -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<BookmarkIdTag> = 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<BookmarkIdTag> = emptyList(),
privateBookmarks: List<BookmarkIdTag> = emptyList(),
signer: NostrSigner,
@@ -320,7 +321,7 @@ class LabeledBookmarkListEvent(
) {
dTag(dTag)
alt(ALT)
name(name)
title(title)
bookmarks(publicBookmarks)
initializer()
@@ -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<LabeledBookmarkListEvent>.name(name: String) = addUnique(NameTag.assemble(name))
fun TagArrayBuilder<LabeledBookmarkListEvent>.title(title: String) = addUnique(TitleTag.assemble(title))
fun TagArrayBuilder<LabeledBookmarkListEvent>.bookmarks(bookmarks: List<BookmarkIdTag>) = addAll(bookmarks.map { it.toTagArray() })
fun TagArrayBuilder<LabeledBookmarkListEvent>.description(listDescription: String) = addUnique(DescriptionTag.assemble(listDescription))
@@ -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<UserTag> = emptyList(),
privateMembers: List<UserTag> = 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<UserTag> = emptyList(),
privateMembers: List<UserTag> = 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,
@@ -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<PeopleListEvent>.name(name: String) = addUnique(NameTag.assemble(name))
fun TagArrayBuilder<PeopleListEvent>.title(name: String) = addUnique(TitleTag.assemble(name))
fun TagArrayBuilder<PeopleListEvent>.description(desc: String) = addUnique(DescriptionTag.assemble(desc))
fun TagArrayBuilder<PeopleListEvent>.image(url: String) = addUnique(ImageTag.assemble(url))
@@ -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<NormalizedRelayUrl> = tags.mapNotNull(RelayTag.Companion::parse)
fun name() = tags.firstNotNullOfOrNull(NameTag::parse)
fun title() = tags.firstNotNullOfOrNull(TitleTag::parse)
fun description() = tags.firstNotNullOfOrNull(DescriptionTag::parse)