Skip to content

Conversation

martinmitrevski
Copy link
Contributor

🔗 Issue Links

Provide all Linear and/or Github issues related to this PR, if applicable.

🎯 Goal

Describe why we are making this change.

📝 Summary

Provide bullet points with the most important changes in the codebase.

🛠 Implementation

Provide a detailed description of the implementation and explain your decisions if you find them relevant.

🎨 Showcase

Add relevant screenshots and/or videos/gifs to easily see what this PR changes, if applicable.

Before After
img img

🧪 Manual Testing Notes

Explain how this change can be tested manually, if applicable.

☑️ Contributor Checklist

  • I have signed the Stream CLA (required)
  • This change should be manually QAed
  • Changelog is updated with client-facing changes
  • Changelog is updated with new localization keys
  • New code is covered by unit tests
  • Documentation has been updated in the docs-content repo

@martinmitrevski martinmitrevski requested a review from a team as a code owner September 24, 2025 14:49
@martinmitrevski martinmitrevski marked this pull request as draft September 24, 2025 14:49
Copy link

1 Warning
⚠️ Big PR
1 Message
📖 There seems to be app changes but CHANGELOG wasn't modified.
Please include an entry if the PR includes user-facing changes.
You can find it at CHANGELOG.md.

Generated by 🚫 Danger

@Stream-SDK-Bot
Copy link
Collaborator

Stream-SDK-Bot commented Sep 24, 2025

SDK Size

title develop branch diff status
StreamChatSwiftUI 9.43 MB 9.88 MB +453 KB 🟡

Copy link

github-actions bot commented Sep 25, 2025

Public Interface

+ public final class MessageListDateIndicatorViewOptions: Sendable  
+ 
+   public let date: Date
+   
+ 
+   public init(date: Date)

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

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

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

+ public final class ChannelListBackgroundOptions: Sendable  
+ 
+   public let colors: ColorPalette
+   
+ 
+   public init(colors: ColorPalette)

+ public final class QuotedMessageHeaderViewOptions: Sendable  
+ 
+   public let quotedMessage: Binding<ChatMessage?>
+   
+ 
+   public init(quotedMessage: Binding<ChatMessage?>)

+ public final class TrailingSwipeActionsViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let offsetX: CGFloat
+   public let buttonWidth: CGFloat
+   public let swipedChannelId: Binding<String?>
+   public let leftButtonTapped: @MainActor(ChatChannel) -> Void
+   public let rightButtonTapped: @MainActor(ChatChannel) -> Void
+   
+ 
+   public init(channel: ChatChannel,offsetX: CGFloat,buttonWidth: CGFloat,swipedChannelId: Binding<String?>,leftButtonTapped: @escaping @MainActor(ChatChannel) -> Void,rightButtonTapped: @escaping @MainActor(ChatChannel) -> Void)

+ public final class MessageListBackgroundOptions: Sendable  
+ 
+   public let colors: ColorPalette
+   public let isInThread: Bool
+   
+ 
+   public init(colors: ColorPalette,isInThread: Bool)

+ public final class ComposerRecordingViewOptions: Sendable  
+ 
+   public let viewModel: MessageComposerViewModel
+   public let gestureLocation: CGPoint
+   
+ 
+   public init(viewModel: MessageComposerViewModel,gestureLocation: CGPoint)

+ public final class MessageAuthorAndDateViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   
+ 
+   public init(message: ChatMessage)

+ public final class DeletedMessageViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   public let isFirst: Bool
+   public let availableWidth: CGFloat
+   
+ 
+   public init(message: ChatMessage,isFirst: Bool,availableWidth: CGFloat)

+ public final class ChannelListHeaderViewModifierOptions: Sendable  
+ 
+   public let title: String
+   
+ 
+   public init(title: String)

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

+ public final class MessageAvatarViewOptions: Sendable  
+ 
+   public let userDisplayInfo: UserDisplayInfo
+   
+ 
+   public init(userDisplayInfo: UserDisplayInfo)

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

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

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

+ public final class ChannelListItemBackgroundOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let isSelected: Bool
+   
+ 
+   public init(channel: ChatChannel,isSelected: Bool)

+ public final class EditedMessageHeaderViewOptions: Sendable  
+ 
+   public let editedMessage: Binding<ChatMessage?>
+   
+ 
+   public init(editedMessage: Binding<ChatMessage?>)

+ public final class MessageDateViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   
+ 
+   public init(message: ChatMessage)

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

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

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

+ public final class ChannelHeaderViewModifierOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   
+ 
+   public init(channel: ChatChannel)

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

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

+ public final class MessageReadIndicatorViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let message: ChatMessage
+   
+ 
+   public init(channel: ChatChannel,message: ChatMessage)

+ public final class MoreChannelActionsViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let swipedChannelId: Binding<String?>
+   public let onDismiss: @MainActor() -> Void
+   public let onError: @MainActor(Error) -> Void
+   
+ 
+   public init(channel: ChatChannel,swipedChannelId: Binding<String?>,onDismiss: @escaping @MainActor() -> Void,onError: @escaping @MainActor(Error) -> Void)

+ public final class MessageTranslationFooterViewOptions: Sendable  
+ 
+   public let messageViewModel: MessageViewModel
+   
+ 
+   public init(messageViewModel: MessageViewModel)

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

+ public final class QuotedMessageViewOptions: Sendable  
+ 
+   public let quotedMessage: ChatMessage
+   public let fillAvailableSpace: Bool
+   public let isInComposer: Bool
+   public let scrolledId: Binding<String?>
+   
+ 
+   public init(quotedMessage: ChatMessage,fillAvailableSpace: Bool,isInComposer: Bool,scrolledId: Binding<String?>)

+ public final class ChannelBarsVisibilityViewModifierOptions: Sendable  
+ 
+   public let shouldShow: Bool
+   
+ 
+   public init(shouldShow: Bool)

+ public final class GiphyBadgeViewTypeOptions: Sendable  
+ 
+   public let message: ChatMessage
+   public let availableWidth: CGFloat
+   
+ 
+   public init(message: ChatMessage,availableWidth: CGFloat)

+ public final class ThreadListFooterViewOptions: Sendable  
+ 
+   public let viewModel: ChatThreadListViewModel
+   
+ 
+   public init(viewModel: ChatThreadListViewModel)

+ public final class ReactionsBottomViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   public let showsAllInfo: Bool
+   public let onTap: @MainActor() -> Void
+   public let onLongPress: @MainActor() -> Void
+   
+ 
+   public init(message: ChatMessage,showsAllInfo: Bool,onTap: @escaping @MainActor() -> Void,onLongPress: @escaping @MainActor() -> Void)

+ public final class ComposerInputViewOptions: Sendable  
+ 
+   public let text: Binding<String>
+   public let selectedRangeLocation: Binding<Int>
+   public let command: Binding<ComposerCommand?>
+   public let addedAssets: [AddedAsset]
+   public let addedFileURLs: [URL]
+   public let addedCustomAttachments: [CustomAttachment]
+   public let quotedMessage: Binding<ChatMessage?>
+   public let maxMessageLength: Int?
+   public let cooldownDuration: Int
+   public let onCustomAttachmentTap: @MainActor(CustomAttachment) -> Void
+   public let shouldScroll: Bool
+   public let removeAttachmentWithId: @MainActor(String) -> Void
+   
+ 
+   public init(text: Binding<String>,selectedRangeLocation: Binding<Int>,command: Binding<ComposerCommand?>,addedAssets: [AddedAsset],addedFileURLs: [URL],addedCustomAttachments: [CustomAttachment],quotedMessage: Binding<ChatMessage?>,maxMessageLength: Int?,cooldownDuration: Int,onCustomAttachmentTap: @escaping @MainActor(CustomAttachment) -> Void,shouldScroll: Bool,removeAttachmentWithId: @escaping @MainActor(String) -> Void)

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

+ public final class VideoPlayerViewOptions: Sendable  
+ 
+   public let attachment: ChatMessageVideoAttachment
+   public let message: ChatMessage
+   public let isShown: Binding<Bool>
+   public let options: MediaViewsOptions
+   
+ 
+   public init(attachment: ChatMessageVideoAttachment,message: ChatMessage,isShown: Binding<Bool>,options: MediaViewsOptions)

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

+ public final class LastInGroupHeaderViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   
+ 
+   public init(message: ChatMessage)

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

+ public final class ComposerRecordingLockedViewOptions: Sendable  
+ 
+   public let viewModel: MessageComposerViewModel
+   
+ 
+   public init(viewModel: MessageComposerViewModel)

+ public final class SupportedMoreChannelActionsOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let onDismiss: @MainActor() -> Void
+   public let onError: @MainActor(Error) -> Void
+   
+ 
+   public init(channel: ChatChannel,onDismiss: @escaping @MainActor() -> Void,onError: @escaping @MainActor(Error) -> Void)

+ public final class EmojiTextViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   public let scrolledId: Binding<String?>
+   public let isFirst: Bool
+   
+ 
+   public init(message: ChatMessage,scrolledId: Binding<String?>,isFirst: Bool)

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

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

