Merge pull request #1916 from vitorpamplona/claude/add-multiple-choice-polls-CQUAv
feat: add multiple choice poll type selector
This commit is contained in:
+32
@@ -22,7 +22,9 @@ package com.vitorpamplona.amethyst.ui.note.creators.polls
|
|||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import androidx.compose.foundation.BorderStroke
|
import androidx.compose.foundation.BorderStroke
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
@@ -32,6 +34,7 @@ import androidx.compose.material.icons.filled.Add
|
|||||||
import androidx.compose.material.icons.filled.Delete
|
import androidx.compose.material.icons.filled.Delete
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.ButtonDefaults
|
import androidx.compose.material3.ButtonDefaults
|
||||||
|
import androidx.compose.material3.FilterChip
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
@@ -47,6 +50,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.ShortNotePostViewModel
|
|||||||
import com.vitorpamplona.amethyst.ui.stringRes
|
import com.vitorpamplona.amethyst.ui.stringRes
|
||||||
import com.vitorpamplona.amethyst.ui.theme.placeholderText
|
import com.vitorpamplona.amethyst.ui.theme.placeholderText
|
||||||
import com.vitorpamplona.quartz.nip88Polls.poll.tags.OptionTag
|
import com.vitorpamplona.quartz.nip88Polls.poll.tags.OptionTag
|
||||||
|
import com.vitorpamplona.quartz.nip88Polls.poll.tags.PollType
|
||||||
import com.vitorpamplona.quartz.utils.RandomInstance
|
import com.vitorpamplona.quartz.utils.RandomInstance
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@@ -55,6 +59,13 @@ fun PollOptionsField(postViewModel: ShortNotePostViewModel) {
|
|||||||
Column(
|
Column(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
) {
|
) {
|
||||||
|
PollTypeSelector(
|
||||||
|
selectedType = postViewModel.pollType,
|
||||||
|
onTypeSelected = { postViewModel.pollType = it },
|
||||||
|
)
|
||||||
|
|
||||||
|
Spacer(Modifier.height(4.dp))
|
||||||
|
|
||||||
optionsList.forEach { option ->
|
optionsList.forEach { option ->
|
||||||
OutlinedTextField(
|
OutlinedTextField(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
@@ -118,6 +129,27 @@ fun PollOptionsField(postViewModel: ShortNotePostViewModel) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun PollTypeSelector(
|
||||||
|
selectedType: PollType,
|
||||||
|
onTypeSelected: (PollType) -> Unit,
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||||
|
) {
|
||||||
|
FilterChip(
|
||||||
|
selected = selectedType == PollType.SINGLE_CHOICE,
|
||||||
|
onClick = { onTypeSelected(PollType.SINGLE_CHOICE) },
|
||||||
|
label = { Text(stringRes(R.string.poll_single_choice)) },
|
||||||
|
)
|
||||||
|
FilterChip(
|
||||||
|
selected = selectedType == PollType.MULTI_CHOICE,
|
||||||
|
onClick = { onTypeSelected(PollType.MULTI_CHOICE) },
|
||||||
|
label = { Text(stringRes(R.string.poll_multiple_choice)) },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("ViewModelConstructorInComposable")
|
@SuppressLint("ViewModelConstructorInComposable")
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
|
|||||||
+5
-1
@@ -117,6 +117,7 @@ import com.vitorpamplona.quartz.nip57Zaps.zapraiser.zapraiserAmount
|
|||||||
import com.vitorpamplona.quartz.nip72ModCommunities.definition.CommunityDefinitionEvent
|
import com.vitorpamplona.quartz.nip72ModCommunities.definition.CommunityDefinitionEvent
|
||||||
import com.vitorpamplona.quartz.nip88Polls.poll.PollEvent
|
import com.vitorpamplona.quartz.nip88Polls.poll.PollEvent
|
||||||
import com.vitorpamplona.quartz.nip88Polls.poll.tags.OptionTag
|
import com.vitorpamplona.quartz.nip88Polls.poll.tags.OptionTag
|
||||||
|
import com.vitorpamplona.quartz.nip88Polls.poll.tags.PollType
|
||||||
import com.vitorpamplona.quartz.nip92IMeta.IMetaTagBuilder
|
import com.vitorpamplona.quartz.nip92IMeta.IMetaTagBuilder
|
||||||
import com.vitorpamplona.quartz.nip92IMeta.imetas
|
import com.vitorpamplona.quartz.nip92IMeta.imetas
|
||||||
import com.vitorpamplona.quartz.nip94FileMetadata.alt
|
import com.vitorpamplona.quartz.nip94FileMetadata.alt
|
||||||
@@ -238,6 +239,7 @@ open class ShortNotePostViewModel :
|
|||||||
var canUsePoll by mutableStateOf(false)
|
var canUsePoll by mutableStateOf(false)
|
||||||
var wantsPoll by mutableStateOf(false)
|
var wantsPoll by mutableStateOf(false)
|
||||||
var pollOptions: SnapshotStateMap<Int, OptionTag> = newStateMapPollOptions()
|
var pollOptions: SnapshotStateMap<Int, OptionTag> = newStateMapPollOptions()
|
||||||
|
var pollType by mutableStateOf(PollType.SINGLE_CHOICE)
|
||||||
var closedAt by mutableLongStateOf(TimeUtils.oneDayAhead())
|
var closedAt by mutableLongStateOf(TimeUtils.oneDayAhead())
|
||||||
|
|
||||||
// ZapPolls
|
// ZapPolls
|
||||||
@@ -597,6 +599,7 @@ open class ShortNotePostViewModel :
|
|||||||
pollOptions[index] = tag
|
pollOptions[index] = tag
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pollType = draftEvent.pollType() ?: PollType.SINGLE_CHOICE
|
||||||
closedAt = draftEvent.endsAt() ?: TimeUtils.oneDayAhead()
|
closedAt = draftEvent.endsAt() ?: TimeUtils.oneDayAhead()
|
||||||
|
|
||||||
message = TextFieldValue(draftEvent.content)
|
message = TextFieldValue(draftEvent.content)
|
||||||
@@ -829,7 +832,7 @@ open class ShortNotePostViewModel :
|
|||||||
accountViewModel.account.nip65RelayList.outboxFlow.value
|
accountViewModel.account.nip65RelayList.outboxFlow.value
|
||||||
.toList()
|
.toList()
|
||||||
|
|
||||||
PollEvent.build(tagger.message, options, closedAt, relays) {
|
PollEvent.build(tagger.message, options, closedAt, relays, pollType) {
|
||||||
pTags(tagger.directMentionsUsers.map { it.toPTag() })
|
pTags(tagger.directMentionsUsers.map { it.toPTag() })
|
||||||
quotes(quotes)
|
quotes(quotes)
|
||||||
hashtags(findHashtags(tagger.message))
|
hashtags(findHashtags(tagger.message))
|
||||||
@@ -1055,6 +1058,7 @@ open class ShortNotePostViewModel :
|
|||||||
|
|
||||||
wantsPoll = false
|
wantsPoll = false
|
||||||
pollOptions = newStateMapPollOptions()
|
pollOptions = newStateMapPollOptions()
|
||||||
|
pollType = PollType.SINGLE_CHOICE
|
||||||
closedAt = TimeUtils.oneDayAhead()
|
closedAt = TimeUtils.oneDayAhead()
|
||||||
|
|
||||||
wantsZapPoll = false
|
wantsZapPoll = false
|
||||||
|
|||||||
@@ -483,6 +483,8 @@
|
|||||||
<string name="poll_zap_value_max">Zap maximum</string>
|
<string name="poll_zap_value_max">Zap maximum</string>
|
||||||
<string name="poll_consensus_threshold">Consensus</string>
|
<string name="poll_consensus_threshold">Consensus</string>
|
||||||
<string name="poll_consensus_threshold_percent">(0–100)%</string>
|
<string name="poll_consensus_threshold_percent">(0–100)%</string>
|
||||||
|
<string name="poll_single_choice">Single choice</string>
|
||||||
|
<string name="poll_multiple_choice">Multiple choice</string>
|
||||||
<string name="poll_closing_date_time">Poll Closing Date & Time</string>
|
<string name="poll_closing_date_time">Poll Closing Date & Time</string>
|
||||||
<string name="poll_closing_in">Poll closes in %1$s</string>
|
<string name="poll_closing_in">Poll closes in %1$s</string>
|
||||||
<string name="poll_closing_time">Close after</string>
|
<string name="poll_closing_time">Close after</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user