This is beta documentation for Stream Chat IOS SDK v5. For the latest stable version, see the latest version (v4) .

Migrating from 4.x to 5.x

Version 5.x of the SwiftUI SDK keeps the overall architecture from 4.x, but it includes several source-breaking API updates in the customization layer. Most migrations are straightforward and fall into these buckets:

  • Appearance customization now goes through mutable properties instead of initializer parameters.
  • Several SwiftUI-specific helper views were renamed.
  • ViewFactory methods now take a single options object instead of many individual parameters.
  • Several modifier methods moved from ViewFactory to the new Styles protocol.
  • Utils gained new formatter parameters and dropped a few deprecated ones.
  • supportedMoreChannelActions, supportedMessageActions, and navigationBarDisplayMode moved to config objects.

If your app mostly uses the default UI components, the upgrade should be limited to dependency updates and a small number of customization fixes.


Please don't hesitate to contact our Support team or open a ticket in our GitHub repository. We'll help you during your migration process and any issues you might face.


Update the SDK Version

First, update your Swift Package Manager or CocoaPods dependency to version 5.x.

Appearance no longer uses parameterized initializers

In v4, many docs and examples initialized Appearance with parameters such as colors, fonts, or images.

In v5, Appearance has a public empty initializer and you customize it by mutating its properties:

var colors = Appearance.ColorPalette()
colors.accentPrimary = .systemPink
colors.navigationBarTintColor = .systemPink

var fonts = Appearance.FontsSwiftUI()
fonts.body = .system(size: 18)

var images = Appearance.Images()

var appearance = Appearance()
appearance.colorPalette = colors
appearance.fontsSwiftUI = fonts
appearance.images = images

let streamChat = StreamChat(chatClient: chatClient, appearance: appearance)

Replace usages like these:

let appearance = Appearance(colors: colors)
let appearance = Appearance(colors: colors, fonts: fonts, images: images)

with property-based configuration on a mutable Appearance value.

Use Appearance.FontsSwiftUI for SwiftUI font customization

Appearance now exposes both UIKit fonts and SwiftUI fonts:

  • appearance.fonts for UIKit font values
  • appearance.fontsSwiftUI for SwiftUI font values

If you are customizing SwiftUI screens, use Appearance.FontsSwiftUI:

var fonts = Appearance.FontsSwiftUI()
fonts.footnoteBold = .footnote

var appearance = Appearance()
appearance.fontsSwiftUI = fonts

If you were previously using Fonts() in SwiftUI snippets, switch those usages to Appearance.FontsSwiftUI().

Replace tintColor customizations with ColorPalette

The SwiftUI SDK reads brand and navigation colors from Appearance.colorPalette.

The most common v4 migration is replacing generic tint configuration with explicit palette values:

var colors = Appearance.ColorPalette()
colors.accentPrimary = .systemPink
colors.navigationBarTintColor = .systemPink

var appearance = Appearance()
appearance.colorPalette = colors

In custom SwiftUI views, when you need the configured brand color, prefer the palette values:

@Injected(\.colors) private var colors

Text("Create")
    .foregroundColor(Color(colors.accentPrimary))

channelNamer became channelNameFormatter

Channel name customization changed in v5.

Replace:

let channelNamer: ChatChannelNamer = { channel, currentUserId in
    "This is our custom name: \(channel.name ?? "no name")"
}

let utils = Utils(channelNamer: channelNamer)

with:

final class CustomChannelNameFormatter: ChannelNameFormatter {
    func format(channel: ChatChannel, forCurrentUserId currentUserId: UserId?) -> String? {
        "This is our custom name: \(channel.name ?? "no name")"
    }
}

let utils = Utils(channelNameFormatter: CustomChannelNameFormatter())

If you were using DefaultChatChannelNamer, migrate to DefaultChannelNameFormatter.

Update renamed reusable SwiftUI views

If you built custom UI with the SDK's reusable views, update the renamed view types:

  • MessageAvatarView -> UserAvatar
  • ChannelAvatarView -> ChannelAvatar
  • TypingIndicatorBottomView -> TypingIndicatorView

For example, this v4 code:

MessageAvatarView(
    url: user.imageURL,
    size: 40
)

becomes:

UserAvatar(
    user: user,
    size: 40
)

Note that UserAvatar takes a ChatUser value directly rather than a URL, and size is now a CGFloat instead of CGSize. If you only have a URL (for example in a quoted message context), use the URL-and-initials initializer:

UserAvatar(
    url: url,
    initials: initials,
    size: 40,
    indicator: .none
)

The showOnlineIndicator: Bool parameter was replaced by an AvatarIndicator enum: .online, .offline, or .none.

And this:

TypingIndicatorBottomView(
    users: users,
    typingIndicatorString: typingText
)

becomes:

TypingIndicatorView(
    users: users,
    typingText: typingText
)

Utils API changes

Several parameters were added, removed, or renamed on the Utils initializer. The Utils class itself is now marked @MainActor.

Removed parameters:

