Skip to content

Conversation

@nuno-vieira
Copy link
Member

@nuno-vieira nuno-vieira commented Dec 17, 2025

🔗 Issue Links

https://linear.app/stream/issue/IOS-1023/v5-create-a-ui-module-in-uikit-repo-to-share-presentation-logic-and

🎯 Goal

Adds a new Module (StreamChatCommonUI) to share UI Logic with the SwiftUI SDK.

📝 Summary

  • Creates the StreamChatCommonUI Module
  • Moves the Appearance object to the new module
  • Moves Image Resources to the new module
  • Moves Fonts to the new Module
  • Moves Localisation to the new Module
  • Creates a Static Target for StreamChatCommonUI
  • Adds new test schema for the new module
  • Updates CI/Infra Scripts

🛠 Implementation

Creating the StreamChatCommonUI will allow sharing Theming, Styling, Formatting and ViewModels with SwiftUI. This will make both SDKs more consistent and faster to build new features.

Some Utils stuff, like UIKit extensions, will need to be public or duplicated in StreamChatUI. So for now, since it is simple stuff, I duplicated it, but one other option could be to use "@Package" access control.

🧪 Manual Testing Notes

Smoke Testing

☑️ 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

@coderabbitai
Copy link

coderabbitai bot commented Dec 17, 2025

Important

Review skipped

Draft detected.

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

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

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch add/presentation-module

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions
Copy link

1 Message
📖 Skipping Danger since the Pull Request is classed as Draft/Work In Progress

Generated by 🚫 Danger

@github-actions
Copy link

Public Interface

