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