remove column, add UI types and group status icon

This commit is contained in:
Evgeny Poberezkin
2025-03-01 23:37:02 +00:00
parent c0f1cf8c16
commit 7be68ea8d2
12 changed files with 27 additions and 22 deletions
@@ -143,6 +143,7 @@ struct ChatPreviewView: View {
}
case let .group(groupInfo):
switch (groupInfo.membership.memberStatus) {
case .memPendingApproval: inactiveIcon("questionmark.circle.fill")
case .memRejected: inactiveIcon()
case .memLeft: inactiveIcon()
case .memRemoved: inactiveIcon()
@@ -154,8 +155,8 @@ struct ChatPreviewView: View {
}
}
@ViewBuilder private func inactiveIcon() -> some View {
Image(systemName: "multiply.circle.fill")
private func inactiveIcon(_ icon: String = "multiply.circle.fill") -> some View {
Image(systemName: icon)
.foregroundColor(.secondary.opacity(0.65))
.background(Circle().foregroundColor(Color(uiColor: .systemBackground)))
}
+5
View File
@@ -2147,6 +2147,7 @@ public struct GroupMember: Identifiable, Decodable, Hashable {
case .memGroupDeleted: return false
case .memUnknown: return false
case .memInvited: return false
case .memPendingApproval: return true
case .memIntroduced: return false
case .memIntroInvited: return false
case .memAccepted: return false
@@ -2165,6 +2166,7 @@ public struct GroupMember: Identifiable, Decodable, Hashable {
case .memGroupDeleted: return false
case .memUnknown: return false
case .memInvited: return false
case .memPendingApproval: return false
case .memIntroduced: return true
case .memIntroInvited: return true
case .memAccepted: return true
@@ -2296,6 +2298,7 @@ public enum GroupMemberStatus: String, Decodable, Hashable {
case memGroupDeleted = "deleted"
case memUnknown = "unknown"
case memInvited = "invited"
case memPendingApproval = "pending_approval"
case memIntroduced = "introduced"
case memIntroInvited = "intro-inv"
case memAccepted = "accepted"
@@ -2312,6 +2315,7 @@ public enum GroupMemberStatus: String, Decodable, Hashable {
case .memGroupDeleted: return "group deleted"
case .memUnknown: return "unknown status"
case .memInvited: return "invited"
case .memPendingApproval: return "pending approval"
case .memIntroduced: return "connecting (introduced)"
case .memIntroInvited: return "connecting (introduction invitation)"
case .memAccepted: return "connecting (accepted)"
@@ -2330,6 +2334,7 @@ public enum GroupMemberStatus: String, Decodable, Hashable {
case .memGroupDeleted: return "group deleted"
case .memUnknown: return "unknown"
case .memInvited: return "invited"
case .memPendingApproval: return "pending"
case .memIntroduced: return "connecting"
case .memIntroInvited: return "connecting"
case .memAccepted: return "connecting"
@@ -1917,6 +1917,7 @@ data class GroupMember (
GroupMemberStatus.MemGroupDeleted -> false
GroupMemberStatus.MemUnknown -> false
GroupMemberStatus.MemInvited -> false
GroupMemberStatus.MemPendingApproval -> true
GroupMemberStatus.MemIntroduced -> false
GroupMemberStatus.MemIntroInvited -> false
GroupMemberStatus.MemAccepted -> false
@@ -1933,6 +1934,7 @@ data class GroupMember (
GroupMemberStatus.MemGroupDeleted -> false
GroupMemberStatus.MemUnknown -> false
GroupMemberStatus.MemInvited -> false
GroupMemberStatus.MemPendingApproval -> false
GroupMemberStatus.MemIntroduced -> true
GroupMemberStatus.MemIntroInvited -> true
GroupMemberStatus.MemAccepted -> true
@@ -2037,6 +2039,7 @@ enum class GroupMemberStatus {
@SerialName("deleted") MemGroupDeleted,
@SerialName("unknown") MemUnknown,
@SerialName("invited") MemInvited,
@SerialName("pending_approval") MemPendingApproval,
@SerialName("introduced") MemIntroduced,
@SerialName("intro-inv") MemIntroInvited,
@SerialName("accepted") MemAccepted,
@@ -2052,6 +2055,7 @@ enum class GroupMemberStatus {
MemGroupDeleted -> generalGetString(MR.strings.group_member_status_group_deleted)
MemUnknown -> generalGetString(MR.strings.group_member_status_unknown)
MemInvited -> generalGetString(MR.strings.group_member_status_invited)
MemPendingApproval -> generalGetString(MR.strings.group_member_status_pending_approval)
MemIntroduced -> generalGetString(MR.strings.group_member_status_introduced)
MemIntroInvited -> generalGetString(MR.strings.group_member_status_intro_invitation)
MemAccepted -> generalGetString(MR.strings.group_member_status_accepted)
@@ -2068,6 +2072,7 @@ enum class GroupMemberStatus {
MemGroupDeleted -> generalGetString(MR.strings.group_member_status_group_deleted)
MemUnknown -> generalGetString(MR.strings.group_member_status_unknown_short)
MemInvited -> generalGetString(MR.strings.group_member_status_invited)
MemPendingApproval -> generalGetString(MR.strings.group_member_status_pending_approval_short)
MemIntroduced -> generalGetString(MR.strings.group_member_status_connecting)
MemIntroInvited -> generalGetString(MR.strings.group_member_status_connecting)
MemAccepted -> generalGetString(MR.strings.group_member_status_connecting)
@@ -52,9 +52,9 @@ fun ChatPreviewView(
val cInfo = chat.chatInfo
@Composable
fun inactiveIcon() {
fun inactiveIcon(icon: ImageResource = MR.images.ic_cancel_filled) {
Icon(
painterResource(MR.images.ic_cancel_filled),
painterResource(icon),
stringResource(MR.strings.icon_descr_group_inactive),
Modifier.size(18.sp.toDp()).background(MaterialTheme.colors.background, CircleShape),
tint = MaterialTheme.colors.secondary
@@ -70,6 +70,7 @@ fun ChatPreviewView(
}
is ChatInfo.Group ->
when (cInfo.groupInfo.membership.memberStatus) {
GroupMemberStatus.MemPendingApproval -> inactiveIcon(MR.images.ic_help_filled)
GroupMemberStatus.MemRejected -> inactiveIcon()
GroupMemberStatus.MemLeft -> inactiveIcon()
GroupMemberStatus.MemRemoved -> inactiveIcon()
@@ -1632,6 +1632,8 @@
<string name="group_member_status_group_deleted">group deleted</string>
<string name="group_member_status_unknown">unknown status</string>
<string name="group_member_status_invited">invited</string>
<string name="group_member_status_pending_approval">pending approval</string>
<string name="group_member_status_pending_approval_short">pending</string>
<string name="group_member_status_introduced">connecting (introduced)</string>
<string name="group_member_status_intro_invitation">connecting (introduction invitation)</string>
<string name="group_member_status_accepted">connecting (accepted)</string>
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M484.41-250.5q15.33 0 25.96-10.54T521-286.91q0-15.33-10.54-25.96t-25.87-10.63q-15.33 0-25.96 10.54T448-287.09q0 15.33 10.54 25.96t25.87 10.63ZM450-394h57q0-25.5 6.75-46.75t39.75-48.75q31-25.5 43.5-50.25T609.5-594q0-52.28-33.49-83.89-33.48-31.61-89.81-31.61-48.32 0-85.18 23.84-36.86 23.84-54.02 66.16l51.61 19q10.89-28 32.89-43 22.01-15 51.5-15 34 0 55 18.5t21 47.5q0 22-12.96 41.2-12.96 19.19-37.77 40.36Q479-486 464.5-459.93 450-433.85 450-394Zm30.06 309q-80.97 0-153.13-31.26-72.15-31.27-125.79-85Q147.5-255 116.25-327.02 85-399.05 85-479.94q0-81.97 31.26-154.13 31.27-72.15 85-125.54Q255-813 327.02-844q72.03-31 152.92-31 81.97 0 154.13 31.13 72.17 31.13 125.55 84.5Q813-706 844-633.98q31 72.03 31 153.92 0 80.97-31.01 153.13-31.02 72.15-84.5 125.79Q706-147.5 633.98-116.25 561.95-85 480.06-85Z"/></svg>

After

Width:  |  Height:  |  Size: 923 B

+3 -3
View File
@@ -581,7 +581,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
let (UserContactLink {autoAccept}, gli_) = ucl
when (connChatVersion < batchSend2Version) $ sendAutoReply ct' autoAccept
-- TODO REMOVE LEGACY vvv
forM_ gli_ $ \GroupLinkInfo {groupId, memberRole = gLinkMemRole, acceptance = _acceptance} -> do
forM_ gli_ $ \GroupLinkInfo {groupId, memberRole = gLinkMemRole} -> do
groupInfo <- withStore $ \db -> getGroupInfo db vr user groupId
subMode <- chatReadVar subscriptionMode
groupConnIds <- createAgentConnectionAsync user CFCreateConnGrpInv True SCMInvitation subMode
@@ -1205,10 +1205,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
incognitoProfile <- if acceptIncognito then Just . NewIncognito <$> liftIO generateRandomProfile else pure Nothing
ct <- acceptContactRequestAsync user cReq incognitoProfile reqPQSup
toView $ CRAcceptingContactRequest user ct
Just gli@GroupLinkInfo {groupId, acceptance = gAcceptance, memberRole = gLinkMemRole} -> do
Just gli@GroupLinkInfo {groupId, memberRole = gLinkMemRole} -> do
gInfo <- withStore $ \db -> getGroupInfo db vr user groupId
acceptMember_ <- asks $ acceptMember . chatHooks . config
maybe (pure $ Right (gAcceptance, gLinkMemRole)) (\am -> liftIO $ am gInfo gli p) acceptMember_ >>= \case
maybe (pure $ Right (GAAuto, gLinkMemRole)) (\am -> liftIO $ am gInfo gli p) acceptMember_ >>= \case
Right (acceptance, useRole)
| v < groupFastLinkJoinVersion ->
messageError "processUserContactRequest: chat version range incompatible for accepting group join request"
@@ -10,8 +10,6 @@ m20250227_member_acceptance :: Text
m20250227_member_acceptance =
T.pack
[r|
ALTER TABLE user_contact_links ADD COLUMN group_link_auto_accept TEXT;
DROP INDEX idx_chat_items_groups_history;
CREATE INDEX idx_chat_items_groups_history ON chat_items(
user_id,
@@ -28,8 +26,6 @@ down_m20250227_member_acceptance :: Text
down_m20250227_member_acceptance =
T.pack
[r|
ALTER TABLE user_contact_links DROP COLUMN group_link_auto_accept;
DROP INDEX idx_chat_items_groups_history;
CREATE INDEX idx_chat_items_groups_history ON chat_items(
user_id,
+4 -5
View File
@@ -457,7 +457,6 @@ data UserContactLink = UserContactLink
data GroupLinkInfo = GroupLinkInfo
{ groupId :: GroupId,
acceptance :: GroupAcceptance,
memberRole :: GroupMemberRole
}
deriving (Show)
@@ -498,14 +497,14 @@ getUserContactLinkById db userId userContactLinkId =
groupLinkInfoQuery :: Query
groupLinkInfoQuery =
[sql|
SELECT conn_req_contact, auto_accept, business_address, auto_accept_incognito, auto_reply_msg_content, group_id, group_link_auto_accept, group_link_member_role
SELECT conn_req_contact, auto_accept, business_address, auto_accept_incognito, auto_reply_msg_content, group_id, group_link_member_role
FROM user_contact_links
WHERE user_id = ?
|]
toGroupLinkInfo :: (Maybe GroupId, Maybe GroupAcceptance, Maybe GroupMemberRole) -> Maybe GroupLinkInfo
toGroupLinkInfo (groupId_, acceptance_, mRole_) =
(\groupId -> GroupLinkInfo {groupId, acceptance = fromMaybe GAAuto acceptance_, memberRole = fromMaybe GRMember mRole_})
toGroupLinkInfo :: (Maybe GroupId, Maybe GroupMemberRole) -> Maybe GroupLinkInfo
toGroupLinkInfo (groupId_, mRole_) =
(\groupId -> GroupLinkInfo {groupId, memberRole = fromMaybe GRMember mRole_})
<$> groupId_
getGroupLinkInfo :: DB.Connection -> UserId -> GroupId -> IO (Maybe GroupLinkInfo)
@@ -8,8 +8,6 @@ import Database.SQLite.Simple.QQ (sql)
m20250227_member_acceptance :: Query
m20250227_member_acceptance =
[sql|
ALTER TABLE user_contact_links ADD COLUMN group_link_auto_accept TEXT;
DROP INDEX idx_chat_items_groups_history;
CREATE INDEX idx_chat_items_groups_history ON chat_items(
user_id,
@@ -25,8 +23,6 @@ CREATE INDEX idx_chat_items_groups_history ON chat_items(
down_m20250227_member_acceptance :: Query
down_m20250227_member_acceptance =
[sql|
ALTER TABLE user_contact_links DROP COLUMN group_link_auto_accept;
DROP INDEX idx_chat_items_groups_history;
CREATE INDEX idx_chat_items_groups_history ON chat_items(
user_id,
@@ -2965,7 +2965,7 @@ Plan:
SEARCH user_contact_links USING INDEX sqlite_autoindex_user_contact_links_1 (user_id=? AND local_display_name=?)
Query:
SELECT conn_req_contact, auto_accept, business_address, auto_accept_incognito, auto_reply_msg_content, group_id, group_link_auto_accept, group_link_member_role
SELECT conn_req_contact, auto_accept, business_address, auto_accept_incognito, auto_reply_msg_content, group_id, group_link_member_role
FROM user_contact_links
WHERE user_id = ?
AND user_contact_link_id = ?
@@ -316,7 +316,6 @@ CREATE TABLE user_contact_links(
group_link_id BLOB,
group_link_member_role TEXT NULL,
business_address INTEGER DEFAULT 0,
group_link_auto_accept TEXT,
UNIQUE(user_id, local_display_name)
);
CREATE TABLE contact_requests(