v4 parameterNotes
imageMergerRemoved; avatar merging is handled internally.
channelAvatarsMergerRemoved; avatar merging is handled internally.
channelHeaderLoaderRemoved.
channelNamerRenamed — see channelNameFormatter below.

Renamed parameter:

v4v5
channelNamer: ChatChannelNamer (closure)channelNameFormatter: any ChannelNameFormatter (protocol)

New parameters in v5:

ParameterPurpose
markdownFormatterProvides custom Markdown rendering for message text.
messageTimestampFormatterFormats the timestamp shown on individual messages.
galleryHeaderViewDateFormatterFormats the date in the media gallery header.
messageDateSeparatorFormatterFormats the date separator labels in the message list.
fileCDNCDN provider for file attachments.
messageAttachmentPreviewIconProviderProvides icons for attachment preview thumbnails.
messagePreviewFormatterFormats the message preview text shown in the channel list.
channelListConfigConfiguration object for the channel list (see below).
mediaBadgeDurationFormatterFormats duration badges on audio and video attachments.
messageRemindersFormatterFormats message reminder labels (conforms to MessageRemindersFormatter).

In v4 these were methods on the ViewFactory protocol. In v5 they are properties on the relevant config objects.

DefaultViewFactory still exposes a compatibility navigationBarDisplayMode() helper on the v5 branch, but the channel list and message list read ChannelListConfig.navigationBarDisplayMode and MessageListConfig.navigationBarDisplayMode. For migrations, move your customization to the config objects.

navigationBarDisplayMode — remove the ViewFactory override and set the property on ChannelListConfig or MessageListConfig instead:

// v4 – ViewFactory override
func navigationBarDisplayMode() -> NavigationBarItem.TitleDisplayMode { .inline }

// v5 – config property
var channelListConfig = ChannelListConfig()
channelListConfig.navigationBarDisplayMode = .inline

var messageListConfig = MessageListConfig()
messageListConfig.navigationBarDisplayMode = .inline

let utils = Utils(channelListConfig: channelListConfig, messageListConfig: messageListConfig)

supportedMoreChannelActions — remove the ViewFactory override and supply a closure on ChannelListConfig:

// v4 – ViewFactory override
func supportedMoreChannelActions(
    for channel: ChatChannel,
    onDismiss: @escaping () -> Void,
    onError: @escaping (Error) -> Void
) -> [ChannelAction] { ... }

// v5 – ChannelListConfig closure
var channelListConfig = ChannelListConfig()
channelListConfig.supportedMoreChannelActions = { options in
    // options.channel, options.onDismiss, options.onError
    return [...]
}

supportedMessageActions — remove the ViewFactory override and supply a closure on MessageListConfig:

// v4 – ViewFactory override
func supportedMessageActions(
    for message: ChatMessage,
    channel: ChatChannel,
    onFinish: @escaping (MessageActionInfo) -> Void,
    onError: @escaping (Error) -> Void
) -> [MessageAction] { ... }

// v5 – MessageListConfig closure
var messageListConfig = MessageListConfig()
messageListConfig.supportedMessageActions = { options in
    // options.message, options.channel, options.onFinish, options.onError
    return [...]
}

New Styles protocol — modifier customization moved out of ViewFactory

v5 introduces a Styles protocol that owns all ViewModifier-returning customizations. Several methods that were on ViewFactory in v4 now live on Styles instead.

The SDK ships two concrete implementations:

  • LiquidGlassStyles — uses the iOS 26 Liquid Glass material where available.
  • RegularStyles — the classic appearance for earlier OS versions.

DefaultViewFactory uses LiquidGlassStyles on iOS 26+ and RegularStyles otherwise. To customize modifiers, conform to Styles and assign your implementation to factory.styles:

struct MyStyles: Styles {
    // override only what you need
    func makeComposerViewModifier(options: ComposerViewModifierOptions) -> some ViewModifier {
        MyComposerModifier()
    }
}

DefaultViewFactory.shared.styles = MyStyles()

For channel list search, this change is behavioral as well as structural. In v5, search is applied through Styles.makeSearchableModifier(options:). makeChannelListTopView(options:) remains available, but it is now just a top content slot and no longer provides searchText or owns the search bar UI.

Methods moved from ViewFactory to Styles:

v4 ViewFactory methodv5 Styles method
func makeChannelListContentModifier() -> ChannelListContentModifierfunc makeChannelListContentModifier(options: ChannelListContentModifierOptions) -> ChannelListContentModifier
func makeChannelListModifier() -> ChannelListModifierfunc makeChannelListModifier(options: ChannelListModifierOptions) -> ChannelListModifier
func makeMessageListModifier() -> MessageListModifierfunc makeMessageListModifier(options: MessageListModifierOptions) -> MessageListModifier
func makeMessageListContainerModifier() -> MessageListContainerModifierfunc makeMessageListContainerModifier(options: MessageListContainerModifierOptions) -> MessageListContainerModifier
func makeMessageViewModifier(for messageModifierInfo: MessageModifierInfo) -> MessageViewModifierfunc makeMessageViewModifier(for messageModifierInfo: MessageModifierInfo) -> MessageViewModifier
func makeComposerViewModifier() -> ComposerViewModifierfunc makeComposerViewModifier(options: ComposerViewModifierOptions) -> ComposerViewModifier

