From d05a6642f8eff0534eb971de70cfa6d9198b31a7 Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Mon, 1 Dec 2025 13:50:44 +0100 Subject: [PATCH] =?UTF-8?q?DROID-4116=20Widgets=20|=20Fix=20|=20Resolving?= =?UTF-8?q?=20chat=20list=20widget=20previews=20=E2=80=94=20hotfixes=20(#2?= =?UTF-8?q?941)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ChatViewModel.kt | 33 ++++++-- .../anytype/feature_chats/ui/ChatMenu.kt | 78 ++++++++++--------- .../anytype/feature_chats/ui/Toolbars.kt | 1 + 3 files changed, 71 insertions(+), 41 deletions(-) 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 8714d8abf5..48cadab188 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 @@ -171,6 +171,7 @@ class ChatViewModel @Inject constructor( MutableStateFlow(SpaceInviteLinkAccessLevel.LinkDisabled()) private val syncStatus = MutableStateFlow(null) + private val currentPermission = MutableStateFlow(null) private val dateFormatter = SimpleDateFormat("d MMMM YYYY") private val messageRateLimiter = MessageRateLimiter() @@ -191,6 +192,7 @@ class ChatViewModel @Inject constructor( spacePermissionProvider .observe(vmParams.space) .collect { permission -> + currentPermission.value = permission if (permission?.isOwnerOrEditor() == true) { if (chatBoxMode.value is ChatBoxMode.ReadOnly) { chatBoxMode.value = ChatBoxMode.Default() @@ -199,6 +201,21 @@ class ChatViewModel @Inject constructor( chatBoxMode.value = ChatBoxMode.ReadOnly } canCreateInviteLink.value = permission?.isOwner() == true + // Update header with new permission if already set + val currentHeader = header.value + when (currentHeader) { + is HeaderView.Default -> { + header.value = currentHeader.copy( + canEdit = permission?.isOwnerOrEditor() == true + ) + } + is HeaderView.ChatObject -> { + header.value = currentHeader.copy( + canEdit = permission?.isOwnerOrEditor() == true + ) + } + else -> {} + } } } @@ -211,6 +228,7 @@ class ChatViewModel @Inject constructor( val notificationSetting = NotificationStateCalculator .calculateChatNotificationState(chatSpace = view, chatId = vmParams.ctx) .toNotificationSetting() + val canEdit = currentPermission.value?.isOwnerOrEditor() == true getObject.async( GetObject.Params( target = vmParams.ctx, @@ -223,7 +241,8 @@ class ChatViewModel @Inject constructor( title = view.name.orEmpty(), icon = view.spaceIcon(builder = urlBuilder), isMuted = isMuted, - notificationSetting = notificationSetting + notificationSetting = notificationSetting, + canEdit = canEdit ) } else { // Chat object @@ -241,7 +260,8 @@ class ChatViewModel @Inject constructor( ), isMuted = isMuted, notificationSetting = notificationSetting, - isPinned = isPinned + isPinned = isPinned, + canEdit = canEdit ) } }.onFailure { @@ -251,7 +271,8 @@ class ChatViewModel @Inject constructor( title = view.name.orEmpty(), icon = view.spaceIcon(builder = urlBuilder), isMuted = isMuted, - notificationSetting = notificationSetting + notificationSetting = notificationSetting, + canEdit = canEdit ) } } @@ -2399,7 +2420,8 @@ class ChatViewModel @Inject constructor( val isMuted: Boolean = false, val showDropDownMenu: Boolean = true, val showAddMembers: Boolean = true, - val notificationSetting: NotificationSetting = NotificationSetting.ALL + val notificationSetting: NotificationSetting = NotificationSetting.ALL, + val canEdit: Boolean = true ) : HeaderView() data class ChatObject( val icon: ObjectIcon, @@ -2408,7 +2430,8 @@ class ChatViewModel @Inject constructor( val showDropDownMenu: Boolean = true, val showAddMembers: Boolean = false, val notificationSetting: NotificationSetting = NotificationSetting.ALL, - val isPinned: Boolean = false + val isPinned: Boolean = false, + val canEdit: Boolean = true ) : HeaderView() } diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatMenu.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatMenu.kt index ca460c7cd4..c5d5c38599 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatMenu.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatMenu.kt @@ -51,6 +51,7 @@ fun BoxScope.ChatMenu( expanded: Boolean, currentNotificationSetting: NotificationSetting, isPinned: Boolean = false, + canEdit: Boolean = true, onDismissRequest: () -> Unit, onPropertiesClick: () -> Unit, onEditInfoClick: () -> Unit, @@ -96,32 +97,34 @@ fun BoxScope.ChatMenu( // ) // Divider(paddingStart = 0.dp, paddingEnd = 0.dp) - // Edit Info - DropdownMenuItem( - content = { - ChatMenuItemContent( - text = stringResource(R.string.chat_edit_info), - iconRes = R.drawable.ic_edit_info_24 - ) - }, - onClick = { onEditInfoClick() } - ) - Divider(paddingStart = 0.dp, paddingEnd = 0.dp, height = 8.dp) + // Edit Info - only show if user can edit + if (canEdit) { + DropdownMenuItem( + content = { + ChatMenuItemContent( + text = stringResource(R.string.chat_edit_info), + iconRes = R.drawable.ic_edit_info_24 + ) + }, + onClick = { onEditInfoClick() } + ) + Divider(paddingStart = 0.dp, paddingEnd = 0.dp, height = 8.dp) - // Pin/Unpin - DropdownMenuItem( - content = { - ChatMenuItemContent( - text = stringResource( - if (isPinned) R.string.object_action_unpin - else R.string.object_action_pin - ), - iconRes = R.drawable.ic_pin_24 - ) - }, - onClick = { onPinClick() } - ) - Divider(paddingStart = 0.dp, paddingEnd = 0.dp) + // Pin/Unpin - only show if user can edit + DropdownMenuItem( + content = { + ChatMenuItemContent( + text = stringResource( + if (isPinned) R.string.object_action_unpin + else R.string.object_action_pin + ), + iconRes = R.drawable.ic_pin_24 + ) + }, + onClick = { onPinClick() } + ) + Divider(paddingStart = 0.dp, paddingEnd = 0.dp) + } // Notifications - expandable DropdownMenuItem( @@ -192,17 +195,19 @@ fun BoxScope.ChatMenu( Divider(paddingStart = 0.dp, paddingEnd = 0.dp) - // Move to Bin - DropdownMenuItem( - content = { - ChatMenuItemContent( - text = stringResource(R.string.chat_move_to_bin), - iconRes = R.drawable.ic_chat_menu_to_bin_24, - textColor = R.color.palette_system_red - ) - }, - onClick = { onMoveToBinClick() } - ) + // Move to Bin - only show if user can edit + if (canEdit) { + DropdownMenuItem( + content = { + ChatMenuItemContent( + text = stringResource(R.string.chat_move_to_bin), + iconRes = R.drawable.ic_chat_menu_to_bin_24, + textColor = R.color.palette_system_red + ) + }, + onClick = { onMoveToBinClick() } + ) + } } } } @@ -267,6 +272,7 @@ fun ChatMenuPreview() { expanded = true, currentNotificationSetting = NotificationSetting.ALL, isPinned = false, + canEdit = true, onDismissRequest = {}, onPropertiesClick = {}, onEditInfoClick = {}, diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/Toolbars.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/Toolbars.kt index 46cfb7d69c..548219cff4 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/Toolbars.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/Toolbars.kt @@ -188,6 +188,7 @@ fun ChatTopToolbar( expanded = showDropdownMenu, currentNotificationSetting = header.notificationSetting, isPinned = header.isPinned, + canEdit = header.canEdit, onDismissRequest = { showDropdownMenu = false },