+ public enum L10n  
+ 
+   public static var you: String
+   
+ 
+   public static func currentSelection(_ p1: Int,_ p2: Int)-> String
+   
+ 
+   public enum Alert  
+   
+     public enum Actions  
+     
+       public static var cancel: String
+       public static var delete: String
+       public static var flag: String
+       public static var ok: String
+       
+     
+     public enum Poll  
+     
+       public static var addComment: String
+       public static var createErrorMessage: String
+       public static var discardChanges: String
+       public static var discardChangesMessage: String
+       public static var end: String
+       public static var endTitle: String
+       public static var genericErrorTitle: String
+       public static var keepEditing: String
+       public static var send: String
+       public static var suggestOption: String
+       public static var updateComment: String
+       
+     
+     
+   
+   public enum Attachment  
+   
+     public static var maxSizeExceeded: String
+     
+   
+     public static func maxCountExceeded(_ p1: Int)-> String
+     
+   
+   public enum Audio  
+   
+     public enum Player  
+     
+       public static func rate(_ p1: Any)-> String
+       
+     
+     
+   
+   public enum Channel  
+   
+     public enum Item  
+     
+       public static var audio: String
+       public static var emptyMessages: String
+       public static var photo: String
+       public static var typingPlural: String
+       public static var typingSingular: String
+       public static var video: String
+       
+     
+       public enum Search  
+       
+         public static func `in`(_ p1: Any)-> String
+         
+       
+       
+     
+     public enum Name  
+     
+       public static var and: String
+       public static var missing: String
+       
+     
+       public static func andXMore(_ p1: Any)-> String
+       
+     
+     
+   
+   public enum ChannelList  
+   
+     public static var search: String
+     
+   
+     public enum Empty  
+     
+       public static var button: String
+       public static var subtitle: String
+       public static var title: String
+       
+     
+     public enum Error  
+     
+       public static var message: String
+       
+     
+     public enum Preview  
+     
+       public enum Voice  
+       
+         public static var recording: String
+         
+       
+       
+     
+     public enum Search  
+     
+       public enum Empty  
+       
+         public static func subtitle(_ p1: Any)-> String
+         
+       
+       
+     
+     
+   
+   public enum Composer  
+   
+     public enum Checkmark  
+     
+       public static var channelReply: String
+       public static var directMessageReply: String
+       
+     
+     public enum LinksDisabled  
+     
+       public static var subtitle: String
+       public static var title: String
+       
+     
+     public enum Picker  
+     
+       public static var camera: String
+       public static var cancel: String
+       public static var file: String
+       public static var media: String
+       public static var poll: String
+       public static var title: String
+       
+     
+     public enum Placeholder  
+     
+       public static var giphy: String
+       public static var message: String
+       public static var messageDisabled: String
+       public static var slowMode: String
+       
+     
+     public enum QuotedMessage  
+     
+       public static var giphy: String
+       public static var photo: String
+       
+     
+     public enum Suggestions  
+     
+       public enum Commands  
+       
+         public static var header: String
+         
+       
+       
+     
+     public enum Title  
+     
+       public static var edit: String
+       public static var reply: String
+       
+     
+     
+   
+   public enum Dates  
+   
+     public static var timeAgoDaysSingular: String
+     public static var timeAgoHoursSingular: String
+     public static var timeAgoMinutesSingular: String
+     public static var timeAgoMonthsSingular: String
+     public static var timeAgoSecondsSingular: String
+     public static var timeAgoWeeksSingular: String
+     
+   
+     public static func timeAgoDaysPlural(_ p1: Int)-> String
+     public static func timeAgoHoursPlural(_ p1: Int)-> String
+     public static func timeAgoMinutesPlural(_ p1: Int)-> String
+     public static func timeAgoMonthsPlural(_ p1: Int)-> String
+     public static func timeAgoSecondsPlural(_ p1: Int)-> String
+     public static func timeAgoWeeksPlural(_ p1: Int)-> String
+     
+   
+   public enum Message  
+   
+     public static var deletedMessagePlaceholder: String
+     public static var edited: String
+     public static var onlyVisibleToYou: String
+     public static var unsupportedAttachment: String
+     
+   
+     public static func translatedTo(_ p1: Any)-> String
+     
+   
+     public enum Actions  
+     
+       public static var copy: String
+       public static var delete: String
+       public static var edit: String
+       public static var flag: String
+       public static var inlineReply: String
+       public static var markUnread: String
+       public static var resend: String
+       public static var threadReply: String
+       public static var userBlock: String
+       public static var userMute: String
+       public static var userUnblock: String
+       public static var userUnmute: String
+       
+     
+       public enum Delete  
+       
+         public static var confirmationMessage: String
+         public static var confirmationTitle: String
+         
+       
+       public enum Flag  
+       
+         public static var confirmationMessage: String
+         public static var confirmationTitle: String
+         
+       
+       
+     
+     public enum Item  
+     
+       public static var deleted: String
+       
+     
+     public enum Moderation  
+     
+       public static var delete: String
+       public static var edit: String
+       public static var message: String
+       public static var resend: String
+       public static var title: String
+       
+     
+     public enum Preview  
+     
+       public static var draft: String
+       public static var pollYouCreated: String
+       public static var pollYouVoted: String
+       
+     
+       public static func pollSomeoneCreated(_ p1: Any)-> String
+       public static func pollSomeoneVoted(_ p1: Any)-> String
+       
+     
+     public enum Sending  
+     
+       public static var attachmentUploadingFailed: String
+       
+     
+     public enum Thread  
+     
+       public enum Replies  
+       
+         public static func count(_ p1: Int)-> String
+         
+       
+       
+     
+     public enum Threads  
+     
+       public static var reply: String
+       
+     
+       public static func count(_ p1: Int)-> String
+       public static func replyWith(_ p1: Any)-> String
+       
+     
+     public enum Title  
+     
+       public static var offline: String
+       public static var online: String
+       
+     
+       public static func group(_ p1: Int,_ p2: Int)-> String
+       
+     
+     public enum Unread  
+     
+       public static func count(_ p1: Int)-> String
+       
+     
+     
+   
+   public enum MessageList  
+   
+     public static func jumpToUnreadButton(_ p1: Int)-> String
+     
+   
+     public enum TypingIndicator  
+     
+       public static var typingUnknown: String
+       
+     
+       public static func users(_ p1: Any,_ p2: Int)-> String
+       
+     
+     
+   
+   public enum Polls  
+   
+     public static var addComment: String
+     public static var allOptionsTitle: String
+     public static var anonymousAuthor: String
+     public static var commentsTitle: String
+     public static var resultsTitle: String
+     public static var updateComment: String
+     
+   
+     public static func votes(_ p1: Int)-> String
+     
+   
+     public enum Button  
+     
+       public static var addComment: String
+       public static var endVote: String
+       public static var showAll: String
+       public static var suggestOption: String
+       public static var viewResults: String
+       
+     
+       public static func allOptions(_ p1: Int)-> String
+       public static func viewComments(_ p1: Int)-> String
+       
+     
+     public enum Creation  
+     
+       public static var addAComment: String
+       public static var addAnOptionPlaceholder: String
+       public static var alreadyAnOptionError: String
+       public static var anonymousPoll: String
+       public static var askAQuestionPlaceholder: String
+       public static var cancel: String
+       public static var maximumVotesError: String
+       public static var maximumVotesPlaceholder: String
+       public static var multipleVotes: String
+       public static var optionsTitle: String
+       public static var questionTitle: String
+       public static var suggestAnOption: String
+       public static var title: String
+       
+     
+     public enum Subtitle  
+     
+       public static var selectOne: String
+       public static var selectOneOrMore: String
+       public static var voteEnded: String
+       
+     
+       public static func selectUpTo(_ p1: Int)-> String
+       
+     
+     
+   
+   public enum Reaction  
+   
+     public enum Authors  
+     
+       public static func numberOfReactions(_ p1: Int)-> String
+       
+     
+     
+   
+   public enum Recording  
+   
+     public static var slideToCancel: String
+     public static var tip: String
+     
+   
+     public enum Presentation  
+     
+       public static func name(_ p1: Int)-> String
+       
+     
+     
+   
+   public enum ThreadList  
+   
+     public static func newThreads(_ p1: Int)-> String
+     
+   
+     public enum Empty  
+     
+       public static var description: String
+       
+     
+     public enum Error  
+     
+       public static var message: String
+       
+     
+     
+   
+   public enum ThreadListItem  
+   
+     public static func repliedTo(_ p1: Any)-> String



@nuno-vieira nuno-vieira changed the title Add StreamChatCommonUI Module Add StreamChatCommonUI Module [v5] Dec 18, 2025
@nuno-vieira nuno-vieira changed the title Add StreamChatCommonUI Module [v5] [v5] Add StreamChatCommonUI Module Dec 18, 2025
@nuno-vieira nuno-vieira force-pushed the add/presentation-module branch from eb16164 to e9c6ba7 Compare December 18, 2025 14:52
@sonarqubecloud
Copy link

Quality Gate Failed Quality Gate failed

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

See analysis details on SonarQube Cloud

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.

2 participants