From 220ce75f199275b73e80c61edb037fa152ade486 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 20 Mar 2024 10:25:41 -0300 Subject: [PATCH] add validations to draft notes --- .../vitorpamplona/amethyst/model/Account.kt | 24 ++++++++++--- .../amethyst/model/LocalCache.kt | 8 +++++ .../amethyst/ui/note/ReactionsRow.kt | 34 +++++++++++++++++-- .../amethyst/ui/note/ZapCustomDialog.kt | 2 +- .../amethyst/ui/note/elements/DropDownMenu.kt | 16 +++++---- .../ui/screen/loggedIn/AccountViewModel.kt | 8 +++++ app/src/main/res/values/strings.xml | 5 +++ 7 files changed, 83 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index fc84e4455..619e70347 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -846,7 +846,14 @@ class Account( } suspend fun delete(note: Note) { - return delete(listOf(note)) + if (note.isDraft()) { + note.event?.let { + val drafts = LocalCache.getDrafts(it.id()) + return delete(drafts) + } + } else { + return delete(listOf(note)) + } } suspend fun delete(notes: List) { @@ -898,10 +905,17 @@ class Account( fun broadcast(note: Note) { note.event?.let { - if (it is WrappedEvent && it.host != null) { - it.host?.let { hostEvent -> Client.send(hostEvent) } + if (note.isDraft()) { + val drafts = LocalCache.getDrafts(it.id()) + drafts.forEach { draftNote -> + broadcast(draftNote) + } } else { - Client.send(it) + if (it is WrappedEvent && it.host != null) { + it.host?.let { hostEvent -> Client.send(hostEvent) } + } else { + Client.send(it) + } } } } @@ -930,6 +944,7 @@ class Account( fun timestamp(note: Note) { if (!isWriteable()) return + if (note.isDraft()) return val id = note.event?.id() ?: note.idHex @@ -1942,6 +1957,7 @@ class Account( isPrivate: Boolean, ) { if (!isWriteable()) return + if (note.isDraft()) return if (note is AddressableNote) { BookmarkListEvent.addReplaceable( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 64f2e5114..3e6a8309d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -148,6 +148,14 @@ object LocalCache { } ?: listOf() } + fun getDrafts(eventId: String): List { + return drafts.filter { + it.value.any { it == eventId } + }.keys.mapNotNull { + checkGetOrCreateNote(it) + } + } + fun addDraft( key: String, value: String, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt index 8fde12944..c70684c38 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt @@ -307,7 +307,12 @@ fun RenderZapRaiser( } LinearProgressIndicator( - modifier = remember(details) { Modifier.fillMaxWidth().height(if (details) 24.dp else 4.dp) }, + modifier = + remember(details) { + Modifier + .fillMaxWidth() + .height(if (details) 24.dp else 4.dp) + }, color = color, progress = { zapraiserStatus.progress }, ) @@ -587,6 +592,13 @@ fun ReplyReaction( IconButton( modifier = iconSizeModifier, onClick = { + if (baseNote.isDraft()) { + accountViewModel.toast( + R.string.draft_note, + R.string.it_s_not_possible_to_reply_to_a_draft_note, + ) + return@IconButton + } if (accountViewModel.isWriteable()) { onPress() } else { @@ -774,7 +786,8 @@ fun LikeReaction( Box( contentAlignment = Center, modifier = - Modifier.size(iconSize) + Modifier + .size(iconSize) .combinedClickable( role = Role.Button, interactionSource = remember { MutableInteractionSource() }, @@ -782,6 +795,7 @@ fun LikeReaction( onClick = { likeClick( accountViewModel, + baseNote, onMultipleChoices = { wantsToReact = true }, onWantsToSignReaction = { accountViewModel.reactToOrDelete(baseNote) }, ) @@ -884,9 +898,17 @@ fun ObserveLikeText( private fun likeClick( accountViewModel: AccountViewModel, + baseNote: Note, onMultipleChoices: () -> Unit, onWantsToSignReaction: () -> Unit, ) { + if (baseNote.isDraft()) { + accountViewModel.toast( + R.string.draft_note, + R.string.it_s_not_possible_to_react_to_a_draft_note, + ) + return + } if (accountViewModel.account.reactionChoices.isEmpty()) { accountViewModel.toast( R.string.no_reactions_setup, @@ -1080,6 +1102,14 @@ fun zapClick( onError: (String, String) -> Unit, onPayViaIntent: (ImmutableList) -> Unit, ) { + if (baseNote.isDraft()) { + accountViewModel.toast( + R.string.draft_note, + R.string.it_s_not_possible_to_zap_to_a_draft_note, + ) + return + } + if (accountViewModel.account.zapAmountChoices.isEmpty()) { accountViewModel.toast( context.getString(R.string.error_dialog_zap_error), diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapCustomDialog.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapCustomDialog.kt index ae411dee6..61dd389ad 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapCustomDialog.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapCustomDialog.kt @@ -179,7 +179,7 @@ fun ZapCustomDialog( ) ZapButton( - isActive = postViewModel.canSend(), + isActive = postViewModel.canSend() && !baseNote.isDraft(), ) { accountViewModel.zap( baseNote, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DropDownMenu.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DropDownMenu.kt index b9672a075..70cc123c2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DropDownMenu.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DropDownMenu.kt @@ -237,13 +237,15 @@ fun NoteDropDownMenu( }, ) HorizontalDivider(thickness = DividerThickness) - DropdownMenuItem( - text = { Text(stringResource(R.string.edit_draft)) }, - onClick = { - wantsToEditDraft.value = true - }, - ) - if (note.event is TextNoteEvent) { + if (!note.isDraft()) { + DropdownMenuItem( + text = { Text(stringResource(R.string.edit_draft)) }, + onClick = { + wantsToEditDraft.value = true + }, + ) + } + if (note.event is TextNoteEvent && !note.isDraft()) { if (state.isLoggedUser) { DropdownMenuItem( text = { Text(stringResource(R.string.edit_post)) }, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index a7abcbb9a..d4d03478d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -1209,6 +1209,14 @@ class AccountViewModel(val account: Account, val settings: SettingsState) : View baseNote: Note, onMore: () -> Unit, ) { + if (baseNote.isDraft()) { + toast( + R.string.draft_note, + R.string.it_s_not_possible_to_quote_to_a_draft_note, + ) + return + } + if (isWriteable()) { if (hasBoosted(baseNote)) { deleteBoostsTo(baseNote) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e117b505..fde9df12d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -821,4 +821,9 @@ Play username as audio Scan QR code Navigate to the third-party wallet provider Alby + It\'s not possible to reply a draft note + It\'s not possible to quote a draft note + It\'s not possible to react a draft note + It\'s not possible to zap a draft note + Draft Note