diff --git a/app/src/main/java/chat/revolt/components/screens/chat/drawer/channel/ChannelList.kt b/app/src/main/java/chat/revolt/components/screens/chat/drawer/channel/ChannelList.kt
new file mode 100644
index 00000000..7f071cd8
--- /dev/null
+++ b/app/src/main/java/chat/revolt/components/screens/chat/drawer/channel/ChannelList.kt
@@ -0,0 +1,127 @@
+package chat.revolt.components.screens.chat.drawer.channel
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.navigation.NavController
+import androidx.navigation.compose.currentBackStackEntryAsState
+import chat.revolt.R
+import chat.revolt.api.RevoltAPI
+import chat.revolt.api.schemas.ChannelType
+import chat.revolt.components.screens.chat.DoubleDrawerState
+import chat.revolt.components.screens.chat.drawer.server.DrawerChannel
+import kotlinx.coroutines.launch
+
+@Composable
+fun RowScope.ChannelList(
+ serverId: String,
+ navController: NavController,
+ drawerState: DoubleDrawerState
+) {
+ val coroutineScope = rememberCoroutineScope()
+ val navBackStackEntry by navController.currentBackStackEntryAsState()
+
+ Surface(
+ tonalElevation = 1.dp,
+ modifier = Modifier
+ .padding(start = 4.dp, top = 8.dp, bottom = 8.dp)
+ .clip(RoundedCornerShape(16.dp))
+ ) {
+ Column(
+ Modifier
+ .weight(1f)
+ ) {
+ if (serverId == "home") {
+ Column(
+ Modifier
+ .weight(1f)
+ .verticalScroll(rememberScrollState())
+ ) {
+ RevoltAPI.channelCache.values.filter { it.channelType == ChannelType.Group }
+ .forEach { channel ->
+ DrawerChannel(
+ name = channel.name
+ ?: "GDM #${channel.id}",
+ channelType = ChannelType.Group,
+ selected = (channel.id == navBackStackEntry?.arguments?.getString(
+ "channelId"
+ )),
+ hasUnread = channel.lastMessageID?.let { lastMessageID ->
+ RevoltAPI.unreads.hasUnread(
+ channel.id!!,
+ lastMessageID
+ )
+ } ?: false,
+ onClick = {
+ navController.navigate("channel/${channel.id}")
+ coroutineScope.launch { drawerState.focusCenter() }
+ },
+ onLongClick = {
+ navController.navigate("channel/${channel.id}/info")
+ }
+ )
+ }
+ }
+ } else {
+ val server = RevoltAPI.serverCache[serverId]
+
+ Text(
+ text = server?.name
+ ?: stringResource(R.string.unknown),
+ style = MaterialTheme.typography.labelLarge,
+ fontSize = 24.sp,
+ modifier = Modifier.padding(16.dp)
+ )
+
+ Column(
+ Modifier
+ .weight(1f)
+ .verticalScroll(rememberScrollState())
+ ) {
+ server?.channels?.forEach { channelId ->
+ RevoltAPI.channelCache[channelId]?.let { ch ->
+ DrawerChannel(
+ name = ch.name!!,
+ channelType = ch.channelType!!,
+ selected = navBackStackEntry?.arguments?.getString(
+ "channelId"
+ ) == ch.id,
+ hasUnread = ch.lastMessageID?.let { lastMessageID ->
+ RevoltAPI.unreads.hasUnread(
+ ch.id!!,
+ lastMessageID
+ )
+ } ?: true,
+ onClick = {
+ coroutineScope.launch { drawerState.focusCenter() }
+ navController.navigate("channel/${ch.id}") {
+ popUpTo("home") {
+ inclusive = true
+ }
+ }
+ },
+ onLongClick = {
+ navController.navigate("channel/${ch.id}/menu")
+ }
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/chat/revolt/components/screens/chat/drawer/server/DrawerChannel.kt b/app/src/main/java/chat/revolt/components/screens/chat/drawer/server/DrawerChannel.kt
index ccd08e14..05af671e 100644
--- a/app/src/main/java/chat/revolt/components/screens/chat/drawer/server/DrawerChannel.kt
+++ b/app/src/main/java/chat/revolt/components/screens/chat/drawer/server/DrawerChannel.kt
@@ -3,8 +3,9 @@ package chat.revolt.components.screens.chat.drawer.server
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.spring
+import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
+import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.LocalContentColor
@@ -22,13 +23,15 @@ import androidx.compose.ui.unit.dp
import chat.revolt.api.schemas.ChannelType
import chat.revolt.components.screens.chat.ChannelIcon
+@OptIn(ExperimentalFoundationApi::class)
@Composable
fun DrawerChannel(
channelType: ChannelType,
name: String,
selected: Boolean,
hasUnread: Boolean,
- onClick: () -> Unit
+ onClick: () -> Unit,
+ onLongClick: () -> Unit = {},
) {
val backgroundColor = animateColorAsState(
if (selected) MaterialTheme.colorScheme.background
@@ -52,7 +55,10 @@ fun DrawerChannel(
.clip(MaterialTheme.shapes.medium)
.background(backgroundColor.value)
.alpha(channelAlpha.value)
- .clickable(onClick = onClick)
+ .combinedClickable(
+ onClick = onClick,
+ onLongClick = onLongClick
+ )
.padding(vertical = 8.dp, horizontal = 16.dp),
verticalAlignment = Alignment.CenterVertically
) {
diff --git a/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt b/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt
index 8dae598f..1e8f7b2b 100644
--- a/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt
+++ b/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt
@@ -12,12 +12,10 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
@@ -30,17 +28,17 @@ import chat.revolt.R
import chat.revolt.api.RevoltAPI
import chat.revolt.api.realtime.DisconnectionState
import chat.revolt.api.realtime.RealtimeSocket
-import chat.revolt.api.schemas.ChannelType
import chat.revolt.components.chat.DisconnectedNotice
import chat.revolt.components.generic.UserAvatar
import chat.revolt.components.generic.presenceFromStatus
import chat.revolt.components.screens.chat.DoubleDrawer
-import chat.revolt.components.screens.chat.drawer.server.DrawerChannel
+import chat.revolt.components.screens.chat.drawer.channel.ChannelList
import chat.revolt.components.screens.chat.drawer.server.DrawerServer
import chat.revolt.components.screens.chat.drawer.server.DrawerServerlikeIcon
import chat.revolt.components.screens.chat.drawer.server.ServerDrawerSeparator
import chat.revolt.components.screens.chat.rememberDoubleDrawerState
import chat.revolt.screens.chat.dialogs.safety.ReportMessageDialog
+import chat.revolt.screens.chat.sheets.ChannelContextSheet
import chat.revolt.screens.chat.sheets.ChannelInfoSheet
import chat.revolt.screens.chat.sheets.MessageContextSheet
import chat.revolt.screens.chat.sheets.StatusSheet
@@ -91,7 +89,6 @@ fun ChatRouterScreen(topNav: NavController, viewModel: ChatRouterViewModel = vie
val bottomSheetNavigator = rememberBottomSheetNavigator()
val navController = rememberNavController(bottomSheetNavigator)
- val navBackStackEntry by navController.currentBackStackEntryAsState()
ModalBottomSheetLayout(
sheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
@@ -176,91 +173,11 @@ fun ChatRouterScreen(topNav: NavController, viewModel: ChatRouterViewModel = vie
}
Crossfade(targetState = viewModel.currentServer) {
- Surface(
- tonalElevation = 1.dp,
- modifier = Modifier
- .padding(start = 4.dp, top = 8.dp, bottom = 8.dp)
- .clip(RoundedCornerShape(16.dp))
- ) {
- Column(
- Modifier
- .weight(1f)
- ) {
- if (it == "home") {
- Column(
- Modifier
- .weight(1f)
- .verticalScroll(rememberScrollState())
- ) {
- RevoltAPI.channelCache.values.filter { it.channelType == ChannelType.Group }
- .forEach { channel ->
- DrawerChannel(
- name = channel.name
- ?: "GDM #${channel.id}",
- channelType = ChannelType.Group,
- selected = channel.id == (navBackStackEntry?.arguments?.getString(
- "channelId"
- ) ?: false),
- hasUnread = channel.lastMessageID?.let { lastMessageID ->
- RevoltAPI.unreads.hasUnread(
- channel.id!!,
- lastMessageID
- )
- } ?: false,
- onClick = {
- navController.navigate("channel/${channel.id}")
- scope.launch {
- drawerState.focusCenter()
- }
- }
- )
- }
- }
- } else {
- val server = RevoltAPI.serverCache[it]
-
- Text(
- text = server?.name
- ?: stringResource(R.string.unknown),
- style = MaterialTheme.typography.labelLarge,
- fontSize = 24.sp,
- modifier = Modifier.padding(16.dp)
- )
-
- Column(
- Modifier
- .weight(1f)
- .verticalScroll(rememberScrollState())
- ) {
- server?.channels?.forEach { channelId ->
- RevoltAPI.channelCache[channelId]?.let { ch ->
- DrawerChannel(
- name = ch.name!!,
- channelType = ch.channelType!!,
- selected = navBackStackEntry?.arguments?.getString(
- "channelId"
- ) == ch.id,
- hasUnread = ch.lastMessageID?.let { lastMessageID ->
- RevoltAPI.unreads.hasUnread(
- ch.id!!,
- lastMessageID
- )
- } ?: true,
- onClick = {
- scope.launch { drawerState.focusCenter() }
- navController.navigate("channel/${ch.id}") {
- popUpTo("home") {
- inclusive = true
- }
- }
- }
- )
- }
- }
- }
- }
- }
- }
+ ChannelList(
+ serverId = it,
+ navController = navController,
+ drawerState = drawerState
+ )
}
}
}
@@ -300,6 +217,15 @@ fun ChatRouterScreen(topNav: NavController, viewModel: ChatRouterViewModel = vie
)
}
}
+ bottomSheet("channel/{channelId}/menu") { backStackEntry ->
+ val channelId = backStackEntry.arguments?.getString("channelId")
+ if (channelId != null) {
+ ChannelContextSheet(
+ navController = navController,
+ channelId = channelId
+ )
+ }
+ }
bottomSheet("message/{messageId}/menu") { backStackEntry ->
val messageId = backStackEntry.arguments?.getString("messageId")
if (messageId != null) {
diff --git a/app/src/main/java/chat/revolt/screens/chat/sheets/ChannelContextSheet.kt b/app/src/main/java/chat/revolt/screens/chat/sheets/ChannelContextSheet.kt
new file mode 100644
index 00000000..1633e566
--- /dev/null
+++ b/app/src/main/java/chat/revolt/screens/chat/sheets/ChannelContextSheet.kt
@@ -0,0 +1,86 @@
+package chat.revolt.screens.chat.sheets
+
+import android.widget.Toast
+import androidx.compose.foundation.layout.Column
+import androidx.compose.material3.Icon
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.platform.LocalClipboardManager
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.AnnotatedString
+import androidx.navigation.NavController
+import chat.revolt.R
+import chat.revolt.api.RevoltAPI
+import chat.revolt.components.generic.SheetClickable
+import kotlinx.coroutines.launch
+
+@Composable
+fun ChannelContextSheet(
+ navController: NavController,
+ channelId: String,
+) {
+ val channel = RevoltAPI.channelCache[channelId]
+ if (channel == null) {
+ navController.popBackStack()
+ return
+ }
+
+ val clipboardManager = LocalClipboardManager.current
+ val context = LocalContext.current
+
+ val coroutineScope = rememberCoroutineScope()
+
+ Column {
+ 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.channel_context_sheet_actions_copy_id),
+ style = style
+ )
+ },
+ ) {
+ if (channel.id == null) return@SheetClickable
+
+ clipboardManager.setText(AnnotatedString(channel.id))
+ Toast.makeText(
+ context,
+ context.getString(R.string.channel_context_sheet_actions_copy_id_copied),
+ Toast.LENGTH_SHORT
+ ).show()
+ navController.popBackStack()
+ }
+
+ SheetClickable(
+ icon = { modifier ->
+ Icon(
+ painter = painterResource(id = R.drawable.ic_eye_check_24dp),
+ contentDescription = null,
+ modifier = modifier
+ )
+ },
+ label = { style ->
+ Text(
+ text = stringResource(id = R.string.channel_context_sheet_actions_mark_read),
+ style = style
+ )
+ },
+ ) {
+ coroutineScope.launch {
+ channel.lastMessageID?.let {
+ RevoltAPI.unreads.markAsRead(channelId, it, sync = true)
+ }
+ }
+ navController.popBackStack()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/chat/revolt/screens/chat/sheets/MessageContextSheet.kt b/app/src/main/java/chat/revolt/screens/chat/sheets/MessageContextSheet.kt
index b2f673f0..701ce144 100644
--- a/app/src/main/java/chat/revolt/screens/chat/sheets/MessageContextSheet.kt
+++ b/app/src/main/java/chat/revolt/screens/chat/sheets/MessageContextSheet.kt
@@ -8,7 +8,10 @@ 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.*
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@@ -40,234 +43,256 @@ fun MessageContextSheet(
val context = LocalContext.current
val clipboardManager = LocalClipboardManager.current
- Surface {
- Column(
+ Column(
+ modifier = Modifier
+ .padding(horizontal = 16.dp, vertical = 8.dp)
+ .verticalScroll(rememberScrollState()),
+ ) {
+ Box(
modifier = Modifier
- .padding(horizontal = 16.dp, vertical = 8.dp)
- .verticalScroll(rememberScrollState()),
+ .clip(MaterialTheme.shapes.medium)
+ .background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp))
+ .padding(bottom = 8.dp)
) {
- Box(
- modifier = Modifier
- .clip(MaterialTheme.shapes.medium)
- .background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp))
- .padding(bottom = 8.dp)
- ) {
- Message(
- message = message.copy(
- tail = false,
- masquerade = null
- ),
- truncate = true
+ Message(
+ message = message.copy(
+ tail = false,
+ masquerade = null
+ ),
+ truncate = true
+ )
+ }
+
+ Spacer(modifier = Modifier.height(8.dp))
+
+ SheetClickable(
+ icon = { modifier ->
+ Icon(
+ painter = painterResource(id = R.drawable.ic_reply_24dp),
+ contentDescription = null,
+ modifier = modifier
)
- }
+ },
+ label = { style ->
+ Text(
+ text = stringResource(id = R.string.message_context_sheet_actions_reply),
+ style = style
+ )
+ },
+ ) {
+ UiCallbacks.emitQueueMessageForReply(messageId)
+ navController.popBackStack()
+ }
- Spacer(modifier = Modifier.height(8.dp))
+ SheetClickable(
+ icon = { modifier ->
+ Icon(
+ painter = painterResource(id = R.drawable.ic_hamburger_plus_24dp),
+ contentDescription = null,
+ modifier = modifier
+ )
+ },
+ label = { style ->
+ Text(
+ text = stringResource(id = R.string.message_context_sheet_actions_react),
+ style = style
+ )
+ },
+ ) {
+ Toast.makeText(
+ context,
+ context.getString(R.string.comingsoon_toast),
+ Toast.LENGTH_SHORT
+ ).show()
+ navController.popBackStack()
+ }
- SheetClickable(
- icon = { modifier ->
- Icon(
- painter = painterResource(id = R.drawable.ic_reply_24dp),
- contentDescription = null,
- modifier = modifier
- )
- },
- label = { style ->
- Text(
- text = stringResource(id = R.string.message_context_sheet_actions_reply),
- style = style
- )
- },
- ) {
- UiCallbacks.emitQueueMessageForReply(messageId)
- navController.popBackStack()
- }
-
- SheetClickable(
- icon = { modifier ->
- Icon(
- painter = painterResource(id = R.drawable.ic_hamburger_plus_24dp),
- contentDescription = null,
- modifier = modifier
- )
- },
- label = { style ->
- Text(
- text = stringResource(id = R.string.message_context_sheet_actions_react),
- style = style
- )
- },
- ) {
+ 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 == null || message.content.isEmpty()) {
Toast.makeText(
context,
- context.getString(R.string.comingsoon_toast),
+ context.getString(R.string.message_context_sheet_actions_copy_failed_empty),
Toast.LENGTH_SHORT
).show()
navController.popBackStack()
+ return@SheetClickable
}
- 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 == null || message.content.isEmpty()) {
- Toast.makeText(
- context,
- context.getString(R.string.message_context_sheet_actions_copy_failed_empty),
- Toast.LENGTH_SHORT
- ).show()
- navController.popBackStack()
- return@SheetClickable
- }
+ clipboardManager.setText(AnnotatedString(message.content))
+ Toast.makeText(
+ context,
+ context.getString(R.string.copied),
+ Toast.LENGTH_SHORT
+ ).show()
+ navController.popBackStack()
+ }
- clipboardManager.setText(AnnotatedString(message.content))
+ 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 == null || message.content.isEmpty()) {
Toast.makeText(
context,
- context.getString(R.string.copied),
+ context.getString(R.string.message_context_sheet_actions_copy_failed_empty),
Toast.LENGTH_SHORT
).show()
navController.popBackStack()
+ return@SheetClickable
}
- 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 == null || message.content.isEmpty()) {
- Toast.makeText(
- context,
- context.getString(R.string.message_context_sheet_actions_copy_failed_empty),
- Toast.LENGTH_SHORT
- ).show()
- navController.popBackStack()
- 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()
- navController.popBackStack()
+ 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}"
- 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(messageLink))
+ Toast.makeText(
+ context,
+ context.getString(R.string.message_context_sheet_actions_copy_link_copied),
+ Toast.LENGTH_SHORT
+ ).show()
+ navController.popBackStack()
+ }
- clipboardManager.setText(AnnotatedString(message.id))
- Toast.makeText(
- context,
- context.getString(R.string.message_context_sheet_actions_copy_id_copied),
- Toast.LENGTH_SHORT
- ).show()
- navController.popBackStack()
- }
+ 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
- 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
- )
- },
- ) {
- Toast.makeText(
- context,
- context.getString(R.string.comingsoon_toast),
- Toast.LENGTH_SHORT
- ).show()
- navController.popBackStack()
- }
+ clipboardManager.setText(AnnotatedString(message.id))
+ Toast.makeText(
+ context,
+ context.getString(R.string.message_context_sheet_actions_copy_id_copied),
+ Toast.LENGTH_SHORT
+ ).show()
+ navController.popBackStack()
+ }
- 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
- )
- },
- ) {
- Toast.makeText(
- context,
- context.getString(R.string.comingsoon_toast),
- Toast.LENGTH_SHORT
- ).show()
- navController.popBackStack()
- }
- 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
- )
- },
- ) {
- navController.navigate("report/message/${message.id}")
- }
+ SheetClickable(
+ icon = { modifier ->
+ Icon(
+ painter = painterResource(id = R.drawable.ic_eye_off_24dp),
+ contentDescription = null,
+ modifier = modifier
+ )
+ },
+ label = { style ->
+ Text(
+ text = stringResource(id = R.string.message_context_sheet_actions_mark_unread),
+ style = style
+ )
+ },
+ ) {
+ Toast.makeText(
+ context,
+ context.getString(R.string.comingsoon_toast),
+ Toast.LENGTH_SHORT
+ ).show()
+ navController.popBackStack()
+ }
+
+ 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
+ )
+ },
+ ) {
+ Toast.makeText(
+ context,
+ context.getString(R.string.comingsoon_toast),
+ Toast.LENGTH_SHORT
+ ).show()
+ navController.popBackStack()
+ }
+
+ 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
+ )
+ },
+ ) {
+ Toast.makeText(
+ context,
+ context.getString(R.string.comingsoon_toast),
+ Toast.LENGTH_SHORT
+ ).show()
+ navController.popBackStack()
+ }
+
+ 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
+ )
+ },
+ ) {
+ navController.navigate("report/message/${message.id}")
}
}
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_eye_check_24dp.xml b/app/src/main/res/drawable/ic_eye_check_24dp.xml
new file mode 100644
index 00000000..dac37144
--- /dev/null
+++ b/app/src/main/res/drawable/ic_eye_check_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_eye_off_24dp.xml b/app/src/main/res/drawable/ic_eye_off_24dp.xml
new file mode 100644
index 00000000..0a03e67f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_eye_off_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index aa1a2bca..693455ac 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -140,6 +140,15 @@
Copied message link to clipboard
React
Report
+ Mark as unread
+
+ Copy ID
+ Copied channel ID to clipboard
+ Mark as read
+
+ Copy ID
+ Copied server ID to clipboard
+ Mark as read
Report
Cancel