New Styles methods with no v4 equivalent:

  • func makeComposerInputViewModifier(options: ComposerInputModifierOptions) -> ComposerInputViewModifier
  • func makeComposerButtonViewModifier(options: ComposerButtonModifierOptions) -> ComposerButtonViewModifier
  • func makeScrollToBottomButtonModifier(options: ScrollToBottomButtonModifierOptions) -> ScrollToBottomButtonViewModifier
  • func makeBouncedMessageActionsModifier(viewModel: ChatChannelViewModel) -> BouncedMessageActionsModifierType
  • func makeSuggestionsContainerModifier(options: SuggestionsContainerModifierOptions) -> SuggestionsContainerModifier
  • func makeToolbarConfirmActionModifier(options: ToolbarConfirmActionModifierOptions) -> ToolbarConfirmActionViewModifier
  • func makeSearchableModifier(options: SearchableModifierOptions) -> SearchableModifierType

Review your ViewFactory implementations

The biggest ViewFactory change in v5 is that the API moved from many ad-hoc parameters to option objects. If you had a custom factory in v4, you should review every override.

Below is the full mapping validated against the latest develop and v5 branches of stream-chat-swiftui.

Channel List
v4v5
func makeChannelListHeaderViewModifier(title: String) -> HeaderViewModifierfunc makeChannelListHeaderViewModifier(options: ChannelListHeaderViewModifierOptions) -> HeaderViewModifier
func makeNoChannelsView() -> NoChannelsfunc makeNoChannelsView(options: NoChannelsViewOptions) -> NoChannels
func makeLoadingView() -> LoadingContentfunc makeLoadingView(options: LoadingViewOptions) -> LoadingContent
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) -> ChannelListItemTypefunc makeChannelListItem(options: ChannelListItemOptions<ChannelDestination>) -> ChannelListItemType
func makeChannelListBackground(colors: ColorPalette) -> ChannelListBackgroundfunc makeChannelListBackground(options: ChannelListBackgroundOptions) -> ChannelListBackground
func makeChannelListDividerItem() -> ChannelListDividerItemfunc makeChannelListDividerItem(options: ChannelListDividerItemOptions) -> ChannelListDividerItem
func makeMoreChannelActionsView(for channel: ChatChannel, swipedChannelId: Binding<String?>, onDismiss: @escaping () -> Void, onError: @escaping (Error) -> Void) -> MoreActionsViewfunc makeMoreChannelActionsView(options: MoreChannelActionsViewOptions) -> MoreActionsView
func makeTrailingSwipeActionsView(channel: ChatChannel, offsetX: CGFloat, buttonWidth: CGFloat, swipedChannelId: Binding<String?>, leftButtonTapped: @escaping (ChatChannel) -> Void, rightButtonTapped: @escaping (ChatChannel) -> Void) -> TrailingSwipeActionsViewTypefunc makeTrailingSwipeActionsView(options: TrailingSwipeActionsViewOptions) -> TrailingSwipeActionsViewType
func makeLeadingSwipeActionsView(channel: ChatChannel, offsetX: CGFloat, buttonWidth: CGFloat, swipedChannelId: Binding<String?>, buttonTapped: @escaping (ChatChannel) -> Void) -> LeadingSwipeActionsViewTypefunc makeLeadingSwipeActionsView(options: LeadingSwipeActionsViewOptions) -> LeadingSwipeActionsViewType
func makeChannelListTopView(searchText: Binding<String>) -> ChannelListTopViewTypefunc makeChannelListTopView(options: ChannelListTopViewOptions) -> ChannelListTopViewType (no searchText; search customization moved to Styles.makeSearchableModifier(options:))
func makeChannelListFooterView() -> ChannelListFooterViewTypefunc makeChannelListFooterView(options: ChannelListFooterViewOptions) -> ChannelListFooterViewType
func makeChannelListStickyFooterView() -> ChannelListStickyFooterViewTypefunc makeChannelListStickyFooterView(options: ChannelListStickyFooterViewOptions) -> ChannelListStickyFooterViewType
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) -> ChannelListSearchResultsViewTypefunc makeSearchResultsView(options: SearchResultsViewOptions) -> ChannelListSearchResultsViewType
func makeChannelListSearchResultItem(searchResult: ChannelSelectionInfo, onlineIndicatorShown: Bool, channelName: String, avatar: UIImage, onSearchResultTap: @escaping (ChannelSelectionInfo) -> Void, channelDestination: @escaping (ChannelSelectionInfo) -> ChannelDestination) -> ChannelListSearchResultItemfunc makeChannelListSearchResultItem(options: ChannelListSearchResultItemOptions<ChannelDestination>) -> ChannelListSearchResultItem
func makeChannelListContentModifier() -> ChannelListContentModifiermoved to Styles — see the Styles section above
func makeChannelListModifier() -> ChannelListModifiermoved to Styles — see the Styles section above
no v4 equivalentfunc makeChannelAvatarView(options: ChannelAvatarViewOptions) -> ChannelAvatarViewType
no v4 equivalentfunc makeChannelListItemBackground(options: ChannelListItemBackgroundOptions) -> ChannelListItemBackground
Channel And Message List
v4v5
func makeChannelDestination() -> (ChannelSelectionInfo) -> ChannelDestinationfunc makeChannelDestination(options: ChannelDestinationOptions) -> @MainActor (ChannelSelectionInfo) -> ChannelDestination
func makeMessageThreadDestination() -> (ChatChannel, ChatMessage) -> MessageThreadDestinationfunc makeMessageThreadDestination(options: MessageThreadDestinationOptions) -> @MainActor (ChatChannel, ChatMessage) -> MessageThreadDestination
func makeEmptyMessagesView(for channel: ChatChannel, colors: ColorPalette) -> EmptyMessagesViewTypefunc makeEmptyMessagesView(options: EmptyMessagesViewOptions) -> EmptyMessagesViewType
func makeMessageListModifier() -> MessageListModifiermoved to Styles — see the Styles section above
func makeMessageListContainerModifier() -> MessageListContainerModifiermoved to Styles — see the Styles section above
func makeMessageViewModifier(for messageModifierInfo: MessageModifierInfo) -> MessageViewModifiermoved to Styles — see the Styles section above
func makeMessageAvatarView(for userDisplayInfo: UserDisplayInfo) -> UserAvatarremoved — use func makeUserAvatarView(options: UserAvatarViewOptions) -> UserAvatarViewType
func makeQuotedMessageAvatarView(for userDisplayInfo: UserDisplayInfo, size: CGSize) -> QuotedUserAvatarremoved — use func makeUserAvatarView(options: UserAvatarViewOptions) -> UserAvatarViewType
func makeChannelHeaderViewModifier(for channel: ChatChannel) -> ChatHeaderViewModifierfunc makeChannelHeaderViewModifier(options: ChannelHeaderViewModifierOptions) -> ChatHeaderViewModifier
func makeChannelLoadingView() -> ChannelLoadingViewTypefunc makeChannelLoadingView(options: ChannelLoadingViewOptions) -> ChannelLoadingViewType
func makeMessageThreadHeaderViewModifier() -> ThreadHeaderViewModifierfunc makeMessageThreadHeaderViewModifier(options: MessageThreadHeaderViewModifierOptions) -> ThreadHeaderViewModifier
func makeMessageListBackground(colors: ColorPalette, isInThread: Bool) -> MessageListBackgroundfunc makeMessageListBackground(options: MessageListBackgroundOptions) -> MessageListBackground
func makeMessageContainerView(channel: ChatChannel, message: ChatMessage, width: CGFloat?, showsAllInfo: Bool, isInThread: Bool, scrolledId: Binding<String?>, quotedMessage: Binding<ChatMessage?>, onLongPress: @escaping (MessageDisplayInfo) -> Void, isLast: Bool) -> MessageContainerViewTyperemoved — use func makeMessageItemView(options: MessageItemViewOptions) -> MessageItemViewType
func makeMessageTextView(for message: ChatMessage, isFirst: Bool, availableWidth: CGFloat, scrolledId: Binding<String?>) -> MessageTextViewTypefunc makeMessageTextView(options: MessageTextViewOptions) -> MessageTextViewType
func makeMessageDateView(for message: ChatMessage) -> MessageDateViewTypefunc makeMessageDateView(options: MessageDateViewOptions) -> MessageDateViewType
func makeMessageAuthorAndDateView(for message: ChatMessage) -> MessageAuthorAndDateViewTypefunc makeMessageAuthorAndDateView(options: MessageAuthorAndDateViewOptions) -> MessageAuthorAndDateViewType
func makeMessageTranslationFooterView(messageViewModel: MessageViewModel) -> MessageTranslationFooterViewTyperemoved — translated/pinned/reply annotations are now composed by func makeMessageTopView(options: MessageTopViewOptions) -> MessageTopViewType
func makeLastInGroupHeaderView(for message: ChatMessage) -> LastInGroupHeaderViewfunc makeLastInGroupHeaderView(options: LastInGroupHeaderViewOptions) -> LastInGroupHeaderView
func makeImageAttachmentView(...) -> ImageAttachmentViewTypefunc makeImageAttachmentView(options: ImageAttachmentViewOptions) -> ImageAttachmentViewType
func makeGiphyAttachmentView(...) -> GiphyAttachmentViewTypefunc makeGiphyAttachmentView(options: GiphyAttachmentViewOptions) -> GiphyAttachmentViewType
func makeLinkAttachmentView(...) -> LinkAttachmentViewTypefunc makeLinkAttachmentView(options: LinkAttachmentViewOptions) -> LinkAttachmentViewType
func makeFileAttachmentView(...) -> FileAttachmentViewTypefunc makeFileAttachmentView(options: FileAttachmentViewOptions) -> FileAttachmentViewType
func makeVideoAttachmentView(...) -> VideoAttachmentViewTypefunc makeVideoAttachmentView(options: VideoAttachmentViewOptions) -> VideoAttachmentViewType
func makeGalleryView(...) -> GalleryViewTypefunc makeMediaViewer(options: MediaViewerOptions) -> MediaViewerType
func makeGalleryHeaderView(...) -> GalleryHeaderViewTypefunc makeMediaViewerHeader(options: MediaViewerHeaderOptions) -> MediaViewerHeaderType
func makeVideoPlayerView(...) -> VideoPlayerViewTypefunc makeVideoPlayerView(options: VideoPlayerViewOptions) -> VideoPlayerViewType
func makeVideoPlayerHeaderView(...) -> VideoPlayerHeaderViewTypefunc makeVideoPlayerHeaderView(options: VideoPlayerHeaderViewOptions) -> VideoPlayerHeaderViewType
func makeVideoPlayerFooterView(...) -> VideoPlayerFooterViewTypefunc makeVideoPlayerFooterView(options: VideoPlayerFooterViewOptions) -> VideoPlayerFooterViewType
func makeDeletedMessageView(...) -> DeletedMessageViewTypefunc makeDeletedMessageView(options: DeletedMessageViewOptions) -> DeletedMessageViewType
func makeSystemMessageView(message: ChatMessage) -> SystemMessageViewTypefunc makeSystemMessageView(options: SystemMessageViewOptions) -> SystemMessageViewType
func makeEmojiTextView(...) -> EmojiTextViewTypefunc makeEmojiTextView(options: EmojiTextViewOptions) -> EmojiTextViewType
func makeVoiceRecordingView(...) -> VoiceRecordingViewTypefunc makeVoiceRecordingView(options: VoiceRecordingViewOptions) -> VoiceRecordingViewType
func makeCustomAttachmentViewType(...) -> CustomAttachmentViewTypefunc makeCustomAttachmentViewType(options: CustomAttachmentViewTypeOptions) -> CustomAttachmentViewType
func makeScrollToBottomButton(unreadCount: Int, onScrollToBottom: @escaping () -> Void) -> ScrollToBottomButtonTypefunc makeScrollToBottomButton(options: ScrollToBottomButtonOptions) -> ScrollToBottomButtonType
func makeDateIndicatorView(dateString: String) -> DateIndicatorViewTypefunc makeDateIndicatorView(options: DateIndicatorViewOptions) -> DateIndicatorViewType
func makeMessageListDateIndicator(date: Date) -> MessageListDateIndicatorViewTypefunc makeMessageListDateIndicator(options: MessageListDateIndicatorViewOptions) -> MessageListDateIndicatorViewType
func makeTypingIndicatorBottomView(...) -> TypingIndicatorViewTyperemoved — use makeInlineTypingIndicatorView(options: TypingIndicatorViewOptions) and/or makeSubtitleTypingIndicatorView(options: SubtitleTypingIndicatorViewOptions)
func makeGiphyBadgeViewType(...) -> GiphyBadgeViewTypefunc makeGiphyBadgeViewType(options: GiphyBadgeViewTypeOptions) -> GiphyBadgeViewType
func makeMessageRepliesView(...) -> MessageRepliesViewTypefunc makeMessageRepliesView(options: MessageRepliesViewOptions) -> MessageRepliesViewType
func makeMessageRepliesShownInChannelView(...) -> MessageRepliesShownInChannelViewTyperemoved — migrate reply/thread annotations to makeMessageTopView(options:) and keep reply count customization in makeMessageRepliesView(options:)
func makeMessageComposerViewType(...) -> MessageComposerViewTypefunc makeMessageComposerViewType(options: MessageComposerViewTypeOptions) -> MessageComposerViewType
func makeLeadingComposerView(...) -> LeadingComposerViewTypefunc makeLeadingComposerView(options: LeadingComposerViewOptions) -> LeadingComposerViewType
func makeComposerInputView(...) -> ComposerInputViewTypefunc makeComposerInputView(options: ComposerInputViewOptions) -> ComposerInputViewType
func makeComposerTextInputView(...) -> ComposerTextInputViewTypefunc makeComposerTextInputView(options: ComposerTextInputViewOptions) -> ComposerTextInputViewType
func makeTrailingComposerView(...) -> TrailingComposerViewTypefunc makeTrailingComposerView(options: TrailingComposerViewOptions) -> TrailingComposerViewType
func makeComposerViewModifier() -> ComposerViewModifiermoved to Styles — see the Styles section above
func makeComposerRecordingView(...) -> ComposerRecordingViewTyperemoved — use func makeComposerVoiceRecordingInputView(options: ComposerVoiceRecordingInputViewOptions) -> ComposerVoiceRecordingInputViewType
func makeComposerRecordingLockedView(...) -> ComposerRecordingLockedViewTyperemoved — use func makeComposerVoiceRecordingInputView(options: ComposerVoiceRecordingInputViewOptions) -> ComposerVoiceRecordingInputViewType
func makeComposerRecordingTipView() -> ComposerRecordingTipViewTyperemoved — use func makeComposerVoiceRecordingInputView(options: ComposerVoiceRecordingInputViewOptions) -> ComposerVoiceRecordingInputViewType
func makeAttachmentPickerView(...) -> AttachmentPickerViewTypefunc makeAttachmentPickerView(options: AttachmentPickerViewOptions) -> AttachmentPickerViewType
func makeAttachmentSourcePickerView(...) -> AttachmentSourcePickerViewTyperemoved — use func makeAttachmentTypePickerView(options: AttachmentTypePickerViewOptions) -> AttachmentTypePickerViewType
func makePhotoAttachmentPickerView(...) -> PhotoAttachmentPickerViewTyperemoved — use func makeAttachmentMediaPickerView(options: AttachmentMediaPickerViewOptions) -> AttachmentMediaPickerViewType
func makeFilePickerView(...) -> FilePickerViewTyperemoved — use func makeAttachmentFilePickerView(options: AttachmentFilePickerViewOptions) -> AttachmentFilePickerViewType
func makeCameraPickerView(...) -> CameraPickerViewTyperemoved — use func makeAttachmentCameraPickerView(options: AttachmentCameraPickerViewOptions) -> AttachmentCameraPickerViewType
func makeCustomAttachmentView(...) -> CustomAttachmentViewTyperemoved — use func makeCustomAttachmentPickerView(options: CustomAttachmentPickerViewOptions) -> CustomAttachmentPickerViewType
func makeCustomAttachmentPreviewView(...) -> CustomAttachmentPreviewViewTypefunc makeCustomAttachmentPreviewView(options: CustomAttachmentPreviewViewOptions) -> CustomAttachmentPreviewViewType
func makeAssetsAccessPermissionView() -> AssetsAccessPermissionViewTyperemoved with no direct replacement
func supportedMessageActions(...) -> [MessageAction]moved to MessageListConfig.supportedMessageActions closure
func makeSendInChannelView(...) -> SendInChannelViewTypefunc makeSendInChannelView(options: SendInChannelViewOptions) -> SendInChannelViewType
func makeMessageActionsView(...) -> MessageActionsViewfunc makeMessageActionsView(options: MessageActionsViewOptions) -> MessageActionsViewType
func makeReactionsUsersView(...) -> ReactionsUsersViewTyperemoved — use func makeReactionsDetailView(options: ReactionsDetailViewOptions) -> ReactionsDetailViewType
func makeBottomReactionsView(...) -> BottomReactionsViewTypefunc makeBottomReactionsView(options: ReactionsBottomViewOptions) -> ReactionsBottomViewType
func makeMessageReactionView(...) -> MessageReactionViewTypefunc makeMessageReactionView(options: MessageReactionViewOptions) -> MessageReactionViewType
func makeReactionsOverlayView(...) -> ReactionsOverlayViewTypefunc makeReactionsOverlayView(options: ReactionsOverlayViewOptions) -> ReactionsOverlayViewType
func makeReactionsBackgroundView(...) -> ReactionsBackgroundfunc makeReactionsBackgroundView(options: ReactionsBackgroundOptions) -> ReactionsBackground
func makeReactionsContentView(...) -> ReactionsContentViewfunc makeReactionsContentView(options: ReactionsContentViewOptions) -> ReactionsContentView
no v4 equivalentfunc makeMoreReactionsView(options: MoreReactionsViewOptions) -> MoreReactionsViewType
func makeQuotedMessageHeaderView(...) -> QuotedMessageHeaderViewTyperemoved — use func makeComposerQuotedMessageView(options: ComposerQuotedMessageViewOptions) -> ComposerQuotedMessageViewType
func makeQuotedMessageView(...) -> QuotedMessageViewTypefunc makeQuotedMessageView(options: QuotedMessageViewOptions) -> QuotedMessageViewType
func makeQuotedMessageContentView(options: QuotedMessageContentViewOptions) -> QuotedMessageContentViewTyperemoved — customize quoted-message rendering with makeQuotedMessageView(options:) and makeChatQuotedMessageView(options:)
no v4 equivalentfunc makeChatQuotedMessageView(options: ChatQuotedMessageViewOptions) -> ChatQuotedMessageViewType
func makeCustomAttachmentQuotedView(for message: ChatMessage) -> CustomAttachmentQuotedViewTyperemoved with no direct replacement
func makeEditedMessageHeaderView(...) -> EditedMessageHeaderViewTyperemoved — use func makeComposerEditedMessageView(options: ComposerEditedMessageViewOptions) -> ComposerEditedMessageViewType
func makeCommandsContainerView(...) -> CommandsContainerViewTyperemoved — use func makeSuggestionsContainerView(options: SuggestionsContainerViewOptions) -> SuggestionsContainerViewType
func makeMessageReadIndicatorView(...) -> MessageReadIndicatorViewTypefunc makeMessageReadIndicatorView(options: MessageReadIndicatorViewOptions) -> MessageReadIndicatorViewType
func makeNewMessagesIndicatorView(...) -> NewMessagesIndicatorViewTypefunc makeNewMessagesIndicatorView(options: NewMessagesIndicatorViewOptions) -> NewMessagesIndicatorViewType
func makeJumpToUnreadButton(...) -> JumpToUnreadButtonTypefunc makeJumpToUnreadButton(options: JumpToUnreadButtonOptions) -> JumpToUnreadButtonType
func navigationBarDisplayMode() -> NavigationBarItem.TitleDisplayModemoved to ChannelListConfig and MessageListConfig — see section above
no v4 equivalentfunc makeUserAvatarView(options: UserAvatarViewOptions) -> UserAvatarViewType
no v4 equivalentfunc makeChannelBarsVisibilityViewModifier(options: ChannelBarsVisibilityViewModifierOptions) -> ChangeBarsVisibilityModifier
no v4 equivalentfunc makeMessageAttachmentsView(options: MessageAttachmentsViewOptions) -> MessageAttachmentsViewType
no v4 equivalentfunc makeInlineTypingIndicatorView(options: TypingIndicatorViewOptions) -> InlineTypingIndicatorViewType
no v4 equivalentfunc makeSubtitleTypingIndicatorView(options: SubtitleTypingIndicatorViewOptions) -> SubtitleTypingIndicatorViewType
no v4 equivalentfunc makeSendMessageButton(options: SendMessageButtonOptions) -> SendMessageButtonType
no v4 equivalentfunc makeConfirmEditButton(options: ConfirmEditButtonOptions) -> ConfirmEditButtonType
no v4 equivalentfunc makeComposerInputTrailingView(options: ComposerInputTrailingViewOptions) -> ComposerInputTrailingViewType
no v4 equivalentfunc makeComposerVoiceRecordingInputView(options: ComposerVoiceRecordingInputViewOptions) -> ComposerVoiceRecordingInputViewType
no v4 equivalentfunc makeAttachmentCommandsPickerView(options: AttachmentCommandsPickerViewOptions) -> AttachmentCommandsPickerViewType
no v4 equivalentfunc makeAttachmentTypePickerView(options: AttachmentTypePickerViewOptions) -> AttachmentTypePickerViewType
no v4 equivalentfunc makeAttachmentMediaPickerView(options: AttachmentMediaPickerViewOptions) -> AttachmentMediaPickerViewType
no v4 equivalentfunc makeAttachmentFilePickerView(options: AttachmentFilePickerViewOptions) -> AttachmentFilePickerViewType
no v4 equivalentfunc makeAttachmentCameraPickerView(options: AttachmentCameraPickerViewOptions) -> AttachmentCameraPickerViewType
no v4 equivalentfunc makeCustomAttachmentPickerView(options: CustomAttachmentPickerViewOptions) -> CustomAttachmentPickerViewType
no v4 equivalentfunc makeAttachmentPollPickerView(options: AttachmentPollPickerViewOptions) -> AttachmentPollPickerViewType
no v4 equivalentfunc makeReactionsDetailView(options: ReactionsDetailViewOptions) -> ReactionsDetailViewType
no v4 equivalentfunc makeComposerQuotedMessageView(options: ComposerQuotedMessageViewOptions) -> ComposerQuotedMessageViewType
no v4 equivalentfunc makeComposerEditedMessageView(options: ComposerEditedMessageViewOptions) -> ComposerEditedMessageViewType
no v4 equivalentfunc makeMessageAttachmentPreviewThumbnailView(options: MessageAttachmentPreviewViewOptions) -> MessageAttachmentPreviewViewType
no v4 equivalentfunc makeMessageAttachmentPreviewIconView(options: MessageAttachmentPreviewIconViewOptions) -> MessageAttachmentPreviewIconViewType
no v4 equivalentfunc makeSuggestionsContainerView(options: SuggestionsContainerViewOptions) -> SuggestionsContainerViewType
Polls
v4v5
func makeComposerPollView(channelController: ChatChannelController, messageController: ChatMessageController?) -> ComposerPollViewTypefunc makeComposerPollView(options: ComposerPollViewOptions) -> ComposerPollViewType
func makePollView(message: ChatMessage, poll: Poll, isFirst: Bool) -> PollViewTypefunc makePollView(options: PollViewOptions) -> PollViewType
Thread List
v4v5
func makeThreadDestination() -> (ChatThread) -> ThreadDestinationfunc makeThreadDestination(options: ThreadDestinationOptions) -> @MainActor (ChatThread) -> ThreadDestination
func makeThreadListItem(thread: ChatThread, threadDestination: @escaping (ChatThread) -> ThreadDestination, selectedThread: Binding<ThreadSelectionInfo?>) -> ThreadListItemTypefunc makeThreadListItem(options: ThreadListItemOptions<ThreadDestination>) -> ThreadListItemType
func makeNoThreadsView() -> NoThreadsfunc makeNoThreadsView(options: NoThreadsViewOptions) -> NoThreads
func makeThreadsListErrorBannerView(onRefreshAction: @escaping () -> Void) -> ThreadListErrorBannerViewremoved in v5
func makeThreadListLoadingView() -> ThreadListLoadingViewfunc makeThreadListLoadingView(options: ThreadListLoadingViewOptions) -> ThreadListLoadingView
func makeThreadListContainerViewModifier(viewModel: ChatThreadListViewModel) -> ThreadListContainerModifierfunc makeThreadListContainerViewModifier(options: ThreadListContainerModifierOptions) -> ThreadListContainerModifier
func makeThreadListHeaderViewModifier(title: String) -> ThreadListHeaderViewModifierfunc makeThreadListHeaderViewModifier(options: ThreadListHeaderViewModifierOptions) -> ThreadListHeaderViewModifier
func makeThreadListHeaderView(viewModel: ChatThreadListViewModel) -> ThreadListHeaderViewfunc makeThreadListHeaderView(options: ThreadListHeaderViewOptions) -> ThreadListHeaderView
func makeThreadListFooterView(viewModel: ChatThreadListViewModel) -> ThreadListFooterViewfunc makeThreadListFooterView(options: ThreadListFooterViewOptions) -> ThreadListFooterView
func makeThreadListBackground(colors: ColorPalette) -> ThreadListBackgroundfunc makeThreadListBackground(options: ThreadListBackgroundOptions) -> ThreadListBackground
func makeThreadListItemBackground(thread: ChatThread, isSelected: Bool) -> ThreadListItemBackgroundfunc makeThreadListItemBackground(options: ThreadListItemBackgroundOptions) -> ThreadListItemBackground
func makeThreadListDividerItem() -> ThreadListDividerItemfunc makeThreadListDividerItem(options: ThreadListDividerItemOptions) -> ThreadListDividerItem
Add Users And Text Rendering
v4v5
func makeAddUsersView(options: AddUsersOptions, onUserTap: @escaping (ChatUser) -> Void) -> AddUsersViewTypefunc makeAddUsersView(options: AddUsersViewOptions) -> AddUsersViewType
func makeAttachmentTextView(options: AttachmentTextViewOptions) -> AttachmentTextViewTypefunc makeAttachmentTextView(options: AttachmentTextViewOptions) -> AttachmentTextViewType
no v4 equivalentfunc makeStreamTextView(options: StreamTextViewOptions) -> StreamTextViewType

