From 7a53708cccde0a4d155d52fe1841d9729af44177 Mon Sep 17 00:00:00 2001 From: toadlyBroodle Date: Sat, 18 Mar 2023 15:38:58 +0900 Subject: [PATCH] add fields to pollNoteEvent, add clearState fun to pollViewModel, add refined PollNoteEvent to Event, --- .../amethyst/service/model/Event.kt | 1 + .../amethyst/service/model/PollNoteEvent.kt | 39 ++++++++++++++++--- .../amethyst/ui/actions/NewPollView.kt | 7 +--- .../amethyst/ui/actions/NewPollViewModel.kt | 15 +++++-- .../ui/components/PollRecipientsField.kt | 7 +++- 5 files changed, 53 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt index 70b237e2d..e83d1eb5d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt @@ -178,6 +178,7 @@ open class Event( LnZapRequestEvent.kind -> LnZapRequestEvent(id, pubKey, createdAt, tags, content, sig) LongTextNoteEvent.kind -> LongTextNoteEvent(id, pubKey, createdAt, tags, content, sig) MetadataEvent.kind -> MetadataEvent(id, pubKey, createdAt, tags, content, sig) + PollNoteEvent.kind -> PollNoteEvent(id, pubKey, createdAt, tags, content, sig) PrivateDmEvent.kind -> PrivateDmEvent(id, pubKey, createdAt, tags, content, sig) ReactionEvent.kind -> ReactionEvent(id, pubKey, createdAt, tags, content, sig) RecommendRelayEvent.kind -> RecommendRelayEvent(id, pubKey, createdAt, tags, content, sig, lenient) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt index 9c910477d..6cb15d4a9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt @@ -5,11 +5,18 @@ import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +const val POLL_OPTIONS = "poll_options" +const val VALUE_MAXIMUM = "value_maximum" +const val VALUE_MINIMUM = "value_minimum" +const val CONSENSUS_THRESHOLD = "consensus_threshold" +const val CLOSED_AT = "closed_at" + class PollNoteEvent( id: HexKey, pubKey: HexKey, createdAt: Long, tags: List>, + // ots: , TODO implement OTS: https://github.com/opentimestamps/java-opentimestamps content: String, sig: HexKey ) : Event(id, pubKey, createdAt, kind, tags, content, sig) { @@ -23,15 +30,28 @@ class PollNoteEvent( fun replyTos() = tags.filter { it.firstOrNull() == "e" }.mapNotNull { it.getOrNull(1) } + fun pollOptions() = tags.filter { it.firstOrNull() == POLL_OPTIONS }.mapNotNull { it.getOrNull(1) } + fun valueMaximum() = tags.filter { it.firstOrNull() == VALUE_MAXIMUM }.mapNotNull { it.getOrNull(1) } + fun valueMinimum() = tags.filter { it.firstOrNull() == VALUE_MINIMUM }.mapNotNull { it.getOrNull(1) } + fun consensusThreshold() = tags.filter { it.firstOrNull() == CONSENSUS_THRESHOLD }.mapNotNull { it.getOrNull(1) } + fun closedAt() = tags.filter { it.firstOrNull() == CLOSED_AT }.mapNotNull { it.getOrNull(1) } + companion object { const val kind = 6969 - fun create(msg: String, - replyTos: List?, - mentions: List?, - addresses: List?, - privateKey: ByteArray, - createdAt: Long = Date().time / 1000): PollNoteEvent { + fun create( + msg: String, + replyTos: List?, + mentions: List?, + addresses: List?, + privateKey: ByteArray, + createdAt: Long = Date().time / 1000, + pollOptions: List>, + valueMaximum: Int?, + valueMinimum: Int?, + consensusThreshold: Int?, + closedAt: Int? + ): PollNoteEvent { val pubKey = Utils.pubkeyCreate(privateKey).toHexKey() val tags = mutableListOf>() replyTos?.forEach { @@ -43,6 +63,13 @@ class PollNoteEvent( addresses?.forEach { tags.add(listOf("a", it.toTag())) } + pollOptions.forEach { + tags.add(listOf(POLL_OPTIONS, it.toString())) + } + tags.add(listOf(VALUE_MAXIMUM, valueMaximum.toString())) + tags.add(listOf(VALUE_MINIMUM, valueMinimum.toString())) + tags.add(listOf(CONSENSUS_THRESHOLD, consensusThreshold.toString())) + tags.add(listOf(CLOSED_AT, closedAt.toString())) val id = generateId(pubKey, createdAt, kind, tags, msg) val sig = Utils.sign(id, privateKey) return PollNoteEvent(id.toHexKey(), pubKey, createdAt, tags, msg, sig.toHexKey()) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPollView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPollView.kt index 07067a2d5..ee54ae23b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPollView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPollView.kt @@ -39,11 +39,6 @@ fun NewPollView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n val scrollState = rememberScrollState() - // if no recipients, add user's pubkey - if (pollViewModel.zapRecipients.isEmpty()) { - pollViewModel.zapRecipients.add(account.userProfile().pubkeyHex) - } - LaunchedEffect(Unit) { pollViewModel.load(account, baseReplyTo, quote) delay(100) @@ -114,7 +109,7 @@ fun NewPollView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n } Text(stringResource(R.string.poll_heading_required)) - PollRecipientsField(pollViewModel) + PollRecipientsField(pollViewModel, account) PollPrimaryDescription(pollViewModel) pollViewModel.pollOptions.forEachIndexed { index, element -> PollOption(pollViewModel, index) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPollViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPollViewModel.kt index c90562fc9..e54c2107f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPollViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPollViewModel.kt @@ -39,14 +39,13 @@ class NewPollViewModel : NewPostViewModel() { override fun sendPost() { super.sendPost() - // delete existing pollOptions - pollOptions = mutableStateListOf("", "") + clearStates() } override fun cancel() { super.cancel() - pollOptions = mutableStateListOf("", "") + clearStates() } override fun findUrlInMessage(): String? { @@ -64,4 +63,14 @@ class NewPollViewModel : NewPostViewModel() { override fun autocompleteWithUser(item: User) { super.autocompleteWithUser(item) } + + private fun clearStates() { + // clear states + zapRecipients = mutableStateListOf() + pollOptions = mutableStateListOf("", "") + zapMax = null + zapMin = null + consensus = null + closedAfter = null + } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/PollRecipientsField.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/PollRecipientsField.kt index 131821727..602a1c1af 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/PollRecipientsField.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/PollRecipientsField.kt @@ -8,10 +8,15 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.ui.actions.NewPollViewModel @Composable -fun PollRecipientsField(pollViewModel: NewPollViewModel) { +fun PollRecipientsField(pollViewModel: NewPollViewModel, account: Account) { + // if no recipients, add user's pubkey + if (pollViewModel.zapRecipients.isEmpty()) { + pollViewModel.zapRecipients.add(account.userProfile().pubkeyHex) + } OutlinedTextField( modifier = Modifier