Skip to content

Conversation

@Stream-SDK-Bot
Copy link
Collaborator

βœ… Added

  • Add toolbarThemed(content:) for creating custom views with themed navigation bar #953
  • Add support for downloading file attachments #952

🐞 Fixed

  • Fix updating back button tint with ColorPalette.navigationBarTintColor #953
  • Fix swipe to reply enabled when quoting a message is disabled #977
  • Fix composer not showing images in the composer when editing signed attachments #956
  • Fix replacing an image while editing a message not showing the new image in the message list #956
  • Improve precision when scrolling to the newest message with long text #958
  • Fix draft attachments being sent with local file urls to the server #964
  • Fix keyboard showing with attachment picker when editing a message #965
  • Fix race condition when clearing text in a regular TextField #955

πŸ”„ Changed

  • Change the gallery header view to show the message timestamp instead of online status #962

Stream Bot and others added 15 commits September 10, 2025 13:01
* Add `AttachmentDownloadingStateView` similar to the uploading one

* Add download and share button to `FileAttachmentView`

* Add download and share button to the Files List view as well

* Add feature flag to enable download of file attachments

* Add test coverage

* Update CHANGELOG.md

* Simlify conflict resolution

* Revise CHANGELOG format and add new entry

Updated the changelog format and added a new entry for file attachment downloads.

* Fix linting

* Fix more linting
* Fix message list not scrolling to newest message with long text

* Update CHANGELOG.md

* Fix not scrolling to bottom when sending a new message

* Improve name of the variable

* Fix tests
…of online status (#962)

* Change the gallery header view to show the message timestamp instead of online status

* Update CHANGELOG with recent fixes and changes

* [CI] Snapshots (#963)

Co-authored-by: Stream Bot <[email protected]>

---------

Co-authored-by: Stream SDK Bot <[email protected]>
Co-authored-by: Stream Bot <[email protected]>
…964)

* Fix draft attachments sent to the server with local file url

* Add test coverage

* Update CHANGELOG.md
)

* Fix keyboard showing with attachment picker when editing a message

* Update CHANGELOG.md
@Stream-SDK-Bot Stream-SDK-Bot requested a review from a team as a code owner September 22, 2025 18:17
@github-actions
Copy link

1 Warning
⚠️ Big PR

Generated by 🚫 Danger

@github-actions
Copy link

Public Interface

+ public final class GalleryHeaderViewDateFormatter: DateFormatter, @unchecked Sendable  
+ 
+   override public init()
+   
+ 
+   override public func string(from date: Date)-> String



 public struct MessageListConfig  
-   
+   public let downloadFileAttachmentsEnabled: Bool
- 
+   
-   public init(messageListType: MessageListType = .messaging,typingIndicatorPlacement: TypingIndicatorPlacement = .bottomOverlay,groupMessages: Bool = true,messageDisplayOptions: MessageDisplayOptions = MessageDisplayOptions(),messagePaddings: MessagePaddings = MessagePaddings(),dateIndicatorPlacement: DateIndicatorPlacement = .overlay,pageSize: Int = 25,messagePopoverEnabled: Bool = true,doubleTapOverlayEnabled: Bool = false,becomesFirstResponderOnOpen: Bool = false,resignsFirstResponderOnScrollDown: Bool = true,updateChannelsFromMessageList: Bool = false,maxTimeIntervalBetweenMessagesInGroup: TimeInterval = 60,cacheSizeOnChatDismiss: Int = 1024 * 1024 * 100,iPadSplitViewEnabled: Bool = true,scrollingAnchor: UnitPoint = .center,showNewMessagesSeparator: Bool = true,handleTabBarVisibility: Bool = true,messageListAlignment: MessageListAlignment = .standard,uniqueReactionsEnabled: Bool = false,localLinkDetectionEnabled: Bool = true,isMessageEditedLabelEnabled: Bool = true,markdownSupportEnabled: Bool = true,userBlockingEnabled: Bool = false,bouncedMessagesAlertActionsEnabled: Bool = true,skipEditedMessageLabel: @escaping (ChatMessage) -> Bool = { _ in false },draftMessagesEnabled: Bool = false)
+ 
+   public init(messageListType: MessageListType = .messaging,typingIndicatorPlacement: TypingIndicatorPlacement = .bottomOverlay,groupMessages: Bool = true,messageDisplayOptions: MessageDisplayOptions = MessageDisplayOptions(),messagePaddings: MessagePaddings = MessagePaddings(),dateIndicatorPlacement: DateIndicatorPlacement = .overlay,pageSize: Int = 25,messagePopoverEnabled: Bool = true,doubleTapOverlayEnabled: Bool = false,becomesFirstResponderOnOpen: Bool = false,resignsFirstResponderOnScrollDown: Bool = true,updateChannelsFromMessageList: Bool = false,maxTimeIntervalBetweenMessagesInGroup: TimeInterval = 60,cacheSizeOnChatDismiss: Int = 1024 * 1024 * 100,iPadSplitViewEnabled: Bool = true,scrollingAnchor: UnitPoint = .center,showNewMessagesSeparator: Bool = true,handleTabBarVisibility: Bool = true,messageListAlignment: MessageListAlignment = .standard,uniqueReactionsEnabled: Bool = false,localLinkDetectionEnabled: Bool = true,isMessageEditedLabelEnabled: Bool = true,markdownSupportEnabled: Bool = true,userBlockingEnabled: Bool = false,bouncedMessagesAlertActionsEnabled: Bool = true,skipEditedMessageLabel: @escaping (ChatMessage) -> Bool = { _ in false },draftMessagesEnabled: Bool = false,downloadFileAttachmentsEnabled: Bool = false)

 public struct GalleryView: View  