+ public final class ThreadListErrorBannerViewOptions: Sendable  
+ 
+   public let onRefreshAction: @MainActor() -> Void
+   
+ 
+   public init(onRefreshAction: @escaping @MainActor() -> Void)

+ public final class LeadingComposerViewOptions: Sendable  
+ 
+   public let state: Binding<PickerTypeState>
+   public let channelConfig: ChannelConfig?
+   
+ 
+   public init(state: Binding<PickerTypeState>,channelConfig: ChannelConfig?)

+ public final class ThreadListHeaderViewModifierOptions: Sendable  
+ 
+   public let title: String
+   
+ 
+   public init(title: String)

+ public final class ChannelAvatarViewFactoryOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let options: ChannelAvatarViewOptions
+   
+ 
+   public init(channel: ChatChannel,options: ChannelAvatarViewOptions)

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

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

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

+ public final class TypingIndicatorBottomViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let currentUserId: UserId?
+   
+ 
+   public init(channel: ChatChannel,currentUserId: UserId?)

+ public final class SearchResultsViewOptions: Sendable  
+ 
+   public let selectedChannel: Binding<ChannelSelectionInfo?>
+   public let searchResults: [ChannelSelectionInfo]
+   public let loadingSearchResults: Bool
+   public let onlineIndicatorShown: @MainActor(ChatChannel) -> Bool
+   public let channelNaming: @MainActor(ChatChannel) -> String
+   public let imageLoader: @MainActor(ChatChannel) -> UIImage
+   public let onSearchResultTap: @MainActor(ChannelSelectionInfo) -> Void
+   public let onItemAppear: @MainActor(Int) -> Void
+   
+ 
+   public init(selectedChannel: Binding<ChannelSelectionInfo?>,searchResults: [ChannelSelectionInfo],loadingSearchResults: Bool,onlineIndicatorShown: @escaping @MainActor(ChatChannel) -> Bool,channelNaming: @escaping @MainActor(ChatChannel) -> String,imageLoader: @escaping @MainActor(ChatChannel) -> UIImage,onSearchResultTap: @escaping @MainActor(ChannelSelectionInfo) -> Void,onItemAppear: @escaping @MainActor(Int) -> Void)

+ public final class CameraPickerViewOptions: Sendable  
+ 
+   public let selected: Binding<AttachmentPickerState>
+   public let cameraPickerShown: Binding<Bool>
+   public let cameraImageAdded: @MainActor(AddedAsset) -> Void
+   
+ 
+   public init(selected: Binding<AttachmentPickerState>,cameraPickerShown: Binding<Bool>,cameraImageAdded: @escaping @MainActor(AddedAsset) -> Void)

+ public final class SupportedMessageActionsOptions: Sendable  
+ 
+   public let message: ChatMessage
+   public let channel: ChatChannel
+   public let onFinish: @MainActor(MessageActionInfo) -> Void
+   public let onError: @MainActor(Error) -> Void
+   
+ 
+   public init(message: ChatMessage,channel: ChatChannel,onFinish: @escaping @MainActor(MessageActionInfo) -> Void,onError: @escaping @MainActor(Error) -> Void)

+ public final class MessageReactionViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   public let onTapGesture: @MainActor() -> Void
+   public let onLongPressGesture: @MainActor() -> Void
+   
+ 
+   public init(message: ChatMessage,onTapGesture: @escaping @MainActor() -> Void,onLongPressGesture: @escaping @MainActor() -> Void)

+ public final class AttachmentSourcePickerViewOptions: Sendable  
+ 
+   public let selected: AttachmentPickerState
+   public let onPickerStateChange: @MainActor(AttachmentPickerState) -> Void
+   
+ 
+   public init(selected: AttachmentPickerState,onPickerStateChange: @escaping @MainActor(AttachmentPickerState) -> Void)

+ public final class GalleryViewOptions: Sendable  
+ 
+   public let mediaAttachments: [MediaAttachment]
+   public let message: ChatMessage
+   public let isShown: Binding<Bool>
+   public let options: MediaViewsOptions
+   
+ 
+   public init(mediaAttachments: [MediaAttachment],message: ChatMessage,isShown: Binding<Bool>,options: MediaViewsOptions)

+ public final class VideoPlayerHeaderViewOptions: 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 MessageListContainerModifierOptions: Sendable  
+ 
+   public init()

+ public final class CustomComposerAttachmentViewOptions: Sendable  
+ 
+   public let addedCustomAttachments: [CustomAttachment]
+   public let onCustomAttachmentTap: @MainActor(CustomAttachment) -> Void
+   
+ 
+   public init(addedCustomAttachments: [CustomAttachment],onCustomAttachmentTap: @escaping @MainActor(CustomAttachment) -> Void)

+ public final class FilePickerViewOptions: Sendable  
+ 
+   public let filePickerShown: Binding<Bool>
+   public let addedFileURLs: Binding<[URL]>
+   
+ 
+   public init(filePickerShown: Binding<Bool>,addedFileURLs: Binding<[URL]>)

+ public final class ThreadListHeaderViewOptions: Sendable  
+ 
+   public let viewModel: ChatThreadListViewModel
+   
+ 
+   public init(viewModel: ChatThreadListViewModel)

+ public final class LeadingSwipeActionsViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let offsetX: CGFloat
+   public let buttonWidth: CGFloat
+   public let swipedChannelId: Binding<String?>
+   public let buttonTapped: @MainActor(ChatChannel) -> Void
+   
+ 
+   public init(channel: ChatChannel,offsetX: CGFloat,buttonWidth: CGFloat,swipedChannelId: Binding<String?>,buttonTapped: @escaping @MainActor(ChatChannel) -> Void)

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

+ public final class ReactionsBackgroundOptions: Sendable  
+ 
+   public let currentSnapshot: UIImage
+   public let popInAnimationInProgress: Bool
+   
+ 
+   public init(currentSnapshot: UIImage,popInAnimationInProgress: Bool)

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

+ public final class MessageActionsViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   public let channel: ChatChannel
+   public let onFinish: @MainActor(MessageActionInfo) -> Void
+   public let onError: @MainActor(Error) -> Void
+   
+ 
+   public init(message: ChatMessage,channel: ChatChannel,onFinish: @escaping @MainActor(MessageActionInfo) -> Void,onError: @escaping @MainActor(Error) -> Void)

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

+ public final class ReactionsContentViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   public let contentRect: CGRect
+   public let onReactionTap: @MainActor(MessageReactionType) -> Void
+   
+ 
+   public init(message: ChatMessage,contentRect: CGRect,onReactionTap: @escaping @MainActor(MessageReactionType) -> Void)

+ public final class ComposerPollViewOptions: Sendable  
+ 
+   public let channelController: ChatChannelController
+   public let messageController: ChatMessageController?
+   
+ 
+   public init(channelController: ChatChannelController,messageController: ChatMessageController?)

+ public final class PhotoAttachmentPickerViewOptions: Sendable  
+ 
+   public let assets: PHFetchResultCollection
+   public let onAssetTap: @MainActor(AddedAsset) -> Void
+   public let isAssetSelected: @MainActor(String) -> Bool
+   
+ 
+   public init(assets: PHFetchResultCollection,onAssetTap: @escaping @MainActor(AddedAsset) -> Void,isAssetSelected: @escaping @MainActor(String) -> Bool)

+ public final class ChannelListSearchResultItemOptions  
+ 
+   public let searchResult: ChannelSelectionInfo
+   public let onlineIndicatorShown: Bool
+   public let channelName: String
+   public let avatar: UIImage
+   public let onSearchResultTap: @MainActor(ChannelSelectionInfo) -> Void
+   public let channelDestination: @MainActor(ChannelSelectionInfo) -> ChannelDestination
+   
+ 
+   public init(searchResult: ChannelSelectionInfo,onlineIndicatorShown: Bool,channelName: String,avatar: UIImage,onSearchResultTap: @escaping @MainActor(ChannelSelectionInfo) -> Void,channelDestination: @escaping @MainActor(ChannelSelectionInfo) -> ChannelDestination)

+ public final class CommandsContainerViewOptions: @unchecked Sendable  
+ 
+   public let suggestions: [String: Any]
+   public let handleCommand: @MainActor([String: Any]) -> Void
+   
+ 
+   public init(suggestions: [String: Any],handleCommand: @escaping @MainActor([String: Any]) -> Void)

+ public final class MessageRepliesViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let message: ChatMessage
+   public let replyCount: Int
+   
+ 
+   public init(channel: ChatChannel,message: ChatMessage,replyCount: Int)

+ public final class DateIndicatorViewOptions: Sendable  
+ 
+   public let dateString: String
+   
+ 
+   public init(dateString: String)

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

+ public final class VideoPlayerFooterViewOptions: Sendable  
+ 
+   public let attachment: ChatMessageVideoAttachment
+   public let shown: Binding<Bool>
+   
+ 
+   public init(attachment: ChatMessageVideoAttachment,shown: Binding<Bool>)

+ public final class CustomAttachmentQuotedViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   
+ 
+   public init(message: ChatMessage)

