diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index aadb5413e..7f007a737 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -69,6 +69,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource import com.vitorpamplona.amethyst.service.noProtocolUrlValidator 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.TextSpinner 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.mediumImportanceLink import com.vitorpamplona.amethyst.ui.theme.placeholderText +import com.vitorpamplona.amethyst.ui.theme.replyModifier import com.vitorpamplona.amethyst.ui.theme.subtleBorder import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList @@ -177,6 +179,18 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n .fillMaxWidth() .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()) { postViewModel.removeFromReplyList(it) } @@ -496,7 +510,9 @@ private fun AddZapraiserButton( Icon( imageVector = Icons.Default.ShowChart, null, - modifier = Modifier.size(20.dp).align(Alignment.TopStart), + modifier = Modifier + .size(20.dp) + .align(Alignment.TopStart), tint = MaterialTheme.colors.onBackground ) Icon( @@ -511,7 +527,9 @@ private fun AddZapraiserButton( Icon( imageVector = Icons.Default.ShowChart, null, - modifier = Modifier.size(20.dp).align(Alignment.TopStart), + modifier = Modifier + .size(20.dp) + .align(Alignment.TopStart), tint = BitcoinOrange ) Icon( 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 52f26b7fa..04b7319bd 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 @@ -18,6 +18,7 @@ import com.vitorpamplona.amethyst.service.FileHeader import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource import com.vitorpamplona.amethyst.service.model.AddressableEvent 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.TextNoteEvent import com.vitorpamplona.amethyst.service.noProtocolUrlValidator @@ -89,15 +90,17 @@ open class NewPostViewModel() : ViewModel() { this.replyTos = listOf(replyNote) } - replyNote.author?.let { replyUser -> - val currentMentions = (replyNote.event as? TextNoteEvent) - ?.mentions() - ?.map { LocalCache.getOrCreateUser(it) } ?: emptyList() + if (replyNote.event !is CommunityDefinitionEvent) { + replyNote.author?.let { replyUser -> + val currentMentions = (replyNote.event as? TextNoteEvent) + ?.mentions() + ?.map { LocalCache.getOrCreateUser(it) } ?: emptyList() - if (currentMentions.contains(replyUser)) { - this.mentions = currentMentions - } else { - this.mentions = currentMentions.plus(replyUser) + if (currentMentions.contains(replyUser)) { + this.mentions = currentMentions + } else { + this.mentions = currentMentions.plus(replyUser) + } } } } ?: run { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewCommunityNoteButton.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewCommunityNoteButton.kt new file mode 100644 index 000000000..ec0e9593e --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewCommunityNoteButton.kt @@ -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 + ) + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/SensitivityWarning.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/SensitivityWarning.kt index 951a34b14..f0d1b0fa1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/SensitivityWarning.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/SensitivityWarning.kt @@ -43,7 +43,7 @@ fun SensitivityWarning( accountViewModel: AccountViewModel, content: @Composable () -> Unit ) { - val hasSensitiveContent = remember(note.event) { note.event?.isSensitive() ?: false } + val hasSensitiveContent = remember(note) { note.event?.isSensitive() ?: false } if (hasSensitiveContent) { SensitivityWarning(accountViewModel, content) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index a676d0ea4..7926fa444 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -832,7 +832,7 @@ private fun RenderNoteRow( accountViewModel: AccountViewModel, nav: (String) -> Unit ) { - when (remember { baseNote.event }) { + when (baseNote.event) { is AppDefinitionEvent -> { RenderAppDefinition(baseNote, accountViewModel, nav) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt index 6baec1ba5..c7d31ba6b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt @@ -30,6 +30,7 @@ import androidx.navigation.NavBackStackEntry import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController 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.navigation.* import com.vitorpamplona.amethyst.ui.navigation.AccountSwitchBottomSheet @@ -254,5 +255,16 @@ private fun WritePermissionButtons( Route.Home.base -> NewNoteButton(accountViewModel, nav) Route.Message.base -> ChannelFabColumn(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) + } + } } } diff --git a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt index 6a2dd8e4a..0160bc960 100644 --- a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt +++ b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt @@ -60,7 +60,7 @@ fun TranslatableRichTextViewer( accountViewModel: AccountViewModel, nav: (String) -> Unit ) { - var translatedTextState by remember { + var translatedTextState by remember(content) { mutableStateOf(TranslationConfig(content, null, null, false)) }