-   public init(viewFactory: Factory = DefaultViewFactory.shared,imageAttachments: [ChatMessageImageAttachment],author: ChatUser,isShown: Binding<Bool>,selected: Int)
+   public init(viewFactory: Factory = DefaultViewFactory.shared,imageAttachments: [ChatMessageImageAttachment],author: ChatUser,isShown: Binding<Bool>,selected: Int,message: ChatMessage? = nil)
-   public init(viewFactory: Factory = DefaultViewFactory.shared,mediaAttachments: [MediaAttachment],author: ChatUser,isShown: Binding<Bool>,selected: Int)
+   public init(viewFactory: Factory = DefaultViewFactory.shared,mediaAttachments: [MediaAttachment],author: ChatUser,isShown: Binding<Bool>,selected: Int,message: ChatMessage? = nil)

- public struct MediaAttachment: Identifiable  
+ public struct MediaAttachment: Identifiable, Equatable  
+   
+ 
+   public static func ==(lhs: MediaAttachment,rhs: MediaAttachment)-> Bool

 public class Utils  
-   public var videoPreviewLoader: VideoPreviewLoader
+   public var galleryHeaderViewDateFormatter: DateFormatter
-   public var imageLoader: ImageLoading
+   public var videoPreviewLoader: VideoPreviewLoader
-   public var imageCDN: ImageCDN
+   public var imageLoader: ImageLoading
-   public var imageProcessor: ImageProcessor
+   public var imageCDN: ImageCDN
-   public var imageMerger: ImageMerging
+   public var imageProcessor: ImageProcessor
-   public var fileCDN: FileCDN
+   public var imageMerger: ImageMerging
-   public var channelNamer: ChatChannelNamer
+   public var fileCDN: FileCDN
-   public var chatUserNamer: ChatUserNamer
+   public var channelNamer: ChatChannelNamer
-   public var channelAvatarsMerger: ChannelAvatarsMerging
+   public var chatUserNamer: ChatUserNamer
-   public var messageTypeResolver: MessageTypeResolving
+   public var channelAvatarsMerger: ChannelAvatarsMerging
-   public var messageActionsResolver: MessageActionsResolving
+   public var messageTypeResolver: MessageTypeResolving
-   public var messagePreviewFormatter: MessagePreviewFormatter
+   public var messageActionsResolver: MessageActionsResolving
-   public var commandsConfig: CommandsConfig
+   public var messagePreviewFormatter: MessagePreviewFormatter
-   public var channelListConfig: ChannelListConfig
+   public var commandsConfig: CommandsConfig
-   public var messageListConfig: MessageListConfig
+   public var channelListConfig: ChannelListConfig
-   public var composerConfig: ComposerConfig
+   public var messageListConfig: MessageListConfig
-   public var pollsConfig: PollsConfig
+   public var composerConfig: ComposerConfig
-   public var shouldSyncChannelControllerOnAppear: (ChatChannelController) -> Bool
+   public var pollsConfig: PollsConfig
-   public var snapshotCreator: SnapshotCreator
+   public var shouldSyncChannelControllerOnAppear: (ChatChannelController) -> Bool
-   public var messageIdBuilder: MessageIdBuilder
+   public var snapshotCreator: SnapshotCreator
-   public var sortReactions: (MessageReactionType, MessageReactionType) -> Bool
+   public var messageIdBuilder: MessageIdBuilder
-   public var channelHeaderLoader: ChannelHeaderLoader
+   public var sortReactions: (MessageReactionType, MessageReactionType) -> Bool
-   public var videoDurationFormatter: VideoDurationFormatter
+   public var channelHeaderLoader: ChannelHeaderLoader
-   public var audioRecordingNameFormatter: AudioRecordingNameFormatter
+   public var videoDurationFormatter: VideoDurationFormatter
-   public var audioPlayerBuilder: () -> AudioPlaying
+   public var audioRecordingNameFormatter: AudioRecordingNameFormatter
-   public var audioPlayer: AudioPlaying
+   public var audioPlayerBuilder: () -> AudioPlaying
-   public var audioRecorderBuilder: () -> AudioRecording
+   public var audioPlayer: AudioPlaying
-   public var audioRecorder: AudioRecording
+   public var audioRecorderBuilder: () -> AudioRecording
-   public lazy var audioSessionFeedbackGenerator: AudioSessionFeedbackGenerator
+   public var audioRecorder: AudioRecording
-   public var originalTranslationsStore
+   public lazy var audioSessionFeedbackGenerator: AudioSessionFeedbackGenerator
-   public static var defaultSortReactions: (MessageReactionType, MessageReactionType) -> Bool
+   public var originalTranslationsStore
-   
+   public static var defaultSortReactions: (MessageReactionType, MessageReactionType) -> Bool
- 
+   
-   public init(dateFormatter: DateFormatter = .makeDefault(),messageRelativeDateFormatter: DateFormatter = MessageRelativeDateFormatter(),videoPreviewLoader: VideoPreviewLoader = DefaultVideoPreviewLoader(),imageLoader: ImageLoading = NukeImageLoader(),imageCDN: ImageCDN = StreamImageCDN(),imageProcessor: ImageProcessor = NukeImageProcessor(),imageMerger: ImageMerging = DefaultImageMerger(),fileCDN: FileCDN = DefaultFileCDN(),channelAvatarsMerger: ChannelAvatarsMerging = ChannelAvatarsMerger(),messageTypeResolver: MessageTypeResolving = MessageTypeResolver(),messageActionResolver: MessageActionsResolving = MessageActionsResolver(),messagePreviewFormatter: MessagePreviewFormatter = MessagePreviewFormatter(),commandsConfig: CommandsConfig = DefaultCommandsConfig(),channelListConfig: ChannelListConfig = ChannelListConfig(),messageListConfig: MessageListConfig = MessageListConfig(),composerConfig: ComposerConfig = ComposerConfig(),pollsConfig: PollsConfig = PollsConfig(),channelNamer: @escaping ChatChannelNamer = DefaultChatChannelNamer(),chatUserNamer: ChatUserNamer = DefaultChatUserNamer(),snapshotCreator: SnapshotCreator = DefaultSnapshotCreator(),messageIdBuilder: MessageIdBuilder = DefaultMessageIdBuilder(),channelHeaderLoader: ChannelHeaderLoader = ChannelHeaderLoader(),videoDurationFormatter: VideoDurationFormatter = DefaultVideoDurationFormatter(),audioRecordingNameFormatter: AudioRecordingNameFormatter = DefaultAudioRecordingNameFormatter(),sortReactions: @escaping (MessageReactionType, MessageReactionType) -> Bool = Utils.defaultSortReactions,shouldSyncChannelControllerOnAppear: @escaping (ChatChannelController) -> Bool = { _ in true })
+ 
+   public init(dateFormatter: DateFormatter = .makeDefault(),messageRelativeDateFormatter: DateFormatter = MessageRelativeDateFormatter(),galleryHeaderViewDateFormatter: DateFormatter = GalleryHeaderViewDateFormatter(),videoPreviewLoader: VideoPreviewLoader = DefaultVideoPreviewLoader(),imageLoader: ImageLoading = NukeImageLoader(),imageCDN: ImageCDN = StreamImageCDN(),imageProcessor: ImageProcessor = NukeImageProcessor(),imageMerger: ImageMerging = DefaultImageMerger(),fileCDN: FileCDN = DefaultFileCDN(),channelAvatarsMerger: ChannelAvatarsMerging = ChannelAvatarsMerger(),messageTypeResolver: MessageTypeResolving = MessageTypeResolver(),messageActionResolver: MessageActionsResolving = MessageActionsResolver(),messagePreviewFormatter: MessagePreviewFormatter = MessagePreviewFormatter(),commandsConfig: CommandsConfig = DefaultCommandsConfig(),channelListConfig: ChannelListConfig = ChannelListConfig(),messageListConfig: MessageListConfig = MessageListConfig(),composerConfig: ComposerConfig = ComposerConfig(),pollsConfig: PollsConfig = PollsConfig(),channelNamer: @escaping ChatChannelNamer = DefaultChatChannelNamer(),chatUserNamer: ChatUserNamer = DefaultChatUserNamer(),snapshotCreator: SnapshotCreator = DefaultSnapshotCreator(),messageIdBuilder: MessageIdBuilder = DefaultMessageIdBuilder(),channelHeaderLoader: ChannelHeaderLoader = ChannelHeaderLoader(),videoDurationFormatter: VideoDurationFormatter = DefaultVideoDurationFormatter(),audioRecordingNameFormatter: AudioRecordingNameFormatter = DefaultAudioRecordingNameFormatter(),sortReactions: @escaping (MessageReactionType, MessageReactionType) -> Bool = Utils.defaultSortReactions,shouldSyncChannelControllerOnAppear: @escaping (ChatChannelController) -> Bool = { _ in true })

@Stream-SDK-Bot
Copy link
Collaborator Author

SDK Size

title previous release current release diff status
StreamChatSwiftUI 9.35 MB 9.43 MB +88 KB 🟒

@github-actions
Copy link

Build for regression testing β„–125 has been uploaded to TestFlight 🎁

@sonarqubecloud
Copy link

@nuno-vieira
Copy link
Member

/merge release

@testableapple
Copy link
Contributor

Publication of the release has been launched πŸ‘

@github-actions github-actions bot merged commit 7e1f373 into main Sep 22, 2025
12 checks passed
@github-actions github-actions bot deleted the release/4.89.0 branch September 22, 2025 19:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants