ui: navigation from support chat to member info (#6237)

This commit is contained in:
spaced4ndy
2025-09-03 13:07:28 +00:00
committed by GitHub
parent 6beb6b1efc
commit 9d65b9eb2b
10 changed files with 93 additions and 22 deletions
@@ -2343,7 +2343,7 @@ data class GroupMember (
}
fun canChangeRoleTo(groupInfo: GroupInfo): List<GroupMemberRole>? =
if (!canBeRemoved(groupInfo)) null
if (!canBeRemoved(groupInfo) || memberPending) null
else groupInfo.membership.memberRole.let { userRole ->
GroupMemberRole.selectableRoles.filter { it <= userRole }
}
@@ -2352,6 +2352,7 @@ data class GroupMember (
val userRole = groupInfo.membership.memberRole
return memberStatus != GroupMemberStatus.MemRemoved && memberStatus != GroupMemberStatus.MemLeft && memberRole < GroupMemberRole.Moderator
&& userRole >= GroupMemberRole.Moderator && userRole >= memberRole && groupInfo.membership.memberActive
&& !memberPending
}
val versionRange: VersionRange = activeConn?.peerChatVRange ?: memberChatVRange
@@ -453,7 +453,7 @@ fun ChatView(
}
ModalManager.end.showModalCloseable(true) { close ->
remember { derivedStateOf { chatModel.getGroupMember(member.groupMemberId) } }.value?.let { mem ->
GroupMemberInfoView(chatRh, groupInfo, mem, scrollToItemId, stats, code, chatModel, close, close)
GroupMemberInfoView(chatRh, groupInfo, mem, scrollToItemId, stats, code, chatModel, openedFromSupportChat = false, close, close)
}
}
}
@@ -1005,7 +1005,9 @@ fun ChatLayout(
Column(if (oneHandUI.value && chatBottomBar.value) Modifier.align(Alignment.BottomStart).imePadding() else Modifier) {
Box {
if (selectedChatItems.value == null) {
MemberSupportChatAppBar(chatsCtx, chatsCtx.secondaryContextFilter.groupScopeInfo.groupMember_, { ModalManager.end.closeModal() }, onSearchValueChanged)
if (chat != null) {
MemberSupportChatAppBar(chatsCtx, remoteHostId, chat, chatsCtx.secondaryContextFilter.groupScopeInfo.groupMember_, scrollToItemId, { ModalManager.end.closeModal() }, onSearchValueChanged)
}
} else {
SelectedItemsCounterToolbar(selectedChatItems, !oneHandUI.value)
}
@@ -126,7 +126,7 @@ fun ModalData.GroupChatInfoView(
}
ModalManager.end.showModalCloseable(true) { closeCurrent ->
remember { derivedStateOf { chatModel.getGroupMember(member.groupMemberId) } }.value?.let { mem ->
GroupMemberInfoView(rhId, groupInfo, mem, scrollToItemId, stats, code, chatModel, closeCurrent) {
GroupMemberInfoView(rhId, groupInfo, mem, scrollToItemId, stats, code, chatModel, openedFromSupportChat = false, closeCurrent) {
closeCurrent()
close()
}
@@ -49,9 +49,13 @@ fun GroupMemberInfoView(
connectionStats: ConnectionStats?,
connectionCode: String?,
chatModel: ChatModel,
openedFromSupportChat: Boolean,
close: () -> Unit,
closeAll: () -> Unit, // Close all open windows up to ChatView
) {
KeyChangeEffect(chat.simplex.common.platform.chatModel.chatId.value) {
ModalManager.end.closeModals()
}
BackHandler(onBack = close)
val chat = chatModel.chats.value.firstOrNull { ch -> ch.id == chatModel.chatId.value && ch.remoteHostId == rhId }
val connStats = remember { mutableStateOf(connectionStats) }
@@ -225,7 +229,8 @@ fun GroupMemberInfoView(
)
}
}
}
},
openedFromSupportChat = openedFromSupportChat
)
if (progressIndicator) {
@@ -291,6 +296,7 @@ fun GroupMemberInfoLayout(
syncMemberConnection: () -> Unit,
syncMemberConnectionForce: () -> Unit,
verifyClicked: () -> Unit,
openedFromSupportChat: Boolean
) {
val cStats = connStats.value
fun knownDirectChat(contactId: Long): Pair<Chat, Contact>? {
@@ -440,6 +446,7 @@ fun GroupMemberInfoLayout(
if (member.memberActive) {
SectionView {
if (
!openedFromSupportChat &&
groupInfo.membership.memberRole >= GroupMemberRole.Moderator &&
(member.memberRole < GroupMemberRole.Moderator || member.supportChat != null)
) {
@@ -924,6 +931,7 @@ fun PreviewGroupMemberInfoLayout() {
syncMemberConnection = {},
syncMemberConnectionForce = {},
verifyClicked = {},
openedFromSupportChat = false,
)
}
}
@@ -51,7 +51,10 @@ private fun MemberSupportChatView(
@Composable
fun MemberSupportChatAppBar(
chatsCtx: ChatModel.ChatsContext,
rhId: Long?,
chat: Chat,
scopeMember_: GroupMember?,
scrollToItemId: MutableState<Long?>,
close: () -> Unit,
onSearchValueChanged: (String) -> Unit
) {
@@ -67,11 +70,31 @@ fun MemberSupportChatAppBar(
}
}
BackHandler(onBack = onBackClicked)
if (scopeMember_ != null) {
if (chat.chatInfo is ChatInfo.Group && scopeMember_ != null) {
val groupInfo = chat.chatInfo.groupInfo
DefaultAppBar(
navigationButton = { NavigationButtonBack(onBackClicked) },
title = { MemberSupportChatToolbarTitle(scopeMember_) },
onTitleClick = null,
onTitleClick = {
withBGApi {
val r = chatModel.controller.apiGroupMemberInfo(rhId, groupInfo.groupId, scopeMember_.groupMemberId)
val stats = r?.second
val code = if (scopeMember_.memberActive) {
val memCode = chatModel.controller.apiGetGroupMemberCode(rhId, groupInfo.apiId, scopeMember_.groupMemberId)
memCode?.second
} else {
null
}
ModalManager.end.showModalCloseable(true) { closeCurrent ->
remember { derivedStateOf { chatModel.getGroupMember(scopeMember_.groupMemberId) } }.value?.let { mem ->
GroupMemberInfoView(rhId, groupInfo, mem, scrollToItemId, stats, code, chatModel, openedFromSupportChat = true, close = closeCurrent) {
closeCurrent()
close()
}
}
}
}
},
onTop = !oneHandUI.value || !chatBottomBar.value,
showSearch = showSearch.value,
onSearchValueChanged = onSearchValueChanged,