mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-04-26 19:35:48 +00:00
remove column, add UI types and group status icon
This commit is contained in:
@@ -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)))
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
+3
-2
@@ -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 |
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user