Skip to content

Commit de4aede

Browse files
committed
Keep hidden state unchanged when receiving campaign message
1 parent 9178258 commit de4aede

File tree

4 files changed

+72
-5
lines changed

4 files changed

+72
-5
lines changed

Sources/StreamChat/APIClient/Endpoints/Payloads/MessagePayloads.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ enum MessagePayloadsCodingKeys: String, CodingKey, CaseIterable {
5858
case reminder
5959
case member
6060
case deletedForMe = "deleted_for_me"
61+
case campaignId = "created_by_campaign_id"
6162
}
6263

6364
extension MessagePayload {
@@ -121,6 +122,8 @@ class MessagePayload: Decodable {
121122
var reminder: ReminderPayload?
122123
var member: MemberInfoPayload?
123124
let deletedForMe: Bool?
125+
126+
let campaignId: String?
124127

125128
/// Only message payload from `getMessage` endpoint contains channel data. It's a convenience workaround for having to
126129
/// make an extra call do get channel details.
@@ -192,6 +195,7 @@ class MessagePayload: Decodable {
192195
reminder = try container.decodeIfPresent(ReminderPayload.self, forKey: .reminder)
193196
member = try container.decodeIfPresent(MemberInfoPayload.self, forKey: .member)
194197
deletedForMe = try container.decodeIfPresent(Bool.self, forKey: .deletedForMe)
198+
campaignId = try container.decodeIfPresent(String.self, forKey: .campaignId)
195199
}
196200

197201
init(
@@ -237,7 +241,8 @@ class MessagePayload: Decodable {
237241
reminder: ReminderPayload? = nil,
238242
location: SharedLocationPayload? = nil,
239243
member: MemberInfoPayload? = nil,
240-
deletedForMe: Bool? = nil
244+
deletedForMe: Bool? = nil,
245+
campaignId: String? = nil
241246
) {
242247
self.id = id
243248
self.cid = cid
@@ -282,6 +287,7 @@ class MessagePayload: Decodable {
282287
self.reminder = reminder
283288
self.member = member
284289
self.deletedForMe = deletedForMe
290+
self.campaignId = campaignId
285291
}
286292
}
287293

Sources/StreamChat/WebSocketClient/EventMiddlewares/ChannelVisibilityEventMiddleware.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct ChannelVisibilityEventMiddleware: EventMiddleware {
3434
throw ClientError.ChannelDoesNotExist(cid: event.cid)
3535
}
3636

37-
if !event.message.isShadowed && !channelDTO.isBlocked {
37+
if !event.message.isShadowed && event.message.campaignId == nil && !channelDTO.isBlocked {
3838
channelDTO.isHidden = false
3939
}
4040

@@ -45,7 +45,7 @@ struct ChannelVisibilityEventMiddleware: EventMiddleware {
4545
throw ClientError.ChannelDoesNotExist(cid: event.channel.cid)
4646
}
4747

48-
if !event.message.isShadowed && !channelDTO.isBlocked {
48+
if !event.message.isShadowed && event.message.campaignId == nil && !channelDTO.isBlocked {
4949
channelDTO.isHidden = false
5050
}
5151

TestTools/StreamChatTestTools/TestData/DummyData/MessagePayload.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ extension MessagePayload {
5454
draft: DraftPayload? = nil,
5555
sharedLocation: SharedLocationPayload? = nil,
5656
member: MemberInfoPayload? = nil,
57-
deletedForMe: Bool? = nil
57+
deletedForMe: Bool? = nil,
58+
campaignId: String? = nil
5859
) -> MessagePayload {
5960
.init(
6061
id: messageId,
@@ -99,7 +100,8 @@ extension MessagePayload {
99100
draft: draft,
100101
location: sharedLocation,
101102
member: member,
102-
deletedForMe: deletedForMe
103+
deletedForMe: deletedForMe,
104+
campaignId: campaignId
103105
)
104106
}
105107

Tests/StreamChatTests/WebSocketClient/EventMiddlewares/ChannelVisibilityEventMiddleware_Tests.swift

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,36 @@ final class ChannelVisibilityEventMiddleware_Tests: XCTestCase {
236236
// Assert the `isHidden` value is still true
237237
XCTAssertTrue(channelDTO.isHidden)
238238
}
239+
240+
func test_messageNewEvent_whenCampaignMessage_doesNotResetIsHidden() throws {
241+
let cid: ChannelId = .unique
242+
243+
// Create the event
244+
let event = try MessageNewEventDTO(
245+
from: .init(
246+
eventType: .messageNew,
247+
cid: cid,
248+
user: .dummy(userId: .unique),
249+
message: .dummy(messageId: .unique, authorUserId: .unique, campaignId: "campaign_123"),
250+
createdAt: .unique
251+
) as EventPayload
252+
)
253+
254+
// Create a channel in the DB with `isHidden` set to true
255+
try database.writeSynchronously { session in
256+
let dto = try session.saveChannel(payload: XCTestCase().dummyPayload(with: cid))
257+
dto.isHidden = true
258+
}
259+
260+
// Simulate incoming event
261+
_ = middleware.handle(event: event, session: database.viewContext)
239262

263+
let channelDTO = try XCTUnwrap(database.viewContext.channel(cid: cid))
264+
265+
// Assert the `isHidden` value is still true
266+
XCTAssertTrue(channelDTO.isHidden)
267+
}
268+
240269
func test_notificationMessageNewEvent_resetsHiddenAtValue() throws {
241270
let cid: ChannelId = .unique
242271

@@ -296,4 +325,34 @@ final class ChannelVisibilityEventMiddleware_Tests: XCTestCase {
296325
// Assert the `isHidden` value is still true
297326
XCTAssertTrue(channelDTO.isHidden)
298327
}
328+
329+
func test_notificationMessageNewEvent_whenCampaignMessage_doesNotResetIsHidden() throws {
330+
let cid: ChannelId = .unique
331+
332+
// Create the event
333+
let event = try NotificationMessageNewEventDTO(
334+
from: .init(
335+
eventType: .notificationMessageNew,
336+
cid: cid,
337+
user: .dummy(userId: .unique),
338+
channel: .dummy(cid: cid),
339+
message: .dummy(messageId: .unique, authorUserId: .unique, campaignId: "campaign_123"),
340+
createdAt: .unique
341+
)
342+
)
343+
344+
// Create a channel in the DB with `isHidden` set to true
345+
try database.writeSynchronously { session in
346+
let dto = try session.saveChannel(payload: XCTestCase().dummyPayload(with: cid))
347+
dto.isHidden = true
348+
}
349+
350+
// Simulate incoming event
351+
_ = middleware.handle(event: event, session: database.viewContext)
352+
353+
let channelDTO = try XCTUnwrap(database.viewContext.channel(cid: cid))
354+
355+
// Assert the `isHidden` value is still true
356+
XCTAssertTrue(channelDTO.isHidden)
357+
}
299358
}

0 commit comments

Comments
 (0)