From 0399a10f7d0724d4d08f53438509d9b1a81007dd Mon Sep 17 00:00:00 2001 From: Gian <47775302+gpunto@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:38:43 +0100 Subject: [PATCH] Remove custom message actions from the Compose sample --- .../MessageRemindersComponentFactory.kt | 254 --------------- .../DeleteMessageForMeComponentFactory.kt | 152 --------- .../component/MessageInfoComponentFactory.kt | 295 ------------------ .../ui/location/LocationComponentFactory.kt | 38 +-- .../main/res/drawable/ic_bell_filled_24.xml | 21 -- .../res/drawable/ic_bookmark_filled_24.xml | 21 -- .../src/main/res/values/strings.xml | 10 - 7 files changed, 17 insertions(+), 774 deletions(-) delete mode 100644 stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/reminders/MessageRemindersComponentFactory.kt delete mode 100644 stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/DeleteMessageForMeComponentFactory.kt delete mode 100644 stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/MessageInfoComponentFactory.kt delete mode 100644 stream-chat-android-compose-sample/src/main/res/drawable/ic_bell_filled_24.xml delete mode 100644 stream-chat-android-compose-sample/src/main/res/drawable/ic_bookmark_filled_24.xml diff --git a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/reminders/MessageRemindersComponentFactory.kt b/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/reminders/MessageRemindersComponentFactory.kt deleted file mode 100644 index 32e905acd72..00000000000 --- a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/reminders/MessageRemindersComponentFactory.kt +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.chat.android.compose.sample.feature.reminders - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import io.getstream.chat.android.client.ChatClient -import io.getstream.chat.android.client.utils.message.isDeleted -import io.getstream.chat.android.compose.sample.R -import io.getstream.chat.android.compose.sample.ui.component.DeleteMessageForMeComponentFactory -import io.getstream.chat.android.compose.state.messageoptions.MessageOptionItemState -import io.getstream.chat.android.compose.ui.theme.ChatComponentFactory -import io.getstream.chat.android.models.Message -import io.getstream.chat.android.models.ReactionSorting -import io.getstream.chat.android.models.User -import io.getstream.chat.android.ui.common.state.messages.CustomAction -import io.getstream.chat.android.ui.common.state.messages.MessageAction -import io.getstream.chat.android.ui.common.state.messages.list.MessageItemState -import java.util.Date - -/** - * Factory for creating components related to message reminders. - */ -class MessageRemindersComponentFactory( - private val delegate: ChatComponentFactory = DeleteMessageForMeComponentFactory(), -) : ChatComponentFactory by delegate { - - /** - * Creates a header for the message item, enhancing it with reminder information (if available). - */ - @Composable - override fun ColumnScope.MessageTop( - messageItem: MessageItemState, - reactionSorting: ReactionSorting, - onReactionsClick: (Message) -> Unit, - ) { - with(delegate) { - val message = messageItem.message - val reminder = message.reminder - if (!message.isDeleted() && reminder != null) { - // Add reminder info to the header (if message is not deleted and has a reminder) - val isMine = message.user.id == ChatClient.instance().getCurrentUser()?.id - val alignment = if (isMine) Alignment.End else Alignment.Start - Column(horizontalAlignment = alignment) { - // Display the reminder status label - MessageReminderStatusLabel(reminder.remindAt) - // Call the default header content - MessageTop(messageItem, reactionSorting, onReactionsClick) - } - } else { - MessageTop(messageItem, reactionSorting, onReactionsClick) - } - } - } - - /** - * Creates a message menu with options for setting reminders and saving messages for later. - * - * @param modifier Modifier to be applied to the message menu. - * @param message The message for which the menu is created. - * @param messageOptions List of available message options. - * @param ownCapabilities Set of capabilities of the current user. - * @param onMessageAction Callback invoked when a message action is selected. - * @param onShowMore Callback invoked when the "show more" option is selected. - * @param onDismiss Callback invoked when the menu is dismissed. - */ - @Suppress("LongMethod") - @Composable - override fun MessageMenu( - modifier: Modifier, - message: Message, - messageOptions: List, - ownCapabilities: Set, - onMessageAction: (MessageAction) -> Unit, - onShowMore: () -> Unit, - onDismiss: () -> Unit, - currentUser: User?, - ) { - val remindMeOption = remindMeOption(message) - val saveForLaterOption = saveForLaterOption(message) - var showCreateReminderDialog by remember { mutableStateOf(false) } - var showUpdateReminderDialog by remember { mutableStateOf(false) } - val extendedAction: (MessageAction) -> Unit = { action -> - when (action) { - is CustomAction -> { - when (action.extraProperties[ACTION_TYPE]) { - ACTION_TYPE_ADD_REMINDER -> { - showCreateReminderDialog = true - } - - ACTION_TYPE_UPDATE_REMINDER -> { - showUpdateReminderDialog = true - } - - ACTION_TYPE_SAVE_FOR_LATER -> { - saveForLater(message.id) - onDismiss() - } - - ACTION_TYPE_REMOVE_REMINDER -> { - removeReminder(message.id) - onDismiss() - } - } - } - - else -> onMessageAction(action) - } - } - - if (showCreateReminderDialog) { - CreateReminderDialog( - onDismiss = { showCreateReminderDialog = false }, - onRemindAtSelected = { remindAt -> - addReminder(message.id, remindAt) - showCreateReminderDialog = false - onDismiss() - }, - ) - } - - if (showUpdateReminderDialog) { - EditReminderDialog( - remindAt = message.reminder?.remindAt, - onRemindAtSelected = { remindAt -> - updateReminder(message.id, remindAt) - showUpdateReminderDialog = false - onDismiss() - }, - onDismiss = { showUpdateReminderDialog = false }, - ) - } - - // Allow setting reminders only if the message is not a thread reply - val allOptions = if (message.parentId == null) { - messageOptions + remindMeOption + saveForLaterOption - } else { - messageOptions - } - - delegate.MessageMenu( - modifier = modifier, - message = message, - messageOptions = allOptions, - ownCapabilities = ownCapabilities, - onMessageAction = extendedAction, - onShowMore = onShowMore, - onDismiss = onDismiss, - currentUser = currentUser, - ) - } - - @Composable - private fun remindMeOption(message: Message): MessageOptionItemState { - val hasReminder = message.reminder != null - val title = if (hasReminder) { - R.string.message_menu_update_reminder - } else { - R.string.message_menu_add_reminder - } - val icon = if (hasReminder) { - R.drawable.ic_bell_filled_24 - } else { - R.drawable.ic_bell_24 - } - val actionType = if (hasReminder) { - ACTION_TYPE_UPDATE_REMINDER - } else { - ACTION_TYPE_ADD_REMINDER - } - return MessageOptionItemState( - title = title, - iconPainter = painterResource(icon), - destructive = false, - action = CustomAction(message, mapOf(ACTION_TYPE to actionType)), - ) - } - - @Composable - private fun saveForLaterOption(message: Message): MessageOptionItemState { - val hasReminder = message.reminder != null - val title = if (hasReminder) { - R.string.message_menu_remove_reminder - } else { - R.string.message_menu_save_for_later - } - val icon = if (hasReminder) { - R.drawable.ic_bookmark_filled_24 - } else { - R.drawable.ic_bookmark_24 - } - val actionType = if (hasReminder) { - ACTION_TYPE_REMOVE_REMINDER - } else { - ACTION_TYPE_SAVE_FOR_LATER - } - return MessageOptionItemState( - title = title, - iconPainter = painterResource(icon), - destructive = false, - action = CustomAction(message, mapOf(ACTION_TYPE to actionType)), - ) - } - - private fun addReminder(messageId: String, remindAt: Date) { - val client = ChatClient.instance() - client.createReminder(messageId, remindAt).enqueue() - } - - private fun updateReminder(messageId: String, remindAt: Date?) { - val client = ChatClient.instance() - client.updateReminder(messageId, remindAt).enqueue() - } - - private fun saveForLater(messageId: String) { - val client = ChatClient.instance() - client.createReminder(messageId, remindAt = null).enqueue() - } - - private fun removeReminder(messageId: String) { - val client = ChatClient.instance() - client.deleteReminder(messageId).enqueue() - } - - companion object { - private const val ACTION_TYPE = "type" - private const val ACTION_TYPE_ADD_REMINDER = "add_reminder" - private const val ACTION_TYPE_UPDATE_REMINDER = "update_reminder" - private const val ACTION_TYPE_SAVE_FOR_LATER = "save_for_later" - private const val ACTION_TYPE_REMOVE_REMINDER = "remove_reminder" - } -} diff --git a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/DeleteMessageForMeComponentFactory.kt b/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/DeleteMessageForMeComponentFactory.kt deleted file mode 100644 index b4e081e43ac..00000000000 --- a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/DeleteMessageForMeComponentFactory.kt +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.chat.android.compose.sample.ui.component - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.unit.dp -import io.getstream.chat.android.client.ChatClient -import io.getstream.chat.android.compose.sample.R -import io.getstream.chat.android.compose.state.messageoptions.MessageOptionItemState -import io.getstream.chat.android.compose.ui.components.SimpleDialog -import io.getstream.chat.android.compose.ui.theme.ChatComponentFactory -import io.getstream.chat.android.compose.ui.theme.ChatTheme -import io.getstream.chat.android.models.Message -import io.getstream.chat.android.models.User -import io.getstream.chat.android.ui.common.state.messages.CustomAction -import io.getstream.chat.android.ui.common.state.messages.Delete -import io.getstream.chat.android.ui.common.state.messages.MessageAction -import io.getstream.chat.android.ui.common.state.messages.list.MessageItemState -import io.getstream.chat.android.ui.common.utils.canDeleteMessage - -/** - * Factory for creating components related to deleting messages for the current user. - */ -class DeleteMessageForMeComponentFactory( - private val delegate: ChatComponentFactory = MessageInfoComponentFactory(), -) : ChatComponentFactory by delegate { - - /** - * Creates a message menu with option for deleting messages for the current user. - */ - @Suppress("LongMethod") - @Composable - override fun MessageMenu( - modifier: Modifier, - message: Message, - messageOptions: List, - ownCapabilities: Set, - onMessageAction: (MessageAction) -> Unit, - onShowMore: () -> Unit, - onDismiss: () -> Unit, - currentUser: User?, - ) { - val chatClient = ChatClient.instance() - - val visibility = ChatTheme.messageOptionsTheme.optionVisibility - - val canDeleteMessage = canDeleteMessage( - deleteMessageEnabled = visibility.isDeleteMessageVisible, - currentUser = chatClient.getCurrentUser(), - message = message, - ownCapabilities = ownCapabilities, - ) - - var showDeleteForMeConfirmationDialog by remember { mutableStateOf(false) } - - val allOptions = if (canDeleteMessage) { - buildList { - messageOptions.forEach { option -> - add(option) - if (option.action is Delete) { - add( - MessageOptionItemState( - title = R.string.message_option_delete_for_me, - iconPainter = painterResource(R.drawable.stream_compose_ic_delete), - destructive = true, - action = CustomAction(message, mapOf("delete_for_me" to true)), - ), - ) - } - } - } - } else { - messageOptions - } - - val extendedOnMessageAction: (MessageAction) -> Unit = { action -> - when { - action is CustomAction && action.extraProperties.contains("delete_for_me") -> - showDeleteForMeConfirmationDialog = true - - else -> onMessageAction(action) - } - } - - if (showDeleteForMeConfirmationDialog) { - SimpleDialog( - modifier = Modifier.padding(16.dp), - title = "Delete for Me", - message = "Are you sure you want to delete this message for you?", - onPositiveAction = { - chatClient.deleteMessageForMe(message.id).enqueue() - onDismiss() - }, - onDismiss = { showDeleteForMeConfirmationDialog = false }, - ) - } - - delegate.MessageMenu( - modifier = modifier, - message = message, - messageOptions = allOptions, - ownCapabilities = ownCapabilities, - onMessageAction = extendedOnMessageAction, - onShowMore = onShowMore, - onDismiss = onDismiss, - currentUser = currentUser, - ) - } - - @Composable - override fun MessageFooterContent(messageItem: MessageItemState) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp), - ) { - if (messageItem.message.deletedForMe) { - Text( - modifier = Modifier.padding(vertical = 4.dp), - text = "Deleted only for me", - style = ChatTheme.typography.metadataDefault, - color = ChatTheme.colors.textPrimary, - ) - } - super.MessageFooterContent(messageItem) - } - } -} diff --git a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/MessageInfoComponentFactory.kt b/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/MessageInfoComponentFactory.kt deleted file mode 100644 index 72fd994c105..00000000000 --- a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/MessageInfoComponentFactory.kt +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.chat.android.compose.sample.ui.component - -import androidx.annotation.StringRes -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.LazyListScope -import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Info -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.rememberVectorPainter -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import io.getstream.chat.android.client.ChatClient -import io.getstream.chat.android.client.api.state.watchChannelAsState -import io.getstream.chat.android.client.extensions.deliveredReadsOf -import io.getstream.chat.android.client.extensions.readsOf -import io.getstream.chat.android.compose.sample.R -import io.getstream.chat.android.compose.state.messageoptions.MessageOptionItemState -import io.getstream.chat.android.compose.ui.components.avatar.UserAvatar -import io.getstream.chat.android.compose.ui.theme.ChatComponentFactory -import io.getstream.chat.android.compose.ui.theme.ChatTheme -import io.getstream.chat.android.models.Channel -import io.getstream.chat.android.models.ChannelUserRead -import io.getstream.chat.android.models.Message -import io.getstream.chat.android.models.User -import io.getstream.chat.android.ui.common.state.messages.CustomAction -import io.getstream.chat.android.ui.common.state.messages.MessageAction -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.filterNotNull -import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.map -import java.util.Calendar -import java.util.Date -import kotlin.time.Duration.Companion.hours - -/** - * Factory for creating components related to message info. - */ -class MessageInfoComponentFactory : ChatComponentFactory { - - /** - * Creates a message menu with option for message info. - */ - @OptIn(ExperimentalMaterial3Api::class) - @Suppress("LongMethod") - @Composable - override fun MessageMenu( - modifier: Modifier, - message: Message, - messageOptions: List, - ownCapabilities: Set, - onMessageAction: (MessageAction) -> Unit, - onShowMore: () -> Unit, - onDismiss: () -> Unit, - currentUser: User?, - ) { - var showMessageInfoDialog by remember { mutableStateOf(false) } - - val allOptions = listOf( - MessageOptionItemState( - title = R.string.message_option_message_info, - iconPainter = rememberVectorPainter(Icons.Outlined.Info), - destructive = false, - action = CustomAction(message, mapOf("message_info" to true)), - ), - ) + messageOptions - - val extendedOnMessageAction: (MessageAction) -> Unit = { action -> - when { - action is CustomAction && action.extraProperties.contains("message_info") -> - showMessageInfoDialog = true - - else -> onMessageAction(action) - } - } - - var dismissed by remember { mutableStateOf(false) } - - if (showMessageInfoDialog) { - ModalBottomSheet( - onDismissRequest = { - showMessageInfoDialog = false - onDismiss() - dismissed = true // Mark as dismissed to avoid animating the menu again - }, - containerColor = ChatTheme.colors.backgroundCoreApp, - ) { - val coroutineScope = rememberCoroutineScope() - val state by remember(message) { readsOf(message, coroutineScope) }.collectAsState(null) - state?.let { - val (reads, deliveredReads) = it - MessageInfoContent( - reads = reads, - deliveredReads = deliveredReads, - ) - } - } - } else if (!dismissed) { - super.MessageMenu( - modifier = modifier, - message = message, - messageOptions = allOptions, - ownCapabilities = ownCapabilities, - onMessageAction = extendedOnMessageAction, - onShowMore = onShowMore, - onDismiss = onDismiss, - currentUser = currentUser, - ) - } - } - - private fun readsOf( - message: Message, - coroutineScope: CoroutineScope, - ): Flow, List>> = ChatClient.instance() - .watchChannelAsState( - cid = message.cid, - messageLimit = 0, - coroutineScope = coroutineScope, - ).filterNotNull() - .flatMapLatest { it.reads } - .map { - val channel = Channel(read = it) - - val reads = channel.readsOf(message) - .sortedByDescending(ChannelUserRead::lastRead) - - val deliveredReads = channel.deliveredReadsOf(message) - .sortedByDescending { it.lastDeliveredAt ?: Date(0) } - reads - - reads to deliveredReads - } -} - -@Composable -private fun MessageInfoContent( - reads: List, - deliveredReads: List, -) { - LazyColumn( - modifier = Modifier.fillMaxWidth(), - contentPadding = PaddingValues( - start = 16.dp, - end = 16.dp, - bottom = 16.dp, - ), - ) { - // Read by section - section( - items = reads, - labelResId = R.string.message_info_read_by, - skipTopPadding = true, - ) - // Delivered to section - section( - items = deliveredReads, - labelResId = R.string.message_info_delivered_to, - ) - } -} - -private fun LazyListScope.section( - items: List, - @StringRes labelResId: Int, - skipTopPadding: Boolean = false, -) { - if (items.isNotEmpty()) { - item { - if (skipTopPadding) { - PaneTitle( - text = stringResource(labelResId, items.size), - padding = PaddingValues( - start = 16.dp, - bottom = 8.dp, - end = 16.dp, - ), - ) - } else { - PaneTitle(text = stringResource(labelResId, items.size)) - } - } - itemsIndexed( - items = items, - key = { _, item -> item.user.id }, - ) { index, item -> - PaneRow( - index = index, - lastIndex = items.lastIndex, - ) { - ReadItem(userRead = item) - } - } - } -} - -@Composable -private fun ReadItem(userRead: ChannelUserRead) { - Row( - horizontalArrangement = Arrangement.spacedBy(12.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - UserAvatar( - modifier = Modifier.size(48.dp), - user = userRead.user, - ) - - Text( - text = userRead.user.name.takeIf(String::isNotBlank) ?: userRead.user.id, - style = ChatTheme.typography.bodyEmphasis, - color = ChatTheme.colors.textPrimary, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } -} - -@Suppress("MagicNumber") -@Preview -@Composable -private fun MessageInfoScreenPreview() { - val sentDate = Calendar.getInstance().apply { - set(2025, Calendar.AUGUST, 15, 8, 15) - }.time - val user1 = User(id = "jane", name = "Jane Doe") - val user2 = User(id = "bob", name = "Bob Smith") - val user3 = User(id = "alice", name = "Alice Johnson") - val reads = listOf( - ChannelUserRead( - user = user1, - lastReceivedEventDate = Date(), - unreadMessages = 0, - lastRead = sentDate.apply { time += 2.hours.inWholeMilliseconds }, - lastReadMessageId = null, - ), - ChannelUserRead( - user = user2, - lastReceivedEventDate = Date(), - unreadMessages = 0, - lastRead = sentDate.apply { time += 3.hours.inWholeMilliseconds }, - lastReadMessageId = null, - ), - ) - val deliveredReads = listOf( - ChannelUserRead( - user = user3, - lastReceivedEventDate = Date(), - unreadMessages = 0, - lastRead = Date(), - lastReadMessageId = null, - lastDeliveredAt = sentDate.apply { time += 1.hours.inWholeMilliseconds }, - lastDeliveredMessageId = null, - ), - ) - ChatTheme { - MessageInfoContent( - deliveredReads = deliveredReads, - reads = reads, - ) - } -} diff --git a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/location/LocationComponentFactory.kt b/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/location/LocationComponentFactory.kt index a459e08c54f..69060fc08aa 100644 --- a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/location/LocationComponentFactory.kt +++ b/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/location/LocationComponentFactory.kt @@ -31,7 +31,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import io.getstream.chat.android.client.utils.message.hasSharedLocation import io.getstream.chat.android.client.utils.message.isDeleted -import io.getstream.chat.android.compose.sample.feature.reminders.MessageRemindersComponentFactory import io.getstream.chat.android.compose.sample.ui.component.SharedLocationItem import io.getstream.chat.android.compose.sample.vm.SharedLocationViewModelFactory import io.getstream.chat.android.compose.state.mediagallerypreview.MediaGalleryPreviewResult @@ -58,8 +57,7 @@ import io.getstream.chat.android.ui.common.state.messages.poll.PollSelectionType */ class LocationComponentFactory( private val locationViewModelFactory: SharedLocationViewModelFactory?, - private val delegate: ChatComponentFactory = MessageRemindersComponentFactory(), -) : ChatComponentFactory by delegate { +) : ChatComponentFactory { @Composable override fun AttachmentTypePicker( @@ -147,24 +145,22 @@ class LocationComponentFactory( onMapLongClick = { onLongItemClick(message) }, ) } else { - with(delegate) { - MessageContent( - messageItem = messageItem, - onLongItemClick = onLongItemClick, - onGiphyActionClick = onGiphyActionClick, - onQuotedMessageClick = onQuotedMessageClick, - onLinkClick = onLinkClick, - onUserMentionClick = onUserMentionClick, - onMediaGalleryPreviewResult = onMediaGalleryPreviewResult, - onPollUpdated = onPollUpdated, - onCastVote = onCastVote, - onRemoveVote = onRemoveVote, - selectPoll = selectPoll, - onAddAnswer = onAddAnswer, - onClosePoll = onClosePoll, - onAddPollOption = onAddPollOption, - ) - } + super.MessageContent( + messageItem = messageItem, + onLongItemClick = onLongItemClick, + onGiphyActionClick = onGiphyActionClick, + onQuotedMessageClick = onQuotedMessageClick, + onLinkClick = onLinkClick, + onUserMentionClick = onUserMentionClick, + onMediaGalleryPreviewResult = onMediaGalleryPreviewResult, + onPollUpdated = onPollUpdated, + onCastVote = onCastVote, + onRemoveVote = onRemoveVote, + selectPoll = selectPoll, + onAddAnswer = onAddAnswer, + onClosePoll = onClosePoll, + onAddPollOption = onAddPollOption, + ) } } } diff --git a/stream-chat-android-compose-sample/src/main/res/drawable/ic_bell_filled_24.xml b/stream-chat-android-compose-sample/src/main/res/drawable/ic_bell_filled_24.xml deleted file mode 100644 index 71b378e03e4..00000000000 --- a/stream-chat-android-compose-sample/src/main/res/drawable/ic_bell_filled_24.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - diff --git a/stream-chat-android-compose-sample/src/main/res/drawable/ic_bookmark_filled_24.xml b/stream-chat-android-compose-sample/src/main/res/drawable/ic_bookmark_filled_24.xml deleted file mode 100644 index d08dff6922e..00000000000 --- a/stream-chat-android-compose-sample/src/main/res/drawable/ic_bookmark_filled_24.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - diff --git a/stream-chat-android-compose-sample/src/main/res/values/strings.xml b/stream-chat-android-compose-sample/src/main/res/values/strings.xml index 91f605fab48..e56b98822c3 100644 --- a/stream-chat-android-compose-sample/src/main/res/values/strings.xml +++ b/stream-chat-android-compose-sample/src/main/res/values/strings.xml @@ -78,10 +78,6 @@ Sign out - Remind me - Update reminder - Save for later - Remove reminder Select reminder time When would you like to be reminded? In 2 minutes @@ -121,15 +117,9 @@ %d seconds - Delete Message For Me - Message Info - Failed to load more media attachments Failed to load more files attachments - - READ BY (%d) - DELIVERED TO (%d)