+ public final class ScrollToBottomButtonOptions: Sendable  
+ 
+   public let unreadCount: Int
+   public let onScrollToBottom: @MainActor() -> Void
+   
+ 
+   public init(unreadCount: Int,onScrollToBottom: @escaping @MainActor() -> Void)

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

+ public final class SendInChannelViewOptions: Sendable  
+ 
+   public let showReplyInChannel: Binding<Bool>
+   public let isDirectMessage: Bool
+   
+ 
+   public init(showReplyInChannel: Binding<Bool>,isDirectMessage: Bool)

+ public final class ThreadListContainerModifierOptions: Sendable  
+ 
+   public let viewModel: ChatThreadListViewModel
+   
+ 
+   public init(viewModel: ChatThreadListViewModel)

+ public final class ChannelListTopViewOptions: Sendable  
+ 
+   public let searchText: Binding<String>
+   
+ 
+   public init(searchText: Binding<String>)

+ public final class CustomAttachmentPreviewViewOptions: Sendable  
+ 
+   public let addedCustomAttachments: [CustomAttachment]
+   public let onCustomAttachmentTap: @MainActor(CustomAttachment) -> Void
+   
+ 
+   public init(addedCustomAttachments: [CustomAttachment],onCustomAttachmentTap: @escaping @MainActor(CustomAttachment) -> Void)

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

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

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

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

+ public final class ThreadListItemBackgroundOptions: Sendable  
+ 
+   public let thread: ChatThread
+   public let isSelected: Bool
+   
+ 
+   public init(thread: ChatThread,isSelected: Bool)

+ public final class ChannelListItemOptions  
+ 
+   public let channel: ChatChannel
+   public let channelName: String
+   public let avatar: UIImage
+   public let onlineIndicatorShown: Bool
+   public let disabled: Bool
+   public let selectedChannel: Binding<ChannelSelectionInfo?>
+   public let swipedChannelId: Binding<String?>
+   public let channelDestination: @MainActor(ChannelSelectionInfo) -> ChannelDestination
+   public let onItemTap: @MainActor(ChatChannel) -> Void
+   public let trailingSwipeRightButtonTapped: @MainActor(ChatChannel) -> Void
+   public let trailingSwipeLeftButtonTapped: @MainActor(ChatChannel) -> Void
+   public let leadingSwipeButtonTapped: @MainActor(ChatChannel) -> Void
+   
+ 
+   public init(channel: ChatChannel,channelName: String,avatar: UIImage,onlineIndicatorShown: Bool,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 final class ThreadListItemOptions  
+ 
+   public let thread: ChatThread
+   public let threadDestination: @MainActor(ChatThread) -> ThreadDestination
+   public let selectedThread: Binding<ThreadSelectionInfo?>
+   
+ 
+   public init(thread: ChatThread,threadDestination: @escaping @MainActor(ChatThread) -> ThreadDestination,selectedThread: Binding<ThreadSelectionInfo?>)

+ public final class QuotedMessageAvatarViewOptions: Sendable  
+ 
+   public let userDisplayInfo: UserDisplayInfo
+   public let size: CGSize
+   
+ 
+   public init(userDisplayInfo: UserDisplayInfo,size: CGSize)

+ public final class ComposerTextInputViewOptions: Sendable  
+ 
+   public let text: Binding<String>
+   public let height: Binding<CGFloat>
+   public let selectedRangeLocation: Binding<Int>
+   public let placeholder: String
+   public let editable: Bool
+   public let maxMessageLength: Int?
+   public let currentHeight: CGFloat
+   
+ 
+   public init(text: Binding<String>,height: Binding<CGFloat>,selectedRangeLocation: Binding<Int>,placeholder: String,editable: Bool,maxMessageLength: Int?,currentHeight: CGFloat)

+ public final class ReactionsOverlayViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let currentSnapshot: UIImage
+   public let messageDisplayInfo: MessageDisplayInfo
+   public let onBackgroundTap: @MainActor() -> Void
+   public let onActionExecuted: @MainActor(MessageActionInfo) -> Void
+   
+ 
+   public init(channel: ChatChannel,currentSnapshot: UIImage,messageDisplayInfo: MessageDisplayInfo,onBackgroundTap: @escaping @MainActor() -> Void,onActionExecuted: @escaping @MainActor(MessageActionInfo) -> Void)

+ public final class AttachmentPickerViewOptions: Sendable  
+ 
+   public let attachmentPickerState: Binding<AttachmentPickerState>
+   public let filePickerShown: Binding<Bool>
+   public let cameraPickerShown: Binding<Bool>
+   public let addedFileURLs: Binding<[URL]>
+   public let onPickerStateChange: @MainActor(AttachmentPickerState) -> Void
+   public let photoLibraryAssets: PHFetchResult<PHAsset>?
+   public let onAssetTap: @MainActor(AddedAsset) -> Void
+   public let onCustomAttachmentTap: @MainActor(CustomAttachment) -> Void
+   public let isAssetSelected: @MainActor(String) -> Bool
+   public let addedCustomAttachments: [CustomAttachment]
+   public let cameraImageAdded: @MainActor(AddedAsset) -> Void
+   public let askForAssetsAccessPermissions: @MainActor() -> Void
+   public let isDisplayed: Bool
+   public let height: CGFloat
+   public let popupHeight: CGFloat
+   
+ 
+   public init(attachmentPickerState: Binding<AttachmentPickerState>,filePickerShown: Binding<Bool>,cameraPickerShown: Binding<Bool>,addedFileURLs: Binding<[URL]>,onPickerStateChange: @escaping @MainActor(AttachmentPickerState) -> Void,photoLibraryAssets: PHFetchResult<PHAsset>?,onAssetTap: @escaping @MainActor(AddedAsset) -> Void,onCustomAttachmentTap: @escaping @MainActor(CustomAttachment) -> Void,isAssetSelected: @escaping @MainActor(String) -> Bool,addedCustomAttachments: [CustomAttachment],cameraImageAdded: @escaping @MainActor(AddedAsset) -> Void,askForAssetsAccessPermissions: @escaping @MainActor() -> Void,isDisplayed: Bool,height: CGFloat,popupHeight: CGFloat)

+ public final class SystemMessageViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   
+ 
+   public init(message: ChatMessage)

+ public final class GalleryHeaderViewOptions: 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 ReactionsUsersViewOptions: Sendable  
+ 
+   public let message: ChatMessage
+   public let maxHeight: CGFloat
+   
+ 
+   public init(message: ChatMessage,maxHeight: CGFloat)

+ public final class MessageRepliesShownInChannelViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let message: ChatMessage
+   public let parentMessage: ChatMessage
+   public let replyCount: Int
+   
+ 
+   public init(channel: ChatChannel,message: ChatMessage,parentMessage: ChatMessage,replyCount: Int)

+ public final class ThreadListBackgroundOptions: Sendable  
+ 
+   public let colors: ColorPalette
+   
+ 
+   public init(colors: ColorPalette)

+ public final class EmptyMessagesViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let colors: ColorPalette
+   
+ 
+   public init(channel: ChatChannel,colors: ColorPalette)

+ public final class MessageContainerViewOptions: Sendable  
+ 
+   public let channel: ChatChannel
+   public let message: ChatMessage
+   public let width: CGFloat?
+   public let showsAllInfo: Bool
+   public let isInThread: Bool
+   public let scrolledId: Binding<String?>
+   public let quotedMessage: Binding<ChatMessage?>
+   public let onLongPress: @MainActor(MessageDisplayInfo) -> Void
+   public let isLast: Bool
+   
+ 
+   public init(channel: ChatChannel,message: ChatMessage,width: CGFloat?,showsAllInfo: Bool,isInThread: Bool,scrolledId: Binding<String?>,quotedMessage: Binding<ChatMessage?>,onLongPress: @escaping @MainActor(MessageDisplayInfo) -> Void,isLast: Bool)

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

+ public final class TrailingComposerViewOptions: Sendable  
+ 
+   public let enabled: Bool
+   public let cooldownDuration: Int
+   public let onTap: @MainActor() -> Void
+   
+ 
+   public init(enabled: Bool,cooldownDuration: Int,onTap: @escaping @MainActor() -> Void)

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



- public struct ChannelAvatarViewOptions  
+ public struct ChannelAvatarViewOptions: Sendable  

- open class ChatChannelViewModel: ObservableObject, MessagesDataSource  
+ @MainActor open class ChatChannelViewModel: ObservableObject, MessagesDataSource  

- public struct MediaViewsOptions  
+ public struct MediaViewsOptions: Sendable  

 extension DateFormatter  
-   public static var messageListDateOverlay: DateFormatter
+   @MainActor public static var messageListDateOverlay: DateFormatter

 public class Utils  
-   public lazy var audioSessionFeedbackGenerator: AudioSessionFeedbackGenerator
+   @MainActor public lazy var audioSessionFeedbackGenerator: AudioSessionFeedbackGenerator

- open class ChannelHeaderLoader: ObservableObject  
+ @MainActor open class ChannelHeaderLoader: ObservableObject  
-   public init()
+   public nonisolated init()

 public final class DefaultVideoPreviewLoader: VideoPreviewLoader  
-   public func loadPreviewForVideo(at url: URL,completion: @escaping (Result<UIImage, Error>) -> Void)
+   public func loadPreviewForVideo(at url: URL,completion: @escaping @MainActor(Result<UIImage, Error>) -> Void)

- public struct ChannelSelectionInfo: Identifiable  
+ public struct ChannelSelectionInfo: Identifiable, Sendable  

 public struct MessageListView: View, KeyboardReadable  
-   public init(factory: Factory,channel: ChatChannel,messages: LazyCachedMapCollection<ChatMessage>,messagesGroupingInfo: [String: [String]],scrolledId: Binding<String?>,showScrollToLatestButton: Binding<Bool>,quotedMessage: Binding<ChatMessage?>,currentDateString: String? = nil,listId: String,isMessageThread: Bool = false,shouldShowTypingIndicator: Bool = false,scrollPosition: Binding<String?> = .constant(nil),loadingNextMessages: Bool = false,firstUnreadMessageId: Binding<MessageId?> = .constant(nil),onMessageAppear: @escaping (Int, ScrollDirection) -> Void,onScrollToBottom: @escaping () -> Void,onLongPress: @escaping (MessageDisplayInfo) -> Void,onJumpToMessage: ((String) -> Bool)? = nil)
+   public init(factory: Factory,channel: ChatChannel,messages: LazyCachedMapCollection<ChatMessage>,messagesGroupingInfo: [String: [String]],scrolledId: Binding<String?>,showScrollToLatestButton: Binding<Bool>,quotedMessage: Binding<ChatMessage?>,currentDateString: String? = nil,listId: String,isMessageThread: Bool = false,shouldShowTypingIndicator: Bool = false,scrollPosition: Binding<String?> = .constant(nil),loadingNextMessages: Bool = false,firstUnreadMessageId: Binding<MessageId?> = .constant(nil),onMessageAppear: @escaping @MainActor(Int, ScrollDirection) -> Void,onScrollToBottom: @escaping @MainActor() -> Void,onLongPress: @escaping @MainActor(MessageDisplayInfo) -> Void,onJumpToMessage: ((String) -> Bool)? = nil)

- public struct AddedAsset: Identifiable, Equatable  
+ public struct AddedAsset: Identifiable, Equatable, Sendable  

- public protocol CommandHandler
+ @MainActor public protocol CommandHandler

- public class ChatChannelInfoViewModel: ObservableObject, ChatChannelControllerDelegate  
+ @MainActor public class ChatChannelInfoViewModel: ObservableObject, ChatChannelControllerDelegate  
-   public func leaveConversationTapped(completion: @escaping () -> Void)
+   public func leaveConversationTapped(completion: @escaping @MainActor() -> Void)

- public struct TypingSuggestion  
+ public struct TypingSuggestion: Sendable  

 public struct StreamChatError: Error  
-   public let additionalInfo: [String: Any]?
+   public nonisolated let additionalInfo: [String: Any]?

- public struct MediaAttachment: Identifiable, Equatable  
+ public struct MediaAttachment: Identifiable, Equatable, @unchecked Sendable  

 public class CommandsHandler: CommandHandler  
-   public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping (Error?) -> Void)
+   public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping @MainActor(Error?) -> Void)

