mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-10-04 18:24:34 +02:00
- Adds a button to create community posts from the Community screen
- Adds a reference to the reply/community in the new post screen.
This commit is contained in:
@@ -69,6 +69,7 @@ import com.vitorpamplona.amethyst.model.User
|
|||||||
import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource
|
import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource
|
||||||
import com.vitorpamplona.amethyst.service.noProtocolUrlValidator
|
import com.vitorpamplona.amethyst.service.noProtocolUrlValidator
|
||||||
import com.vitorpamplona.amethyst.ui.components.*
|
import com.vitorpamplona.amethyst.ui.components.*
|
||||||
|
import com.vitorpamplona.amethyst.ui.note.NoteCompose
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.TextSpinner
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.TextSpinner
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.UserLine
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.UserLine
|
||||||
@@ -78,6 +79,7 @@ import com.vitorpamplona.amethyst.ui.theme.Font14SP
|
|||||||
import com.vitorpamplona.amethyst.ui.theme.QuoteBorder
|
import com.vitorpamplona.amethyst.ui.theme.QuoteBorder
|
||||||
import com.vitorpamplona.amethyst.ui.theme.mediumImportanceLink
|
import com.vitorpamplona.amethyst.ui.theme.mediumImportanceLink
|
||||||
import com.vitorpamplona.amethyst.ui.theme.placeholderText
|
import com.vitorpamplona.amethyst.ui.theme.placeholderText
|
||||||
|
import com.vitorpamplona.amethyst.ui.theme.replyModifier
|
||||||
import com.vitorpamplona.amethyst.ui.theme.subtleBorder
|
import com.vitorpamplona.amethyst.ui.theme.subtleBorder
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
@@ -177,6 +179,18 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n
|
|||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.verticalScroll(scrollState)
|
.verticalScroll(scrollState)
|
||||||
) {
|
) {
|
||||||
|
postViewModel.originalNote?.let {
|
||||||
|
NoteCompose(
|
||||||
|
baseNote = it,
|
||||||
|
makeItShort = true,
|
||||||
|
unPackReply = false,
|
||||||
|
isQuotedNote = true,
|
||||||
|
modifier = MaterialTheme.colors.replyModifier,
|
||||||
|
accountViewModel = accountViewModel,
|
||||||
|
nav = nav
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
Notifying(postViewModel.mentions?.toImmutableList()) {
|
Notifying(postViewModel.mentions?.toImmutableList()) {
|
||||||
postViewModel.removeFromReplyList(it)
|
postViewModel.removeFromReplyList(it)
|
||||||
}
|
}
|
||||||
@@ -496,7 +510,9 @@ private fun AddZapraiserButton(
|
|||||||
Icon(
|
Icon(
|
||||||
imageVector = Icons.Default.ShowChart,
|
imageVector = Icons.Default.ShowChart,
|
||||||
null,
|
null,
|
||||||
modifier = Modifier.size(20.dp).align(Alignment.TopStart),
|
modifier = Modifier
|
||||||
|
.size(20.dp)
|
||||||
|
.align(Alignment.TopStart),
|
||||||
tint = MaterialTheme.colors.onBackground
|
tint = MaterialTheme.colors.onBackground
|
||||||
)
|
)
|
||||||
Icon(
|
Icon(
|
||||||
@@ -511,7 +527,9 @@ private fun AddZapraiserButton(
|
|||||||
Icon(
|
Icon(
|
||||||
imageVector = Icons.Default.ShowChart,
|
imageVector = Icons.Default.ShowChart,
|
||||||
null,
|
null,
|
||||||
modifier = Modifier.size(20.dp).align(Alignment.TopStart),
|
modifier = Modifier
|
||||||
|
.size(20.dp)
|
||||||
|
.align(Alignment.TopStart),
|
||||||
tint = BitcoinOrange
|
tint = BitcoinOrange
|
||||||
)
|
)
|
||||||
Icon(
|
Icon(
|
||||||
|
@@ -18,6 +18,7 @@ import com.vitorpamplona.amethyst.service.FileHeader
|
|||||||
import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource
|
import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource
|
||||||
import com.vitorpamplona.amethyst.service.model.AddressableEvent
|
import com.vitorpamplona.amethyst.service.model.AddressableEvent
|
||||||
import com.vitorpamplona.amethyst.service.model.BaseTextNoteEvent
|
import com.vitorpamplona.amethyst.service.model.BaseTextNoteEvent
|
||||||
|
import com.vitorpamplona.amethyst.service.model.CommunityDefinitionEvent
|
||||||
import com.vitorpamplona.amethyst.service.model.PrivateDmEvent
|
import com.vitorpamplona.amethyst.service.model.PrivateDmEvent
|
||||||
import com.vitorpamplona.amethyst.service.model.TextNoteEvent
|
import com.vitorpamplona.amethyst.service.model.TextNoteEvent
|
||||||
import com.vitorpamplona.amethyst.service.noProtocolUrlValidator
|
import com.vitorpamplona.amethyst.service.noProtocolUrlValidator
|
||||||
@@ -89,15 +90,17 @@ open class NewPostViewModel() : ViewModel() {
|
|||||||
this.replyTos = listOf(replyNote)
|
this.replyTos = listOf(replyNote)
|
||||||
}
|
}
|
||||||
|
|
||||||
replyNote.author?.let { replyUser ->
|
if (replyNote.event !is CommunityDefinitionEvent) {
|
||||||
val currentMentions = (replyNote.event as? TextNoteEvent)
|
replyNote.author?.let { replyUser ->
|
||||||
?.mentions()
|
val currentMentions = (replyNote.event as? TextNoteEvent)
|
||||||
?.map { LocalCache.getOrCreateUser(it) } ?: emptyList()
|
?.mentions()
|
||||||
|
?.map { LocalCache.getOrCreateUser(it) } ?: emptyList()
|
||||||
|
|
||||||
if (currentMentions.contains(replyUser)) {
|
if (currentMentions.contains(replyUser)) {
|
||||||
this.mentions = currentMentions
|
this.mentions = currentMentions
|
||||||
} else {
|
} else {
|
||||||
this.mentions = currentMentions.plus(replyUser)
|
this.mentions = currentMentions.plus(replyUser)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} ?: run {
|
} ?: run {
|
||||||
|
@@ -0,0 +1,58 @@
|
|||||||
|
package com.vitorpamplona.amethyst.ui.buttons
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
|
import androidx.compose.material.ButtonDefaults
|
||||||
|
import androidx.compose.material.Icon
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.OutlinedButton
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.res.painterResource
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import com.vitorpamplona.amethyst.R
|
||||||
|
import com.vitorpamplona.amethyst.model.Note
|
||||||
|
import com.vitorpamplona.amethyst.ui.actions.NewPostView
|
||||||
|
import com.vitorpamplona.amethyst.ui.components.LoadNote
|
||||||
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun NewCommunityNoteButton(communityIdHex: String, accountViewModel: AccountViewModel, nav: (String) -> Unit) {
|
||||||
|
LoadNote(baseNoteHex = communityIdHex) {
|
||||||
|
it?.let {
|
||||||
|
NewCommunityNoteButton(it, accountViewModel, nav)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun NewCommunityNoteButton(note: Note, accountViewModel: AccountViewModel, nav: (String) -> Unit) {
|
||||||
|
var wantsToPost by remember {
|
||||||
|
mutableStateOf(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wantsToPost) {
|
||||||
|
NewPostView({ wantsToPost = false }, note, accountViewModel = accountViewModel, nav = nav)
|
||||||
|
}
|
||||||
|
|
||||||
|
OutlinedButton(
|
||||||
|
onClick = { wantsToPost = true },
|
||||||
|
modifier = Modifier.size(55.dp),
|
||||||
|
shape = CircleShape,
|
||||||
|
colors = ButtonDefaults.outlinedButtonColors(backgroundColor = MaterialTheme.colors.primary),
|
||||||
|
contentPadding = PaddingValues(0.dp)
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(R.drawable.ic_compose),
|
||||||
|
null,
|
||||||
|
modifier = Modifier.size(26.dp),
|
||||||
|
tint = Color.White
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@@ -43,7 +43,7 @@ fun SensitivityWarning(
|
|||||||
accountViewModel: AccountViewModel,
|
accountViewModel: AccountViewModel,
|
||||||
content: @Composable () -> Unit
|
content: @Composable () -> Unit
|
||||||
) {
|
) {
|
||||||
val hasSensitiveContent = remember(note.event) { note.event?.isSensitive() ?: false }
|
val hasSensitiveContent = remember(note) { note.event?.isSensitive() ?: false }
|
||||||
|
|
||||||
if (hasSensitiveContent) {
|
if (hasSensitiveContent) {
|
||||||
SensitivityWarning(accountViewModel, content)
|
SensitivityWarning(accountViewModel, content)
|
||||||
|
@@ -832,7 +832,7 @@ private fun RenderNoteRow(
|
|||||||
accountViewModel: AccountViewModel,
|
accountViewModel: AccountViewModel,
|
||||||
nav: (String) -> Unit
|
nav: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
when (remember { baseNote.event }) {
|
when (baseNote.event) {
|
||||||
is AppDefinitionEvent -> {
|
is AppDefinitionEvent -> {
|
||||||
RenderAppDefinition(baseNote, accountViewModel, nav)
|
RenderAppDefinition(baseNote, accountViewModel, nav)
|
||||||
}
|
}
|
||||||
|
@@ -30,6 +30,7 @@ import androidx.navigation.NavBackStackEntry
|
|||||||
import androidx.navigation.compose.currentBackStackEntryAsState
|
import androidx.navigation.compose.currentBackStackEntryAsState
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import com.vitorpamplona.amethyst.ui.buttons.ChannelFabColumn
|
import com.vitorpamplona.amethyst.ui.buttons.ChannelFabColumn
|
||||||
|
import com.vitorpamplona.amethyst.ui.buttons.NewCommunityNoteButton
|
||||||
import com.vitorpamplona.amethyst.ui.buttons.NewNoteButton
|
import com.vitorpamplona.amethyst.ui.buttons.NewNoteButton
|
||||||
import com.vitorpamplona.amethyst.ui.navigation.*
|
import com.vitorpamplona.amethyst.ui.navigation.*
|
||||||
import com.vitorpamplona.amethyst.ui.navigation.AccountSwitchBottomSheet
|
import com.vitorpamplona.amethyst.ui.navigation.AccountSwitchBottomSheet
|
||||||
@@ -254,5 +255,16 @@ private fun WritePermissionButtons(
|
|||||||
Route.Home.base -> NewNoteButton(accountViewModel, nav)
|
Route.Home.base -> NewNoteButton(accountViewModel, nav)
|
||||||
Route.Message.base -> ChannelFabColumn(accountViewModel, nav)
|
Route.Message.base -> ChannelFabColumn(accountViewModel, nav)
|
||||||
Route.Video.base -> NewImageButton(accountViewModel, nav)
|
Route.Video.base -> NewImageButton(accountViewModel, nav)
|
||||||
|
Route.Community.base -> {
|
||||||
|
val communityId by remember(navEntryState.value) {
|
||||||
|
derivedStateOf {
|
||||||
|
navEntryState.value?.arguments?.getString("id")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
communityId?.let {
|
||||||
|
NewCommunityNoteButton(it, accountViewModel, nav)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -60,7 +60,7 @@ fun TranslatableRichTextViewer(
|
|||||||
accountViewModel: AccountViewModel,
|
accountViewModel: AccountViewModel,
|
||||||
nav: (String) -> Unit
|
nav: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
var translatedTextState by remember {
|
var translatedTextState by remember(content) {
|
||||||
mutableStateOf(TranslationConfig(content, null, null, false))
|
mutableStateOf(TranslationConfig(content, null, null, false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user