The safest migration path is to take your custom ViewFactory, compile against v5, and then convert each failing override to the new signature shown above.

Migration Checklist

  • Update your dependency to 5.x.
  • Replace Appearance(...) initializers with var appearance = Appearance() and property assignment.
  • Use Appearance.FontsSwiftUI() for SwiftUI font customization.
  • Move tint customizations to ColorPalette, usually accentPrimary and navigationBarTintColor.
  • Rename channelNamer to channelNameFormatter in your Utils initializer.
  • Replace ChatChannelNamer closure type with a class conforming to ChannelNameFormatter.
  • Replace DefaultChatChannelNamer with DefaultChannelNameFormatter.
  • Remove imageMerger, channelAvatarsMerger, and channelHeaderLoader from your Utils initializer.
  • Replace renamed reusable views: UserAvatar, ChannelAvatar, and TypingIndicatorView.
  • Update UserAvatar call sites: pass a ChatUser (or use the URL+initials initializer), use CGFloat for size, and switch showOnlineIndicator: Bool to the AvatarIndicator enum.
  • Migrate message container customizations from makeMessageContainerView(...) to makeMessageItemView(options:).
  • Migrate message translation/reply annotation customizations from makeMessageTranslationFooterView(...) and makeMessageRepliesShownInChannelView(...) to makeMessageTopView(options:) and makeMessageRepliesView(options:).
  • Migrate gallery/media customizations from makeGalleryView(...) and makeGalleryHeaderView(...) to makeMediaViewer(options:) and makeMediaViewerHeader(options:).
  • Keep video player customizations, but update them to the new options-based makeVideoPlayerView/HeaderView/FooterView signatures.
  • Migrate quoted-message content customization from makeQuotedMessageContentView(...) to makeQuotedMessageView(options:) and/or makeChatQuotedMessageView(options:).
  • Move ViewFactory modifier overrides (makeChannelListContentModifier, makeChannelListModifier, makeMessageListModifier, makeMessageListContainerModifier, makeMessageViewModifier, makeComposerViewModifier) to a custom Styles implementation and assign it to factory.styles.
  • If you customized channel-list search in v4, move that work out of makeChannelListTopView(...) and into Styles.makeSearchableModifier(options:). Treat makeChannelListTopView(options:) as a separate top content area in v5.
  • Move supportedMoreChannelActions to ChannelListConfig.supportedMoreChannelActions.
  • Move supportedMessageActions to MessageListConfig.supportedMessageActions.
  • Move navigationBarDisplayMode to ChannelListConfig.navigationBarDisplayMode and/or MessageListConfig.navigationBarDisplayMode; do not rely on the compatibility helper on DefaultViewFactory.
  • Update all ViewFactory overrides that take individual parameters to use the new single options object signature.
  • Replace removed ViewFactory methods with their v5 equivalents (see the Channel And Message List table above).

After these changes, most v4 SwiftUI integrations should compile against v5 without further structural changes.