From dd7867990102680766cb67b9f3963e79f0eea928 Mon Sep 17 00:00:00 2001 From: Infi Date: Tue, 28 Feb 2023 00:03:11 +0100 Subject: [PATCH] feat: channel menu and mark as read --- .../chat/drawer/channel/ChannelList.kt | 127 ++++++ .../chat/drawer/server/DrawerChannel.kt | 12 +- .../revolt/screens/chat/ChatRouterScreen.kt | 106 +---- .../chat/sheets/ChannelContextSheet.kt | 86 ++++ .../chat/sheets/MessageContextSheet.kt | 431 +++++++++--------- .../main/res/drawable/ic_eye_check_24dp.xml | 9 + app/src/main/res/drawable/ic_eye_off_24dp.xml | 9 + app/src/main/res/values/strings.xml | 9 + 8 files changed, 493 insertions(+), 296 deletions(-) create mode 100644 app/src/main/java/chat/revolt/components/screens/chat/drawer/channel/ChannelList.kt create mode 100644 app/src/main/java/chat/revolt/screens/chat/sheets/ChannelContextSheet.kt create mode 100644 app/src/main/res/drawable/ic_eye_check_24dp.xml create mode 100644 app/src/main/res/drawable/ic_eye_off_24dp.xml 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