- public struct PaddingsConfig  
+ public struct PaddingsConfig: Sendable  

- public struct MessageDisplayInfo  
+ public struct MessageDisplayInfo: Sendable  

- public struct PollsConfig  
+ public struct PollsConfig: Sendable  

 public class InstantCommandsHandler: CommandHandler  
-   public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping (Error?) -> Void)
+   public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping @MainActor(Error?) -> Void)

 open class WaveformView: UIView  
-   public struct Content: Equatable  
+   public struct Content: Equatable, Sendable  

 public struct AttachmentPickerView: View  
-   public init(viewFactory: Factory,selectedPickerState: Binding<AttachmentPickerState>,filePickerShown: Binding<Bool>,cameraPickerShown: Binding<Bool>,addedFileURLs: Binding<[URL]>,onPickerStateChange: @escaping (AttachmentPickerState) -> Void,photoLibraryAssets: PHFetchResult<PHAsset>? = nil,onAssetTap: @escaping (AddedAsset) -> Void,onCustomAttachmentTap: @escaping (CustomAttachment) -> Void,isAssetSelected: @escaping (String) -> Bool,addedCustomAttachments: [CustomAttachment],cameraImageAdded: @escaping (AddedAsset) -> Void,askForAssetsAccessPermissions: @escaping () -> Void,isDisplayed: Bool,height: CGFloat)
+   public init(viewFactory: Factory,selectedPickerState: Binding<AttachmentPickerState>,filePickerShown: Binding<Bool>,cameraPickerShown: Binding<Bool>,addedFileURLs: Binding<[URL]>,onPickerStateChange: @escaping @MainActor(AttachmentPickerState) -> Void,photoLibraryAssets: PHFetchResult<PHAsset>? = nil,onAssetTap: @escaping @MainActor(AddedAsset) -> Void,onCustomAttachmentTap: @escaping @MainActor(CustomAttachment) -> Void,isAssetSelected: @escaping @MainActor(String) -> Bool,addedCustomAttachments: [CustomAttachment],cameraImageAdded: @escaping @MainActor(AddedAsset) -> Void,askForAssetsAccessPermissions: @escaping () -> Void,isDisplayed: Bool,height: CGFloat)

- public struct ChannelItemMutedLayoutStyle: Hashable  
+ public struct ChannelItemMutedLayoutStyle: Hashable, Sendable  
-   public static var `default`: ChannelItemMutedLayoutStyle
+   public static let `default`: ChannelItemMutedLayoutStyle
-   public static var topRightCorner: ChannelItemMutedLayoutStyle
+   public static let topRightCorner: ChannelItemMutedLayoutStyle
-   public static var afterChannelName: ChannelItemMutedLayoutStyle
+   public static let afterChannelName: ChannelItemMutedLayoutStyle

- public enum PickerTypeState: Equatable  
+ public enum PickerTypeState: Equatable, Sendable  

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

- open class MoreChannelActionsViewModel: ObservableObject  
+ @MainActor open class MoreChannelActionsViewModel: ObservableObject  

- public class PinnedMessagesViewModel: ObservableObject  
+ @MainActor public class PinnedMessagesViewModel: ObservableObject  

- open class MessageComposerViewModel: ObservableObject  
+ @MainActor open class MessageComposerViewModel: ObservableObject  
-   open func sendMessage(quotedMessage: ChatMessage?,editedMessage: ChatMessage?,isSilent: Bool = false,skipPush: Bool = false,skipEnrichUrl: Bool = false,extraData: [String: RawJSON] = [:],completion: @escaping () -> Void)
+   open func sendMessage(quotedMessage: ChatMessage?,editedMessage: ChatMessage?,isSilent: Bool = false,skipPush: Bool = false,skipEnrichUrl: Bool = false,extraData: [String: RawJSON] = [:],completion: @escaping @MainActor() -> Void)

- public protocol ChannelAvatarsMerging
+ public protocol ChannelAvatarsMerging: Sendable

 public class Appearance  
-   public static var localizationProvider: (_ key: String, _ table: String) -> String
+   public nonisolated static var localizationProvider: @Sendable(_ key: String, _ table: String) -> String

- public struct PollsEntryConfig  
+ public struct PollsEntryConfig: Sendable  

- public protocol ViewFactory: AnyObject
+ @MainActor public protocol ViewFactory: AnyObject

- public struct ChannelListSearchType: Equatable  
+ public struct ChannelListSearchType: Equatable, Sendable  
-   public static var channels
+   public static let channels
-   public static var messages
+   public static let messages

- public struct CustomAttachment: Identifiable, Equatable  
+ public struct CustomAttachment: Identifiable, Equatable, Sendable  

 open class StreamImageCDN: ImageCDN  
-   public static var streamCDNURL
+   public static let streamCDNURL

- open class ReactionsOverlayViewModel: ObservableObject, ChatMessageControllerDelegate  
+ @MainActor open class ReactionsOverlayViewModel: ObservableObject, ChatMessageControllerDelegate  

- public struct AudioRecordingInfo: Equatable  
+ public struct AudioRecordingInfo: Equatable, Sendable  

- public struct CommandDisplayInfo  
+ public struct CommandDisplayInfo: Sendable  

 public class UnmuteCommandHandler: TwoStepMentionCommand  
-   override public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping (Error?) -> Void)
+   override public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping @MainActor(Error?) -> Void)

 public struct ThreadsLazyVStack: View  
-   public init(factory: Factory,threads: LazyCachedMapCollection<ChatThread>,threadDestination: @escaping (ChatThread) -> Factory.ThreadDestination,selectedThread: Binding<ThreadSelectionInfo?>,onItemTap: @escaping (ChatThread) -> Void,onItemAppear: @escaping (Int) -> Void)
+   public init(factory: Factory,threads: LazyCachedMapCollection<ChatThread>,threadDestination: @escaping @MainActor(ChatThread) -> Factory.ThreadDestination,selectedThread: Binding<ThreadSelectionInfo?>,onItemTap: @escaping (ChatThread) -> Void,onItemAppear: @escaping (Int) -> Void)

- public struct ChannelAction: Identifiable  
+ public struct ChannelAction: Identifiable, @unchecked Sendable  
-   public let action: () -> Void
+   public let action: @MainActor() -> Void
-   public init(title: String,iconName: String,action: @escaping () -> Void,confirmationPopup: ConfirmationPopup?,isDestructive: Bool)
+   public init(title: String,iconName: String,action: @escaping @MainActor() -> Void,confirmationPopup: ConfirmationPopup?,isDestructive: Bool)

- open class ChatChannelListViewModel: ObservableObject, ChatChannelListControllerDelegate, ChatMessageSearchControllerDelegate  
+ @MainActor open class ChatChannelListViewModel: ObservableObject, ChatChannelListControllerDelegate, ChatMessageSearchControllerDelegate  

 public struct MessageAction: Identifiable, Equatable  
-   public let action: () -> Void
+   public let action: @MainActor() -> Void
-   public init(id: String = UUID().uuidString,title: String,iconName: String,action: @escaping () -> Void,confirmationPopup: ConfirmationPopup?,isDestructive: Bool)
+   public init(id: String = UUID().uuidString,title: String,iconName: String,action: @escaping @MainActor() -> Void,confirmationPopup: ConfirmationPopup?,isDestructive: Bool)

- public enum StreamChatErrorCode: Int  
+ public enum StreamChatErrorCode: Int, Sendable  

 public struct AppearanceKey: EnvironmentKey  
-   public static let defaultValue: Appearance
+   public static var defaultValue: Appearance

- public protocol AudioSessionFeedbackGenerator
+ @MainActor public protocol AudioSessionFeedbackGenerator

 extension ViewFactory  
-   public func makeNoChannelsView()-> some View
+   public func makeNoChannelsView(options: NoChannelsViewOptions)-> some View
-   public func makeLoadingView()-> some View
+   public func makeLoadingView(options: LoadingViewOptions)-> some View
-   public func makeChannelListHeaderViewModifier(title: String)-> some ChannelListHeaderViewModifier
+   public func makeChannelListHeaderViewModifier(options: ChannelListHeaderViewModifierOptions)-> some ChannelListHeaderViewModifier
-   public func supportedMoreChannelActions(for channel: ChatChannel,onDismiss: @escaping () -> Void,onError: @escaping (Error) -> Void)-> [ChannelAction]
+   public func supportedMoreChannelActions(options: SupportedMoreChannelActionsOptions)-> [ChannelAction]
-   public func makeMoreChannelActionsView(for channel: ChatChannel,swipedChannelId: Binding<String?>,onDismiss: @escaping () -> Void,onError: @escaping (Error) -> Void)-> some View
+   public func makeMoreChannelActionsView(options: MoreChannelActionsViewOptions)-> some View
-   public func makeChannelListItem(channel: ChatChannel,channelName: String,avatar: UIImage,onlineIndicatorShown: Bool,disabled: Bool,selectedChannel: Binding<ChannelSelectionInfo?>,swipedChannelId: Binding<String?>,channelDestination: @escaping (ChannelSelectionInfo) -> ChannelDestination,onItemTap: @escaping (ChatChannel) -> Void,trailingSwipeRightButtonTapped: @escaping (ChatChannel) -> Void,trailingSwipeLeftButtonTapped: @escaping (ChatChannel) -> Void,leadingSwipeButtonTapped: @escaping (ChatChannel) -> Void)-> some View
+   public func makeChannelListItem(options: ChannelListItemOptions<ChannelDestination>)-> some View
-   public func makeChannelAvatarView(for channel: ChatChannel,with options: ChannelAvatarViewOptions)-> some View
+   public func makeChannelAvatarView(options: ChannelAvatarViewFactoryOptions)-> some View
-   public func makeChannelListBackground(colors: ColorPalette)-> some View
+   public func makeChannelListBackground(options: ChannelListBackgroundOptions)-> some View
-   public func makeChannelListItemBackground(channel: ChatChannel,isSelected: Bool)-> some View
+   public func makeChannelListItemBackground(options: ChannelListItemBackgroundOptions)-> some View
-   public func makeChannelListDividerItem()-> some View
+   public func makeChannelListDividerItem(options: ChannelListDividerItemOptions)-> some View
-   public func makeTrailingSwipeActionsView(channel: ChatChannel,offsetX: CGFloat,buttonWidth: CGFloat,swipedChannelId: Binding<String?>,leftButtonTapped: @escaping (ChatChannel) -> Void,rightButtonTapped: @escaping (ChatChannel) -> Void)-> TrailingSwipeActionsView
+   public func makeTrailingSwipeActionsView(options: TrailingSwipeActionsViewOptions)-> TrailingSwipeActionsView
-   public func makeLeadingSwipeActionsView(channel: ChatChannel,offsetX: CGFloat,buttonWidth: CGFloat,swipedChannelId: Binding<String?>,buttonTapped: (ChatChannel) -> Void)-> EmptyView
+   public func makeLeadingSwipeActionsView(options: LeadingSwipeActionsViewOptions)-> EmptyView
-   public func makeChannelListTopView(searchText: Binding<String>)-> some View
+   public func makeChannelListTopView(options: ChannelListTopViewOptions)-> some View
-   public func makeChannelListFooterView()-> some View
+   public func makeChannelListFooterView(options: ChannelListFooterViewOptions)-> some View
-   public func makeChannelListStickyFooterView()-> some View
+   public func makeChannelListStickyFooterView(options: ChannelListStickyFooterViewOptions)-> some View
-   public func makeSearchResultsView(selectedChannel: Binding<ChannelSelectionInfo?>,searchResults: [ChannelSelectionInfo],loadingSearchResults: Bool,onlineIndicatorShown: @escaping (ChatChannel) -> Bool,channelNaming: @escaping (ChatChannel) -> String,imageLoader: @escaping (ChatChannel) -> UIImage,onSearchResultTap: @escaping (ChannelSelectionInfo) -> Void,onItemAppear: @escaping (Int) -> Void)-> some View
+   public func makeSearchResultsView(options: SearchResultsViewOptions)-> some View
-   public func makeChannelListSearchResultItem(searchResult: ChannelSelectionInfo,onlineIndicatorShown: Bool,channelName: String,avatar: UIImage,onSearchResultTap: @escaping (ChannelSelectionInfo) -> Void,channelDestination: @escaping (ChannelSelectionInfo) -> ChannelDestination)-> some View
+   public func makeChannelListSearchResultItem(options: ChannelListSearchResultItemOptions<ChannelDestination>)-> some View
-   public func makeChannelListContentModifier()-> some ViewModifier
+   public func makeChannelListContentModifier(options: ChannelListContentModifierOptions)-> some ViewModifier
-   public func makeChannelListModifier()-> some ViewModifier
+   public func makeChannelListModifier(options: ChannelListModifierOptions)-> some ViewModifier
-   public func makeChannelDestination()-> (ChannelSelectionInfo) -> ChatChannelView<Self>
+   public func makeChannelDestination(options: ChannelDestinationOptions)-> @MainActor(ChannelSelectionInfo) -> ChatChannelView<Self>
-   public func makeMessageThreadDestination()-> (ChatChannel, ChatMessage) -> ChatChannelView<Self>
+   public func makeMessageThreadDestination(options: MessageThreadDestinationOptions)-> @MainActor(ChatChannel, ChatMessage) -> ChatChannelView<Self>
-   public func makeMessageListModifier()-> some ViewModifier
+   public func makeMessageListModifier(options: MessageListModifierOptions)-> some ViewModifier
-   public func makeMessageListContainerModifier()-> some ViewModifier
+   public func makeMessageListContainerModifier(options: MessageListContainerModifierOptions)-> some ViewModifier
-   public func makeEmptyMessagesView(for channel: ChatChannel,colors: ColorPalette)-> some View
+   public func makeEmptyMessagesView(options: EmptyMessagesViewOptions)-> some View
-   public func makeMessageAvatarView(for userDisplayInfo: UserDisplayInfo)-> some View
+   public func makeMessageAvatarView(options: MessageAvatarViewOptions)-> some View
-   public func makeQuotedMessageAvatarView(for userDisplayInfo: UserDisplayInfo,size: CGSize)-> some View
+   public func makeQuotedMessageAvatarView(options: QuotedMessageAvatarViewOptions)-> some View
-   public func makeChannelHeaderViewModifier(for channel: ChatChannel)-> some ChatChannelHeaderViewModifier
+   public func makeChannelHeaderViewModifier(options: ChannelHeaderViewModifierOptions)-> some ChatChannelHeaderViewModifier
-   public func makeChannelBarsVisibilityViewModifier(shouldShow: Bool)-> some ViewModifier
+   public func makeChannelBarsVisibilityViewModifier(options: ChannelBarsVisibilityViewModifierOptions)-> some ViewModifier
-   public func makeChannelLoadingView()-> some View
+   public func makeChannelLoadingView(options: ChannelLoadingViewOptions)-> some View
-   public func makeMessageThreadHeaderViewModifier()-> some MessageThreadHeaderViewModifier
+   public func makeMessageThreadHeaderViewModifier(options: MessageThreadHeaderViewModifierOptions)-> some MessageThreadHeaderViewModifier
-   public func makeMessageListBackground(colors: ColorPalette,isInThread: Bool)-> some View
+   public func makeMessageListBackground(options: MessageListBackgroundOptions)-> some View
-   public func makeMessageContainerView(channel: ChatChannel,message: ChatMessage,width: CGFloat?,showsAllInfo: Bool,isInThread: Bool,scrolledId: Binding<String?>,quotedMessage: Binding<ChatMessage?>,onLongPress: @escaping (MessageDisplayInfo) -> Void,isLast: Bool)-> some View
+   public func makeMessageContainerView(options: MessageContainerViewOptions)-> some View
-   public func makeMessageTextView(for message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)-> some View
+   public func makeMessageTextView(options: MessageTextViewOptions)-> some View
-   public func makeMessageDateView(for message: ChatMessage)-> some View
+   public func makeMessageDateView(options: MessageDateViewOptions)-> some View
-   public func makeMessageAuthorAndDateView(for message: ChatMessage)-> some View
+   public func makeMessageAuthorAndDateView(options: MessageAuthorAndDateViewOptions)-> some View
-   public func makeLastInGroupHeaderView(for message: ChatMessage)-> some View
+   public func makeLastInGroupHeaderView(options: LastInGroupHeaderViewOptions)-> some View
-   public func makeMessageTranslationFooterView(messageViewModel: MessageViewModel)-> some View
+   public func makeMessageTranslationFooterView(options: MessageTranslationFooterViewOptions)-> some View
-   public func makeImageAttachmentView(for message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)-> some View
+   public func makeImageAttachmentView(options: ImageAttachmentViewOptions)-> some View
-   public func makeGiphyAttachmentView(for message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)-> some View
+   public func makeGiphyAttachmentView(options: GiphyAttachmentViewOptions)-> some View
-   public func makeLinkAttachmentView(for message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)-> some View
+   public func makeLinkAttachmentView(options: LinkAttachmentViewOptions)-> some View
-   public func makeFileAttachmentView(for message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)-> some View
+   public func makeFileAttachmentView(options: FileAttachmentViewOptions)-> some View
-   public func makeVideoAttachmentView(for message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)-> some View
+   public func makeVideoAttachmentView(options: VideoAttachmentViewOptions)-> some View
-   public func makeGalleryView(mediaAttachments: [MediaAttachment],message: ChatMessage,isShown: Binding<Bool>,options: MediaViewsOptions)-> some View
+   public func makeGalleryView(options: GalleryViewOptions)-> some View
-   public func makeGalleryHeaderView(title: String,subtitle: String,shown: Binding<Bool>)-> some View
+   public func makeGalleryHeaderView(options: GalleryHeaderViewOptions)-> some View
-   public func makeVideoPlayerView(attachment: ChatMessageVideoAttachment,message: ChatMessage,isShown: Binding<Bool>,options: MediaViewsOptions)-> some View
+   public func makeVideoPlayerView(options: VideoPlayerViewOptions)-> some View
-   public func makeVideoPlayerHeaderView(title: String,subtitle: String,shown: Binding<Bool>)-> some View
+   public func makeVideoPlayerHeaderView(options: VideoPlayerHeaderViewOptions)-> some View
-   public func makeVideoPlayerFooterView(attachment: ChatMessageVideoAttachment,shown: Binding<Bool>)-> some View
+   public func makeVideoPlayerFooterView(options: VideoPlayerFooterViewOptions)-> some View
-   public func makeDeletedMessageView(for message: ChatMessage,isFirst: Bool,availableWidth: CGFloat)-> some View
+   public func makeDeletedMessageView(options: DeletedMessageViewOptions)-> some View
-   public func makeSystemMessageView(message: ChatMessage)-> some View
+   public func makeSystemMessageView(options: SystemMessageViewOptions)-> some View
-   public func makeEmojiTextView(message: ChatMessage,scrolledId: Binding<String?>,isFirst: Bool)-> some View
+   public func makeEmojiTextView(options: EmojiTextViewOptions)-> some View
-   public func makeCustomAttachmentViewType(for message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)-> some View
+   public func makeCustomAttachmentViewType(options: CustomAttachmentViewTypeOptions)-> some View
-   public func makeScrollToBottomButton(unreadCount: Int,onScrollToBottom: @escaping () -> Void)-> some View
+   public func makeScrollToBottomButton(options: ScrollToBottomButtonOptions)-> some View
-   public func makeDateIndicatorView(dateString: String)-> some View
+   public func makeDateIndicatorView(options: DateIndicatorViewOptions)-> some View
-   public func makeMessageListDateIndicator(date: Date)-> some View
+   public func makeMessageListDateIndicator(options: MessageListDateIndicatorViewOptions)-> some View
-   public func makeTypingIndicatorBottomView(channel: ChatChannel,currentUserId: UserId?)-> some View
+   public func makeTypingIndicatorBottomView(options: TypingIndicatorBottomViewOptions)-> some View
-   public func makeGiphyBadgeViewType(for message: ChatMessage,availableWidth: CGFloat)-> some View
+   public func makeGiphyBadgeViewType(options: GiphyBadgeViewTypeOptions)-> some View
-   public func makeMessageRepliesView(channel: ChatChannel,message: ChatMessage,replyCount: Int)-> some View
+   public func makeMessageRepliesView(options: MessageRepliesViewOptions)-> some View
-   public func makeMessageRepliesShownInChannelView(channel: ChatChannel,message: ChatMessage,parentMessage: ChatMessage,replyCount: Int)-> some View
+   public func makeMessageRepliesShownInChannelView(options: MessageRepliesShownInChannelViewOptions)-> some View
-   public func makeMessageComposerViewType(with channelController: ChatChannelController,messageController: ChatMessageController?,quotedMessage: Binding<ChatMessage?>,editedMessage: Binding<ChatMessage?>,onMessageSent: @escaping () -> Void)-> MessageComposerView<Self>
+   public func makeMessageComposerViewType(options: MessageComposerViewTypeOptions)-> MessageComposerView<Self>
-   public func makeLeadingComposerView(state: Binding<PickerTypeState>,channelConfig: ChannelConfig?)-> some View
+   public func makeLeadingComposerView(options: LeadingComposerViewOptions)-> some View
-   @ViewBuilder public func makeComposerInputView(text: Binding<String>,selectedRangeLocation: Binding<Int>,command: Binding<ComposerCommand?>,addedAssets: [AddedAsset],addedFileURLs: [URL],addedCustomAttachments: [CustomAttachment],quotedMessage: Binding<ChatMessage?>,maxMessageLength: Int?,cooldownDuration: Int,onCustomAttachmentTap: @escaping (CustomAttachment) -> Void,shouldScroll: Bool,removeAttachmentWithId: @escaping (String) -> Void)-> some View
+   @ViewBuilder public func makeComposerInputView(options: ComposerInputViewOptions)-> some View
-   public func makeComposerTextInputView(text: Binding<String>,height: Binding<CGFloat>,selectedRangeLocation: Binding<Int>,placeholder: String,editable: Bool,maxMessageLength: Int?,currentHeight: CGFloat)-> some View
+   public func makeComposerTextInputView(options: ComposerTextInputViewOptions)-> some View
-   public func makeTrailingComposerView(enabled: Bool,cooldownDuration: Int,onTap: @escaping () -> Void)-> some View
+   public func makeTrailingComposerView(options: TrailingComposerViewOptions)-> some View
-   public func makeComposerRecordingView(viewModel: MessageComposerViewModel,gestureLocation: CGPoint)-> some View
+   public func makeComposerRecordingView(options: ComposerRecordingViewOptions)-> some View
-   public func makeComposerRecordingLockedView(viewModel: MessageComposerViewModel)-> some View
+   public func makeComposerRecordingLockedView(options: ComposerRecordingLockedViewOptions)-> some View
-   public func makeComposerRecordingTipView()-> some View
+   public func makeComposerRecordingTipView(options: ComposerRecordingTipViewOptions)-> some View
-   public func makeComposerViewModifier()-> some ViewModifier
+   public func makeComposerViewModifier(options: ComposerViewModifierOptions)-> some ViewModifier
-   public func makeAttachmentPickerView(attachmentPickerState: Binding<AttachmentPickerState>,filePickerShown: Binding<Bool>,cameraPickerShown: Binding<Bool>,addedFileURLs: Binding<[URL]>,onPickerStateChange: @escaping (AttachmentPickerState) -> Void,photoLibraryAssets: PHFetchResult<PHAsset>?,onAssetTap: @escaping (AddedAsset) -> Void,onCustomAttachmentTap: @escaping (CustomAttachment) -> Void,isAssetSelected: @escaping (String) -> Bool,addedCustomAttachments: [CustomAttachment],cameraImageAdded: @escaping (AddedAsset) -> Void,askForAssetsAccessPermissions: @escaping () -> Void,isDisplayed: Bool,height: CGFloat,popupHeight: CGFloat)-> some View
+   public func makeAttachmentPickerView(options: AttachmentPickerViewOptions)-> some View
-   public func makeVoiceRecordingView(for message: ChatMessage,isFirst: Bool,availableWidth: CGFloat,scrolledId: Binding<String?>)-> some View
+   public func makeVoiceRecordingView(options: VoiceRecordingViewOptions)-> some View
-   public func makeCustomAttachmentView(addedCustomAttachments: [CustomAttachment],onCustomAttachmentTap: @escaping (CustomAttachment) -> Void)-> some View
+   public func makeCustomAttachmentView(options: CustomComposerAttachmentViewOptions)-> some View
-   public func makeCustomAttachmentPreviewView(addedCustomAttachments: [CustomAttachment],onCustomAttachmentTap: @escaping (CustomAttachment) -> Void)-> some View
+   public func makeCustomAttachmentPreviewView(options: CustomAttachmentPreviewViewOptions)-> some View
-   public func makeAttachmentSourcePickerView(selected: AttachmentPickerState,onPickerStateChange: @escaping (AttachmentPickerState) -> Void)-> some View
+   public func makeAttachmentSourcePickerView(options: AttachmentSourcePickerViewOptions)-> some View
-   public func makePhotoAttachmentPickerView(assets: PHFetchResultCollection,onAssetTap: @escaping (AddedAsset) -> Void,isAssetSelected: @escaping (String) -> Bool)-> some View
+   public func makePhotoAttachmentPickerView(options: PhotoAttachmentPickerViewOptions)-> some View
-   public func makeFilePickerView(filePickerShown: Binding<Bool>,addedFileURLs: Binding<[URL]>)-> some View
+   public func makeFilePickerView(options: FilePickerViewOptions)-> some View
-   public func makeCameraPickerView(selected: Binding<AttachmentPickerState>,cameraPickerShown: Binding<Bool>,cameraImageAdded: @escaping (AddedAsset) -> Void)-> some View
+   public func makeCameraPickerView(options: CameraPickerViewOptions)-> some View
-   public func makeAssetsAccessPermissionView()-> some View
+   public func makeAssetsAccessPermissionView(options: AssetsAccessPermissionViewOptions)-> some View
-   public func makeSendInChannelView(showReplyInChannel: Binding<Bool>,isDirectMessage: Bool)-> some View
+   public func makeSendInChannelView(options: SendInChannelViewOptions)-> some View
-   public func supportedMessageActions(for message: ChatMessage,channel: ChatChannel,onFinish: @escaping (MessageActionInfo) -> Void,onError: @escaping (Error) -> Void)-> [MessageAction]
+   public func supportedMessageActions(options: SupportedMessageActionsOptions)-> [MessageAction]
-   public func makeMessageActionsView(for message: ChatMessage,channel: ChatChannel,onFinish: @escaping (MessageActionInfo) -> Void,onError: @escaping (Error) -> Void)-> some View
+   public func makeMessageActionsView(options: MessageActionsViewOptions)-> some View
-   public func makeReactionsUsersView(message: ChatMessage,maxHeight: CGFloat)-> some View
+   public func makeReactionsUsersView(options: ReactionsUsersViewOptions)-> some View
-   public func makeBottomReactionsView(message: ChatMessage,showsAllInfo: Bool,onTap: @escaping () -> Void,onLongPress: @escaping () -> Void)-> some View
+   public func makeBottomReactionsView(options: ReactionsBottomViewOptions)-> some View
-   public func makeMessageReactionView(message: ChatMessage,onTapGesture: @escaping () -> Void,onLongPressGesture: @escaping () -> Void)-> some View
+   public func makeMessageReactionView(options: MessageReactionViewOptions)-> some View
-   public func makeReactionsOverlayView(channel: ChatChannel,currentSnapshot: UIImage,messageDisplayInfo: MessageDisplayInfo,onBackgroundTap: @escaping () -> Void,onActionExecuted: @escaping (MessageActionInfo) -> Void)-> some View
+   public func makeReactionsOverlayView(options: ReactionsOverlayViewOptions)-> some View
-   public func makeReactionsContentView(message: ChatMessage,contentRect: CGRect,onReactionTap: @escaping (MessageReactionType) -> Void)-> some View
+   public func makeReactionsContentView(options: ReactionsContentViewOptions)-> some View
-   public func makeReactionsBackgroundView(currentSnapshot: UIImage,popInAnimationInProgress: Bool)-> some View
+   public func makeReactionsBackgroundView(options: ReactionsBackgroundOptions)-> some View
-   public func makeQuotedMessageHeaderView(quotedMessage: Binding<ChatMessage?>)-> some View
+   public func makeQuotedMessageHeaderView(options: QuotedMessageHeaderViewOptions)-> some View
-   public func makeQuotedMessageView(quotedMessage: ChatMessage,fillAvailableSpace: Bool,isInComposer: Bool,scrolledId: Binding<String?>)-> some View
+   public func makeQuotedMessageView(options: QuotedMessageViewOptions)-> some View
-   public func makeCustomAttachmentQuotedView(for message: ChatMessage)-> some View
+   public func makeCustomAttachmentQuotedView(options: CustomAttachmentQuotedViewOptions)-> some View
-   public func makeEditedMessageHeaderView(editedMessage: Binding<ChatMessage?>)-> some View
+   public func makeEditedMessageHeaderView(options: EditedMessageHeaderViewOptions)-> some View
-   public func makeCommandsContainerView(suggestions: [String: Any],handleCommand: @escaping ([String: Any]) -> Void)-> some View
+   public func makeCommandsContainerView(options: CommandsContainerViewOptions)-> some View
-   public func makeMessageReadIndicatorView(channel: ChatChannel,message: ChatMessage)-> some View
+   public func makeMessageReadIndicatorView(options: MessageReadIndicatorViewOptions)-> some View
-   public func makeNewMessagesIndicatorView(newMessagesStartId: Binding<String?>,count: Int)-> some View
+   public func makeNewMessagesIndicatorView(options: NewMessagesIndicatorViewOptions)-> some View
-   public func makeJumpToUnreadButton(channel: ChatChannel,onJumpToMessage: @escaping () -> Void,onClose: @escaping () -> Void)-> some View
+   public func makeJumpToUnreadButton(options: JumpToUnreadButtonOptions)-> some View
-   public func makeComposerPollView(channelController: ChatChannelController,messageController: ChatMessageController?)-> some View
+   public func makeComposerPollView(options: ComposerPollViewOptions)-> some View
-   public func makePollView(message: ChatMessage,poll: Poll,isFirst: Bool)-> some View
+   public func makePollView(options: PollViewOptions)-> some View
-   public func makeThreadDestination()-> (ChatThread) -> ChatChannelView<Self>
+   public func makeThreadDestination(options: ThreadDestinationOptions)-> @MainActor(ChatThread) -> ChatChannelView<Self>
-   public func makeThreadListItem(thread: ChatThread,threadDestination: @escaping (ChatThread) -> ThreadDestination,selectedThread: Binding<ThreadSelectionInfo?>)-> some View
+   public func makeThreadListItem(options: ThreadListItemOptions<ThreadDestination>)-> some View
-   public func makeNoThreadsView()-> some View
+   public func makeNoThreadsView(options: NoThreadsViewOptions)-> some View
-   public func makeThreadsListErrorBannerView(onRefreshAction: @escaping () -> Void)-> some View
+   public func makeThreadsListErrorBannerView(options: ThreadListErrorBannerViewOptions)-> some View
-   public func makeThreadListLoadingView()-> some View
+   public func makeThreadListLoadingView(options: ThreadListLoadingViewOptions)-> some View
-   public func makeThreadListContainerViewModifier(viewModel: ChatThreadListViewModel)-> some ViewModifier
+   public func makeThreadListContainerViewModifier(options: ThreadListContainerModifierOptions)-> some ViewModifier
-   public func makeThreadListHeaderViewModifier(title: String)-> some ViewModifier
+   public func makeThreadListHeaderViewModifier(options: ThreadListHeaderViewModifierOptions)-> some ViewModifier
-   public func makeThreadListHeaderView(viewModel: ChatThreadListViewModel)-> some View
+   public func makeThreadListHeaderView(options: ThreadListHeaderViewOptions)-> some View
-   public func makeThreadListFooterView(viewModel: ChatThreadListViewModel)-> some View
+   public func makeThreadListFooterView(options: ThreadListFooterViewOptions)-> some View
-   public func makeThreadListBackground(colors: ColorPalette)-> some View
+   public func makeThreadListBackground(options: ThreadListBackgroundOptions)-> some View
-   public func makeThreadListItemBackground(thread: ChatThread,isSelected: Bool)-> some View
+   public func makeThreadListItemBackground(options: ThreadListItemBackgroundOptions)-> some View
-   public func makeThreadListDividerItem()-> some View
+   public func makeThreadListDividerItem(options: ThreadListDividerItemOptions)-> some View
-   public func makeAddUsersView(options: AddUsersOptions,onUserTap: @escaping (ChatUser) -> Void)-> some View
+   public func makeAddUsersView(options: AddUsersViewOptions)-> some View

- public struct AddUsersOptions  
+ public struct AddUsersOptions: Sendable  

 extension ChannelAction  
-   public static func defaultActions(for channel: ChatChannel,chatClient: ChatClient,onDismiss: @escaping () -> Void,onError: @escaping (Error) -> Void)-> [ChannelAction]
+   @MainActor public static func defaultActions(for channel: ChatChannel,chatClient: ChatClient,onDismiss: @escaping @MainActor() -> Void,onError: @escaping @MainActor(Error) -> Void)-> [ChannelAction]

- public struct ComposerCommand  
+ public struct ComposerCommand: Sendable  

- public struct ConfirmationPopup  
+ public struct ConfirmationPopup: Sendable  

- open class MessageActionsViewModel: ObservableObject  
+ @MainActor open class MessageActionsViewModel: ObservableObject  

- public struct MessageActionInfo  
+ public struct MessageActionInfo: Sendable  

- public class PollAttachmentViewModel: ObservableObject, PollControllerDelegate  
+ @MainActor public class PollAttachmentViewModel: ObservableObject, PollControllerDelegate  

- open class ChatThreadListViewModel: ObservableObject, ChatThreadListControllerDelegate, EventsControllerDelegate  
+ @MainActor open class ChatThreadListViewModel: ObservableObject, ChatThreadListControllerDelegate, EventsControllerDelegate  

