-
Notifications
You must be signed in to change notification settings - Fork 224
4.83.0 Release #3752
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
4.83.0 Release #3752
Conversation
* Fix existing filter queries not actually limit their scope when creating the filters * Make channel list query keypath optional * Add ThreadListQuery filter and sorting support * Add new `LocalConvertibleSortingKey` to reuse code between ChannelListSortingKey and ThreadListSortingKey * Fix existing tests * Add ThreadListQuery test coverage * Add a way to show the channel threads in the demo app * Add activeParticipantCount to Threads * Add comment explaining why we don't save threads in the DB on new message event * Add test coverage to filtering and sorting * Update CHANGELOG.md * Update CHANGELOG.md * Fix runtime sorting not respecting isAscending * Fix unnecessary fallback in activeParticipantCount * Fix typo in ThreadListFilterScope extending from Channel List * Fix typo in parentMessageId filter key * Fix runtimeSorting logic * Update CHANGELOG.md * Rename LocalConvertibleQuery to LocalConvertibleSortingQuery * Fix linting * Update Sources/StreamChat/WebSocketClient/EventMiddlewares/ThreadUpdaterMiddleware.swift
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.8 to 1.18.9. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](sparklemotion/nokogiri@v1.18.8...v1.18.9) --- updated-dependencies: - dependency-name: nokogiri dependency-version: 1.18.9 dependency-type: indirect ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alexey Alter-Pesotskiy <[email protected]>
…cation (#3738) * Add skipPush to `MessageController.editMessage()` * Add skipPush and emojiCode to `MessageController.addReaction()` * Add `MessageNotificationContent.reaction` so that it can be used by NSEs * Add test coverage to skip push edit message * Add test coverage to skip push and emojiCode * Add test coverage to remote notification handler parsing reaction data * Fix existing unit tests * Update CHANGELOG.md * Fix type in addReaction defaultValues test * Fix NSE not compiling correctly on CI * PR Feedback
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the ✨ Finishing Touches🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
SDK Size
|
Public Interface+ public struct ThreadListFilterScope: FilterScope, AnyThreadListFilterScope
+ public struct PushReactionInfo
+
+ public let type: MessageReactionType
+ public let reactionUserId: UserId
+ public let reactionUserImageUrl: URL?
+ public let receiverUserId: UserId
+ extension ThreadListSortingKey
+
+ public static let createdAt
+ public static let updatedAt
+ public static let lastMessageAt
+ public static let participantCount
+ public static let activeParticipantCount
+ public static let replyCount
+ public static let parentMessageId
+ public static let hasUnread
+ public struct LocalConvertibleSortingKey: SortingKey, Encodable, Equatable
+
+ public static func custom(keyPath: KeyPath<Model, Value>,key: String)-> Self
+ public func encode(to encoder: Encoder)throws
+ public protocol AnyThreadListFilterScope
+ extension LocalConvertibleSortingKey: CustomDebugStringConvertible
+
+ public var debugDescription: String
- public struct ChannelListSortingKey: SortingKey, Equatable
-
- public static let `default`
- public static let createdAt
- public static let updatedAt
- public static let lastMessageAt
- public static let pinnedAt
- public static let memberCount
- public static let cid
- public static let hasUnread
- public static let unreadCount
-
-
- public static func custom(keyPath: KeyPath<ChatChannel, T>,key: String)-> Self
- public func encode(to encoder: Encoder)throws
public class Chat
- @discardableResult public func updateMessage(_ messageId: MessageId,text: String,attachments: [AnyAttachmentPayload] = [],extraData: [String: RawJSON]? = nil,restrictedVisibility: [UserId] = [],skipEnrichURL: Bool = false)async throws -> ChatMessage
+ @discardableResult public func updateMessage(_ messageId: MessageId,text: String,attachments: [AnyAttachmentPayload] = [],extraData: [String: RawJSON]? = nil,restrictedVisibility: [UserId] = [],skipEnrichURL: Bool = false,skipPush: Bool = false)async throws -> ChatMessage
- public func sendReaction(to messageId: MessageId,with type: MessageReactionType,score: Int = 1,enforceUnique: Bool = false,extraData: [String: RawJSON] = [:])async throws
+ public func sendReaction(to messageId: MessageId,with type: MessageReactionType,score: Int = 1,enforceUnique: Bool = false,skipPush: Bool = false,pushEmojiCode: String? = nil,extraData: [String: RawJSON] = [:])async throws
open class GalleryVC: _ViewController, UIGestureRecognizerDelegate, AppearanceProvider, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, ComponentsProvider
- override open func viewWillDisappear(_ animated: Bool)
+ override open func viewDidAppear(_ animated: Bool)
- override open func updateContent()
+ override open func viewWillDisappear(_ animated: Bool)
- @objc open func handlePan(with gestureRecognizer: UIPanGestureRecognizer)
+ override open func updateContent()
- @objc open func closeButtonTapped()
+ @objc open func handlePan(with gestureRecognizer: UIPanGestureRecognizer)
- @objc open func shareButtonTapped()
+ @objc open func closeButtonTapped()
- open func updateCurrentPage()
+ @objc open func shareButtonTapped()
- open func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection section: Int)-> Int
+ open func updateCurrentPage()
- open func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath)-> UICollectionViewCell
+ open func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection section: Int)-> Int
- open func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,sizeForItemAt indexPath: IndexPath)-> CGSize
+ open func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath)-> UICollectionViewCell
- open func collectionView(_ collectionView: UICollectionView,targetContentOffsetForProposedContentOffset proposedContentOffset: CGPoint)-> CGPoint
+ open func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,sizeForItemAt indexPath: IndexPath)-> CGSize
- open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
+ open func collectionView(_ collectionView: UICollectionView,targetContentOffsetForProposedContentOffset proposedContentOffset: CGPoint)-> CGPoint
- open func scrollViewDidScroll(_ scrollView: UIScrollView)
+ open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
- override open func viewWillTransition(to size: CGSize,with coordinator: UIViewControllerTransitionCoordinator)
+ open func scrollViewDidScroll(_ scrollView: UIScrollView)
- open func shareItem(at indexPath: IndexPath)-> Any?
+ override open func viewWillTransition(to size: CGSize,with coordinator: UIViewControllerTransitionCoordinator)
- open func cellReuseIdentifierForItem(at indexPath: IndexPath)-> String?
+ open func shareItem(at indexPath: IndexPath)-> Any?
- open func handleSingleTapOnCell(at indexPath: IndexPath)
+ open func cellReuseIdentifierForItem(at indexPath: IndexPath)-> String?
-
+ open func handleSingleTapOnCell(at indexPath: IndexPath)
-
+
- public struct Content
+
-
+ public struct Content
- public var message: ChatMessage
+
- public var currentPage: Int
+ public var message: ChatMessage
-
+ public var currentPage: Int
-
+
- public init(message: ChatMessage,currentPage: Int = 0)
+
+ public init(message: ChatMessage,currentPage: Int = 0)
- extension ChannelListSortingKey: CustomDebugStringConvertible
+ extension ChannelListSortingKey
- public var debugDescription: String
+ public static let `default`
+ public static let createdAt
+ public static let updatedAt
+ public static let lastMessageAt
+ public static let pinnedAt
+ public static let memberCount
+ public static let cid
+ public static let hasUnread
+ public static let unreadCount
- public struct ThreadListQuery: Encodable
+ public struct ThreadListQuery: Encodable, LocalConvertibleSortingQuery
- case watch
+ case filter
- case replyLimit = "reply_limit"
+ case sort
- case participantLimit = "participant_limit"
+ case watch
- case limit
+ case replyLimit = "reply_limit"
- case next
+ case participantLimit = "participant_limit"
-
+ case limit
-
+ case next
- public var watch: Bool
+
- public var limit: Int
+
- public var replyLimit: Int
+ public let filter: Filter<ThreadListFilterScope>?
- public var participantLimit: Int
+ public let sort: [Sorting<ThreadListSortingKey>]
- public var next: String?
+ public var watch: Bool
-
+ public var limit: Int
-
+ public var replyLimit: Int
- public init(watch: Bool,limit: Int = 20,replyLimit: Int = 3,participantLimit: Int = 10,next: String? = nil)
+ public var participantLimit: Int
+ public var next: String?
+
+
+ public init(watch: Bool,filter: Filter<ThreadListFilterScope>? = nil,sort: [Sorting<ThreadListSortingKey>] = [
+ .init(key: .hasUnread),
+ .init(key: .lastMessageAt),
+ .init(key: .parentMessageId)
+ ],limit: Int = 20,replyLimit: Int = 3,participantLimit: Int = 10,next: String? = nil)
public class MessageNotificationContent
- public let type: PushNotificationType
+ public let reaction: PushReactionInfo?
+ public let type: PushNotificationType
public class ChatUser
- public let extraData: [String: RawJSON]
+ public let avgResponseTime: Int?
+ public let extraData: [String: RawJSON]
public struct ChatThread
- public let threadParticipants: [ThreadParticipant]
+ public let activeParticipantCount: Int
- public let lastMessageAt: Date?
+ public let threadParticipants: [ThreadParticipant]
- public let createdAt: Date
+ public let lastMessageAt: Date?
- public let updatedAt: Date?
+ public let createdAt: Date
- public let title: String?
+ public let updatedAt: Date?
- public let latestReplies: [ChatMessage]
+ public let title: String?
- public let reads: [ThreadRead]
+ public let latestReplies: [ChatMessage]
- public let extraData: [String: RawJSON]
+ public let reads: [ThreadRead]
+ public let extraData: [String: RawJSON]
- public struct ChannelListQuery: Encodable
+ public struct ChannelListQuery: Encodable, LocalConvertibleSortingQuery
public struct Components
- @available(iOSApplicationExtension, unavailable) public var threadListRouter: ChatThreadListRouter.Type
+ public var isReactionPushEmojisEnabled: Bool
- public var threadListItemCell: ChatThreadListItemCell.Type
+ @available(iOSApplicationExtension, unavailable) public var threadListRouter: ChatThreadListRouter.Type
- public var threadListItemView: ChatThreadListItemView.Type
+ public var threadListItemCell: ChatThreadListItemCell.Type
- public var threadUnreadCountView: ChatThreadUnreadCountView.Type
+ public var threadListItemView: ChatThreadListItemView.Type
- public var threadListHeaderBannerView: ChatThreadListHeaderBannerView.Type
+ public var threadUnreadCountView: ChatThreadUnreadCountView.Type
- public var threadListLoadingView: ChatThreadListLoadingView.Type
+ public var threadListHeaderBannerView: ChatThreadListHeaderBannerView.Type
- public var threadListEmptyView: ChatThreadListEmptyView.Type
+ public var threadListLoadingView: ChatThreadListLoadingView.Type
- public var threadListErrorView: ChatThreadListErrorView.Type
+ public var threadListEmptyView: ChatThreadListEmptyView.Type
- public var threadVC: ChatThreadVC.Type
+ public var threadListErrorView: ChatThreadListErrorView.Type
- public var threadHeaderView: ChatThreadHeaderView.Type
+ public var threadVC: ChatThreadVC.Type
- public var threadRepliesCounterDecorationView: ChatThreadRepliesCountDecorationView.Type
+ public var threadHeaderView: ChatThreadHeaderView.Type
- public var threadRepliesCounterEnabled
+ public var threadRepliesCounterDecorationView: ChatThreadRepliesCountDecorationView.Type
- public var threadRendersParentMessageEnabled
+ public var threadRepliesCounterEnabled
- public var threadRepliesStartFromOldest
+ public var threadRendersParentMessageEnabled
- public var channelVC: ChatChannelVC.Type
+ public var threadRepliesStartFromOldest
- public var channelHeaderView: ChatChannelHeaderView.Type
+ public var channelVC: ChatChannelVC.Type
- public var channelListLayout: UICollectionViewLayout.Type
+ public var channelHeaderView: ChatChannelHeaderView.Type
- public var channelCell: ChatChannelListCollectionViewCell.Type
+ public var channelListLayout: UICollectionViewLayout.Type
- public var channelCellSeparator: UICollectionReusableView.Type
+ public var channelCell: ChatChannelListCollectionViewCell.Type
- public var channelActionsView: SwipeableView.Type
+ public var channelCellSeparator: UICollectionReusableView.Type
- public var channelContentView: ChatChannelListItemView.Type
+ public var channelActionsView: SwipeableView.Type
- public var channelAvatarView: ChatChannelAvatarView.Type
+ public var channelContentView: ChatChannelListItemView.Type
- public var channelUnreadCountView: ChatChannelUnreadCountView.Type
+ public var channelAvatarView: ChatChannelAvatarView.Type
- public var channelListEmptyView: ChatChannelListEmptyView.Type
+ public var channelUnreadCountView: ChatChannelUnreadCountView.Type
- public var channelListErrorView: ChatChannelListErrorView.Type
+ public var channelListEmptyView: ChatChannelListEmptyView.Type
- public var channelListLoadingView: ChatChannelListLoadingView.Type
+ public var channelListErrorView: ChatChannelListErrorView.Type
- public var channelListLoadingViewCell: ChatChannelListLoadingViewCell.Type
+ public var channelListLoadingView: ChatChannelListLoadingView.Type
- public var channelListLoadingContentViewCell: ChatChannelListLoadingViewCellContentView.Type
+ public var channelListLoadingViewCell: ChatChannelListLoadingViewCell.Type
- public var isChatChannelListStatesEnabled
+ public var channelListLoadingContentViewCell: ChatChannelListLoadingViewCellContentView.Type
- public var channelListSearchStrategy: ChannelListSearchStrategy?
+ public var isChatChannelListStatesEnabled
- public var messageComposerVC: ComposerVC.Type
+ public var channelListSearchStrategy: ChannelListSearchStrategy?
- public var messageComposerView: ComposerView.Type
+ public var messageComposerVC: ComposerVC.Type
- public var messageComposerAttachmentsVC: AttachmentsPreviewVC.Type
+ public var messageComposerView: ComposerView.Type
- public var messageComposerAttachmentCell: AttachmentPreviewContainer.Type
+ public var messageComposerAttachmentsVC: AttachmentsPreviewVC.Type
- public var messageComposerFileAttachmentView: FileAttachmentView.Type
+ public var messageComposerAttachmentCell: AttachmentPreviewContainer.Type
- public var imageAttachmentComposerPreview: ImageAttachmentComposerPreview
+ public var messageComposerFileAttachmentView: FileAttachmentView.Type
- .Type
+ public var imageAttachmentComposerPreview: ImageAttachmentComposerPreview
- public var videoAttachmentComposerPreview: VideoAttachmentComposerPreview
+ .Type
- .Type
+ public var videoAttachmentComposerPreview: VideoAttachmentComposerPreview
- public var suggestionsVC: ChatSuggestionsVC.Type
+ .Type
- public var mentionAllAppUsers: Bool
+ public var suggestionsVC: ChatSuggestionsVC.Type
- public var suggestionsCollectionView: ChatSuggestionsCollectionView.Type
+ public var mentionAllAppUsers: Bool
- public var suggestionsMentionCollectionViewCell: ChatMentionSuggestionCollectionViewCell.Type
+ public var suggestionsCollectionView: ChatSuggestionsCollectionView.Type
- public var suggestionsCommandCollectionViewCell: ChatCommandSuggestionCollectionViewCell
+ public var suggestionsMentionCollectionViewCell: ChatMentionSuggestionCollectionViewCell.Type
- .Type
+ public var suggestionsCommandCollectionViewCell: ChatCommandSuggestionCollectionViewCell
- public var suggestionsMentionView: ChatMentionSuggestionView.Type
+ .Type
- public var suggestionsCommandView: ChatCommandSuggestionView.Type
+ public var suggestionsMentionView: ChatMentionSuggestionView.Type
- public var suggestionsCollectionViewLayout: UICollectionViewLayout.Type
+ public var suggestionsCommandView: ChatCommandSuggestionView.Type
- public var suggestionsHeaderReusableView: UICollectionReusableView.Type
+ public var suggestionsCollectionViewLayout: UICollectionViewLayout.Type
- public var suggestionsHeaderView: ChatSuggestionsHeaderView.Type
+ public var suggestionsHeaderReusableView: UICollectionReusableView.Type
- public var userAvatarView: ChatUserAvatarView.Type
+ public var suggestionsHeaderView: ChatSuggestionsHeaderView.Type
- public var isVoiceRecordingEnabled
+ public var userAvatarView: ChatUserAvatarView.Type
- public var isVoiceRecordingConfirmationRequiredEnabled
+ public var isVoiceRecordingEnabled
- public var voiceRecordingViewController: VoiceRecordingVC.Type
+ public var isVoiceRecordingConfirmationRequiredEnabled
- public var audioPlayer: AudioPlaying.Type
+ public var voiceRecordingViewController: VoiceRecordingVC.Type
- public var audioRecorder: AudioRecording.Type
+ public var audioPlayer: AudioPlaying.Type
- public var audioSessionFeedbackGenerator: AudioSessionFeedbackGenerator.Type
+ public var audioRecorder: AudioRecording.Type
- public var audioQueuePlayerNextItemProvider: AudioQueuePlayerNextItemProvider.Type
+ public var audioSessionFeedbackGenerator: AudioSessionFeedbackGenerator.Type
- public var currentUserAvatarView: CurrentChatUserAvatarView.Type
+ public var audioQueuePlayerNextItemProvider: AudioQueuePlayerNextItemProvider.Type
- public var isBlockingUsersEnabled
+ public var currentUserAvatarView: CurrentChatUserAvatarView.Type
- public var navigationVC: NavigationVC.Type
+ public var isBlockingUsersEnabled
- @available(iOSApplicationExtension, unavailable) public var channelListRouter: ChatChannelListRouter.Type
+ public var navigationVC: NavigationVC.Type
- public var messageListRouter: ChatMessageListRouter.Type
+ @available(iOSApplicationExtension, unavailable) public var channelListRouter: ChatChannelListRouter.Type
- public var alertsRouter: AlertsRouter.Type
+ public var messageListRouter: ChatMessageListRouter.Type
- public static var `default`
+ public var alertsRouter: AlertsRouter.Type
- @available(*, deprecated, renamed: "uploadingOverlayView") public var imageUploadingOverlay: UploadingOverlayView.Type
+ public static var `default`
-
+ @available(*, deprecated, renamed: "uploadingOverlayView") public var imageUploadingOverlay: UploadingOverlayView.Type
-
+
- public init()
+
+ public init()
open class SlideToCancelView: _View, ThemeProvider
- override open func updateContent()
+ override open func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
-
+ override open func updateContent()
-
+
- public struct Content: Equatable
+
-
+ public struct Content: Equatable
- public var alpha: CGFloat
+
-
+ public var alpha: CGFloat
-
+
- public init(alpha: CGFloat)
+
+ public init(alpha: CGFloat)
public class ChatMessageController: DataController, DelegateCallable, DataStoreProvider
- public func editMessage(text: String,skipEnrichUrl: Bool = false,attachments: [AnyAttachmentPayload] = [],restrictedVisibility: [UserId] = [],extraData: [String: RawJSON]? = nil,completion: ((Error?) -> Void)? = nil)
+ public func editMessage(text: String,skipEnrichUrl: Bool = false,skipPush: Bool = false,attachments: [AnyAttachmentPayload] = [],restrictedVisibility: [UserId] = [],extraData: [String: RawJSON]? = nil,completion: ((Error?) -> Void)? = nil)
- public func addReaction(_ type: MessageReactionType,score: Int = 1,enforceUnique: Bool = false,extraData: [String: RawJSON] = [:],completion: ((Error?) -> Void)? = nil)
+ public func addReaction(_ type: MessageReactionType,score: Int = 1,enforceUnique: Bool = false,skipPush: Bool = false,pushEmojiCode: String? = nil,extraData: [String: RawJSON] = [:],completion: ((Error?) -> Void)? = nil)
open class StreamAudioPlayer: AudioPlaying, AppStateObserverDelegate
-
+ public init(assetPropertyLoader: AssetPropertyLoading,audioSessionConfigurator: AudioSessionConfiguring)
-
+
- public func configure(_ audioSessionConfigurator: AudioSessionConfiguring)
+
- open func subscribe(_ subscriber: AudioPlayingDelegate)
+ public func configure(_ audioSessionConfigurator: AudioSessionConfiguring)
- open func loadAsset(from url: URL)
+ open func subscribe(_ subscriber: AudioPlayingDelegate)
- open func loadAsset(from url: URL,options: [String: Any]?)
+ open func loadAsset(from url: URL)
- open func play()
+ open func loadAsset(from url: URL,options: [String: Any]?)
- open func pause()
+ open func play()
- open func stop()
+ open func pause()
- open func updateRate(_ newRate: AudioPlaybackRate)
+ open func stop()
- open func seek(to time: TimeInterval)
+ open func updateRate(_ newRate: AudioPlaybackRate)
- open func applicationDidMoveToBackground()
+ open func seek(to time: TimeInterval)
- open func applicationDidMoveToForeground()
+ open func applicationDidMoveToBackground()
+ open func applicationDidMoveToForeground()
public struct CurrentUserUnreads
- public let unreadChannels: [UnreadChannel]
+ public let totalUnreadCountByTeam: [TeamId: Int]?
- public let unreadThreads: [UnreadThread]
+ public let unreadChannels: [UnreadChannel]
- public let unreadChannelsByType: [UnreadChannelByType]
+ public let unreadThreads: [UnreadThread]
+ public let unreadChannelsByType: [UnreadChannelByType]
open class StreamAudioSessionConfigurator: AudioSessionConfiguring
- public required convenience init()
+ public required init() |
Generated by 🚫 Danger |
Build for regression testing №123457080 has been uploaded to TestFlight 🎁 |
|
/merge release |
Publication of the release has been launched 👍 |
StreamChat
✅ Added
ChatThread.activeParticipantCount
#3731CurrentUserUnreads.totalUnreadCountByTeam
#3733StreamAudioPlayer
andStreamAudioSessionConfigurator
#3737skipPush
parameter toMessageController.editMessage()
#3738skipPush
andemojiCode
toMessageController.addReaction()
#3738Components.availableReactionsPushEmojis
for rendering emojis in reaction push notifications #3738Components.isReactionPushEmojisEnabled
to control whether an emoji should be set when adding a reaction #3738MessageNotificationContent.reaction
that can be used by Notification Service Extension #3738🐞 Fixed
IOSBackgroundTaskScheduler
with on entering callbacks #3751StreamChatUI
🐞 Fixed
GalleryVC
when using RTL layout #3745