add an edit draft in the drawer

pull/749/head
greenart7c3 2024-01-24 08:22:35 -03:00
rodzic ba7c59fdd5
commit 99965ecd2d
2 zmienionych plików z 135 dodań i 8 usunięć

Wyświetl plik

@ -20,17 +20,20 @@
*/
package com.vitorpamplona.amethyst.ui.navigation
import android.util.Log
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
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
@ -38,6 +41,7 @@ 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
@ -49,9 +53,12 @@ import androidx.compose.material3.Divider
import androidx.compose.material3.DrawerState
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
@ -75,16 +82,22 @@ import androidx.compose.ui.res.stringResource
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.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.NewRelayListView
import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage
@ -155,7 +168,10 @@ fun DrawerContent(
)
ListContent(
modifier = Modifier.fillMaxWidth().weight(1f),
modifier =
Modifier
.fillMaxWidth()
.weight(1f),
drawerState,
openSheet,
accountViewModel,
@ -227,7 +243,8 @@ fun ProfileContentTemplate(
model = profilePicture,
contentDescription = stringResource(id = R.string.profile_image),
modifier =
Modifier.width(100.dp)
Modifier
.width(100.dp)
.height(100.dp)
.clip(shape = CircleShape)
.border(3.dp, MaterialTheme.colorScheme.background, CircleShape)
@ -240,7 +257,10 @@ fun ProfileContentTemplate(
CreateTextWithEmoji(
text = bestDisplayName,
tags = tags,
modifier = Modifier.padding(top = 7.dp).clickable(onClick = onClick),
modifier =
Modifier
.padding(top = 7.dp)
.clickable(onClick = onClick),
fontWeight = FontWeight.Bold,
fontSize = 18.sp,
maxLines = 1,
@ -450,8 +470,26 @@ fun ListContent(
val proxyPort = remember { mutableStateOf(accountViewModel.account.proxyPort.toString()) }
val context = LocalContext.current
var draftText by remember {
mutableStateOf<String?>(null)
}
var showDraft by remember { mutableStateOf(false) }
LaunchedEffect(drawerState.isOpen) {
if (drawerState.isOpen) {
launch(Dispatchers.IO) {
Log.d("draftText", "loading draft")
draftText = LocalPreferences.loadDraft(accountViewModel.account)
}
}
}
Column(
modifier = modifier.fillMaxHeight().verticalScroll(rememberScrollState()),
modifier =
modifier
.fillMaxHeight()
.verticalScroll(rememberScrollState()),
) {
NavigationRow(
title = stringResource(R.string.profile),
@ -523,6 +561,18 @@ 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,
@ -567,6 +617,17 @@ fun ListContent(
)
}
if (showDraft) {
EditDraftDialog(
{
draftText = null
showDraft = false
},
{ },
draftText!!,
)
}
if (disconnectTorDialog) {
AlertDialog(
title = { Text(text = stringResource(R.string.do_you_really_want_to_disable_tor_title)) },
@ -594,6 +655,61 @@ fun ListContent(
}
}
@Composable
fun EditDraftDialog(
onClose: () -> Unit,
onPost: () -> 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() })
}
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))
@ -658,7 +774,8 @@ fun IconRow(
) {
Row(
modifier =
Modifier.fillMaxWidth()
Modifier
.fillMaxWidth()
.combinedClickable(
onClick = onClick,
onLongClick = onLongClick,
@ -689,10 +806,16 @@ fun IconRowRelays(
onClick: () -> Unit,
) {
Row(
modifier = Modifier.fillMaxWidth().clickable { onClick() },
modifier =
Modifier
.fillMaxWidth()
.clickable { onClick() },
) {
Row(
modifier = Modifier.fillMaxWidth().padding(vertical = 15.dp, horizontal = 25.dp),
modifier =
Modifier
.fillMaxWidth()
.padding(vertical = 15.dp, horizontal = 25.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
@ -733,7 +856,10 @@ fun BottomContent(
thickness = DividerThickness,
)
Row(
modifier = Modifier.fillMaxWidth().padding(horizontal = 15.dp),
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 15.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Text(

Wyświetl plik

@ -701,4 +701,5 @@
<string name="server_did_not_provide_a_url_after_uploading">Server did not provide a URL after uploading</string>
<string name="could_not_download_from_the_server">Could not download uploaded media from the server</string>
<string name="could_not_prepare_local_file_to_upload">Could not prepare local file to upload: %1$s</string>
<string name="edit_draft">Edit draft</string>
</resources>