Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### 🐞 Fixed
- Fix logout not clearing token when current user had no device registered [#3838](https://github.com/GetStream/stream-chat-swift/pull/3838)
- Fix `PollVoteListController` not updating votes on the vote cast event [#3849](https://github.com/GetStream/stream-chat-swift/pull/3849)
- Fix showing channel when receiving a campaign message with `show_channels` false [#3851](https://github.com/GetStream/stream-chat-swift/pull/3851)

## StreamChatUI
### 🐞 Fixed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ enum MessagePayloadsCodingKeys: String, CodingKey, CaseIterable {
case reminder
case member
case deletedForMe = "deleted_for_me"
case campaignId = "created_by_campaign_id"
}

extension MessagePayload {
Expand Down Expand Up @@ -121,6 +122,8 @@ class MessagePayload: Decodable {
var reminder: ReminderPayload?
var member: MemberInfoPayload?
let deletedForMe: Bool?

let campaignId: String?

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

init(
Expand Down Expand Up @@ -237,7 +241,8 @@ class MessagePayload: Decodable {
reminder: ReminderPayload? = nil,
location: SharedLocationPayload? = nil,
member: MemberInfoPayload? = nil,
deletedForMe: Bool? = nil
deletedForMe: Bool? = nil,
campaignId: String? = nil
) {
self.id = id
self.cid = cid
Expand Down Expand Up @@ -282,6 +287,7 @@ class MessagePayload: Decodable {
self.reminder = reminder
self.member = member
self.deletedForMe = deletedForMe
self.campaignId = campaignId
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ struct ChannelVisibilityEventMiddleware: EventMiddleware {
throw ClientError.ChannelDoesNotExist(cid: event.cid)
}

if !event.message.isShadowed && !channelDTO.isBlocked {
if !event.message.isShadowed && event.message.campaignId == nil && !channelDTO.isBlocked {
channelDTO.isHidden = false
}

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

if !event.message.isShadowed && !channelDTO.isBlocked {
if !event.message.isShadowed && event.message.campaignId == nil && !channelDTO.isBlocked {
channelDTO.isHidden = false
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ extension MessagePayload {
draft: DraftPayload? = nil,
sharedLocation: SharedLocationPayload? = nil,
member: MemberInfoPayload? = nil,
deletedForMe: Bool? = nil
deletedForMe: Bool? = nil,
campaignId: String? = nil
) -> MessagePayload {
.init(
id: messageId,
Expand Down Expand Up @@ -99,7 +100,8 @@ extension MessagePayload {
draft: draft,
location: sharedLocation,
member: member,
deletedForMe: deletedForMe
deletedForMe: deletedForMe,
campaignId: campaignId
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,36 @@ final class ChannelVisibilityEventMiddleware_Tests: XCTestCase {
// Assert the `isHidden` value is still true
XCTAssertTrue(channelDTO.isHidden)
}

func test_messageNewEvent_whenCampaignMessage_doesNotResetIsHidden() throws {
let cid: ChannelId = .unique

// Create the event
let event = try MessageNewEventDTO(
from: .init(
eventType: .messageNew,
cid: cid,
user: .dummy(userId: .unique),
message: .dummy(messageId: .unique, authorUserId: .unique, campaignId: "campaign_123"),
createdAt: .unique
) as EventPayload
)

// Create a channel in the DB with `isHidden` set to true
try database.writeSynchronously { session in
let dto = try session.saveChannel(payload: XCTestCase().dummyPayload(with: cid))
dto.isHidden = true
}

// Simulate incoming event
_ = middleware.handle(event: event, session: database.viewContext)

let channelDTO = try XCTUnwrap(database.viewContext.channel(cid: cid))

// Assert the `isHidden` value is still true
XCTAssertTrue(channelDTO.isHidden)
}

func test_notificationMessageNewEvent_resetsHiddenAtValue() throws {
let cid: ChannelId = .unique

Expand Down Expand Up @@ -296,4 +325,34 @@ final class ChannelVisibilityEventMiddleware_Tests: XCTestCase {
// Assert the `isHidden` value is still true
XCTAssertTrue(channelDTO.isHidden)
}

func test_notificationMessageNewEvent_whenCampaignMessage_doesNotResetIsHidden() throws {
let cid: ChannelId = .unique

// Create the event
let event = try NotificationMessageNewEventDTO(
from: .init(
eventType: .notificationMessageNew,
cid: cid,
user: .dummy(userId: .unique),
channel: .dummy(cid: cid),
message: .dummy(messageId: .unique, authorUserId: .unique, campaignId: "campaign_123"),
createdAt: .unique
)
)

// Create a channel in the DB with `isHidden` set to true
try database.writeSynchronously { session in
let dto = try session.saveChannel(payload: XCTestCase().dummyPayload(with: cid))
dto.isHidden = true
}

// Simulate incoming event
_ = middleware.handle(event: event, session: database.viewContext)

let channelDTO = try XCTUnwrap(database.viewContext.channel(cid: cid))

// Assert the `isHidden` value is still true
XCTAssertTrue(channelDTO.isHidden)
}
}
Loading