diff --git a/app/src/main/java/chat/revolt/api/routes/channel/Channel.kt b/app/src/main/java/chat/revolt/api/routes/channel/Channel.kt index 898456d5..a842e401 100644 --- a/app/src/main/java/chat/revolt/api/routes/channel/Channel.kt +++ b/app/src/main/java/chat/revolt/api/routes/channel/Channel.kt @@ -8,6 +8,7 @@ import chat.revolt.api.schemas.Channel import chat.revolt.api.schemas.Message import chat.revolt.api.schemas.MessagesInChannel import chat.revolt.api.schemas.User +import io.ktor.client.request.delete import io.ktor.client.request.get import io.ktor.client.request.parameter import io.ktor.client.request.patch @@ -133,6 +134,10 @@ suspend fun editMessage(channelId: String, messageId: String, newContent: String } } +suspend fun deleteMessage(channelId: String, messageId: String) { + RevoltHttp.delete("/channels/$channelId/messages/$messageId") +} + suspend fun ackChannel(channelId: String, messageId: String = ULID.makeNext()) { RevoltHttp.put("/channels/$channelId/ack/$messageId") } diff --git a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt b/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt index 055fec6f..ddac963d 100644 --- a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt +++ b/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt @@ -13,12 +13,15 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Edit +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button 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.TextButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable @@ -39,6 +42,10 @@ import androidx.compose.ui.unit.dp import chat.revolt.R import chat.revolt.api.REVOLT_APP import chat.revolt.api.RevoltAPI +import chat.revolt.api.internals.PermissionBit +import chat.revolt.api.internals.Roles +import chat.revolt.api.internals.has +import chat.revolt.api.routes.channel.deleteMessage import chat.revolt.api.routes.channel.react import chat.revolt.callbacks.UiCallbacks import chat.revolt.components.chat.Message @@ -71,6 +78,7 @@ fun MessageContextSheet( var showShareSheet by remember { mutableStateOf(false) } var showReactSheet by remember { mutableStateOf(false) } + var showDeleteMessageConfirmation by remember { mutableStateOf(false) } if (showShareSheet) { val shareSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) @@ -260,6 +268,52 @@ fun MessageContextSheet( } } + if (showDeleteMessageConfirmation) { + AlertDialog( + onDismissRequest = { + showDeleteMessageConfirmation = false + }, + title = { + Text( + text = stringResource(R.string.message_context_sheet_actions_delete_confirmation_title) + ) + }, + text = { + Text( + text = stringResource(R.string.message_context_sheet_actions_delete_confirmation_body) + ) + }, + confirmButton = { + Button( + onClick = { + coroutineScope.launch { + message.channel?.let { channelId -> + deleteMessage(channelId, messageId) + } + + onHideSheet() + } + showDeleteMessageConfirmation = false + coroutineScope.launch { + onHideSheet() + } + } + ) { + Text(stringResource(R.string.message_context_sheet_actions_delete_confirmation_yes)) + } + }, + dismissButton = { + TextButton( + onClick = { + showDeleteMessageConfirmation = false + } + ) { + Text(stringResource(R.string.message_context_sheet_actions_delete_confirmation_no)) + } + } + ) + } + Column( modifier = Modifier .padding(horizontal = 16.dp, vertical = 8.dp) @@ -388,30 +442,32 @@ fun MessageContextSheet( showShareSheet = true } - SheetClickable( - icon = { modifier -> - Icon( - imageVector = Icons.Default.Delete, - contentDescription = null, - modifier = modifier + if ( + (message.channel?.let { + val channel = RevoltAPI.channelCache[it] ?: return@let null + Roles.permissionFor( + channel, + RevoltAPI.userCache[RevoltAPI.selfId] ) - }, - label = { style -> - Text( - text = stringResource(id = R.string.message_context_sheet_actions_delete), - style = style - ) - }, - dangerous = true + } ?: 0) has PermissionBit.ManageMessages || message.author == RevoltAPI.selfId ) { - Toast.makeText( - context, - context.getString(R.string.comingsoon_toast), - Toast.LENGTH_SHORT - ).show() - - coroutineScope.launch { - onHideSheet() + SheetClickable( + icon = { modifier -> + Icon( + imageVector = Icons.Default.Delete, + contentDescription = null, + modifier = modifier + ) + }, + label = { style -> + Text( + text = stringResource(id = R.string.message_context_sheet_actions_delete), + style = style + ) + }, + dangerous = true + ) { + showDeleteMessageConfirmation = true } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7088bfab..5e7f12ad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -273,6 +273,11 @@ Report Mark as unread + Delete message? + It will be gone forever (a long time!) + Delete + Keep + Copy ID Copied channel ID to clipboard Mark as read