core, ui: group members permanent connection errors (#6662)

This commit is contained in:
spaced4ndy
2026-03-06 15:24:55 +00:00
committed by GitHub
parent e0dc4366e0
commit 3f4e7f379d
17 changed files with 501 additions and 62 deletions
@@ -1904,6 +1904,12 @@ data class Connection(
val connInactive: Boolean
get() = quotaErrCounter >= 5 // quotaErrInactiveCount in core
val connFailedErr: String?
get() = when (connStatus) {
is ConnStatus.Failed -> connStatus.connError
else -> null
}
val connPQEnabled: Boolean
get() = pqSndEnabled == true && pqRcvEnabled == true
@@ -2638,25 +2644,27 @@ class PendingContactConnection(
}
@Serializable
enum class ConnStatus {
@SerialName("new") New,
@SerialName("prepared") Prepared,
@SerialName("joined") Joined,
@SerialName("requested") Requested,
@SerialName("accepted") Accepted,
@SerialName("snd-ready") SndReady,
@SerialName("ready") Ready,
@SerialName("deleted") Deleted;
sealed class ConnStatus {
@Serializable @SerialName("new") object New: ConnStatus()
@Serializable @SerialName("prepared") object Prepared: ConnStatus()
@Serializable @SerialName("joined") object Joined: ConnStatus()
@Serializable @SerialName("requested") object Requested: ConnStatus()
@Serializable @SerialName("accepted") object Accepted: ConnStatus()
@Serializable @SerialName("sndReady") object SndReady: ConnStatus()
@Serializable @SerialName("ready") object Ready: ConnStatus()
@Serializable @SerialName("deleted") object Deleted: ConnStatus()
@Serializable @SerialName("failed") class Failed(val connError: String): ConnStatus()
val initiated: Boolean? get() = when (this) {
New -> true
Prepared -> false
Joined -> false
Requested -> true
Accepted -> true
SndReady -> null
Ready -> null
Deleted -> null
is New -> true
is Prepared -> false
is Joined -> false
is Requested -> true
is Accepted -> true
is SndReady -> null
is Ready -> null
is Deleted -> null
is Failed -> null
}
}
@@ -878,9 +878,11 @@ fun MemberRow(member: GroupMember, user: Boolean = false, infoPage: Boolean = tr
}
fun memberConnStatus(): String {
return if (member.activeConn?.connDisabled == true) {
generalGetString(MR.strings.member_info_member_disabled)
return if (member.activeConn?.connStatus is ConnStatus.Failed) {
generalGetString(MR.strings.member_info_member_failed)
} else if (member.activeConn?.connDisabled == true) {
generalGetString(MR.strings.member_info_member_disabled)
} else if (member.activeConn?.connInactive == true) {
generalGetString(MR.strings.member_info_member_inactive)
} else {
member.memberStatus.shortText
@@ -562,6 +562,14 @@ fun GroupMemberInfoLayout(
}
}
val connFailedErr = member.activeConn?.connFailedErr
if (connFailedErr != null) {
SectionDividerSpaced()
SectionView {
InfoRow(stringResource(MR.strings.info_row_connection_failed), connFailedErr)
}
}
if (groupInfo.membership.memberRole >= GroupMemberRole.Moderator) {
ModeratorDestructiveSection()
} else {
@@ -162,7 +162,9 @@ private fun ModalData.MemberSupportViewLayout(
@Composable
fun SupportChatRow(member: GroupMember) {
fun memberStatus(): String {
return if (member.activeConn?.connDisabled == true) {
return if (member.activeConn?.connStatus is ConnStatus.Failed) {
generalGetString(MR.strings.member_info_member_failed)
} else if (member.activeConn?.connDisabled == true) {
generalGetString(MR.strings.member_info_member_disabled)
} else if (member.activeConn?.connInactive == true) {
generalGetString(MR.strings.member_info_member_inactive)
@@ -1906,6 +1906,7 @@
<string name="member_blocked_by_admin">Blocked by admin</string>
<string name="member_info_member_blocked">blocked</string>
<string name="member_info_member_disabled">disabled</string>
<string name="member_info_member_failed">failed</string>
<string name="member_info_member_inactive">inactive</string>
<string name="member_info_section_title_member">MEMBER</string>
<string name="role_in_group">Role</string>
@@ -1924,6 +1925,7 @@
<string name="info_row_group">Group</string>
<string name="info_row_chat">Chat</string>
<string name="info_row_connection">Connection</string>
<string name="info_row_connection_failed">Connection failed</string>
<string name="conn_level_desc_direct">direct</string>
<string name="conn_level_desc_indirect">indirect (%1$s)</string>
<string name="message_queue_info">Message queue info</string>