@@ -26,6 +26,7 @@ public class IMConversation {
2626 case unique = " unique "
2727 case transient = " tr "
2828 case system = " sys "
29+ case joined = " joined "
2930 case temporary = " temp "
3031 case temporaryTTL = " ttl "
3132 case convType = " conv_type "
@@ -2211,11 +2212,8 @@ extension IMConversation {
22112212 }
22122213
22132214 private func needUpdateMembers( members: [ String ] , updatedDateString: String ? ) -> Bool {
2214- guard
2215- self . convType != . transient,
2216- self . convType != . system,
2217- !members. isEmpty else
2218- {
2215+ if ( self . convType == . transient) ||
2216+ ( self . convType != . system && members. isEmpty) {
22192217 return false
22202218 }
22212219 if let dateString: String = updatedDateString,
@@ -2234,20 +2232,24 @@ extension IMConversation {
22342232 guard self . needUpdateMembers ( members: joinedMembers, updatedDateString: udate) else {
22352233 return
22362234 }
2237- let newMembers : [ String ]
2238- if var originMembers: [ String ] = self . members {
2239- for member in joinedMembers {
2240- if !originMembers. contains ( member) {
2241- originMembers. append ( member)
2235+ if self . convType == . system {
2236+ self . safeUpdatingRawData ( key: . joined, value: true )
2237+ } else {
2238+ let newMembers : [ String ]
2239+ if var originMembers: [ String ] = self . members {
2240+ for member in joinedMembers {
2241+ if !originMembers. contains ( member) {
2242+ originMembers. append ( member)
2243+ }
22422244 }
2245+ newMembers = originMembers
2246+ } else {
2247+ newMembers = joinedMembers
2248+ }
2249+ self . safeUpdatingRawData ( key: . members, value: newMembers)
2250+ if let udateString: String = udate {
2251+ self . safeUpdatingRawData ( key: . updatedAt, value: udateString)
22432252 }
2244- newMembers = originMembers
2245- } else {
2246- newMembers = joinedMembers
2247- }
2248- self . safeUpdatingRawData ( key: . members, value: newMembers)
2249- if let udateString: String = udate {
2250- self . safeUpdatingRawData ( key: . updatedAt, value: udateString)
22512253 }
22522254 #if canImport(GRDB)
22532255 if let _ = client. localStorage {
@@ -2262,19 +2264,30 @@ extension IMConversation {
22622264 guard self . needUpdateMembers ( members: leftMembers, updatedDateString: udate) else {
22632265 return
22642266 }
2265- if leftMembers. contains ( self . clientID) {
2266- self . isOutdated = true
2267- }
2268- if var originMembers: [ String ] = self . members {
2269- for member in leftMembers {
2270- if let index = originMembers. firstIndex ( of: member) {
2271- originMembers. remove ( at: index)
2267+ if self . convType == . system {
2268+ self . safeUpdatingRawData ( key: . joined, value: false )
2269+ } else {
2270+ if leftMembers. contains ( self . clientID) {
2271+ self . isOutdated = true
2272+ }
2273+ if var originMembers: [ String ] = self . members {
2274+ for member in leftMembers {
2275+ if let index = originMembers. firstIndex ( of: member) {
2276+ originMembers. remove ( at: index)
2277+ }
22722278 }
2279+ self . safeUpdatingRawData ( key: . members, value: originMembers)
22732280 }
2274- self . safeUpdatingRawData ( key: . members, value: originMembers)
2275- }
2276- if let udate = udate {
2277- self . safeUpdatingRawData ( key: . updatedAt, value: udate)
2281+ if let udate = udate {
2282+ self . safeUpdatingRawData ( key: . updatedAt, value: udate)
2283+ }
2284+ self . sync ( closure: {
2285+ if let _ = self . _memberInfoTable {
2286+ for member in leftMembers {
2287+ self . _memberInfoTable? . removeValue ( forKey: member)
2288+ }
2289+ }
2290+ } )
22782291 }
22792292 #if canImport(GRDB)
22802293 if let _ = client. localStorage {
@@ -2285,13 +2298,6 @@ extension IMConversation {
22852298 outdated: tuple. 1 )
22862299 }
22872300 #endif
2288- self . sync ( closure: {
2289- if let _ = self . _memberInfoTable {
2290- for member in leftMembers {
2291- self . _memberInfoTable? . removeValue ( forKey: member)
2292- }
2293- }
2294- } )
22952301 }
22962302
22972303 private class KeyAndDictionary {
@@ -2699,6 +2705,11 @@ public class IMChatRoom: IMConversation {
26992705
27002706/// IM Service Conversation
27012707public class IMServiceConversation : IMConversation {
2708+
2709+ /// Whether this service conversation has been subscribed by the client.
2710+ public var isSubscribed : Bool ? {
2711+ return self . safeDecodingRawData ( with: . joined)
2712+ }
27022713
27032714 @available ( * , unavailable)
27042715 public override func update( attribution data: [ String : Any ] , completion: @escaping ( LCBooleanResult ) -> Void ) throws {
0 commit comments