diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index 11527ebc7..c613cc004 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -107,8 +107,6 @@ private object PrefKeys { const val LOGIN_WITH_EXTERNAL_SIGNER = "login_with_external_signer" const val AUTOMATICALLY_SHOW_PROFILE_PICTURE = "automatically_show_profile_picture" const val SIGNER_PACKAGE_NAME = "signer_package_name" - const val NEW_POST_DRAFT = "draft_new_post" - const val DRAFT_REPLY_POST = "draft_reply_post" const val HAS_DONATED_IN_VERSION = "has_donated_in_version" const val PENDING_ATTESTATIONS = "pending_attestations" @@ -395,38 +393,6 @@ object LocalPreferences { } } - fun saveDraft( - message: String, - replyPost: String?, - account: Account, - ) { - val prefs = encryptedPreferences(account.keyPair.pubKey.toNpub()) - with(prefs.edit()) { - putString(PrefKeys.NEW_POST_DRAFT, message) - putString(PrefKeys.DRAFT_REPLY_POST, replyPost) - apply() - } - } - - fun loadReplyDraft(account: Account): String? { - val prefs = encryptedPreferences(account.keyPair.pubKey.toNpub()) - return prefs.getString(PrefKeys.DRAFT_REPLY_POST, null) - } - - fun loadDraft(account: Account): String? { - val prefs = encryptedPreferences(account.keyPair.pubKey.toNpub()) - return prefs.getString(PrefKeys.NEW_POST_DRAFT, null) - } - - fun clearDraft(account: Account) { - val prefs = encryptedPreferences(account.keyPair.pubKey.toNpub()) - with(prefs.edit()) { - remove(PrefKeys.DRAFT_REPLY_POST) - remove(PrefKeys.NEW_POST_DRAFT) - apply() - } - } - suspend fun innerLoadCurrentAccountFromEncryptedStorage(npub: String?): Account? = withContext(Dispatchers.IO) { checkNotInMainThread() 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 ee68d4585..1054d8bf1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -155,6 +155,15 @@ object LocalCache { return null } + fun draftNotes(draftTag: String): List { + return notes.values.filter { + it.event?.tags()?.filter { it.size > 1 && it[0] == "d" }?.map { + Log.d("tag", it[1]) + it[1] + }?.firstOrNull() == draftTag + } + } + fun getOrCreateUser(key: HexKey): User { // checkNotInMainThread() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt index 3e308700c..8d2e67d98 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt @@ -263,7 +263,7 @@ class Relay( val subscriptionId = msgArray.get(1).asText() val event = Event.fromJson(msgArray.get(2)) - Log.w("Relay", "Relay onEVENT ${event.kind} $url, $subscriptionId ${msgArray.get(2)}") + // Log.w("Relay", "Relay onEVENT ${event.kind} $url, $subscriptionId ${msgArray.get(2)}") listeners.forEach { it.onEvent( this@Relay, 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 0ca801538..1ffd99cf4 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 @@ -64,7 +64,6 @@ import androidx.compose.material.icons.filled.Sell import androidx.compose.material.icons.filled.ShowChart import androidx.compose.material.icons.filled.Visibility import androidx.compose.material.icons.filled.VisibilityOff -import androidx.compose.material.icons.outlined.Bolt import androidx.compose.material.icons.rounded.Warning import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults @@ -125,10 +124,8 @@ import coil.compose.AsyncImage import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState -import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.commons.RichTextParser -import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.Nip96MediaServers @@ -204,17 +201,7 @@ fun NewPostView( LaunchedEffect(Unit) { launch(Dispatchers.IO) { - val replyDraft = LocalPreferences.loadReplyDraft(accountViewModel.account) - if (replyDraft.isNullOrBlank()) { - postViewModel.load(accountViewModel, baseReplyTo, quote, fork, version) - } else { - val note = LocalCache.checkGetOrCreateNote(replyDraft) - if (note == null) { - postViewModel.load(accountViewModel, baseReplyTo, quote, fork, version) - } else { - postViewModel.load(accountViewModel, note, quote, fork, version) - } - } + postViewModel.load(accountViewModel, baseReplyTo, quote, fork, version) postViewModel.imageUploadingError.collect { error -> withContext(Dispatchers.Main) { Toast.makeText(context, error, Toast.LENGTH_SHORT).show() } 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 d9739c918..7fd552211 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 @@ -35,7 +35,6 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.fonfon.kgeohash.toGeoHash -import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.commons.RichTextParser import com.vitorpamplona.amethyst.commons.insertUrlAtCursor import com.vitorpamplona.amethyst.model.Account @@ -229,13 +228,6 @@ open class NewPostViewModel() : ViewModel() { forwardZapTo = Split() forwardZapToEditting = TextFieldValue("") - viewModelScope.launch(Dispatchers.IO) { - val draft = loadDraft() - if (draft != null) { - message = TextFieldValue(draft) - updateMessage(message) - } - } quote?.let { message = TextFieldValue(message.text + "\nnostr:${it.toNEvent()}") urlPreview = findUrlInMessage() @@ -685,7 +677,7 @@ open class NewPostViewModel() : ViewModel() { originalNote = null viewModelScope.launch(Dispatchers.IO) { - clearDraft() + accountViewModel?.deleteDraft(draftTag) } NostrSearchEventOrUserDataSource.clear() @@ -707,16 +699,6 @@ open class NewPostViewModel() : ViewModel() { sendPost(localDraft = draftTag) } - open fun loadDraft(): String? { - account?.let { return LocalPreferences.loadDraft(it) } - - return null - } - - open fun clearDraft() { - account?.let { LocalPreferences.clearDraft(it) } - } - open fun updateMessage(it: TextFieldValue) { message = it urlPreview = findUrlInMessage() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt index d5f739cda..7a3496f75 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt @@ -26,13 +26,11 @@ import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -40,7 +38,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll @@ -52,12 +49,9 @@ import androidx.compose.material3.DrawerState import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalDrawerSheet import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.OutlinedTextFieldDefaults -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable @@ -83,26 +77,19 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardCapitalization -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.text.style.TextDirection import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.compose.ui.window.Dialog -import androidx.compose.ui.window.DialogProperties import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil.compose.AsyncImage import com.vitorpamplona.amethyst.BuildConfig -import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relays.RelayPool import com.vitorpamplona.amethyst.service.relays.RelayPoolStatus -import com.vitorpamplona.amethyst.ui.actions.CloseButton import com.vitorpamplona.amethyst.ui.actions.NewPostView import com.vitorpamplona.amethyst.ui.actions.NewRelayListView -import com.vitorpamplona.amethyst.ui.actions.PostButton import com.vitorpamplona.amethyst.ui.components.ClickableText import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage @@ -479,17 +466,8 @@ fun ListContent( mutableStateOf(null) } - var showDraft by remember { mutableStateOf(false) } var wantsToPost by remember { mutableStateOf(false) } - LaunchedEffect(drawerState.isOpen) { - if (drawerState.isOpen) { - launch(Dispatchers.IO) { - draftText = LocalPreferences.loadDraft(accountViewModel.account) - } - } - } - Column( modifier = modifier @@ -566,18 +544,6 @@ fun ListContent( }, ) - draftText?.let { - IconRow( - title = stringResource(R.string.edit_draft), - icon = R.drawable.ic_lists, - tint = MaterialTheme.colorScheme.onBackground, - onClick = { - coroutineScope.launch { drawerState.close() } - showDraft = true - }, - ) - } - NavigationRow( title = stringResource(R.string.settings), icon = Route.Settings.icon, @@ -634,24 +600,6 @@ fun ListContent( ) } - if (showDraft) { - EditDraftDialog( - { - draftText = null - showDraft = false - }, - { - coroutineScope.launch(Dispatchers.IO) { - LocalPreferences.saveDraft(it, null, accountViewModel.account) - draftText = null - showDraft = false - wantsToPost = true - } - }, - draftText!!, - ) - } - if (disconnectTorDialog) { AlertDialog( title = { Text(text = stringResource(R.string.do_you_really_want_to_disable_tor_title)) }, @@ -679,62 +627,6 @@ fun ListContent( } } -@Composable -fun EditDraftDialog( - onClose: () -> Unit, - onPost: (String) -> Unit, - draftText: String, -) { - var message by remember { - mutableStateOf(TextFieldValue(draftText)) - } - Dialog( - onDismissRequest = onClose, - properties = DialogProperties(usePlatformDefaultWidth = false), - ) { - Surface(modifier = Modifier.fillMaxSize()) { - Column( - modifier = Modifier.padding(10.dp), - ) { - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth(), - ) { - CloseButton(onPress = { onClose() }) - PostButton(isActive = true, onPost = { onPost(message.text) }) - } - - Column( - modifier = Modifier.padding(8.dp), - ) { - OutlinedTextField( - value = message, - onValueChange = { message = it }, - keyboardOptions = - KeyboardOptions.Default.copy( - capitalization = KeyboardCapitalization.Sentences, - ), - modifier = - Modifier.fillMaxWidth() - .border( - width = 1.dp, - color = MaterialTheme.colorScheme.surface, - shape = RoundedCornerShape(8.dp), - ), - colors = - OutlinedTextFieldDefaults.colors( - focusedBorderColor = Color.Transparent, - unfocusedBorderColor = Color.Transparent, - ), - textStyle = LocalTextStyle.current.copy(textDirection = TextDirection.Content), - ) - } - } - } - } -} - @Composable private fun RelayStatus(accountViewModel: AccountViewModel) { val connectedRelaysText by RelayPool.statusFlow.collectAsStateWithLifecycle(RelayPoolStatus(0, 0)) 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 88ec1d47b..303bb93a5 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 @@ -1318,6 +1318,11 @@ class AccountViewModel(val account: Account, val settings: SettingsState) : View } } } + + suspend fun deleteDraft(draftTag: String) { + val notes = LocalCache.draftNotes(draftTag) + account.delete(notes) + } } class HasNotificationDot(bottomNavigationItems: ImmutableList) {