Skip to content

Commit b30ed90

Browse files
authored
Merge pull request #298 from zapcannon87/developer
feat(IM): add joined property for system conversation
2 parents 6c5f4e4 + 2ff92ca commit b30ed90

File tree

2 files changed

+75
-63
lines changed

2 files changed

+75
-63
lines changed

LeanCloudTests/IMConversationTestCase.swift

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -367,48 +367,49 @@ class IMConversationTestCase: RTMBaseTestCase {
367367
}
368368

369369
func testServiceConversationSubscription() {
370-
guard
371-
let client = newOpenedClient(),
372-
let serviceConversationID = IMConversationTestCase.newServiceConversation()
373-
else
374-
{
375-
XCTFail()
376-
return
370+
guard let client = newOpenedClient(),
371+
let serviceConversationID = IMConversationTestCase.newServiceConversation() else {
372+
XCTFail()
373+
return
377374
}
378375

379376
delay()
380377

381378
var serviceConversation: IMServiceConversation?
382379

383-
let queryExp = expectation(description: "conv query")
384-
try! client.conversationQuery.getConversation(by: serviceConversationID) { (result) in
385-
XCTAssertTrue(result.isSuccess)
386-
XCTAssertNil(result.error)
387-
serviceConversation = (result.value as? IMServiceConversation)
388-
queryExp.fulfill()
380+
expecting { (exp) in
381+
try! client.conversationQuery.getConversation(by: serviceConversationID) { (result) in
382+
XCTAssertTrue(result.isSuccess)
383+
XCTAssertNil(result.error)
384+
serviceConversation = (result.value as? IMServiceConversation)
385+
XCTAssertEqual(serviceConversation?.isSubscribed, false)
386+
exp.fulfill()
387+
}
389388
}
390-
wait(for: [queryExp], timeout: timeout)
391389

392-
let checkExp = expectation(description: "check subscription")
393-
checkExp.expectedFulfillmentCount = 3
394-
serviceConversation?.checkSubscription(completion: { (result) in
395-
XCTAssertTrue(result.isSuccess)
396-
XCTAssertNil(result.error)
397-
XCTAssertEqual(result.value, false)
398-
checkExp.fulfill()
399-
try! serviceConversation?.subscribe(completion: { (result) in
390+
expecting(
391+
description: "service conversation subscription",
392+
count: 3)
393+
{ (exp) in
394+
serviceConversation?.checkSubscription(completion: { (result) in
400395
XCTAssertTrue(result.isSuccess)
401396
XCTAssertNil(result.error)
402-
checkExp.fulfill()
403-
serviceConversation?.checkSubscription(completion: { (result) in
397+
XCTAssertEqual(result.value, false)
398+
exp.fulfill()
399+
try! serviceConversation?.subscribe(completion: { (result) in
404400
XCTAssertTrue(result.isSuccess)
405401
XCTAssertNil(result.error)
406-
XCTAssertEqual(result.value, true)
407-
checkExp.fulfill()
402+
XCTAssertEqual(serviceConversation?.isSubscribed, true)
403+
exp.fulfill()
404+
serviceConversation?.checkSubscription(completion: { (result) in
405+
XCTAssertTrue(result.isSuccess)
406+
XCTAssertNil(result.error)
407+
XCTAssertEqual(result.value, true)
408+
exp.fulfill()
409+
})
408410
})
409411
})
410-
})
411-
wait(for: [checkExp], timeout: timeout)
412+
}
412413
}
413414

414415
func testNormalConversationUnreadEvent() {

Sources/RTM/IMConversation.swift

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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
27012707
public 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

Comments
 (0)