- public class ViewModelsFactory  
+ @MainActor public class ViewModelsFactory  

- public enum AssetType  
+ public enum AssetType: Sendable  

 public struct ChannelsLazyVStack: View  
-   public init(factory: Factory,channels: LazyCachedMapCollection<ChatChannel>,selectedChannel: Binding<ChannelSelectionInfo?>,swipedChannelId: Binding<String?>,onlineIndicatorShown: @escaping (ChatChannel) -> Bool,imageLoader: @escaping (ChatChannel) -> UIImage,onItemTap: @escaping (ChatChannel) -> Void,onItemAppear: @escaping (Int) -> Void,channelNaming: @escaping (ChatChannel) -> String,channelDestination: @escaping (ChannelSelectionInfo) -> Factory.ChannelDestination,trailingSwipeRightButtonTapped: @escaping (ChatChannel) -> Void,trailingSwipeLeftButtonTapped: @escaping (ChatChannel) -> Void,leadingSwipeButtonTapped: @escaping (ChatChannel) -> Void)
+   public init(factory: Factory,channels: LazyCachedMapCollection<ChatChannel>,selectedChannel: Binding<ChannelSelectionInfo?>,swipedChannelId: Binding<String?>,onlineIndicatorShown: @escaping @MainActor(ChatChannel) -> Bool,imageLoader: @escaping @MainActor(ChatChannel) -> UIImage,onItemTap: @escaping @MainActor(ChatChannel) -> Void,onItemAppear: @escaping @MainActor(Int) -> Void,channelNaming: @escaping @MainActor(ChatChannel) -> String,channelDestination: @escaping @MainActor(ChannelSelectionInfo) -> Factory.ChannelDestination,trailingSwipeRightButtonTapped: @escaping @MainActor(ChatChannel) -> Void,trailingSwipeLeftButtonTapped: @escaping @MainActor(ChatChannel) -> Void,leadingSwipeButtonTapped: @escaping @MainActor(ChatChannel) -> Void)

 public struct ComposerInputView: View, KeyboardReadable  
-   public init(factory: Factory,text: Binding<String>,selectedRangeLocation: Binding<Int>,command: Binding<ComposerCommand?>,addedAssets: [AddedAsset],addedFileURLs: [URL],addedCustomAttachments: [CustomAttachment],quotedMessage: Binding<ChatMessage?>,maxMessageLength: Int? = nil,cooldownDuration: Int,onCustomAttachmentTap: @escaping (CustomAttachment) -> Void,removeAttachmentWithId: @escaping (String) -> Void)
+   public init(factory: Factory,text: Binding<String>,selectedRangeLocation: Binding<Int>,command: Binding<ComposerCommand?>,addedAssets: [AddedAsset],addedFileURLs: [URL],addedCustomAttachments: [CustomAttachment],quotedMessage: Binding<ChatMessage?>,maxMessageLength: Int? = nil,cooldownDuration: Int,onCustomAttachmentTap: @escaping @MainActor(CustomAttachment) -> Void,removeAttachmentWithId: @escaping (String) -> Void)

- public class ChannelAvatarsMerger: ChannelAvatarsMerging  
+ public final class ChannelAvatarsMerger: ChannelAvatarsMerging  

- public struct ColorPalette  
+ public struct ColorPalette: Sendable  
-   public var highlightedColorForColor: (UIColor) -> UIColor
+   public var highlightedColorForColor: @Sendable(UIColor) -> UIColor
-   public var disabledColorForColor: (UIColor) -> UIColor
+   public var disabledColorForColor: @Sendable(UIColor) -> UIColor
-   public var unselectedColorForColor: (UIColor) -> UIColor
+   public var unselectedColorForColor: @Sendable(UIColor) -> UIColor

- public struct AddedVoiceRecording: Identifiable, Equatable  
+ public struct AddedVoiceRecording: Identifiable, Equatable, Sendable  

- public enum AttachmentPickerState  
+ public enum AttachmentPickerState: Sendable  

- public struct UserDisplayInfo  
+ public struct UserDisplayInfo: Sendable  

- public struct InjectedChannelInfo  
+ public struct InjectedChannelInfo: Sendable  

- public struct PHFetchResultCollection: RandomAccessCollection, Equatable  
+ public struct PHFetchResultCollection: RandomAccessCollection, Equatable, Sendable  

 open class TwoStepMentionCommand: CommandHandler  
-   open func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping (Error?) -> Void)
+   open func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping @MainActor(Error?) -> Void)

 extension CommandHandler  
-   public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping (Error?) -> Void)
+   public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping @MainActor(Error?) -> Void)

 open class NukeImageLoader: ImageLoading  
-   open func loadImage(using urlRequest: URLRequest,cachingKey: String?,completion: @escaping ((Result<UIImage, Error>) -> Void))
+   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 (([UIImage]) -> 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 ((Result<UIImage, Error>) -> Void))
+   open func loadImage(url: URL?,imageCDN: ImageCDN,resize: Bool = true,preferredSize: CGSize? = nil,completion: @escaping @MainActor(Result<UIImage, Error>) -> Void)

 public struct ComposerConfig  
-   public static var defaultAttachmentPayloadConverter: (ChatMessage) -> [AnyAttachmentPayload]
+   public nonisolated static var defaultAttachmentPayloadConverter: (ChatMessage) -> [AnyAttachmentPayload]

- open class MessageViewModel: ObservableObject  
+ @MainActor open class MessageViewModel: ObservableObject  

 public class MuteCommandHandler: TwoStepMentionCommand  
-   override public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping (Error?) -> Void)
+   override public func executeOnMessageSent(composerCommand: ComposerCommand,completion: @escaping @MainActor(Error?) -> Void)

- public enum AttachmentPickerType  
+ public enum AttachmentPickerType: Sendable  

@martinmitrevski martinmitrevski marked this pull request as ready for review September 29, 2025 08:19
Copy link

Quality Gate Failed Quality Gate failed

Failed conditions
77.1% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud

let inputTextView: InputTextView
if #available(iOS 16.0, *) {
inputTextView = InputTextView(usingTextLayoutManager: false)
let inputTextView: InputTextView = if #available(iOS 16.0, *) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if-switch expression rules strikes again

}

public struct MediaAttachment: Identifiable, Equatable {
public struct MediaAttachment: Identifiable, Equatable, @unchecked Sendable {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it is a struct, not sure why @unchecked Sendable and not Sendable


extension String {
func ranges<S: StringProtocol>(of string: S, options: String.CompareOptions = []) -> [Range<String.Index>] {
func ranges(of string: some StringProtocol, options: String.CompareOptions = []) -> [Range<String.Index>] {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a big fan of swiftformat changing it here. But I can live with it

channelListItem: listItem,
swipedChannelId: options.swipedChannelId,
channel: options.channel,
numberOfTrailingItems: options.channel.ownCapabilities.contains(.deleteChannel) ? 2 : 1,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Feels slightly confusing since it takes in Int and hard to understand what 2 or 1 mean. We could change this in a separate PR to keep this one not refactoring too much.

Copy link
Contributor

@laevandus laevandus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Linting/formatting almost ruined this PR since many of the changes are not related to the actual change. I can live with this because additional linter changes are hard to revert now.
Otherwise looks nice and clean now. Maybe for ease of migration, we should add an interface with deprecates all the existing view factory methods with rename option (then Xcode could suggest the change). Can happen later when we are starting to write migration guides.

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.

3 participants