diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt index ef3f4a14c..148c2e1ef 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt @@ -138,7 +138,16 @@ fun ZapVote( ) .show() } - } else if (pollViewModel.isVoteAmountAtomic) { + } else if (pollViewModel.isVoteAmountAtomic()) { + // only allow one vote per option when min==max, i.e. atomic vote amount specified + if (pollViewModel.isPollOptionZappedBy(pollOption, account.userProfile())) { + scope.launch { + Toast + .makeText(context, R.string.one_vote_per_user_on_atomic_votes, Toast.LENGTH_SHORT) + .show() + } + return@combinedClickable + } accountViewModel.zap( baseNote, pollViewModel.valueMaximum!!.toLong() * 1000, @@ -263,11 +272,12 @@ fun ZapVoteAmountChoicePopup( } ) + val isValidInputAmount = pollViewModel.isValidInputVoteAmount(amount) Button( modifier = Modifier.padding(horizontal = 3.dp), - enabled = pollViewModel.isValidInputVoteAmount(amount), + enabled = isValidInputAmount, onClick = { - if (amount != null) { + if (amount != null && isValidInputAmount) { accountViewModel.zap( baseNote, amount * 1000, @@ -276,8 +286,8 @@ fun ZapVoteAmountChoicePopup( context, onError ) + onDismiss() } - onDismiss() }, shape = RoundedCornerShape(20.dp), colors = ButtonDefaults @@ -291,7 +301,7 @@ fun ZapVoteAmountChoicePopup( textAlign = TextAlign.Center, modifier = Modifier.combinedClickable( onClick = { - if (amount != null) { + if (amount != null && isValidInputAmount) { accountViewModel.zap( baseNote, amount * 1000, @@ -300,8 +310,8 @@ fun ZapVoteAmountChoicePopup( context, onError ) + onDismiss() } - onDismiss() }, onLongClick = {} ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt index 7e5da1765..77080d3e0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt @@ -28,12 +28,12 @@ class PollNoteViewModel { closedAt = pollEvent?.getTagInt(CLOSED_AT) } + fun isVoteAmountAtomic() = valueMaximum != null && valueMinimum != null && valueMinimum == valueMaximum + val isPollClosed: Boolean = closedAt?.let { // allow 2 minute leeway for zap to propagate pollNote?.createdAt()?.plus(it * (86400 + 120))!! > Date().time / 1000 } == true - val isVoteAmountAtomic = valueMaximum != null && valueMinimum != null && valueMinimum == valueMaximum - fun voteAmountPlaceHolderText(sats: String): String = if (valueMinimum == null && valueMaximum == null) { sats } else if (valueMinimum == null) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0fa1498cc..c73475bc1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -235,5 +235,6 @@ days Poll is closed to new votes Zap amount + Only one vote per user is allowed on this type of poll