From f6e5af3e98247a403754e1855d394bb3d9792830 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Mon, 18 Mar 2024 16:18:12 -0300 Subject: [PATCH] support for dms, streams and communities --- .../com/vitorpamplona/amethyst/model/Account.kt | 13 ++++++++++++- .../amethyst/ui/actions/NewPostViewModel.kt | 7 ++++--- .../amethyst/ui/screen/loggedIn/ChatroomScreen.kt | 10 +++++++++- .../quartz/events/ChatMessageEvent.kt | 3 ++- .../vitorpamplona/quartz/events/NIP24Factory.kt | 15 +++++++++++++-- 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 3ded4fd14..a5daff826 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -1756,6 +1756,7 @@ class Account( zapRaiserAmount: Long? = null, geohash: String? = null, nip94attachments: List? = null, + draftTag: String? = null, ) { if (!isWriteable()) return @@ -1773,9 +1774,19 @@ class Account( zapRaiserAmount = zapRaiserAmount, geohash = geohash, nip94attachments = nip94attachments, + draftTag = draftTag, signer = signer, ) { - broadcastPrivately(it) + if (draftTag != null) { + DraftEvent.create(draftTag, it.msg, signer) { draftEvent -> + Client.send(draftEvent) + LocalCache.justConsume(draftEvent, null) + LocalCache.justConsume(it.msg, null) + LocalCache.addDraft(draftTag, it.msg.id()) + } + } else { + broadcastPrivately(it) + } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 465139241..f14fa3be4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -339,7 +339,7 @@ open class NewPostViewModel() : ViewModel() { } eTags = - draft.event?.tags()?.filter { it.size > 1 && it[0] == "e" && it.getOrNull(3) != "fork" }?.mapNotNull { + draft.event?.tags()?.filter { it.size > 1 && (it[0] == "e" || it[0] == "a") && it.getOrNull(3) != "fork" }?.mapNotNull { val note = LocalCache.checkGetOrCreateNote(it[1]) note } @@ -349,13 +349,13 @@ open class NewPostViewModel() : ViewModel() { LocalCache.getOrCreateUser(it[1]) } - draft.event?.tags()?.filter { it.size > 1 && it[0] == "e" && it.getOrNull(3) == "fork" }?.forEach { + draft.event?.tags()?.filter { it.size > 1 && (it[0] == "e" || it[0] == "a") && it.getOrNull(3) == "fork" }?.forEach { val note = LocalCache.checkGetOrCreateNote(it[1]) forkedFromNote = note } originalNote = - draft.event?.tags()?.filter { it.size > 1 && it[0] == "e" && it.getOrNull(3) == "root" }?.map { + draft.event?.tags()?.filter { it.size > 1 && (it[0] == "e" || it[0] == "a") && it.getOrNull(3) == "root" }?.map { LocalCache.checkGetOrCreateNote(it[1]) }?.firstOrNull() @@ -529,6 +529,7 @@ open class NewPostViewModel() : ViewModel() { zapRaiserAmount = localZapRaiserAmount, geohash = geoHash, nip94attachments = usedAttachments, + draftTag = localDraft, ) } else { account?.sendPrivateMessage( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt index 76f3c98b0..8367b2191 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt @@ -116,6 +116,8 @@ import com.vitorpamplona.amethyst.ui.theme.Size34dp import com.vitorpamplona.amethyst.ui.theme.StdPadding import com.vitorpamplona.amethyst.ui.theme.ZeroPadding import com.vitorpamplona.amethyst.ui.theme.placeholderText +import com.vitorpamplona.quartz.encoders.Hex +import com.vitorpamplona.quartz.encoders.toNpub import com.vitorpamplona.quartz.events.ChatMessageEvent import com.vitorpamplona.quartz.events.ChatroomKey import com.vitorpamplona.quartz.events.findURLs @@ -230,6 +232,9 @@ fun PrepareChatroomViewModels( if (newPostModel.requiresNIP24) { newPostModel.nip24 = true } + room.users.forEach { + newPostModel.toUsers = TextFieldValue(newPostModel.toUsers.text + " @${Hex.decode(it).toNpub()}") + } LaunchedEffect(key1 = newPostModel) { launch(Dispatchers.IO) { @@ -315,7 +320,10 @@ fun ChatroomScreen( accountViewModel = accountViewModel, nav = nav, routeForLastRead = "Room/${room.hashCode()}", - onWantsToReply = { replyTo.value = it }, + onWantsToReply = { + replyTo.value = it + newPostModel.originalNote = it + }, ) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChatMessageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChatMessageEvent.kt index 1c2566d7b..805f5884f 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ChatMessageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ChatMessageEvent.kt @@ -82,6 +82,7 @@ class ChatMessageEvent( signer: NostrSigner, createdAt: Long = TimeUtils.now(), nip94attachments: List? = null, + isDraft: Boolean, onReady: (ChatMessageEvent) -> Unit, ) { val tags = mutableListOf>() @@ -106,7 +107,7 @@ class ChatMessageEvent( } // tags.add(arrayOf("alt", alt)) - signer.sign(createdAt, KIND, tags.toTypedArray(), msg, onReady) + signer.sign(createdAt, KIND, tags.toTypedArray(), msg, onReady, isDraft) } } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP24Factory.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP24Factory.kt index 4c623152f..6e69a305d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP24Factory.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/NIP24Factory.kt @@ -77,6 +77,7 @@ class NIP24Factory { zapRaiserAmount: Long? = null, geohash: String? = null, nip94attachments: List? = null, + draftTag: String? = null, onReady: (Result) -> Unit, ) { val senderPublicKey = signer.pubKey @@ -92,15 +93,25 @@ class NIP24Factory { markAsSensitive = markAsSensitive, zapRaiserAmount = zapRaiserAmount, geohash = geohash, + isDraft = draftTag != null, nip94attachments = nip94attachments, ) { senderMessage -> - createWraps(senderMessage, to.plus(senderPublicKey).toSet(), signer) { wraps -> + if (draftTag != null) { onReady( Result( msg = senderMessage, - wraps = wraps, + wraps = listOf(), ), ) + } else { + createWraps(senderMessage, to.plus(senderPublicKey).toSet(), signer) { wraps -> + onReady( + Result( + msg = senderMessage, + wraps = wraps, + ), + ) + } } } }