From df0393ffc9be0fed8f61c22e4b2fc11c0c3b9a33 Mon Sep 17 00:00:00 2001 From: Infi Date: Wed, 14 Jun 2023 17:20:24 +0200 Subject: [PATCH] feat: rework message context sheet Signed-off-by: Infi --- .../components/generic/SheetClickable.kt | 37 +- .../chat/views/channel/ChannelScreen.kt | 2 +- .../chat/revolt/sheets/MessageContextSheet.kt | 316 ++++++++++-------- 3 files changed, 205 insertions(+), 150 deletions(-) diff --git a/app/src/main/java/chat/revolt/components/generic/SheetClickable.kt b/app/src/main/java/chat/revolt/components/generic/SheetClickable.kt index 55edda06..4d9482f0 100644 --- a/app/src/main/java/chat/revolt/components/generic/SheetClickable.kt +++ b/app/src/main/java/chat/revolt/components/generic/SheetClickable.kt @@ -8,9 +8,11 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Person import androidx.compose.material3.Icon +import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -24,25 +26,28 @@ fun SheetClickable( icon: @Composable (Modifier) -> Unit, label: @Composable (TextStyle) -> Unit, modifier: Modifier = Modifier, + dangerous: Boolean = false, onClick: () -> Unit, ) { - Box(modifier = modifier.padding(vertical = 4.dp)) { - Row( - modifier = Modifier - .clip(MaterialTheme.shapes.medium) - .clickable(onClick = onClick) - .padding(all = 4.dp) - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 8.dp), - verticalAlignment = Alignment.CenterVertically - ) { - icon(Modifier.padding(end = 16.dp)) - label( - MaterialTheme.typography.bodyMedium.copy( - color = MaterialTheme.colorScheme.onBackground, - fontWeight = FontWeight.SemiBold, + CompositionLocalProvider(LocalContentColor provides if (dangerous) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.onBackground) { + Box(modifier = modifier.padding(vertical = 4.dp)) { + Row( + modifier = Modifier + .clip(MaterialTheme.shapes.medium) + .clickable(onClick = onClick) + .padding(all = 4.dp) + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + icon(Modifier.padding(end = 16.dp)) + label( + MaterialTheme.typography.bodyMedium.copy( + color = LocalContentColor.current, + fontWeight = FontWeight.SemiBold, + ) ) - ) + } } } } diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt index 50c7aded..038095d1 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt @@ -160,7 +160,7 @@ fun ChannelScreen( } if (messageContextSheetShown) { - val messageContextSheetState = rememberModalBottomSheetState() + val messageContextSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) ModalBottomSheet( sheetState = messageContextSheetState, diff --git a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt b/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt index 9b7e3d3d..2558cdc1 100644 --- a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt +++ b/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt @@ -14,12 +14,19 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Edit import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -37,6 +44,7 @@ import chat.revolt.components.chat.Message import chat.revolt.components.generic.SheetClickable import kotlinx.coroutines.launch +@OptIn(ExperimentalMaterial3Api::class) @Composable fun MessageContextSheet( messageId: String, @@ -59,6 +67,140 @@ fun MessageContextSheet( val clipboardManager = LocalClipboardManager.current val coroutineScope = rememberCoroutineScope() + var showShareSheet by remember { mutableStateOf(false) }; + + if (showShareSheet) { + val shareSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + + ModalBottomSheet( + sheetState = shareSheetState, + onDismissRequest = { + showShareSheet = false + }, + ) { + Column( + modifier = Modifier + .padding(horizontal = 16.dp, vertical = 8.dp) + .verticalScroll(rememberScrollState()), + ) { + SheetClickable( + icon = { modifier -> + Icon( + painter = painterResource(id = R.drawable.ic_content_copy_24dp), + contentDescription = null, + modifier = modifier + ) + }, + label = { style -> + Text( + text = stringResource(id = R.string.message_context_sheet_actions_copy), + style = style + ) + }, + ) { + if (message.content.isNullOrEmpty()) { + coroutineScope.launch { + onHideSheet() + Toast.makeText( + context, + context.getString(R.string.message_context_sheet_actions_copy_failed_empty), + Toast.LENGTH_SHORT + ).show() + } + return@SheetClickable + } + + Toast.makeText( + context, + context.getString(R.string.copied), + Toast.LENGTH_SHORT + ).show() + + coroutineScope.launch { + clipboardManager.setText(AnnotatedString(message.content)) + onHideSheet() + } + } + + SheetClickable( + icon = { modifier -> + Icon( + painter = painterResource(id = R.drawable.ic_link_variant_24dp), + contentDescription = null, + modifier = modifier + ) + }, + label = { style -> + Text( + text = stringResource(id = R.string.message_context_sheet_actions_copy_link), + style = style + ) + }, + ) { + if (message.content.isNullOrEmpty()) { + Toast.makeText( + context, + context.getString(R.string.message_context_sheet_actions_copy_failed_empty), + Toast.LENGTH_SHORT + ).show() + + coroutineScope.launch { + onHideSheet() + } + + return@SheetClickable + } + + val server = RevoltAPI.serverCache.values.find { server -> + server.channels?.contains(message.channel) ?: false + } + val messageLink = + "$REVOLT_APP/server/${server?.id}/channel/${message.channel}/${message.id}" + + clipboardManager.setText(AnnotatedString(messageLink)) + Toast.makeText( + context, + context.getString(R.string.message_context_sheet_actions_copy_link_copied), + Toast.LENGTH_SHORT + ).show() + + coroutineScope.launch { + onHideSheet() + } + } + + SheetClickable( + icon = { modifier -> + Icon( + painter = painterResource(id = R.drawable.ic_content_copy_id_24dp), + contentDescription = null, + modifier = modifier + ) + }, + label = { style -> + Text( + text = stringResource(id = R.string.message_context_sheet_actions_copy_id), + style = style + ) + }, + ) { + if (message.id == null) return@SheetClickable + + clipboardManager.setText(AnnotatedString(message.id)) + Toast.makeText( + context, + context.getString(R.string.message_context_sheet_actions_copy_id_copied), + Toast.LENGTH_SHORT + ).show() + + coroutineScope.launch { + onHideSheet() + } + } + } + } + } + Column( modifier = Modifier .padding(horizontal = 16.dp, vertical = 8.dp) @@ -128,122 +270,29 @@ fun MessageContextSheet( } } - SheetClickable( - icon = { modifier -> - Icon( - painter = painterResource(id = R.drawable.ic_content_copy_24dp), - contentDescription = null, - modifier = modifier - ) - }, - label = { style -> - Text( - text = stringResource(id = R.string.message_context_sheet_actions_copy), - style = style - ) - }, - ) { - if (message.content.isNullOrEmpty()) { - coroutineScope.launch { - onHideSheet() - Toast.makeText( - context, - context.getString(R.string.message_context_sheet_actions_copy_failed_empty), - Toast.LENGTH_SHORT - ).show() - } - return@SheetClickable - } - - Toast.makeText( - context, - context.getString(R.string.copied), - Toast.LENGTH_SHORT - ).show() - - coroutineScope.launch { - clipboardManager.setText(AnnotatedString(message.content)) - onHideSheet() - } - } - - SheetClickable( - icon = { modifier -> - Icon( - painter = painterResource(id = R.drawable.ic_link_variant_24dp), - contentDescription = null, - modifier = modifier - ) - }, - label = { style -> - Text( - text = stringResource(id = R.string.message_context_sheet_actions_copy_link), - style = style - ) - }, - ) { - if (message.content.isNullOrEmpty()) { - Toast.makeText( - context, - context.getString(R.string.message_context_sheet_actions_copy_failed_empty), - Toast.LENGTH_SHORT - ).show() - + if (message.author == RevoltAPI.selfId) { + SheetClickable( + icon = { modifier -> + Icon( + imageVector = Icons.Default.Edit, + contentDescription = null, + modifier = modifier + ) + }, + label = { style -> + Text( + text = stringResource(id = R.string.message_context_sheet_actions_edit), + style = style + ) + }, + ) { coroutineScope.launch { + UiCallbacks.editMessage(messageId) onHideSheet() } - - return@SheetClickable - } - - val server = RevoltAPI.serverCache.values.find { server -> - server.channels?.contains(message.channel) ?: false - } - val messageLink = - "$REVOLT_APP/server/${server?.id}/channel/${message.channel}/${message.id}" - - clipboardManager.setText(AnnotatedString(messageLink)) - Toast.makeText( - context, - context.getString(R.string.message_context_sheet_actions_copy_link_copied), - Toast.LENGTH_SHORT - ).show() - - coroutineScope.launch { - onHideSheet() } } - SheetClickable( - icon = { modifier -> - Icon( - painter = painterResource(id = R.drawable.ic_content_copy_id_24dp), - contentDescription = null, - modifier = modifier - ) - }, - label = { style -> - Text( - text = stringResource(id = R.string.message_context_sheet_actions_copy_id), - style = style - ) - }, - ) { - if (message.id == null) return@SheetClickable - - clipboardManager.setText(AnnotatedString(message.id)) - Toast.makeText( - context, - context.getString(R.string.message_context_sheet_actions_copy_id_copied), - Toast.LENGTH_SHORT - ).show() - - coroutineScope.launch { - onHideSheet() - } - } - - SheetClickable( icon = { modifier -> Icon( @@ -273,22 +322,19 @@ fun MessageContextSheet( SheetClickable( icon = { modifier -> Icon( - imageVector = Icons.Default.Edit, + painter = painterResource(id = R.drawable.ic_share_24dp), contentDescription = null, modifier = modifier ) }, label = { style -> Text( - text = stringResource(id = R.string.message_context_sheet_actions_edit), + text = stringResource(id = R.string.share), style = style ) }, ) { - coroutineScope.launch { - UiCallbacks.editMessage(messageId) - onHideSheet() - } + showShareSheet = true } SheetClickable( @@ -305,6 +351,7 @@ fun MessageContextSheet( style = style ) }, + dangerous = true ) { Toast.makeText( context, @@ -317,23 +364,26 @@ fun MessageContextSheet( } } - SheetClickable( - icon = { modifier -> - Icon( - painter = painterResource(id = R.drawable.ic_flag_24dp), - contentDescription = null, - modifier = modifier - ) - }, - label = { style -> - Text( - text = stringResource(id = R.string.message_context_sheet_actions_report), - style = style - ) - }, - ) { - coroutineScope.launch { - onReportMessage() + if (message.author != RevoltAPI.selfId) { + SheetClickable( + icon = { modifier -> + Icon( + painter = painterResource(id = R.drawable.ic_flag_24dp), + contentDescription = null, + modifier = modifier + ) + }, + label = { style -> + Text( + text = stringResource(id = R.string.message_context_sheet_actions_report), + style = style + ) + }, + dangerous = true + ) { + coroutineScope.launch { + onReportMessage() + } } } }