diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatView.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatView.kt index 2e8faf1ff8..ef7cadef6e 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatView.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatView.kt @@ -4,6 +4,7 @@ import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Hash import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.ObjectWrapper +import com.anytypeio.anytype.core_models.Url import com.anytypeio.anytype.presentation.confgs.ChatConfig import com.anytypeio.anytype.presentation.objects.ObjectIcon import com.anytypeio.anytype.presentation.search.GlobalSearchItemView @@ -73,16 +74,33 @@ sealed interface ChatView { } sealed class ChatBoxAttachment { + data class Media( val uri: String, val state: State = State.Idle ): ChatBoxAttachment() + data class File( val uri: String, val name: String, val size: Int, val state: State = State.Idle ): ChatBoxAttachment() + + sealed class Existing : ChatBoxAttachment() { + data class Image( + val target: Id, + val url: Url + ) : Existing() + + data class Link( + val target: Id, + val name: String, + val typeName: String, + val icon: ObjectIcon + ) : Existing() + } + data class Link( val target: Id, val wrapper: GlobalSearchItemView diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt index 6d75ab1897..87962a534f 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt @@ -343,7 +343,6 @@ class ChatViewModel @Inject constructor( Timber.d("DROID-2635 OnMessageSent, markup: $markup}") } viewModelScope.launch { - val urlRegex = Regex(DEFAULT_URL_REGEX) val parsedUrls = buildList { urlRegex.findAll(msg).forEach { match -> @@ -380,6 +379,22 @@ class ChatViewModel @Inject constructor( ) ) } + is ChatView.Message.ChatBoxAttachment.Existing.Link -> { + add( + Chat.Message.Attachment( + target = attachment.target, + type = Chat.Message.Attachment.Type.Link + ) + ) + } + is ChatView.Message.ChatBoxAttachment.Existing.Image -> { + add( + Chat.Message.Attachment( + target = attachment.target, + type = Chat.Message.Attachment.Type.Image + ) + ) + } is ChatView.Message.ChatBoxAttachment.Media -> { chatBoxAttachments.value = currAttachments.toMutableList().apply { set( @@ -495,16 +510,13 @@ class ChatViewModel @Inject constructor( chatBoxMode.value = ChatBoxMode.Default() } is ChatBoxMode.EditMessage -> { - val editedMessage = data.value.find { - it.id == mode.msg - } editChatMessage.async( params = Command.ChatCommand.EditMessage( chat = vmParams.ctx, message = Chat.Message.updated( id = mode.msg, text = msg.trim(), - attachments = editedMessage?.attachments.orEmpty(), + attachments = attachments, marks = normalizedMarkup ) ) @@ -546,6 +558,33 @@ class ChatViewModel @Inject constructor( fun onRequestEditMessageClicked(msg: ChatView.Message) { Timber.d("onRequestEditMessageClicked") viewModelScope.launch { + chatBoxAttachments.value = msg.attachments.mapNotNull { a -> + when(a) { + is ChatView.Message.Attachment.Image -> { + ChatView.Message.ChatBoxAttachment.Existing.Image( + target = a.target, + url = a.url + ) + } + is ChatView.Message.Attachment.Link -> { + val wrapper = a.wrapper + if (wrapper != null) { + val type = wrapper.type.firstOrNull() + ChatView.Message.ChatBoxAttachment.Existing.Link( + target = wrapper.id, + name = wrapper.name.orEmpty(), + icon = wrapper.objectIcon(urlBuilder), + typeName = if (type != null) + storeOfObjectTypes.get(type)?.name.orEmpty() + else + "" + ) + } else { + null + } + } + } + } chatBoxMode.value = ChatBoxMode.EditMessage(msg.id) } } diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatBoxAttachments.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatBoxAttachments.kt index 3c0ed5526d..b6e5144b0d 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatBoxAttachments.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatBoxAttachments.kt @@ -44,6 +44,38 @@ internal fun ChatBoxAttachments( ) { attachments.forEach { attachment -> when (attachment) { + is ChatView.Message.ChatBoxAttachment.Existing.Link -> { + item { + Box { + AttachedObject( + modifier = Modifier + .padding( + top = 12.dp, + end = 4.dp + ) + .width(216.dp), + title = attachment.name, + type = attachment.typeName, + icon = attachment.icon, + onAttachmentClicked = { + // TODO + } + ) + Image( + painter = painterResource(id = R.drawable.ic_clear_chatbox_attachment), + contentDescription = "Close icon", + modifier = Modifier + .align( + Alignment.TopEnd + ) + .padding(top = 6.dp) + .noRippleClickable { + onClearAttachmentClicked(attachment) + } + ) + } + } + } is ChatView.Message.ChatBoxAttachment.Link -> { item { Box { @@ -76,7 +108,6 @@ internal fun ChatBoxAttachments( } } } - is ChatView.Message.ChatBoxAttachment.Media -> { item { Box(modifier = Modifier.padding()) { @@ -114,7 +145,35 @@ internal fun ChatBoxAttachments( } } } - + is ChatView.Message.ChatBoxAttachment.Existing.Image -> { + item { + Box(modifier = Modifier.padding()) { + Image( + painter = rememberAsyncImagePainter(attachment.url), + contentDescription = null, + modifier = Modifier + .padding( + top = 12.dp, + end = 4.dp + ) + .size(72.dp) + .clip(RoundedCornerShape(8.dp)) + , + contentScale = ContentScale.Crop + ) + Image( + painter = painterResource(R.drawable.ic_clear_chatbox_attachment), + contentDescription = "Clear attachment icon", + modifier = Modifier + .align(Alignment.TopEnd) + .padding(top = 6.dp) + .noRippleClickable { + onClearAttachmentClicked(attachment) + } + ) + } + } + } is ChatView.Message.ChatBoxAttachment.File -> { item { Box {