Skip to content

5.0.0 Release#1422

Merged
github-actions[bot] merged 62 commits intomainfrom
release/5.0.0
Apr 16, 2026
Merged

5.0.0 Release#1422
github-actions[bot] merged 62 commits intomainfrom
release/5.0.0

Conversation

@Stream-SDK-Bot
Copy link
Copy Markdown
Collaborator

βœ… Added

  • Redesign attachment uploading progress and error state indicators #1408
  • Add inline upload progress and retry UI for file attachments #1408
  • Add RetryBadgeView for failed uploads and thumbnail loads #1408
  • Add ComposerConfig.isVoiceRecordingAutoSendEnabled to support sending a recording instantly on release #1362
  • Redesign JumpToUnreadButton #1351
  • Show deleted messages in channel list preview #1338
  • Update deleted message design in the message list #1349
  • Redesign new messages divider in the message list #1354
  • Redesign the thread replies divider in the message replies list #1354

🐞 Fixed

  • Fix attachment downloads not using CDN requester for URL signing and custom headers #1399
  • Fix empty share sheet when sharing a video from the full-screen media viewer #1418
  • Fix swipe-to-reply icon layout for outgoing messages and RTL #1402
  • Fix unwanted border on the Edit button in Channel Info #1402
  • Fix send button icon not mirroring in RTL layouts #1397
  • Fix composer attachment picker prompt views layout to center all content vertically #1397
  • Fix poll icon inconsistency in the attachment type picker and attachment previews #1397
  • Fix voice recording attachment container rendering when quoting a message #1388
  • Fix annotation button colors in the reactions overlay #1386
  • Fix error indicator position and styling to match v5 design #1383
  • Fix scroll to bottom button not working when the message list is actively scrolling #1380
  • Fix timestamp snapping back faster than delivery indicator on swipe-to-reply #1360
  • Fix tapping a non-first media attachment always opening the first item on initial tap #1359
  • Pinned message label now shows "Pinned by you" when the current user pinned the message #1329
  • Fix single media attachment without sharp tail corner when no caption #1330
  • Fix editing a voice message removing the voice recording attachment #1327
  • Fix hold-and-release mic gesture not sending the voice message immediately #1327
  • Fix voice message playback state and waveform slider updates #1327
  • Fix split view navigation on iPad #1320
  • Fix rendering 1:1 direct message avatars and presence indicators #1332
  • Fix giphy previews in the channel list and quote replies #1333
  • Fix black borders on image preview in composer when editing or quoting a message #1334
  • Fix quoted image preview not updating when switching to a different quoted message #1334
  • Use fixed width for attachment previews #1335
  • Fix showing bubble for quoted message and file or image attachment #1335
  • Fix scaling of giphy attachments #1335
  • Fix spacings in message annotations #1403

πŸ”„ Changed

  • Rename AddUsersView/AddUsersViewModel to MemberAddView/MemberAddViewModel #1402
  • Unify Channel Info navigation headers styling #1402
  • Renamed the onMessageSent callback to willSendMessage in MessageComposerViewModel, ViewModelsFactory, and ComposerViewFactoryOptions #1327
  • Remove InjectedChannelInfo from ChatChannelListItemView #1338
  • Rename empty state views from No prefix to Empty prefix #1345
  • Migrate all the old color tokens to new color tokens #1350
  • Replace LinkDetectionTextView with StreamTextView that uses ChatMessage.attributedTextContent(layoutDirection:translationLanguage:) #1411

Stream Bot and others added 30 commits March 23, 2026 13:41
* Show "Pinned by you" when the current user pinned a message

When the current user pins a message, the pinned annotation label
now shows "Pinned by you" instead of "Pinned by [user name]".

Made-with: Cursor

* Update CHANGELOG with pinned-by-you fix

Made-with: Cursor
* Preserve voice when editing messages

Allow voice attachments to map into the composer when duration or waveform
metadata is missing, and always leave the conversion dispatch group.

Tests: MessageAttachmentsConverter_Tests.test_attachmentsToAssets_voiceRecordingWithoutWaveformOrDuration

* Send voice immediately on hold-release

Stop treating finger-up as lock: finalize recording and auto-send once the
file is ready. Wire the composer to invoke the same path as manual send.

Tests: MessageComposerViewModel_Tests hold-gesture auto-send flag coverage
Made-with: Cursor

* Align voice waveform scrubber with duration

Use consistent duration/currentTime for the locked preview bar and clamp
message-list waveform content to the reported asset length.

Made-with: Cursor

* Reset voice time label after playback ends

Show total duration again when the player reports a stopped state (including
after natural finish) in the message list and composer preview.

Made-with: Cursor

* Move sendMessage() from MessageComposerView to the view model

* Fix voice recording showing elapsed time and not remaining time

* Update Agents File

* Run swiftformat

* Update Changelog

* Fix the slider thumb not starting in the actual beginning of the wave form

* Fix playback rate state not kept when restarting audio recording

* Fix the changing rate affecting other audios

* Update changelog

* Add animations when releasing or discarding voice recording

* Reduce changelog entries

* Fix swiftformat

* Improve the namings of the voice recording closures

* FIx snapshot tests

* Update CHANGELOG.md
* Reapply "Fix navigation issues on iPad (#1305)"

