feat: delete messages

Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
Infi 2024-01-01 20:21:45 +01:00
parent d8953a4eb6
commit 46b75c3ed3
3 changed files with 88 additions and 22 deletions

View File

@ -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")
}

View File

@ -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
}
}

View File

@ -273,6 +273,11 @@
<string name="message_context_sheet_actions_report">Report</string>
<string name="message_context_sheet_actions_mark_unread">Mark as unread</string>
<string name="message_context_sheet_actions_delete_confirmation_title">Delete message?</string>
<string name="message_context_sheet_actions_delete_confirmation_body">It will be gone forever (a long time!)</string>
<string name="message_context_sheet_actions_delete_confirmation_yes">Delete</string>
<string name="message_context_sheet_actions_delete_confirmation_no">Keep</string>
<string name="channel_context_sheet_actions_copy_id">Copy ID</string>
<string name="channel_context_sheet_actions_copy_id_copied">Copied channel ID to clipboard</string>
<string name="channel_context_sheet_actions_mark_read">Mark as read</string>