From 7ca1a6a4bbd30385bb478bbb8a01f6bbb2098111 Mon Sep 17 00:00:00 2001 From: Sagar Date: Tue, 3 Jun 2025 17:26:03 +0530 Subject: [PATCH] Fix ImagePicker crash and optimize changeSelectedAttachments. (#5804) --- .../ui/components/attachments/images/ImagesPicker.kt | 9 ++++++++- .../viewmodel/messages/AttachmentsPickerViewModel.kt | 5 ++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/attachments/images/ImagesPicker.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/attachments/images/ImagesPicker.kt index 84ffaaa0a83..7e36e0b50e3 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/attachments/images/ImagesPicker.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/attachments/images/ImagesPicker.kt @@ -39,6 +39,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -62,6 +63,7 @@ import io.getstream.chat.android.compose.ui.util.mirrorRtl import io.getstream.chat.android.models.AttachmentType import io.getstream.chat.android.ui.common.state.messages.composer.AttachmentMetaData import io.getstream.chat.android.ui.common.utils.MediaStringUtil +import kotlinx.coroutines.launch private const val DefaultNumberOfPicturesPerRow = 3 @@ -119,6 +121,7 @@ internal fun DefaultImagesPickerItem( ) { val attachmentMetaData = imageItem.attachmentMetaData val isVideo = attachmentMetaData.type == AttachmentType.VIDEO + val scope = rememberCoroutineScope() val imageRequest = ImageRequest.Builder(LocalContext.current) .data(attachmentMetaData.uri.toString()) @@ -134,7 +137,11 @@ internal fun DefaultImagesPickerItem( modifier = Modifier .height(125.dp) .padding(2.dp) - .clickable { onImageSelected(imageItem) } + .clickable { + scope.launch { + onImageSelected(imageItem) + } + } .testTag("Stream_AttachmentPickerSampleImage"), ) { StreamAsyncImage( diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel.kt index 8697c0210be..ccf4fc08b84 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel.kt @@ -170,13 +170,12 @@ public class AttachmentsPickerViewModel( public fun changeSelectedAttachments(attachmentItem: AttachmentPickerItemState) { val dataSet = attachments - val itemIndex = dataSet.indexOf(attachmentItem) + val itemIndex = dataSet.indexOfFirst { it.attachmentMetaData == attachmentItem.attachmentMetaData } val newFiles = dataSet.toMutableList() val newItem = dataSet[itemIndex].copy(isSelected = !newFiles[itemIndex].isSelected) - newFiles.removeAt(itemIndex) - newFiles.add(itemIndex, newItem) + newFiles[itemIndex] = newItem if (attachmentsPickerMode == Files) { files = newFiles