* Do not use NavigationLink within channel list item when presenting channel list with NavigationSplitView
…caption (#1330)

* Render sharp tail corner on single media attachments without caption

When a message has a single image or video attachment with no text caption,
the bottom corner on the sender's side is now rendered sharp (0 radius)
to visually distinguish caption-less media from captioned media, matching
the Figma design spec.

- Add per-corner clipping support to MessageMediaAttachmentContentView
- Detect single-media-without-caption in MessageMediaAttachmentsContainerView
  and apply bubble corners + border overlay
- Pass isFirst to the container from the factory
- Add snapshot tests for outgoing/incoming, first/non-first, portrait,
  video, and captioned variants
- Re-record affected existing snapshot references

[IOS-1518]

Made-with: Cursor

* Update CHANGELOG for IOS-1518 sharp tail corner fix

Made-with: Cursor

* Update CHANGELOG.md

* Consolidate no-caption corner logic into mediaCell per review feedback

Move the sharp-tail-corner and border overlay logic directly into
mediaCell instead of a separate singleMediaCellWithoutCaption branch,
so a single code path handles both cases. Re-record all affected
multi-item gallery snapshot references.

Made-with: Cursor

* Some minor cleanup
* Fix quoting giphy shows camera icon and "Photo" text

Giphy attachments were incorrectly grouped with image attachments in
the attachment preview resolver, causing quoted giphy messages to
display a camera icon with "Photo" text instead of a document icon
with "Giphy" text.

- Add `.giphy` case to `MessageAttachmentPreviewKind`
- Handle giphy attachments separately from images in the resolver
- Map giphy preview icon to `.document` and description to "Giphy"
- Add snapshot tests for quoted giphy in message list and composer

[IOS-1530]

Made-with: Cursor

* Fix channel list giphy preview shows "/giphy" text

The channel list preview for giphy messages was showing the raw
"/giphy" command text instead of a localized "Giphy" label. Updated
the message preview formatter to use a proper localized string and
added the `channel.item.giphy` localization key.

- Change giphy case in `MessagePreviewFormatter` to return "Giphy"
- Add `channel.item.giphy` to `Localizable.strings` and `L10n.swift`
- Add channel list snapshot tests for giphy preview messages

[IOS-1531]

Made-with: Cursor

* Update CHANGELOG for giphy preview fixes

Made-with: Cursor

* Update CHANGELOG.md

* test: re-record thread attachments snapshot
…ign (#1338)

* Redesign channel preview for deleted message

* Add channel preview for pending messages

* Update channel preview error message

* Update channel preview deleted message for current user

* Fix showing ephemeral giphy messages as part of the preview

* Remove `InjectedChannelInfo`

* Update empty mesasages localization according to Figma

* Add archive UI to swipe actions

* Fix demo app channel list item

* Revert "Add archive UI to swipe actions"

This reverts commit c2482f8.

* Switch to remote SDK dependency

* Re-record ChatChannelListView snapshot tests

Update reference images to reflect channel list item changes
(deleted message display, swipe actions redesign, empty state text).

* Fix xcodeproject

* Update changelog

* Fix redudant if-statement

* [CI] Snapshots (#1339)

Co-authored-by: Stream Bot <ci@getstream.io>

* Update E2E tests for deleted message channel preview

Deleted messages now intentionally show in the channel preview
as "Message deleted" instead of falling back to the previous
message. Update assertions and remove the XCTSkip.

* Fix typo in deleted message for E2E Test

* Fix message deleted E2E Test

* Change stream-chat-swift branch to 'develop'

* Fix missing previewMessage parameter in test ChatChannel initializer

* Fix previewMessage parameter in test ChatChannel initializer

---------

Co-authored-by: Stream SDK Bot <60655709+Stream-SDK-Bot@users.noreply.github.com>
Co-authored-by: Stream Bot <ci@getstream.io>
* Rename all empty views with Empty prefix

* Update CHANGELOG with empty views renaming entry

* Update CHANGELOG.md
* Update deleted message design to match Figma spec

- Add nosign icon before "Message deleted" text
- Use standard message text color instead of low emphasis gray
- Remove "Only visible to you" footer from deleted messages
- Show delivery status (read indicator + timestamp) for deleted messages
- Update textColor(for:) to no longer special-case deleted messages
- Add snapshot test for deleted message container with delivery status
- Re-record deleted message snapshot reference image

Closes IOS-1505

* Update CHANGELOG with deleted message design fix

* Update CHANGELOG.md

* Fix E2E Tests
* Redesign `JumpToUnreadButton`

* Move jump-to-unread layout wrapper from factory into MessageListView

The VStack/Spacer/padding that positions the button belongs to the
message list layout, not the factory-provided component itself.

* Add animation when showing and hiding the unread button overlay

* Cleanup the code a bit

* Use regular weight for the arrow-up icon and re-record snapshots

* Update changelog

* Add Accessibility label

* Introduce `JumpToUnreadButtonOverlayModifier` to make it more flexible to customize

* Re-record unread indicator snapshot after overlay refactoring

* Fix snapshot tests
* Redesign `NewMessagesIndicator` to match Figma spec

- Use design tokens for spacing, colors, and typography
- Add top/bottom border with borderCoreSubtle
- Update text from "New messages" to "Unread messages"
- Add standalone snapshot test for the indicator

* Add thread replies separator and extract `MessageListDivider`

- Extract reusable `MessageListDivider` from `NewMessagesIndicator`
- Refactor `NewMessagesIndicator` to use `MessageListDivider`
- Add thread replies separator between parent message and replies
- Update `message.threads.count` localization to use lowercase format
- Add snapshot tests for divider, indicator, and thread separator

* Update CHANGELOG

* Apply suggestion from @nuno-vieira

* Apply suggestion from @nuno-vieira

* Hide thread replies separator when not all replies are loaded

* Rename `NewMessagesIndicator` to `NewMessagesDivider` and extract `ThreadRepliesDivider`

* Rename factory methods and add `makeThreadRepliesDividerView`

* Remove deprecated typealiases

* Fix accessivlity trait

* Fix snapshot tests

* Fix swift format

* Fix snapshot tests

---------

Co-authored-by: Martin Mitrevski <martinmitrevski.oh@gmail.com>
#1359)

* Fix media gallery attachment not opening the correct item on first tap

* Update changelog with media gallery fix PR link
* Fix timestamp snapping back faster than delivery indicator on swipe-to-reply

The deprecated `.animation(nil)` modifier on `MessageDateView` was
stripping the animation transaction for all property changes, causing
the timestamp to jump instantly while the rest of the message animated
with the swipe-to-reply spring curve. Scoping it to
`.animation(nil, value: text)` only suppresses animation on text
content changes while allowing positional animations to propagate.

* Update CHANGELOG.md
…1362)

* Add `ComposerConfig.isVoiceRecordingAutoSendEnabled` and disable it by default

* Add voice recording auto-send toggle to Demo App configuration

Allows toggling `isVoiceRecordingAutoSendEnabled` from the app
configuration screen so the behavior can be tested at runtime.

* Show recording tip depending on if auto send is enabled or not

* Add test coverage

* Update CHANGELOG for #1362

* Apply suggestion from @nuno-vieira

* Fix snapshot test
martinmitrevski and others added 17 commits April 8, 2026 18:19
* UI Fixes in the media viewer

* [CI] Snapshots (#1396)

Co-authored-by: Stream Bot <ci@getstream.io>

---------

Co-authored-by: Stream SDK Bot <60655709+Stream-SDK-Bot@users.noreply.github.com>
Co-authored-by: Stream Bot <ci@getstream.io>
Co-authored-by: Nuno Vieira <nuno.fcvieira93@gmail.com>
Co-authored-by: Nuno Vieira <nuno.fcvieira93@gmail.com>
… poll icon consistency (#1397)

* Add RTL support for send icon

* Update AttachmentPickerPromptView Design

* Update poll icons to SF Symbol one

* Update channel list item attachment preview icon size

* Update snapshot tests

* Update changelog
…1398)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Nuno Vieira <nuno-vieira@users.noreply.github.com>
Bumps [rack-session](https://github.com/rack/rack-session) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/rack/rack-session/releases)
- [Changelog](https://github.com/rack/rack-session/blob/main/releases.md)
- [Commits](rack/rack-session@v2.1.1...v2.1.2)

---
updated-dependencies:
- dependency-name: rack-session
  dependency-version: 2.1.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Toomas Vahter <toomas.vahter@getstream.io>
…er, and swipe-to-reply (#1402)

* Fix swipe to reply icon for outgoing message not shifted to the right

* Fix swipe to reply gesture for RTL

* Update MediaViewer design according to Figma

* Add support for customizing Media Viewer footer

* Re-record snapshots

* Fix border in Edit button in ChannelInfoView

* Update AddUsersView navigation bar to be consistent with the rest of the SDK

* Update the navigation bar on the MemberListView as well

* Rename member views

* Update changelog

* Update the stream-chat commit to remote LLC develop

* PR Feedback changes
* Update uploading progress indicator for attachements

* Refactor into one view

* Fix loading spinner not shown for videos

* Add retry icon view

* Retry sending message when tapping retry badge view

* Fix shimerring effect when attachment fails to load

* Remove anused code

* Create seperate file for RetryBadgeView.

* Refactor RetryBadgeView

* Add test coverage

* Re-record snapshots

* Upload file attachments uploading and error states

* Reuse FileAttachmentDisplayView

* Update changelog for attachment state redesign

* Remove extra changelog entries

* Remove redundant snapshot tests

* Fix SwiftFormat indentation in LoadingSpinnerView
* Replace old ImageCDN/FileCDN/ImageLoading with unified CDN/ImageLoader/VideoLoader

Remove old protocols duplicated from StreamChatUI:
- ImageCDN, StreamImageCDN, FileCDN, DefaultFileCDN
- ImageLoading, NukeImageLoader, VideoPreviewLoader

Replace with unified types from StreamChatCommonUI:
- Utils.imageLoader now uses ImageLoader (StreamImageLoader)
- Utils.videoLoader now uses VideoLoader (StreamVideoLoader)
- CDN from StreamChat handles URL signing for files/images
- Update StreamAsyncImage, LazyImageExtensions, and Utils

* Update view models and views to use new CDN/loader APIs

- FileAttachmentPreview and MediaViewer use CDN.fileRequest instead of FileCDN
- MediaAttachment uses ImageLoader and VideoLoader directly
- MessageComposerViewModel uses simplified ImageLoader API
- MoreChannelActionsViewModel drops imageCDN dependency

* Update test mocks and tests for new loader protocols

- Replace ImageLoader_Mock to conform to ImageLoader
- Replace VideoPreviewLoader_Mock with VideoLoader_Mock
- Update test setup to use videoLoader instead of videoPreviewLoader
- Remove ImageCDN_Tests (replaced by StreamCDN_Tests in stream-chat-swift)
- Update VideoPreviewLoader_Tests for new VideoLoader protocol

* Use local stream-chat-swift dependency for development

Point Package.swift and xcodeproj to local ../stream-chat-swift path
for development and testing of the unified CDN refactoring.

* Add NukeImageDownloader and update Utils for ImageDownloading protocol

Provide NukeImageDownloader as the ImageDownloading backend for SwiftUI,
keeping Nuke vendored in this repo while sharing loader logic via CommonUI.
Update Utils to pass NukeImageDownloader to StreamImageLoader.

* Apply CDN transformations in LazyImage extensions

Restore CDN URL transformation (headers, signing, caching key) in the
LazyImage convenience initializers. The CDN completion is captured
synchronously -- for StreamCDN (which completes inline) the full
CDNRequest is used; async CDNs fall back to the raw URL gracefully.

* Add StreamLazyImage wrappers with CDN support

Replace direct LazyImage usage with StreamLazyImage and
StreamLazyContentImage wrappers that resolve CDN transformations
asynchronously via @injected dependencies before passing the
request to Nuke's LazyImage.

* Rename NukeImageDownloader and NukeImageProcessor to Stream prefix

Rename to StreamImageDownloader and StreamImageProcessor to decouple
public API naming from the Nuke dependency.

* Unify StreamAsyncImage as the single image-loading view

Merge StreamLazyContentImage, StreamLazyImage, and StreamAsyncImage
into a single StreamAsyncImage view that handles all image loading.

- CDN transformations resolved async via @injected dependencies
- StreamAsyncImageResult carries UIImage, isAnimated flag, and raw
  animated data for GIF rendering without exposing Nuke types
- Nuke coupling isolated to a single private method (loadWithNuke)
  for easy replacement when removing the Nuke dependency
- Delete LazyImageExtensions.swift (no longer needed)
- Update all call sites: avatars, link previews, giphy attachments
- AnimatedGifView now takes raw Data instead of Nuke ImageContainer

* Fix tests

* Remove maxAttachmentSize from CDNStorage protocol

* Introduce options parameters to the CDNStorage and CDNRequester

* Add remote dependency

* Fix CGSize

* Re-record snapshot for date overlay test on iOS 26.2

* Re-record voice recording snapshot tests for iOS 26.2

* Fix flaky date overlay snapshot test by using same-day timestamps

* Fix swiftformat

* Fix attachment downloads not using CDN requester for URL signing and custom headers

* Adopt unified MediaLoader protocol replacing separate ImageLoader and VideoLoader

- Replace imageLoader + videoLoader with single mediaLoader in Utils
- Update all views and view models to use utils.mediaLoader
- Rename loadPreview to loadVideoPreview for clarity
- Update test mocks and tests for MediaLoader conformance
- Update Package.resolved to latest LLC commit

* Adopt MediaLoader wrapper result types and async videoAsset

- Update call sites to use MediaLoaderImage, MediaLoaderVideoPreview
- Update all test mocks to conform to new MediaLoader signatures
- Update SPM dependency to latest LLC commit

* Access cdnRequester through config instead of ChatClient

Aligns with the removal of cdnRequester/cdnStorage from ChatClient.
All SwiftUI call sites now use chatClient.config.cdnRequester.

* Minor cleanups

* Use commit instead of branch

* Use better task identity in StreamAsyncImage

* Fix type mismatch in VideoPreviewLoader tests

Change receivedImage (UIImage?) to receivedPreview (MediaLoaderVideoPreview?)
to match the actual return type of result.get() from loadVideoPreview.

* Address PR review comments

- Merge ImageLoader_Mock and VideoLoader_Mock into a single
  MediaLoader_Mock, consolidating all tracking properties
- Extract Nuke-specific image loading logic from StreamAsyncImage
  into NukeImageLoader internal helper
- Update all test references to use MediaLoader_Mock

* Make sure cache is always used first

* Make initial phase success in StreamAsyncImage in case the image is available in cache

* Remove Image Processor from SwiftUI since it is not used now

* Fix MediaLoader tests naming

* Fix swiftformat

* Remove throwaway AVPlayer in StreamVideoPlayer

The code was creating and starting an AVPlayer before asking
avPlayerProvider for another player, doubling setup/network
work and briefly swapping the active player mid-playback.
Now only the provider-produced player is used.

* Pass CDN headers to AVPlayerProvider for authenticated playback

Add headers parameter to AVPlayerProvider.player(for:headers:completion:)
so CDN authentication headers from cdnRequester.fileRequest() are
propagated to the player. DefaultAVPlayerProvider uses AVURLAsset with
the headers when available. A default extension preserves backwards
compatibility for existing conformers.

* Add unit tests for NukeImageLoader

Cover the key paths: cachedResult returns nil when no key is stored,
loadImage calls CDN requester with correct URL, onCacheMiss fires on
cache miss, cache hit after CDN transform skips onCacheMiss, and
cachingKeyMap persists across load + cachedResult calls.

* Add unit tests for StreamImageDownloader

Verify error handling for invalid URLs, and that all
ImageDownloadingOptions combinations (headers, cachingKey,
resize, zero resize) are accepted without crash.

* Add fallback branch tests for maxAttachmentSize

Cover the cases where appSettings is nil, server limit is zero,
and server limit is negative β€” all should return the fallbackSize.

* Add loadImage and loadImages tests for StreamMediaLoader

Cover loadImage success, nil URL error, error propagation from
downloader, loadImages returning correct count, and loadImages
using placeholders on failure.

* Unify video loading via MediaLoader and simplify AVPlayerProvider

Replace manual CDN + AVPlayerProvider flow in StreamVideoPlayer with
MediaLoader.loadVideoAsset(). Simplify AVPlayerProvider to accept
MediaLoaderVideoAsset instead of raw URL + headers. Rename videoAsset
to loadVideoAsset for consistency with other MediaLoader methods.

* Make media loader mock the only mock

* Make StreamImageDownloader final Sendable

* Fix swiftformat

* Update LLC dependency to latest commit

* Rename LazyImageExtensions_Tests.swift to StreamAsyncImage_Tests.swift

Align file name with the test class StreamAsyncImage_Tests it contains.
Also rename test_mediaAttachment_generateThumbnail_callsImageLoader to
reference MediaLoader instead of the removed ImageLoader.

* Fix StreamAsyncImage doc comment referencing non-existent ImageLoader

Update the doc comment to reference MediaLoader and CDNRequester which
are the actual protocols used by this view.

* Update LLC commit

* Use attachment-based video preview loading

Update MediaAttachment and tests to use the attachment-based
loadVideoPreview(with:) instead of the removed URL variant,
enabling thumbnail URL optimization for remote video previews.

* Update LLC dependency and add loadVideoAsset to test conformers

Update to LLC commit that removes the default loadVideoAsset
implementation from MediaLoader, requiring all conformers to
provide explicit implementations.

* Use Utils.cdnRequester instead of ChatClientConfig

Move CDN requester access from chatClient.config.cdnRequester to
utils.cdnRequester, matching the UIKit pattern where it lives in
Components. The download attachment flow now resolves CDN URLs at the
UI layer before calling the core download function.

* Fix cdnrequester tests

* Remove unecessary stream image downloader tests

* Add NukeImageLoader_Tests to project file

* Minor fixes

* Minor review fixes

* Fix load preview mocks

* Update LLC dependency

* Remove unecessary test

* Fix media viewer tests

* [CI] Print verbose logs on old xcode job

* Revert "[CI] Print verbose logs on old xcode job"

This reverts commit 6ee5138.

* Bump Xcode version for old Xcode job

* Revert "Bump Xcode version for old Xcode job"

This reverts commit 286c240.

* Update dependency to develop

* Update dependency again

* [CI] Snapshots (#1420)

Co-authored-by: Stream Bot <ci@getstream.io>

---------

Co-authored-by: Alexey Alter-Pesotskiy <alex@testableapple.com>
Co-authored-by: Stream SDK Bot <60655709+Stream-SDK-Bot@users.noreply.github.com>
Co-authored-by: Stream Bot <ci@getstream.io>
@Stream-SDK-Bot Stream-SDK-Bot requested a review from a team as a code owner April 16, 2026 16:15
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 16, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

βš™οΈ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c64b1c6f-78d2-4ead-9667-a146d3becc7e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • πŸ” Trigger review
✨ Finishing Touches
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/5.0.0

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.

❀️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

1 Warning
⚠️ Big PR

Generated by 🚫 Danger

@github-actions
Copy link
Copy Markdown

Public Interface

+ public struct MediaViewerToolbarModifier: ViewModifier  
+ 
+   public init(title: String,subtitle: String,isShown: Binding<Bool>)
+   
+ 
+   public func body(content: Content)-> some View

+ public final class MemberAddOptions: Sendable  
+ 
+   public let loadedUserIds: [String]
+   
+ 
+   public init(loadedUserIds: [String])

+ public final class EmptyThreadsViewOptions: Sendable  
+ 
+   public init()

+ public struct LiquidGlassBorderlessModifier: ViewModifier  
+ 
+   public init(shape: BackgroundShape,isInteractive: Bool = false)
+   
+ 
+   public func body(content: Content)-> some View

+ public struct RetryBadgeView: View  
+ 
+   public var body: some View
+   
+ 
+   public init()

+ public struct EmptyChannelsView: View  
+ 
+   public var body: some View

+ public struct MediaViewerFooterView: View  
+ 
+   public var body: some View
+   
+ 
+   public init(shareContent: [UIImage],shareFallbackURL: URL? = nil,selected: Int,totalCount: Int,gridShown: Binding<Bool>)

+ public struct JumpToUnreadButtonOverlayModifier: ViewModifier  
+ 
+   public func body(content: Content)-> some View

+ public final class MemberAddViewOptions: Sendable  
+ 
+   public let options: MemberAddOptions
+   public let onConfirm: @MainActor ([ChatUser]) -> Void
+   
+ 
+   public init(options: MemberAddOptions,onConfirm: @escaping @MainActor ([ChatUser]) -> Void)

+ public struct EmptyThreadsView: View  
+ 
+   public var body: some View
+   
+ 
+   public init()

+ public final class MediaViewerFooterViewOptions: Sendable  
+ 
+   public let shareContent: [UIImage]
+   public let shareFallbackURL: URL?
+   public let selected: Int
+   public let totalCount: Int
+   public let gridShown: Binding<Bool>
+   
+ 
+   public init(shareContent: [UIImage],shareFallbackURL: URL? = nil,selected: Int,totalCount: Int,gridShown: Binding<Bool>)

+ public struct MessageListDivider: View  
+ 
+   public var body: some View
+   
+ 
+   public init(title: String)

+ public struct NewMessagesDivider: View  
+ 
+   public var body: some View
+   
+ 
+   public init(newMessagesStartId: Binding<String?>,count: Int)

+ public final class MediaViewerToolbarModifierOptions: Sendable  
+ 
+   public let title: String
+   public let subtitle: String
+   public let isShown: Binding<Bool>
+   
+ 
+   public init(title: String,subtitle: String,isShown: Binding<Bool>)

+ public final class EmptyChannelsViewOptions: Sendable  
+ 
+   public init()

+ public struct MemberAddView: View  
+ 
+   public var body: some View
+   
+ 
+   public init(factory: Factory = DefaultViewFactory.shared,loadedUserIds: [String],onConfirm: @escaping @MainActor ([ChatUser]) -> Void)

+ public final class ThreadRepliesDividerViewOptions: Sendable  
+ 
+   public let replyCount: Int
+   
+ 
+   public init(replyCount: Int)

+ public struct StreamAsyncImageResult  
+ 
+   public let image: UIImage
+   public let isAnimated: Bool
+   public let animatedImageData: Data?

+ public struct ThreadRepliesDivider: View  
+ 
+   public var body: some View
+   
+ 
+   public init(replyCount: Int)

+ public final class NewMessagesDividerViewOptions: Sendable  
+ 
+   public let newMessagesStartId: Binding<String?>
+   public let count: Int
+   
+ 
+   public init(newMessagesStartId: Binding<String?>,count: Int)

+ public final class StreamImageDownloader: ImageDownloading, Sendable  
+ 
+   public init()
+   
+ 
+   public func downloadImage(url: URL,options: ImageDownloadingOptions,completion: @escaping @MainActor (Result<DownloadedImage, Error>) -> Void)

- public struct NoChannelsView: View  
- 
-   public var body: some View

- public protocol ImageLoading: AnyObject

- public final class AddUsersViewOptions: Sendable  
- 
-   public let options: AddUsersOptions
-   public let onConfirm: @MainActor ([ChatUser]) -> Void
-   
- 
-   public init(options: AddUsersOptions,onConfirm: @escaping @MainActor ([ChatUser]) -> Void)

- public final class DefaultVideoPreviewLoader: VideoPreviewLoader  
- 
-   public init(countLimit: Int = 50)
-   
- 
-   public func loadPreviewForVideo(at url: URL,completion: @escaping @MainActor (Result<UIImage, Error>) -> Void)
-   public func loadPreviewForVideo(with attachment: ChatMessageVideoAttachment,completion: @Sendable @escaping @MainActor (Result<UIImage, Error>) -> Void)

- @MainActor public protocol VideoPreviewLoader: AnyObject

- public extension ImageLoading

- extension ImageCDN  
- 
-   public func urlRequest(forImage url: URL)-> URLRequest

- open class StreamImageCDN: ImageCDN  
- 
-   public static let streamCDNURL
-   
- 
-   public init()
-   
- 
-   open func cachingKey(forImage url: URL)-> String
-   open func urlRequest(forImage url: URL)-> URLRequest
-   open func thumbnailURL(originalURL: URL,preferredSize: CGSize)-> URL

- public protocol ImageProcessor: Sendable

- public struct NoThreadsView: View  
- 
-   public var body: some View
-   
- 
-   public init()

- public struct AddUsersView: View  
- 
-   public var body: some View
-   
- 
-   public init(factory: Factory = DefaultViewFactory.shared,loadedUserIds: [String],onConfirm: @escaping @MainActor ([ChatUser]) -> Void)

- public final class LateResize: ImageProcessing  
- 
-   public var identifier: String
-   
- 
-   public init(sizeProvider: @escaping @Sendable () -> CGSize)
-   
- 
-   public func process(_ image: PlatformImage)-> PlatformImage?

- extension VideoPreviewLoader  
- 
-   public func loadPreviewForVideo(with attachment: ChatMessageVideoAttachment,completion: @Sendable @escaping @MainActor (Result<UIImage, Error>) -> Void)

- public protocol ImageCDN

- public final class DefaultFileCDN: FileCDN  
- 
-   public init()
-   
- 
-   public func adjustedURL(for url: URL,completion: @escaping ((Result<URL, any Error>) -> Void))

- public final class NoThreadsViewOptions: Sendable  
- 
-   public init()

- public protocol FileCDN: AnyObject

- public final class AddUsersOptions: Sendable  
- 
-   public let loadedUserIds: [String]
-   
- 
-   public init(loadedUserIds: [String])

- public struct NewMessagesIndicator: View  
- 
-   public var body: some View
-   
- 
-   public init(newMessagesStartId: Binding<String?>,count: Int)

- public final class InjectedChannelInfo: Sendable  
- 
-   public let subtitle: String?
-   public let unreadCount: Int
-   public let timestamp: String?
-   public let lastMessageAt: Date?
-   public let latestMessages: [ChatMessage]?
-   
- 
-   public init(subtitle: String? = nil,unreadCount: Int,timestamp: String? = nil,lastMessageAt: Date? = nil,latestMessages: [ChatMessage]? = nil)

- open class NukeImageLoader: ImageLoading  
- 
-   public init()
-   
- 
-   open func loadImage(using urlRequest: URLRequest,cachingKey: String?,completion: @escaping @MainActor (Result<UIImage, Error>) -> Void)
-   open func loadImages(from urls: [URL],placeholders: [UIImage],loadThumbnails: Bool,thumbnailSize: CGSize,imageCDN: ImageCDN,completion: @escaping @MainActor ([UIImage]) -> Void)
-   open func loadImage(url: URL?,imageCDN: ImageCDN,resize: Bool = true,preferredSize: CGSize? = nil,completion: @escaping @MainActor (Result<UIImage, Error>) -> Void)

- public final class NoChannelsViewOptions: Sendable  
- 
-   public init()

- @available(iOS 15, *) public struct LinkDetectionTextView: View  
- 
-   public var body: some View
-   
- 
-   public init(message: ChatMessage)

- public final class MediaViewerHeaderOptions: Sendable  
- 
-   public let title: String
-   public let subtitle: String
-   public let shown: Binding<Bool>
-   
- 
-   public init(title: String,subtitle: String,shown: Binding<Bool>)

- public final class NewMessagesIndicatorViewOptions: Sendable  
- 
-   public let newMessagesStartId: Binding<String?>
-   public let count: Int
-   
- 
-   public init(newMessagesStartId: Binding<String?>,count: Int)

- open class NukeImageProcessor: ImageProcessor, @unchecked Sendable  
- 
-   public init()
-   
- 
-   open func crop(image: UIImage,to size: CGSize)-> UIImage?
-   open func scale(image: UIImage,to size: CGSize)-> UIImage

 public class StreamTextViewOptions  
-   
+   public let translationLanguage: TranslationLanguage?
- 
+   
-   public init(message: ChatMessage)
+ 
+   public init(message: ChatMessage,translationLanguage: TranslationLanguage?)

 public final class ChannelAvatarViewOptions: Sendable  
-   
+   public let showsIndicator: Bool
- 
+   public let showsBorder: Bool
-   public init(channel: ChatChannel,size: CGFloat)
+   
+ 
+   public init(channel: ChatChannel,size: CGFloat,showsIndicator: Bool = true,showsBorder: Bool = true)

 public struct LinkAttachmentView: View  
-   public init(linkAttachment: ChatMessageLinkAttachment,width: CGFloat,isFirst: Bool,onImageTap: ((ChatMessageLinkAttachment) -> Void)? = nil)
+   public init(linkAttachment: ChatMessageLinkAttachment,width: CGFloat,isFirst: Bool,isRightAligned: Bool,onImageTap: ((ChatMessageLinkAttachment) -> Void)? = nil)

 public final class MessageAttachmentsViewOptions: Sendable  
-   
+   public let translationLanguage: TranslationLanguage?
- 
+   
-   public init(message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)
+ 
+   public init(message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>,translationLanguage: TranslationLanguage?)

 public struct MessageMediaAttachmentsContainerView: View  
-   public init(factory: Factory,message: ChatMessage,width: CGFloat)
+   public init(factory: Factory,message: ChatMessage,width: CGFloat,isFirst: Bool = true)

 @MainActor public final class MessageListConfig  
-   public let bouncedMessagesAlertActionsEnabled: Bool
+   public let attachmentPreviewWidth: CGFloat
-   public let skipEditedMessageLabel: (ChatMessage) -> Bool
+   public let bouncedMessagesAlertActionsEnabled: Bool
-   public let draftMessagesEnabled: Bool
+   public let skipEditedMessageLabel: (ChatMessage) -> Bool
-   public let downloadFileAttachmentsEnabled: Bool
+   public let draftMessagesEnabled: Bool
-   public init(messageListType: MessageListType = .messaging,typingIndicatorPlacement: TypingIndicatorPlacement = .automatic,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,highlightMessageWhenJumping: 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,hidesCommandsOverlayOnMessageListTap: Bool = true,hidesAttachmentsPickersOnMessageListTap: Bool = true,navigationBarDisplayMode: NavigationBarItem.TitleDisplayMode = .inline,supportedMessageActions: @escaping @MainActor (SupportedMessageActionsOptions) -> [MessageAction] = MessageAction.defaultActions(for:))
+   public init(messageListType: MessageListType = .messaging,typingIndicatorPlacement: TypingIndicatorPlacement = .automatic,groupMessages: Bool = true,messageDisplayOptions: MessageDisplayOptions = MessageDisplayOptions(),messagePaddings: MessagePaddings = MessagePaddings(),dateIndicatorPlacement: DateIndicatorPlacement = .messageList,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,highlightMessageWhenJumping: Bool = true,handleTabBarVisibility: Bool = true,messageListAlignment: MessageListAlignment = .standard,uniqueReactionsEnabled: Bool = false,localLinkDetectionEnabled: Bool = true,isMessageEditedLabelEnabled: Bool = true,markdownSupportEnabled: Bool = false,userBlockingEnabled: Bool = true,bouncedMessagesAlertActionsEnabled: Bool = true,skipEditedMessageLabel: @escaping (ChatMessage) -> Bool = { _ in false },draftMessagesEnabled: Bool = true,hidesCommandsOverlayOnMessageListTap: Bool = true,hidesAttachmentsPickersOnMessageListTap: Bool = true,attachmentPreviewWidth: CGFloat = 256,navigationBarDisplayMode: NavigationBarItem.TitleDisplayMode = .inline,supportedMessageActions: @escaping @MainActor (SupportedMessageActionsOptions) -> [MessageAction] = MessageAction.defaultActions(for:))

 extension ViewFactory  
-   public func makeNoChannelsView(options: NoChannelsViewOptions)-> some View
+   public func makeEmptyChannelsView(options: EmptyChannelsViewOptions)-> some View
-   public func makeMediaViewerHeader(options: MediaViewerHeaderOptions)-> some View
+   public func makeMediaViewerToolbarModifier(options: MediaViewerToolbarModifierOptions)-> some ViewModifier
-   public func makeVideoPlayerHeaderView(options: VideoPlayerHeaderViewOptions)-> some View
+   public func makeMediaViewerFooterView(options: MediaViewerFooterViewOptions)-> some View
-   public func makeVideoPlayerFooterView(options: VideoPlayerFooterViewOptions)-> some View
+   public func makeVideoPlayerHeaderView(options: VideoPlayerHeaderViewOptions)-> some View
-   public func makeDeletedMessageView(options: DeletedMessageViewOptions)-> some View
+   public func makeVideoPlayerFooterView(options: VideoPlayerFooterViewOptions)-> some View
-   public func makeSystemMessageView(options: SystemMessageViewOptions)-> some View
+   public func makeDeletedMessageView(options: DeletedMessageViewOptions)-> some View
-   public func makeEmojiTextView(options: EmojiTextViewOptions)-> some View
+   public func makeSystemMessageView(options: SystemMessageViewOptions)-> some View
-   public func makeCustomAttachmentViewType(options: CustomAttachmentViewTypeOptions)-> some View
+   public func makeEmojiTextView(options: EmojiTextViewOptions)-> some View
-   public func makeScrollToBottomButton(options: ScrollToBottomButtonOptions)-> some View
+   public func makeCustomAttachmentViewType(options: CustomAttachmentViewTypeOptions)-> some View
-   public func makeDateIndicatorView(options: DateIndicatorViewOptions)-> some View
+   public func makeScrollToBottomButton(options: ScrollToBottomButtonOptions)-> some View
-   public func makeMessageListDateIndicator(options: MessageListDateIndicatorViewOptions)-> some View
+   public func makeDateIndicatorView(options: DateIndicatorViewOptions)-> some View
-   public func makeInlineTypingIndicatorView(options: TypingIndicatorViewOptions)-> some View
+   public func makeMessageListDateIndicator(options: MessageListDateIndicatorViewOptions)-> some View
-   public func makeSubtitleTypingIndicatorView(options: SubtitleTypingIndicatorViewOptions)-> some View
+   public func makeInlineTypingIndicatorView(options: TypingIndicatorViewOptions)-> some View
-   public func makeGiphyBadgeViewType(options: GiphyBadgeViewTypeOptions)-> some View
+   public func makeSubtitleTypingIndicatorView(options: SubtitleTypingIndicatorViewOptions)-> some View
-   public func makeMessageRepliesView(options: MessageRepliesViewOptions)-> some View
+   public func makeGiphyBadgeViewType(options: GiphyBadgeViewTypeOptions)-> some View
-   public func makeMessageComposerViewType(options: MessageComposerViewTypeOptions)-> MessageComposerView<Self>
+   public func makeMessageRepliesView(options: MessageRepliesViewOptions)-> some View
-   public func makeLeadingComposerView(options: LeadingComposerViewOptions)-> some View
+   public func makeMessageComposerViewType(options: MessageComposerViewTypeOptions)-> MessageComposerView<Self>
-   @ViewBuilder public func makeComposerInputView(options: ComposerInputViewOptions)-> some View
+   public func makeLeadingComposerView(options: LeadingComposerViewOptions)-> some View
-   public func makeComposerTextInputView(options: ComposerTextInputViewOptions)-> some View
+   @ViewBuilder public func makeComposerInputView(options: ComposerInputViewOptions)-> some View
-   public func makeComposerInputTrailingView(options: ComposerInputTrailingViewOptions)-> some View
+   public func makeComposerTextInputView(options: ComposerTextInputViewOptions)-> some View
-   public func makeTrailingComposerView(options: TrailingComposerViewOptions)-> some View
+   public func makeComposerInputTrailingView(options: ComposerInputTrailingViewOptions)-> some View
-   public func makeSendMessageButton(options: SendMessageButtonOptions)-> some View
+   public func makeTrailingComposerView(options: TrailingComposerViewOptions)-> some View
-   public func makeConfirmEditButton(options: ConfirmEditButtonOptions)-> some View
+   public func makeSendMessageButton(options: SendMessageButtonOptions)-> some View
-   public func makeComposerVoiceRecordingInputView(options: ComposerVoiceRecordingInputViewOptions)-> some View
+   public func makeConfirmEditButton(options: ConfirmEditButtonOptions)-> some View
-   public func makeAttachmentPickerView(options: AttachmentPickerViewOptions)-> some View
+   public func makeComposerVoiceRecordingInputView(options: ComposerVoiceRecordingInputViewOptions)-> some View
-   public func makeAttachmentCommandsPickerView(options: AttachmentCommandsPickerViewOptions)-> some View
+   public func makeAttachmentPickerView(options: AttachmentPickerViewOptions)-> some View
-   public func makeVoiceRecordingView(options: VoiceRecordingViewOptions)-> some View
+   public func makeAttachmentCommandsPickerView(options: AttachmentCommandsPickerViewOptions)-> some View
-   public func makeCustomAttachmentPickerView(options: CustomAttachmentPickerViewOptions)-> some View
+   public func makeVoiceRecordingView(options: VoiceRecordingViewOptions)-> some View
-   public func makeCustomAttachmentPreviewView(options: CustomAttachmentPreviewViewOptions)-> some View
+   public func makeCustomAttachmentPickerView(options: CustomAttachmentPickerViewOptions)-> some View
-   public func makeAttachmentTypePickerView(options: AttachmentTypePickerViewOptions)-> some View
+   public func makeCustomAttachmentPreviewView(options: CustomAttachmentPreviewViewOptions)-> some View
-   public func makeAttachmentMediaPickerView(options: AttachmentMediaPickerViewOptions)-> some View
+   public func makeAttachmentTypePickerView(options: AttachmentTypePickerViewOptions)-> some View
-   public func makeAttachmentFilePickerView(options: AttachmentFilePickerViewOptions)-> some View
+   public func makeAttachmentMediaPickerView(options: AttachmentMediaPickerViewOptions)-> some View
-   public func makeAttachmentCameraPickerView(options: AttachmentCameraPickerViewOptions)-> some View
+   public func makeAttachmentFilePickerView(options: AttachmentFilePickerViewOptions)-> some View
-   public func makeAttachmentPollPickerView(options: AttachmentPollPickerViewOptions)-> some View
+   public func makeAttachmentCameraPickerView(options: AttachmentCameraPickerViewOptions)-> some View
-   public func makeSendInChannelView(options: SendInChannelViewOptions)-> some View
+   public func makeAttachmentPollPickerView(options: AttachmentPollPickerViewOptions)-> some View
-   public func makeMessageActionsView(options: MessageActionsViewOptions)-> some View
+   public func makeSendInChannelView(options: SendInChannelViewOptions)-> some View
-   public func makeBottomReactionsView(options: ReactionsBottomViewOptions)-> some View
+   public func makeMessageActionsView(options: MessageActionsViewOptions)-> some View
-   public func makeMessageReactionView(options: MessageReactionViewOptions)-> some View
+   public func makeBottomReactionsView(options: ReactionsBottomViewOptions)-> some View
-   public func makeReactionsOverlayView(options: ReactionsOverlayViewOptions)-> some View
+   public func makeMessageReactionView(options: MessageReactionViewOptions)-> some View
-   public func makeReactionsContentView(options: ReactionsContentViewOptions)-> some View
+   public func makeReactionsOverlayView(options: ReactionsOverlayViewOptions)-> some View
-   public func makeMoreReactionsView(options: MoreReactionsViewOptions)-> some View
+   public func makeReactionsContentView(options: ReactionsContentViewOptions)-> some View
-   public func makeReactionsDetailView(options: ReactionsDetailViewOptions)-> some View
+   public func makeMoreReactionsView(options: MoreReactionsViewOptions)-> some View
-   public func makeComposerQuotedMessageView(options: ComposerQuotedMessageViewOptions)-> some View
+   public func makeReactionsDetailView(options: ReactionsDetailViewOptions)-> some View
-   public func makeChatQuotedMessageView(options: ChatQuotedMessageViewOptions)-> some View
+   public func makeComposerQuotedMessageView(options: ComposerQuotedMessageViewOptions)-> some View
-   public func makeQuotedMessageView(options: QuotedMessageViewOptions)-> some View
+   public func makeChatQuotedMessageView(options: ChatQuotedMessageViewOptions)-> some View
-   public func makeComposerEditedMessageView(options: ComposerEditedMessageViewOptions)-> some View
+   public func makeQuotedMessageView(options: QuotedMessageViewOptions)-> some View
-   public func makeMessageAttachmentPreviewThumbnailView(options: MessageAttachmentPreviewViewOptions)-> some View
+   public func makeComposerEditedMessageView(options: ComposerEditedMessageViewOptions)-> some View
-   public func makeMessageAttachmentPreviewIconView(options: MessageAttachmentPreviewIconViewOptions)-> some View
+   public func makeMessageAttachmentPreviewThumbnailView(options: MessageAttachmentPreviewViewOptions)-> some View
-   public func makeSuggestionsContainerView(options: SuggestionsContainerViewOptions)-> some View
+   public func makeMessageAttachmentPreviewIconView(options: MessageAttachmentPreviewIconViewOptions)-> some View
-   public func makeMessageReadIndicatorView(options: MessageReadIndicatorViewOptions)-> some View
+   public func makeSuggestionsContainerView(options: SuggestionsContainerViewOptions)-> some View
-   public func makeNewMessagesIndicatorView(options: NewMessagesIndicatorViewOptions)-> some View
+   public func makeMessageReadIndicatorView(options: MessageReadIndicatorViewOptions)-> some View
-   public func makeJumpToUnreadButton(options: JumpToUnreadButtonOptions)-> some View
+   public func makeNewMessagesDividerView(options: NewMessagesDividerViewOptions)-> some View
-   public func makePollView(options: PollViewOptions)-> some View
+   public func makeThreadRepliesDividerView(options: ThreadRepliesDividerViewOptions)-> some View
-   public func makeThreadDestination(options: ThreadDestinationOptions)-> @MainActor (ChatThread) -> ChatChannelView<Self>
+   public func makeJumpToUnreadButtonOverlay(options: JumpToUnreadButtonOptions)-> some ViewModifier
-   public func makeThreadListItem(options: ThreadListItemOptions<ThreadDestination>)-> some View
+   public func makePollView(options: PollViewOptions)-> some View
-   public func makeNoThreadsView(options: NoThreadsViewOptions)-> some View
+   public func makeThreadDestination(options: ThreadDestinationOptions)-> @MainActor (ChatThread) -> ChatChannelView<Self>
-   public func makeThreadListLoadingView(options: ThreadListLoadingViewOptions)-> some View
+   public func makeThreadListItem(options: ThreadListItemOptions<ThreadDestination>)-> some View
-   public func makeThreadListContainerViewModifier(options: ThreadListContainerModifierOptions)-> some ViewModifier
+   public func makeEmptyThreadsView(options: EmptyThreadsViewOptions)-> some View
-   public func makeThreadListHeaderViewModifier(options: ThreadListHeaderViewModifierOptions)-> some ViewModifier
+   public func makeThreadListLoadingView(options: ThreadListLoadingViewOptions)-> some View
-   public func makeThreadListHeaderView(options: ThreadListHeaderViewOptions)-> some View
+   public func makeThreadListContainerViewModifier(options: ThreadListContainerModifierOptions)-> some ViewModifier
-   public func makeThreadListFooterView(options: ThreadListFooterViewOptions)-> some View
+   public func makeThreadListHeaderViewModifier(options: ThreadListHeaderViewModifierOptions)-> some ViewModifier
-   public func makeThreadListBackground(options: ThreadListBackgroundOptions)-> some View
+   public func makeThreadListHeaderView(options: ThreadListHeaderViewOptions)-> some View
-   public func makeThreadListItemBackground(options: ThreadListItemBackgroundOptions)-> some View
+   public func makeThreadListFooterView(options: ThreadListFooterViewOptions)-> some View
-   public func makeThreadListDividerItem(options: ThreadListDividerItemOptions)-> some View
+   public func makeThreadListBackground(options: ThreadListBackgroundOptions)-> some View
-   public func makeAddUsersView(options: AddUsersViewOptions)-> some View
+   public func makeThreadListItemBackground(options: ThreadListItemBackgroundOptions)-> some View
-   public func makeAttachmentTextView(options: AttachmentTextViewOptions)-> some View
+   public func makeThreadListDividerItem(options: ThreadListDividerItemOptions)-> some View
-   public func makeStreamTextView(options: StreamTextViewOptions)-> some View
+   public func makeMemberAddView(options: MemberAddViewOptions)-> some View
+   public func makeAttachmentTextView(options: AttachmentTextViewOptions)-> some View
+   public func makeStreamTextView(options: StreamTextViewOptions)-> some View

 public enum ChannelAlertType: Equatable  
-   case deleteChannel(ChatChannel)
+   case muteChannel(ChatChannel)
-   case error
+   case deleteChannel(ChatChannel)
+   case error

 public final class UserAvatarViewOptions: Sendable  
-   
+   public let showsBorder: Bool
- 
+   
-   public init(user: ChatUser,size: CGFloat,showsIndicator: Bool)
+ 
+   public init(user: ChatUser,size: CGFloat,showsIndicator: Bool,showsBorder: Bool = true)

 public final class MessageDisplayOptions  
-   public init(showIncomingMessageAvatar: Bool = true,showOutgoingMessageAvatar: Bool = false,showAvatarsInGroups: Bool = true,showMessageDate: Bool = true,showAuthorName: Bool = true,animateChanges: Bool = true,overlayDateLabelSize: CGFloat = 40,lastInGroupHeaderSize: CGFloat = 0,newMessagesSeparatorSize: CGFloat = 50,minimumSwipeGestureDistance: CGFloat = 20,currentUserMessageTransition: AnyTransition = .identity,otherUserMessageTransition: AnyTransition = .identity,shouldAnimateReactions: Bool = true,reactionsPlacement: ReactionsPlacement = .top,reactionsStyle: ReactionsStyle = .segmented,showOriginalTranslatedButton: Bool = false,messageLinkDisplayResolver: @escaping @MainActor (ChatMessage) -> [NSAttributedString.Key: Any] = MessageDisplayOptions
+   public init(showIncomingMessageAvatar: Bool = true,showOutgoingMessageAvatar: Bool = false,showAvatarsInGroups: Bool = true,showMessageDate: Bool = true,showAuthorName: Bool = true,animateChanges: Bool = true,overlayDateLabelSize: CGFloat = 40,lastInGroupHeaderSize: CGFloat = 0,newMessagesSeparatorSize: CGFloat = 50,minimumSwipeGestureDistance: CGFloat = 20,currentUserMessageTransition: AnyTransition = .identity,otherUserMessageTransition: AnyTransition = .identity,shouldAnimateReactions: Bool = true,reactionsPlacement: ReactionsPlacement = .top,reactionsStyle: ReactionsStyle = .segmented,showOriginalTranslatedButton: Bool = true,messageLinkDisplayResolver: @escaping @MainActor (ChatMessage) -> [NSAttributedString.Key: Any] = MessageDisplayOptions

 public final class ChannelSelectionInfo: Identifiable, @unchecked Sendable  
-   public var injectedChannelInfo: InjectedChannelInfo?
+   public let searchType: ChannelListSearchType
-   public let searchType: ChannelListSearchType
+   
-   
+ 
- 
+   public init(channel: ChatChannel,message: ChatMessage?,searchType: ChannelListSearchType = .messages)
-   public init(channel: ChatChannel,message: ChatMessage?,searchType: ChannelListSearchType = .messages)

 public final class PollViewOptions: Sendable  
-   
+   public let availableWidth: CGFloat
- 
+   
-   public init(message: ChatMessage,poll: Poll,isFirst: Bool)
+ 
+   public init(message: ChatMessage,poll: Poll,isFirst: Bool,availableWidth: CGFloat)

 public struct FileAttachmentDisplayView: View  
-   public init(url: URL,title: String,sizeString: String)
+   public init(url: URL,title: String,sizeString: String,uploadingState: AttachmentUploadingState? = nil,onRetry: (() -> Void)? = nil)

 public struct ChatInfoGroupHeaderView: View  
-   public init(viewModel: ChatChannelInfoViewModel)
+   public init(factory: Factory = DefaultViewFactory.shared,viewModel: ChatChannelInfoViewModel)

 public final class MessageComposerViewTypeOptions: Sendable  
-   public let onMessageSent: @MainActor () -> Void
+   public let willSendMessage: @MainActor () -> Void
-   public init(channelController: ChatChannelController,messageController: ChatMessageController?,quotedMessage: Binding<ChatMessage?>,editedMessage: Binding<ChatMessage?>,onMessageSent: @escaping @MainActor () -> Void)
+   public init(channelController: ChatChannelController,messageController: ChatMessageController?,quotedMessage: Binding<ChatMessage?>,editedMessage: Binding<ChatMessage?>,willSendMessage: @escaping @MainActor () -> Void)

 public struct MessageTextView: View  
-   public init(factory: Factory,message: ChatMessage,isFirst: Bool,scrolledId: Binding<String?>)
+   public init(factory: Factory,message: ChatMessage,isFirst: Bool,scrolledId: Binding<String?>,translationLanguage: TranslationLanguage?)
-   public init(factory: Factory,message: ChatMessage,isFirst: Bool,leadingPadding: CGFloat,trailingPadding: CGFloat,topPadding: CGFloat,bottomPadding: CGFloat,scrolledId: Binding<String?>)
+   public init(factory: Factory,message: ChatMessage,isFirst: Bool,leadingPadding: CGFloat,trailingPadding: CGFloat,topPadding: CGFloat,bottomPadding: CGFloat,scrolledId: Binding<String?>,translationLanguage: TranslationLanguage?)

 public struct MessageComposerView: View, KeyboardReadable  
-   public init(viewFactory: Factory,viewModel: MessageComposerViewModel? = nil,channelController: ChatChannelController,messageController: ChatMessageController? = nil,quotedMessage: Binding<ChatMessage?>,editedMessage: Binding<ChatMessage?>,onMessageSent: @escaping () -> Void)
+   public init(viewFactory: Factory,viewModel: MessageComposerViewModel? = nil,channelController: ChatChannelController,messageController: ChatMessageController? = nil,quotedMessage: Binding<ChatMessage?>,editedMessage: Binding<ChatMessage?>,willSendMessage: @escaping () -> Void)
-   
- 
-   public func sendMessage()

 public final class ComposerConfig  
-   public var inputViewMinHeight: CGFloat
+   public var isVoiceRecordingAutoSendEnabled: Bool
-   public var inputViewMaxHeight: CGFloat
+   public var inputViewMinHeight: CGFloat
-   public var inputViewCornerRadius: CGFloat
+   public var inputViewMaxHeight: CGFloat
-   public var inputFont: UIFont
+   public var inputViewCornerRadius: CGFloat
-   public var gallerySupportedTypes: GallerySupportedTypes
+   public var inputFont: UIFont
-   public var maxGalleryAssetsCount: Int?
+   public var gallerySupportedTypes: GallerySupportedTypes
-   public var adjustMessageOnSend: (String) -> (String)
+   public var maxGalleryAssetsCount: Int?
-   public var adjustMessageOnRead: (String) -> (String)
+   public var adjustMessageOnSend: (String) -> (String)
-   
+   public var adjustMessageOnRead: (String) -> (String)
- 
+   public var maxAttachmentSize: Int64
-   public init(isVoiceRecordingEnabled: Bool = false,inputViewMinHeight: CGFloat = 40,inputViewMaxHeight: CGFloat = 120,inputViewCornerRadius: CGFloat = 20,inputFont: UIFont = UIFont.preferredFont(forTextStyle: .body),gallerySupportedTypes: GallerySupportedTypes = .imagesAndVideo,maxGalleryAssetsCount: Int? = nil,adjustMessageOnSend: @escaping (String) -> (String) = { $0 },adjustMessageOnRead: @escaping (String) -> (String) = { $0 })
+   
+ 
+   public init(isVoiceRecordingEnabled: Bool = true,isVoiceRecordingAutoSendEnabled: Bool = false,inputViewMinHeight: CGFloat = 40,inputViewMaxHeight: CGFloat = 120,inputViewCornerRadius: CGFloat = 20,inputFont: UIFont = UIFont.preferredFont(forTextStyle: .body),gallerySupportedTypes: GallerySupportedTypes = .imagesAndVideo,maxGalleryAssetsCount: Int? = nil,adjustMessageOnSend: @escaping (String) -> (String) = { $0 },adjustMessageOnRead: @escaping (String) -> (String) = { $0 },maxAttachmentSize: Int64 = 100 * 1024 * 1024)

 public struct ChatChannelSwipeableListItem: View  
-   public init(factory: Factory,channelListItem: ChannelListItem,swipedChannelId: Binding<String?>,channel: ChatChannel,numberOfTrailingItems: Int = 2,widthOfTrailingItem: CGFloat = 60,trailingRightButtonTapped: @escaping @MainActor (ChatChannel) -> Void,trailingLeftButtonTapped: @escaping @MainActor (ChatChannel) -> Void,leadingSwipeButtonTapped: @escaping @MainActor (ChatChannel) -> Void)
+   public init(factory: Factory,channelListItem: ChannelListItem,swipedChannelId: Binding<String?>,channel: ChatChannel,numberOfTrailingItems: Int = 2,widthOfTrailingItem: CGFloat = 80,trailingRightButtonTapped: @escaping @MainActor (ChatChannel) -> Void,trailingLeftButtonTapped: @escaping @MainActor (ChatChannel) -> Void,leadingSwipeButtonTapped: @escaping @MainActor (ChatChannel) -> Void)

- public extension ChatMessage
+ @available(iOS 15, *) extension ChatMessage  
+ 
+   @MainActor public func attributedTextContent(layoutDirection: LayoutDirection,translationLanguage: TranslationLanguage?)-> AttributedString

 @MainActor open class MessageViewModel: ObservableObject  
-   public var isRightAligned: Bool
+   public var pinnedByText: String
-   public var messageAuthor: ChatUser?
+   public var isRightAligned: Bool
-   public var isDoubleTapOverlayEnabled: Bool
+   public var messageAuthor: ChatUser?
-   open var isSwipeToQuoteReplyPossible: Bool
+   public var isDoubleTapOverlayEnabled: Bool
-   open var textContent: String
+   open var isSwipeToQuoteReplyPossible: Bool
-   public var translatedText: String?
+   public var translationLanguage: TranslationLanguage?
-   public var translatedLanguageText: String?
+   public var translatedText: String?
-   public var annotationsShown: Bool
+   public var translatedLanguageText: String?
-   public var threadRepliesShown: Bool
+   public var annotationsShown: Bool
-   public var sentInChannelShown: Bool
+   public var threadRepliesShown: Bool
-   public var repliedToThreadShown: Bool
+   public var sentInChannelShown: Bool
-   public var hasReminder: Bool
+   public var repliedToThreadShown: Bool
-   public var reminderTimeText: String?
+   public var hasReminder: Bool
-   
+   public var reminderTimeText: String?
- 
+   
-   public init(message: ChatMessage,channel: ChatChannel,isInThread: Bool = false)
+ 
-   
+   public init(message: ChatMessage,channel: ChatChannel,isInThread: Bool = false)
- 
+   
-   public func showOriginalText()
+ 
-   public func hideOriginalText()
+   public func showOriginalText()
-   public func isHighlighted(messageId: String?)-> Bool
+   public func hideOriginalText()
+   public func isHighlighted(messageId: String?)-> Bool

 public struct LoadingSpinnerView: View  
-   public init(size: CGFloat,bordered: Bool)
+   public init(size: CGFloat,bordered: Bool = false,progress: Double? = nil)

 public struct MessageMediaAttachmentContentView: View  
-   public init(factory: Factory,source: MediaAttachment,width: CGFloat,height: CGFloat,cornerRadius: CGFloat? = nil,isOutgoing: Bool = false)
+   public init(factory: Factory,source: MediaAttachment,width: CGFloat,height: CGFloat,cornerRadius: CGFloat? = nil,corners: UIRectCorner? = nil,isOutgoing: Bool = false,onUploadRetry: (() -> Void)? = nil)

- public enum StreamAsyncImagePhase: Sendable, Equatable  
+ public enum StreamAsyncImagePhase  
-   case success(Image)
+   case success(StreamAsyncImageResult)
+   case error(Error)
+   
+ 
+   public var image: Image?

 public struct ChatChannelListContentView: View  
-   public init(viewFactory: Factory,viewModel: ChatChannelListViewModel,onItemTap: (@MainActor (ChatChannel) -> Void)? = nil)
+   public init(viewFactory: Factory,viewModel: ChatChannelListViewModel,channelDestination: (@MainActor (ChannelSelectionInfo) -> Factory.ChannelDestination)? = nil,onItemTap: (@MainActor (ChatChannel) -> Void)? = nil)

 @MainActor public class ChatChannelInfoViewModel: ObservableObject, ChatChannelControllerDelegate  
-   open var shouldShowAddUserButton: Bool
+   open var shouldShowAddMemberButton: Bool

 public class AttachmentTextViewOptions  
-   
+   public let availableWidth: CGFloat
- 
+   public let translationLanguage: TranslationLanguage?
-   public init(message: ChatMessage)
+   
+ 
+   public init(message: ChatMessage,availableWidth: CGFloat,translationLanguage: TranslationLanguage?)

 public enum MessageComposerInputState  
-   case creating(hasContent: Bool)
+   case creating(hasContent: Bool, hasCommand: Bool)

 public struct ChatChannelNavigatableListItem: View  
-   public init(factory: Factory = DefaultViewFactory.shared,channel: ChatChannel,channelName: String,disabled: Bool = false,handleTabBarVisibility: Bool = true,selectedChannel: Binding<ChannelSelectionInfo?>,channelDestination: @escaping (ChannelSelectionInfo) -> ChannelDestination,onItemTap: @escaping (ChatChannel) -> Void)
+   public init(factory: Factory = DefaultViewFactory.shared,channel: ChatChannel,channelName: String,disabled: Bool = false,handleTabBarVisibility: Bool = true,selectedChannel: Binding<ChannelSelectionInfo?>,channelDestination: ((ChannelSelectionInfo) -> ChannelDestination)? = nil,onItemTap: @escaping (ChatChannel) -> Void)

 @MainActor public class ViewModelsFactory  
-   public static func makeMessageComposerViewModel(with channelController: ChatChannelController,messageController: ChatMessageController?,quotedMessage: Binding<ChatMessage?>? = nil)-> MessageComposerViewModel
+   public static func makeMessageComposerViewModel(with channelController: ChatChannelController,messageController: ChatMessageController?,quotedMessage: Binding<ChatMessage?>?,editedMessage: Binding<ChatMessage?>?,willSendMessage: (() -> Void)?)-> MessageComposerViewModel

 public final class ChannelListItemOptions  
-   public let channelDestination: @MainActor (ChannelSelectionInfo) -> ChannelDestination
+   public let channelDestination: (@MainActor (ChannelSelectionInfo) -> ChannelDestination)?
-   public init(channel: ChatChannel,channelName: String,disabled: Bool,selectedChannel: Binding<ChannelSelectionInfo?>,swipedChannelId: Binding<String?>,channelDestination: @escaping @MainActor (ChannelSelectionInfo) -> ChannelDestination,onItemTap: @escaping @MainActor (ChatChannel) -> Void,trailingSwipeRightButtonTapped: @escaping @MainActor (ChatChannel) -> Void,trailingSwipeLeftButtonTapped: @escaping @MainActor (ChatChannel) -> Void,leadingSwipeButtonTapped: @escaping @MainActor (ChatChannel) -> Void)
+   public init(channel: ChatChannel,channelName: String,disabled: Bool,selectedChannel: Binding<ChannelSelectionInfo?>,swipedChannelId: Binding<String?>,channelDestination: (@MainActor (ChannelSelectionInfo) -> ChannelDestination)? = nil,onItemTap: @escaping @MainActor (ChatChannel) -> Void,trailingSwipeRightButtonTapped: @escaping @MainActor (ChatChannel) -> Void,trailingSwipeLeftButtonTapped: @escaping @MainActor (ChatChannel) -> Void,leadingSwipeButtonTapped: @escaping @MainActor (ChatChannel) -> Void)

 @MainActor open class ChatChannelListViewModel: ObservableObject, ChatChannelListControllerDelegate, ChatMessageSearchControllerDelegate  
-   public func onMoreTapped(channel: ChatChannel)
+   public func onMuteTapped(channel: ChatChannel)
-   public func delete(channel: ChatChannel)
+   public func onMoreTapped(channel: ChatChannel)
-   open func showErrorPopup(_ error: Error?)
+   public func delete(channel: ChatChannel)
-   open func setChannelAlertType(_ channelAlertType: ChannelAlertType)
+   public func mute(channel: ChatChannel)
-   public func controller(_ controller: ChatChannelListController,didChangeChannels changes: [ListChange<ChatChannel>])
+   open func showErrorPopup(_ error: Error?)
-   open func controller(_ controller: ChatChannelListController,shouldAddNewChannelToList channel: ChatChannel)-> Bool
+   open func setChannelAlertType(_ channelAlertType: ChannelAlertType)
-   open func controller(_ controller: ChatChannelListController,shouldListUpdatedChannel channel: ChatChannel)-> Bool
+   public func controller(_ controller: ChatChannelListController,didChangeChannels changes: [ListChange<ChatChannel>])
-   public func preselectChannelIfNeeded()
+   open func controller(_ controller: ChatChannelListController,shouldAddNewChannelToList channel: ChatChannel)-> Bool
-   public func controller(_ controller: ChatMessageSearchController,didChangeMessages changes: [ListChange<ChatMessage>])
+   open func controller(_ controller: ChatChannelListController,shouldListUpdatedChannel channel: ChatChannel)-> Bool
-   open func performMessageSearch()
+   public func preselectChannelIfNeeded()
-   open func performChannelSearch()
+   public func controller(_ controller: ChatMessageSearchController,didChangeMessages changes: [ListChange<ChatMessage>])
+   open func performMessageSearch()
+   open func performChannelSearch()

 public struct AttachmentTextView: View  
-   public init(factory: Factory = DefaultViewFactory.shared,message: ChatMessage,injectedBackgroundColor: UIColor? = nil)
+   public init(factory: Factory = DefaultViewFactory.shared,message: ChatMessage,availableWidth: CGFloat,translationLanguage: TranslationLanguage? = nil)

 public struct MessageView: View  
-   @Binding public var scrolledId: String?
+   public var translationLanguage: TranslationLanguage?
-   public var body: some View
+   @Binding public var scrolledId: String?
-   
+   public var body: some View
- 
+   
-   public init(factory: Factory,message: ChatMessage,contentWidth: CGFloat,isFirst: Bool,scrolledId: Binding<String?>)
+ 
+   public init(factory: Factory,message: ChatMessage,contentWidth: CGFloat,isFirst: Bool,scrolledId: Binding<String?>,translationLanguage: TranslationLanguage? = nil)

 public struct ChannelsLazyVStack: View  
-   public init(factory: Factory,channels: [ChatChannel],selectedChannel: Binding<ChannelSelectionInfo?>,swipedChannelId: Binding<String?>,onItemTap: @escaping @MainActor (ChatChannel) -> Void,onItemAppear: @escaping @MainActor (Int) -> Void,channelDestination: @escaping @MainActor (ChannelSelectionInfo) -> Factory.ChannelDestination,trailingSwipeRightButtonTapped: @escaping @MainActor (ChatChannel) -> Void,trailingSwipeLeftButtonTapped: @escaping @MainActor (ChatChannel) -> Void,leadingSwipeButtonTapped: @escaping @MainActor (ChatChannel) -> Void)
+   public init(factory: Factory,channels: [ChatChannel],selectedChannel: Binding<ChannelSelectionInfo?>,swipedChannelId: Binding<String?>,onItemTap: @escaping @MainActor (ChatChannel) -> Void,onItemAppear: @escaping @MainActor (Int) -> Void,channelDestination: (@MainActor (ChannelSelectionInfo) -> Factory.ChannelDestination)? = nil,trailingSwipeRightButtonTapped: @escaping @MainActor (ChatChannel) -> Void,trailingSwipeLeftButtonTapped: @escaping @MainActor (ChatChannel) -> Void,leadingSwipeButtonTapped: @escaping @MainActor (ChatChannel) -> Void)

 public struct ChatChannelListItem: View  
-   public init(factory: Factory = DefaultViewFactory.shared,channel: ChatChannel,channelName: String,injectedChannelInfo: InjectedChannelInfo? = nil,disabled: Bool = false,onItemTap: @escaping (ChatChannel) -> Void)
+   public init(factory: Factory = DefaultViewFactory.shared,channel: ChatChannel,channelName: String,isSelected: Bool = false,disabled: Bool = false,onItemTap: @escaping (ChatChannel) -> Void)

 public final class JumpToUnreadButtonOptions: Sendable  
-   public let channel: ChatChannel
+   public let isShown: Bool
-   public let onJumpToMessage: @MainActor () -> Void
+   public let channel: ChatChannel
-   public let onClose: @MainActor () -> Void
+   public let onJumpToMessage: @MainActor () -> Void
-   
+   public let onClose: @MainActor () -> Void
- 
+   
-   public init(channel: ChatChannel,onJumpToMessage: @escaping @MainActor () -> Void,onClose: @escaping @MainActor () -> Void)
+ 
+   public init(isShown: Bool = true,channel: ChatChannel,onJumpToMessage: @escaping @MainActor () -> Void,onClose: @escaping @MainActor () -> Void)

 public final class MediaAttachment: Identifiable, Equatable, Sendable  
-   public init(url: URL,type: MediaAttachmentType,uploadingState: AttachmentUploadingState? = nil,originalWidth: Double? = nil,originalHeight: Double? = nil)
+   public init(url: URL,type: MediaAttachmentType,uploadingState: AttachmentUploadingState? = nil,originalWidth: Double? = nil,originalHeight: Double? = nil,videoAttachment: ChatMessageVideoAttachment? = nil)

 public final class ComposerInputTrailingViewOptions: @unchecked Sendable  
-   public let composerInputState: MessageComposerInputState
+   @Binding public var composerCommand: ComposerCommand?
-   public let startRecording: @MainActor () -> Void
+   public let composerInputState: MessageComposerInputState
-   public let stopRecording: @MainActor () -> Void
+   public let startRecording: @MainActor () -> Void
-   public let showRecordingTip: @MainActor () -> Void
+   public let stopRecording: @MainActor () -> Void
-   public let sendMessage: @MainActor () -> Void
+   public let showRecordingTip: @MainActor () -> Void
-   
+   public let sendMessage: @MainActor () -> Void
- 
+   
-   public init(text: Binding<String>,recordingState: Binding<VoiceRecordingState>,composerInputState: MessageComposerInputState,startRecording: @escaping @MainActor () -> Void,stopRecording: @escaping @MainActor () -> Void,showRecordingTip: @escaping @MainActor () -> Void,sendMessage: @escaping @MainActor () -> Void)
+ 
+   public init(text: Binding<String>,recordingState: Binding<VoiceRecordingState>,composerCommand: Binding<ComposerCommand?>,composerInputState: MessageComposerInputState,startRecording: @escaping @MainActor () -> Void,stopRecording: @escaping @MainActor () -> Void,showRecordingTip: @escaping @MainActor () -> Void,sendMessage: @escaping @MainActor () -> Void)

 public struct ChannelAvatar: View  
-   public init(channel: ChatChannel,size: CGFloat,showsIndicator: Bool = false,showsBorder: Bool = true)
+   public init(channel: ChatChannel,size: CGFloat,indicator: AvatarIndicator = .none,showsBorder: Bool = true)

- public struct StreamAsyncImage: View  
+ @MainActor public struct StreamAsyncImage: View  
-   public init(url: URL?,thumbnailSize: CGSize,content: @escaping (StreamAsyncImagePhase) -> ImageContent)
+   public init(url: URL?,resize: ImageResize? = nil,@ViewBuilder content: @escaping (StreamAsyncImagePhase) -> Content)

 public struct MessageAttachmentsView: View  
-   public init(factory: Factory,message: ChatMessage,width: CGFloat,isFirst: Bool,scrolledId: Binding<String?>)
+   public init(factory: Factory,message: ChatMessage,width: CGFloat,isFirst: Bool,scrolledId: Binding<String?>,translationLanguage: TranslationLanguage? = nil)

 @MainActor open class MessageComposerViewModel: ObservableObject  
-   public let channelController: ChatChannelController
+   @Published public private var isSendingMessage
-   public var messageController: ChatMessageController?
+   public let channelController: ChatChannelController
-   public let eventsController: EventsController
+   public var messageController: ChatMessageController?
-   public var quotedMessage: Binding<ChatMessage?>?
+   public let eventsController: EventsController
-   public var waveformTargetSamples: Int
+   public var quotedMessage: Binding<ChatMessage?>?
-   public internal var pendingAudioRecording: AddedVoiceRecording?
+   public var editedMessage: Binding<ChatMessage?>?
-   public var canSendPoll: Bool
+   public var willSendMessage: (() -> Void)?
-   public lazy var commandsHandler
+   public var waveformTargetSamples: Int
-   public var instantCommands: [CommandHandler]
+   public internal var pendingAudioRecording: AddedVoiceRecording?
-   public var mentionedUsers
+   public var canSendPoll: Bool
-   public var canSendMessage: Bool
+   public lazy var commandsHandler
-   public var hasContent: Bool
+   public var instantCommands: [CommandHandler]
-   public var shouldShowRecordingGestureOverlay: Bool
+   public var mentionedUsers
-   public var sendInChannelShown: Bool
+   public var canSendMessage: Bool
-   public var isDirectChannel: Bool
+   public var hasContent: Bool
-   public var showSuggestionsOverlay: Bool
+   public var shouldShowRecordingGestureOverlay: Bool
-   
+   public var sendInChannelShown: Bool
- 
+   public var isDirectChannel: Bool
-   public init(channelController: ChatChannelController,messageController: ChatMessageController?,eventsController: EventsController? = nil,quotedMessage: Binding<ChatMessage?>? = nil)
+   public var showSuggestionsOverlay: Bool
-   public func addFileURLs(_ urls: [URL])
+   public init(channelController: ChatChannelController,messageController: ChatMessageController?,eventsController: EventsController? = nil,quotedMessage: Binding<ChatMessage?>? = nil,editedMessage: Binding<ChatMessage?>? = nil,willSendMessage: (() -> Void)? = nil)
-   public func fillEditedMessage(_ editedMessage: ChatMessage?)
+   
-   public func fillDraftMessage()
+ 
-   public func updateDraftMessage(quotedMessage: ChatMessage?,isSilent: Bool = false,extraData: [String: RawJSON] = [:])
+   public func addFileURLs(_ urls: [URL])
-   public func deleteDraftMessage()
+   public func fillEditedMessage(_ editedMessage: ChatMessage?)
-   open func sendMessage(quotedMessage: ChatMessage?,editedMessage: ChatMessage?,isSilent: Bool = false,skipPush: Bool = false,skipEnrichUrl: Bool = false,extraData: [String: RawJSON] = [:],completion: @escaping @MainActor () -> Void)
+   public func fillDraftMessage()
-   public func change(pickerState: AttachmentPickerState)
+   public func updateDraftMessage(quotedMessage: ChatMessage?,isSilent: Bool = false,extraData: [String: RawJSON] = [:])
-   public func imageTapped(_ addedAsset: AddedAsset)
+   public func deleteDraftMessage()
-   public func imagePasted(_ image: UIImage)
+   open func sendMessage(isSilent: Bool = false,skipPush: Bool = false,skipEnrichUrl: Bool = false,extraData: [String: RawJSON] = [:],completion: (@MainActor () -> Void)? = nil)
-   public func removeAttachment(with id: String)
+   public func change(pickerState: AttachmentPickerState)
-   public func cameraImageAdded(_ image: AddedAsset)
+   public func imageTapped(_ addedAsset: AddedAsset)
-   public func isImageSelected(with id: String)-> Bool
+   public func imagePasted(_ image: UIImage)
-   public func customAttachmentTapped(_ attachment: CustomAttachment)
+   public func removeAttachment(with id: String)
-   public func isCustomAttachmentSelected(_ attachment: CustomAttachment)-> Bool
+   public func cameraImageAdded(_ image: AddedAsset)
-   public func askForPhotosPermission()
+   public func isImageSelected(with id: String)-> Bool
-   public func handleCommand(for text: Binding<String>,selectedRangeLocation: Binding<Int>,command: Binding<ComposerCommand?>,extraData: [String: Any])
+   public func customAttachmentTapped(_ attachment: CustomAttachment)
-   open func convertAddedAssetsToPayloads()throws -> [AnyAttachmentPayload]
+   public func isCustomAttachmentSelected(_ attachment: CustomAttachment)-> Bool
-   public func checkForMentionedUsers(commandId: String?,extraData: [String: Any])
+   public func askForPhotosPermission()
-   public func clearRemovedMentions()
+   public func handleCommand(for text: Binding<String>,selectedRangeLocation: Binding<Int>,command: Binding<ComposerCommand?>,extraData: [String: Any])
-   public func clearInputData()
+   open func convertAddedAssetsToPayloads()throws -> [AnyAttachmentPayload]
-   public func checkChannelCooldown()
+   public func checkForMentionedUsers(commandId: String?,extraData: [String: Any])
-   public func updateAddedAssets(_ assets: [AddedAsset])
+   public func clearRemovedMentions()
+   public func clearInputData()
+   public func checkChannelCooldown()
+   public func updateAddedAssets(_ assets: [AddedAsset])

 public struct PollAttachmentView: View  
-   public init(factory: Factory,message: ChatMessage,poll: Poll,isFirst: Bool)
+   public init(factory: Factory,message: ChatMessage,poll: Poll,isFirst: Bool,width: CGFloat)

 @MainActor public class Utils  
-   public var videoPreviewLoader: VideoPreviewLoader
+   public var cdnRequester: CDNRequester
-   public var imageLoader: ImageLoading
+   public var mediaLoader: MediaLoader
-   public var imageCDN: ImageCDN
+   public var channelNameFormatter: ChannelNameFormatter
-   public var imageProcessor: ImageProcessor
+   public var avPlayerProvider: AVPlayerProvider
-   public var fileCDN: FileCDN
+   public var chatUserNamer: ChatUserNamer
-   public var channelNameFormatter: ChannelNameFormatter
+   public var messageTypeResolver: MessageTypeResolving
-   public var avPlayerProvider: AVPlayerProvider
+   public var messageActionsResolver: MessageActionsResolving
-   public var chatUserNamer: ChatUserNamer
+   public var messageAttachmentPreviewIconProvider: MessageAttachmentPreviewIconProvider
-   public var messageTypeResolver: MessageTypeResolving
+   public var messagePreviewFormatter: MessagePreviewFormatter
-   public var messageActionsResolver: MessageActionsResolving
+   public var commandsConfig: CommandsConfig
-   public var messageAttachmentPreviewIconProvider: MessageAttachmentPreviewIconProvider
+   public var channelListConfig: ChannelListConfig
-   public var messagePreviewFormatter: MessagePreviewFormatter
+   public var messageListConfig: MessageListConfig
-   public var commandsConfig: CommandsConfig
+   public var composerConfig: ComposerConfig
-   public var channelListConfig: ChannelListConfig
+   public var pollsConfig: PollsConfig
-   public var messageListConfig: MessageListConfig
+   public var shouldSyncChannelControllerOnAppear: (ChatChannelController) -> Bool
-   public var composerConfig: ComposerConfig
+   public var snapshotCreator: SnapshotCreator
-   public var pollsConfig: PollsConfig
+   public var messageIdBuilder: MessageIdBuilder
-   public var shouldSyncChannelControllerOnAppear: (ChatChannelController) -> Bool
+   public var sortReactions: (MessageReactionType, MessageReactionType) -> Bool
-   public var snapshotCreator: SnapshotCreator
+   public var videoDurationFormatter: VideoDurationFormatter
-   public var messageIdBuilder: MessageIdBuilder
+   public var mediaBadgeDurationFormatter: MediaBadgeDurationFormatter
-   public var sortReactions: (MessageReactionType, MessageReactionType) -> Bool
+   public var audioRecordingNameFormatter: AudioRecordingNameFormatter
-   public var videoDurationFormatter: VideoDurationFormatter
+   public var messageRemindersFormatter: any MessageRemindersFormatter
-   public var mediaBadgeDurationFormatter: MediaBadgeDurationFormatter
+   public var audioPlayerBuilder: () -> AudioPlaying
-   public var audioRecordingNameFormatter: AudioRecordingNameFormatter
+   public var audioPlayer: AudioPlaying
-   public var messageRemindersFormatter: any MessageRemindersFormatter
+   public var audioRecorderBuilder: () -> AudioRecording
-   public var audioPlayerBuilder: () -> AudioPlaying
+   public var audioRecorder: AudioRecording
-   public var audioPlayer: AudioPlaying
+   @MainActor public lazy var audioSessionFeedbackGenerator: AudioSessionFeedbackGenerator
-   public var audioRecorderBuilder: () -> AudioRecording
+   public var originalTranslationsStore
-   public var audioRecorder: AudioRecording
+   public static var defaultSortReactions: (MessageReactionType, MessageReactionType) -> Bool
-   @MainActor public lazy var audioSessionFeedbackGenerator: AudioSessionFeedbackGenerator
+   
-   public var originalTranslationsStore
+ 
-   public static var defaultSortReactions: (MessageReactionType, MessageReactionType) -> Bool
+   public init(markdownFormatter: MarkdownFormatter = DefaultMarkdownFormatter(),dateFormatter: DateFormatter = .makeDefault(),messageTimestampFormatter: MessageTimestampFormatter = ChannelListMessageTimestampFormatter(),galleryHeaderViewDateFormatter: GalleryHeaderViewDateFormatter = DefaultGalleryHeaderViewDateFormatter(),messageDateSeparatorFormatter: MessageDateSeparatorFormatter = DefaultMessageDateSeparatorFormatter(),cdnRequester: CDNRequester = StreamCDNRequester(),mediaLoader: MediaLoader? = nil,avPlayerProvider: AVPlayerProvider = DefaultAVPlayerProvider(),messageTypeResolver: MessageTypeResolving = MessageTypeResolver(),messageActionResolver: MessageActionsResolving = MessageActionsResolver(),messageAttachmentPreviewIconProvider: MessageAttachmentPreviewIconProvider = DefaultMessageAttachmentPreviewIconProvider(),messagePreviewFormatter: MessagePreviewFormatter = MessagePreviewFormatter(),commandsConfig: CommandsConfig = DefaultCommandsConfig(),channelListConfig: ChannelListConfig = ChannelListConfig(),messageListConfig: MessageListConfig = MessageListConfig(),composerConfig: ComposerConfig = ComposerConfig(),pollsConfig: PollsConfig = PollsConfig(),channelNameFormatter: ChannelNameFormatter = DefaultChannelNameFormatter(),chatUserNamer: ChatUserNamer = DefaultChatUserNamer(),snapshotCreator: SnapshotCreator = DefaultSnapshotCreator(),messageIdBuilder: MessageIdBuilder = DefaultMessageIdBuilder(),videoDurationFormatter: VideoDurationFormatter = DefaultVideoDurationFormatter(),mediaBadgeDurationFormatter: MediaBadgeDurationFormatter = DefaultMediaBadgeDurationFormatter(),audioRecordingNameFormatter: AudioRecordingNameFormatter = DefaultAudioRecordingNameFormatter(),messageRemindersFormatter: any MessageRemindersFormatter = DefaultMessageRemindersFormatter(),sortReactions: @escaping (MessageReactionType, MessageReactionType) -> Bool = Utils.defaultSortReactions,shouldSyncChannelControllerOnAppear: @escaping (ChatChannelController) -> Bool = { _ in true })
-   
- 
-   public init(markdownFormatter: MarkdownFormatter = DefaultMarkdownFormatter(),dateFormatter: DateFormatter = .makeDefault(),messageTimestampFormatter: MessageTimestampFormatter = ChannelListMessageTimestampFormatter(),galleryHeaderViewDateFormatter: GalleryHeaderViewDateFormatter = DefaultGalleryHeaderViewDateFormatter(),messageDateSeparatorFormatter: MessageDateSeparatorFormatter = DefaultMessageDateSeparatorFormatter(),videoPreviewLoader: VideoPreviewLoader = DefaultVideoPreviewLoader(),imageLoader: ImageLoading = NukeImageLoader(),imageCDN: ImageCDN = StreamImageCDN(),imageProcessor: ImageProcessor = NukeImageProcessor(),fileCDN: FileCDN = DefaultFileCDN(),avPlayerProvider: AVPlayerProvider = DefaultAVPlayerProvider(),messageTypeResolver: MessageTypeResolving = MessageTypeResolver(),messageActionResolver: MessageActionsResolving = MessageActionsResolver(),messageAttachmentPreviewIconProvider: MessageAttachmentPreviewIconProvider = DefaultMessageAttachmentPreviewIconProvider(),messagePreviewFormatter: MessagePreviewFormatter = MessagePreviewFormatter(),commandsConfig: CommandsConfig = DefaultCommandsConfig(),channelListConfig: ChannelListConfig = ChannelListConfig(),messageListConfig: MessageListConfig = MessageListConfig(),composerConfig: ComposerConfig = ComposerConfig(),pollsConfig: PollsConfig = PollsConfig(),channelNameFormatter: ChannelNameFormatter = DefaultChannelNameFormatter(),chatUserNamer: ChatUserNamer = DefaultChatUserNamer(),snapshotCreator: SnapshotCreator = DefaultSnapshotCreator(),messageIdBuilder: MessageIdBuilder = DefaultMessageIdBuilder(),videoDurationFormatter: VideoDurationFormatter = DefaultVideoDurationFormatter(),mediaBadgeDurationFormatter: MediaBadgeDurationFormatter = DefaultMediaBadgeDurationFormatter(),audioRecordingNameFormatter: AudioRecordingNameFormatter = DefaultAudioRecordingNameFormatter(),messageRemindersFormatter: any MessageRemindersFormatter = DefaultMessageRemindersFormatter(),sortReactions: @escaping (MessageReactionType, MessageReactionType) -> Bool = Utils.defaultSortReactions,shouldSyncChannelControllerOnAppear: @escaping (ChatChannelController) -> Bool = { _ in true })

 public struct ChannelList: View  
-   public init(factory: Factory,channels: [ChatChannel],selectedChannel: Binding<ChannelSelectionInfo?>,swipedChannelId: Binding<String?>,scrolledChannelId: Binding<String?> = .constant(nil),scrollable: Bool = true,onItemTap: @escaping @MainActor (ChatChannel) -> Void,onItemAppear: @escaping @MainActor (Int) -> Void,channelDestination: @escaping @MainActor (ChannelSelectionInfo) -> Factory.ChannelDestination,trailingSwipeRightButtonTapped: @escaping @MainActor (ChatChannel) -> Void = { _ in },trailingSwipeLeftButtonTapped: @escaping @MainActor (ChatChannel) -> Void = { _ in },leadingSwipeButtonTapped: @escaping @MainActor (ChatChannel) -> Void = { _ in })
+   public init(factory: Factory,channels: [ChatChannel],selectedChannel: Binding<ChannelSelectionInfo?>,swipedChannelId: Binding<String?>,scrolledChannelId: Binding<String?> = .constant(nil),scrollable: Bool = true,onItemTap: @escaping @MainActor (ChatChannel) -> Void,onItemAppear: @escaping @MainActor (Int) -> Void,channelDestination: (@MainActor (ChannelSelectionInfo) -> Factory.ChannelDestination)? = nil,trailingSwipeRightButtonTapped: @escaping @MainActor (ChatChannel) -> Void = { _ in },trailingSwipeLeftButtonTapped: @escaping @MainActor (ChatChannel) -> Void = { _ in },leadingSwipeButtonTapped: @escaping @MainActor (ChatChannel) -> Void = { _ in })

 public final class MessageTextViewOptions: Sendable  
-   
+   public let translationLanguage: TranslationLanguage?
- 
+   
-   public init(message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)
+ 
+   public init(message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>,translationLanguage: TranslationLanguage?)

 public final class DefaultAVPlayerProvider: AVPlayerProvider  
-   public func player(for url: URL,completion: @escaping ((Result<AVPlayer, Error>) -> Void))
+   public func player(from videoAsset: MediaLoaderVideoAsset,completion: @escaping (Result<AVPlayer, Error>) -> Void)

 public enum LoadingSpinnerSize: Sendable  
-   @MainActor public static var small: CGFloat
+   @MainActor public static var medium: CGFloat
-   @MainActor public static var extraSmall: CGFloat
+   @MainActor public static var small: CGFloat
+   @MainActor public static var extraSmall: CGFloat

 public struct UserAvatar: View  
-   public init(user: ChatUser,size: CGFloat,showsIndicator: Bool = false,showsBorder: Bool = true)
+   public init(user: ChatUser,size: CGFloat,indicator: AvatarIndicator = .none,showsBorder: Bool = true)

@sonarqubecloud
Copy link
Copy Markdown

@Stream-SDK-Bot
Copy link
Copy Markdown
Collaborator Author

SDK Size

title previous release current release diff status
StreamChatSwiftUI 8.65 MB 8.06 MB -609 KB πŸš€

@Stream-SDK-Bot
Copy link
Copy Markdown
Collaborator Author

StreamChatSwiftUI XCSize

Object Diff (bytes)
ChatChannelHeaderViewModifier.o -90994
ChatChannelSwipeableListItem.o -87634
MessageAttachmentsView.o +77086
ChatChannelListViewModel.o -66856
MessageItemView.o -62432
Show 177 more objects
Object Diff (bytes)
PinnedMessagesView.o -62020
ChatThreadListNavigatableItem.o -54796
MessageView.o -41739
AddUsersView.o -40208
MessageListView.o -39264
MemberAddView.o +37892
MoreChannelActionsView.o -35338
ReactionsOverlayView.o -34631
MessageContainerView.o -30984
MessageTopView.o -30502
ChatChannelNavigatableListItem.o -29850
MessageRepliesView.o -29516
TypingIndicatorView.o -29208
ChatChannelListItem.o -27376
MessageListHelperViews.o -23438
MemberListView.o +20203
ChatChannelInfoHelperViews.o -15519
MediaViewer.o +15315
VideoPreviewLoader.o -14793
FileAttachmentView.o +14727
ChatMessage+Extensions.o +14555
AttachmentDownloadingStateView.o -12602
ChatChannelListView.o +10550
AddUsersViewModel.o -9953
MemberAddViewModel.o +9781
LazyImage.o -9414
JumpToUnreadButton.o +8239
DefaultChannelActions.o -7610
ReactionsDetailViewModel.o +7508
MessageMediaAttachmentContentView.o +7389
MediaAttachment.o +6697
MessageMediaAttachmentsContainerView.o +6621
FetchImage.o -6614
StreamAsyncImage.o +6611
EmptyContentView.o +6284
NoContentView.o -6227
ReactionsDetailView.o +5688
MessageComposerViewModel.o +4738
DeletedMessageView.o -4462
RetryBadgeView.o +4436
PercentageProgressView.o -4309
StreamImageDownloader.o +3967
ChatChannelInfoViewModel.o +3742
NukeImageProcessor.o -3633
ImageCDN.o -3596
ChatThreadListItem.o +3594
NukeImageLoader.o -3546
GiphyAttachmentView.o -2908
SendMessageButton.o +2737
Appearance.o -2728
TaskLoadImage.o -2654
LiquidGlassModifiers.o +2642
AlertBannerViewModifier.o +2604
PollAttachmentView.o +2588
AttachmentViewFactoryOptions.o +2531
ChatChannelInfoView.o -2520
FileAttachmentPreview.o +2512
MessageComposerView.o +2464
ChannelAvatar.o -2461
ImagePipeline+Cache.o -2212
LoadingSpinnerView.o +2047
MessageViewFactoryOptions.o +2030
MessageImagePreviewView.o -1893
ImageLoading.o -1841
MessageViewModel.o +1783
FileAttachmentsView.o -1768
ImagePipeline.o +1728
EmptyChannelsView.o +1604
NoChannelsView.o -1558
ComposerVoiceRecordingInputView.o +1524
CreatePollView.o +1404
MessageBubble.o -1351
ParticipantInfoView.o +1332
ImageTask.o +1324
EmptyThreadsView.o +1316
ChatThreadList.o -1292
NoThreadsView.o -1290
WaveformView.o +1275
Utils.o -1259
MessagePreviewFormatter.o +1119
MarkdownFormatter.o -1060
TrailingInputComposerView.o +1030
VoiceRecordingContainerView.o +986
LazyLoadingImage.o +958
MediaAttachmentsViewModel.o +948
ChatChannelView.o +894
FileCDN.o -890
L10n.o +880
MessageVideoPreviewView.o -872
AttachmentTextView.o -867
CommandsConfig.o +860
AttachmentUploadingStateView.o +857
EditGroupView.o +812
ImageProcessing.o -812
ComposerViewFactoryOptions.o +774
LinkAttachmentView.o +759
MessageComposerViewModel+Recording.o +723
ChatChannelViewModel.o -723
MediaAttachmentsView.o -653
MessageAnnotationView.o +618
ComposerConfig.o +595
AttachmentPickerPromptView.o -578
PollResultsView.o +540
SnackBarView.o +464
ChannelViewFactoryOptions.o +448
VoiceRecordingGestureOverlay.o +388
MoreChannelActionsViewModel.o -367
ChatChannelList.o -348
PhotoAssetLoader.o +335
AttachmentTypePickerView.o +324
PollCommentsView.o +312
Styles.o -296
LoadingView.o -292
ChatQuotedMessageView.o -282
DefaultViewFactory.o +261
EditedMessageView.o +256
ComposerAttachmentPickerButton.o +256
ComposerModels.o +240
ViewFactory.o +230
AudioVisualizationView.o -216
StreamChatCommonUI_-2A9222176197F8FB_PackageProduct +212
AsyncTask.o -210
ChatClient+Extensions.o -206
Foundation.tbd -196
InjectedValuesExtensions.o -192
ComposerQuotedMessageView.o +188
MessageAttachmentPreviewResolver.o +182
MediaBadge.o +172
ActionItemView.o +172
SearchResultsView.o -170
PollsConfig.o -156
BadgeNotificationView.o +156
PollAttachmentViewModel.o -140
AttachmentCommandsPickerView.o -132
ViewModelsFactory.o +124
VoiceRecordingLockView.o +116
ComposerTextInputView.o -114
ReactionsIconProvider.o +112
ComposerFileAttachmentView.o -104
GiphyBadgeView.o +104
ChatThreadListHeaderView.o -104
SearchBar.o +102
DefaultMessageActions.o -98
BadgeCountView.o +96
MessageAttachmentPreviewThumbnailView.o -92
CommandChipView.o +88
CommandsHandler.o +88
KeyboardHandling.o +84
RadioCheckView.o +84
SendInChannelView.o +80
ReferenceMessageView.o +80
ReactionsOverlayContainer.o -72
ComposerVoiceRecordingAttachmentView.o -72
AttachmentCameraPickerView.o +71
ViewExtensions.o +68
StreamChat +68
AttachmentMediaPickerItemView.o -68
DataPublisher.o +68
MessageAttachmentPreviewKind.o +66
StreamButton.o +64
SystemMessageView.o +60
SwiftUI+UIAlertController.o -60
TaskFetchOriginalData.o +60
SnapshotCreator.o +60
DataCache.o -58
Modifiers.o -56
AvatarStack.o +56
MessageAttachmentPreviewIconView.o +56
UserAvatar.o +56
UIImageView+SwiftyGif.o -56
ChatChannelHelperViews.o +56
MessageActionsView.o +52
ImageRequest.o -49
ComposerAttachmentsContainerView.o -44
PollAllOptionsView.o +44
ReactionsView.o -42
AvatarIndicatorViewModifier.o -42

@github-actions
Copy link
Copy Markdown

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

@testableapple
Copy link
Copy Markdown
Contributor

/merge release

@testableapple
Copy link
Copy Markdown
Contributor

Publication of the release has been launched πŸ‘

@github-actions github-actions Bot merged commit 35e9c74 into main Apr 16, 2026
12 of 13 checks passed
@github-actions github-actions Bot deleted the release/5.0.0 branch April 16, 2026 17:17
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.

5 participants