diff --git a/CHANGELOG.md b/CHANGELOG.md index 25d0a259..0ab7c3fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +### v3.29.0 (Jan 02, 2025) + +## MessageTemplate (New) + +### 🚀 New Feature + +Introduced a powerful module for parsing JSON-based templated syntax and seamlessly converting it into dynamic Views + +- Added TemplateParser to parse the template and generate the code +- Added ViewGenerator to generate the view based on the parsed template + +### 📦 Modular Design + +Designed as a standalone library for easy adoption in diverse projects + +### 🛠️ Developer-Friendly + +Offers a straightforward API for effortless parsing and rendering, enabling rapid development and reduced boilerplate code + ### v3.28.1 (Dec 05, 2024) ## ModuleSet Improvements diff --git a/Framework/Module/MessageTemplate/SendbirdUIMessageTemplateTarget.swift b/Framework/Module/MessageTemplate/SendbirdUIMessageTemplateTarget.swift new file mode 100644 index 00000000..e69de29b diff --git a/Package.resolved b/Package.resolved index 396c1fb8..a9983e5c 100644 --- a/Package.resolved +++ b/Package.resolved @@ -6,8 +6,8 @@ "repositoryURL": "https://github.com/sendbird/sendbird-chat-sdk-ios", "state": { "branch": null, - "revision": "3125065015982175879093cac9c71b5adbe0749e", - "version": "4.19.0" + "revision": "0b1843060748c295b49f60a6f718dc6488e11657", + "version": "4.24.1" } } ] diff --git a/Package.swift b/Package.swift index b9d72c83..169ec625 100644 --- a/Package.swift +++ b/Package.swift @@ -10,6 +10,10 @@ let package = Package( name: "SendbirdUIKit", targets: ["SendbirdUIKitTarget"] ), + .library( + name: "SendbirdUIMessageTemplate", + targets: ["SendbirdUIMessageTemplateTarget"] + ), ], dependencies: [ .package( @@ -21,8 +25,13 @@ let package = Package( targets: [ .binaryTarget( name: "SendbirdUIKit", - url: "https://github.com/sendbird/sendbird-uikit-ios/releases/download/3.28.1/SendbirdUIKit.xcframework.zip", // SendbirdUIKit_URL - checksum: "505f30d55e1a2d2ab270c7d0ee4542da359fa58c3ad07190c5f631d02e0d3143" // SendbirdUIKit_CHECKSUM + url: "https://github.com/sendbird/sendbird-uikit-ios/releases/download/3.29.0/SendbirdUIKit.xcframework.zip", // SendbirdUIKit_URL + checksum: "556fddaccb892b9b6e1c3ac5734cd493a5f2772f1bab313543a144b542df8944" // SendbirdUIKit_CHECKSUM + ), + .binaryTarget( + name: "SendbirdUIMessageTemplate", + url: "https://github.com/sendbird/sendbird-uikit-ios/releases/download/3.29.0/SendbirdUIMessageTemplate.xcframework.zip", // SendbirdUIMessageTemplate_URL + checksum: "d153ea5c96c9ef69589217e416afa060555a0addabcae5f81afddbba9df31cda" // SendbirdUIMessageTemplate_CHECKSUM ), .target( name: "SendbirdUIKitTarget", @@ -33,5 +42,13 @@ let package = Package( path: "Framework/Dependency", exclude: ["../../Sample", "../../Sources"] ), + .target( + name: "SendbirdUIMessageTemplateTarget", + dependencies: [ + .product(name: "SendbirdChatSDK", package: "SendbirdChatSDK") + ], + path: "Framework/Module/MessageTemplate", + exclude: ["../../Sample", "../../Sources"] + ), ] ) diff --git a/Sample/QuickStart.xcodeproj/project.pbxproj b/Sample/QuickStart.xcodeproj/project.pbxproj index a8813856..523b3fc8 100644 --- a/Sample/QuickStart.xcodeproj/project.pbxproj +++ b/Sample/QuickStart.xcodeproj/project.pbxproj @@ -7,566 +7,549 @@ objects = { /* Begin PBXBuildFile section */ - 004511D159EFF115534D1114 /* SBUViewModelSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A334AF18EE7A1524DDAA02 /* SBUViewModelSet.swift */; }; - 00A85F7965CFE0B222FBECAD /* SBUTypingIndicatorMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8741AB0AF5C9267260E074F /* SBUTypingIndicatorMessageCell.swift */; }; - 02131B71B4E7B0CC5B743489 /* SBUMessageTemplate.Decoders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1560AA0991C25E804E2A7137 /* SBUMessageTemplate.Decoders.swift */; }; - 021D9AE2C33EF155BC8ECD54 /* SBUCreateOpenChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123580C191BBF7D8C9AF1116 /* SBUCreateOpenChannelModule.Header.swift */; }; - 0247FBACEDEC4BACB4D309B6 /* SBUInviteUserModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04DE97EEAD63BBA59E0FB656 /* SBUInviteUserModule.swift */; }; - 02ABB1BAB91A78E40B617A55 /* SBULoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43EA07BFE9725B76DDCC82D8 /* SBULoading.swift */; }; - 038C05C76118FB5BFBA4693F /* SBUUserListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB5700F5D0D4B10B740AEF4 /* SBUUserListViewController.swift */; }; - 046CB029CCCEEAA4D1AF5A4E /* SBUModerationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B575CA3A534C9F671A54E3C /* SBUModerationsViewController.swift */; }; - 04B86FE3F62BB267F87D14B4 /* SBUView.Unavaliable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36707C3537ECA9B171E2C286 /* SBUView.Unavaliable.swift */; }; + 00937F5E085DF052503A50CD /* SBUBaseChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCD4B760FD91A460F7D3558E /* SBUBaseChannelViewModel.swift */; }; + 013883B46AA5F5030797AECF /* SBUMenuCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1AE659DF5214E274DFDEDD /* SBUMenuCell.swift */; }; + 0188B0A197B55B74C9219549 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8F81F37811DBBF0C6750F046 /* Assets.xcassets */; }; 050584E069A50774636741A4 /* MemberListVC_Overriding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 715A32E5B024249C175D3A73 /* MemberListVC_Overriding.swift */; }; - 052153480783F5D8836E5702 /* SBUReactionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A48BA23BAC1C688AE03630C9 /* SBUReactionsViewController.swift */; }; 05838D2F86701D3253BA76E8 /* CustomNewMessageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA8781BA2734284427927163 /* CustomNewMessageInfo.swift */; }; - 0596553868CE49CEA3A155DB /* SBUOpenChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0940CD38AE9564E89E92B498 /* SBUOpenChannelModule.Header.swift */; }; - 059D977BA41CDC4C1DEAB21C /* UIButton+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7F59295553F372937A267AE /* UIButton+SBUIKit.swift */; }; + 05CF4A6F52516DC2463B9410 /* SBUTypingIndicatorMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF95A5440DFB1097E0DC090D /* SBUTypingIndicatorMessageCell.swift */; }; 05EF3B883F179441278AD591 /* SendbirdChatSDK in Frameworks */ = {isa = PBXBuildFile; productRef = 74778F0EA153D6775D8BC4F6 /* SendbirdChatSDK */; }; - 0712BEF000CF282632B5F090 /* SBUViewLifeCycle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965CDE99D3CE7B2C8878BF20 /* SBUViewLifeCycle.swift */; }; - 07A64F764EADBE67510A8B9C /* SBUUserListModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D8EABEB1992CD5141939413 /* SBUUserListModule.List.swift */; }; - 09A8AB24BB34EFADF7986C62 /* SBUConfigManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62B80927EA163A99A9AB0F9C /* SBUConfigManager.swift */; }; - 0A9D07EFFA030C78A98F980C /* SBUBaseSelectUserModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BB7D281DAD481F3E43747A8 /* SBUBaseSelectUserModule.swift */; }; - 0AB69C4998C733A323BE2CEA /* SBUBaseMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFFE0FADB7DF38D0A9529A96 /* SBUBaseMessageCellParams.swift */; }; + 0616F5181F6799482BAE643E /* SBUGroupChannelListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B15D5A49D7BA08FF6852E56B /* SBUGroupChannelListViewModel.swift */; }; + 06660AE1935F28F14E6CDAC0 /* SBUMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B9C5DC79836381B4EBB75F2 /* SBUMenuView.swift */; }; + 06E5AC559550FCC1542F1A23 /* SBUReactionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E321314C869482D4596032AB /* SBUReactionCollectionViewCell.swift */; }; + 08184BDD477D58D4BFD2CF41 /* SBUOpenChannelUnknownMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877084DBA5955D3BF90AABAE /* SBUOpenChannelUnknownMessageCell.swift */; }; + 08D5C9AB7E2E54CF7A3D0B01 /* VoiceMessageStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F37C738B0DF21E04D5F643D /* VoiceMessageStatus.swift */; }; + 091F134B0DE0CF39BE5DDB8F /* UIButton+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38D0D322E0898F77B513394 /* UIButton+SBUIKit.swift */; }; + 0969D662845530A2B2B1D3AC /* SBUEmojiListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E13940CB4B33B22925AE6C /* SBUEmojiListViewController.swift */; }; + 09C06672A09115D0FFC53FDD /* SBUQuotedBaseMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94DBF4C540EFF4387E7269B0 /* SBUQuotedBaseMessageView.swift */; }; 0B2CBE893C99F196B6BBC30B /* CustomSampleEnums.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932048A2DF2D18C5E7B0241C /* CustomSampleEnums.swift */; }; - 0CD56E2F5A0655BE99206CB3 /* NSLayoutConstraint+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E7B76170E32DBEA8298098 /* NSLayoutConstraint+SBUIKit.swift */; }; - 0F0BC25DFA231A1F3CFCB4DF /* SBUMessageSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA565082C3C3A3C9CAFA572D /* SBUMessageSearchViewController.swift */; }; - 0FBAAF7DAFFCE0E99FD5BEE1 /* SBUGroupChannelListModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEE2B4EFD32A67B6176A299A /* SBUGroupChannelListModule.Deprecated.swift */; }; - 0FCE832C2258FBE9E4C5DF27 /* SBUOpenChannelViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318FFA50D14FA7DBF2D42D6A /* SBUOpenChannelViewController.Deprecated.swift */; }; - 112BB9532661659424BA9CAC /* SBUCreateChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79E05EC2053A3F33A4D72CAA /* SBUCreateChannelViewController.swift */; }; - 11330D0C45B720C74CC8E578 /* SBUQuotedUserMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14F4761B430C339CB959BDF8 /* SBUQuotedUserMessageView.swift */; }; - 123D975099FD4D51C7712B7C /* SBUFormViewParams.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DDED6713E40ABD4BD1DBE1 /* SBUFormViewParams.Deprecated.swift */; }; - 131DE842F31D7008EF376010 /* SBUGroupChannelSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE127AC25B1E03735523FE7 /* SBUGroupChannelSettingCell.swift */; }; - 146C081AA198D637EFACB4DF /* SBUQuotedBaseMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0DF16EFEDABAEFA74F71CD9 /* SBUQuotedBaseMessageView.swift */; }; - 147BDA6F7CFB468B5B048FC3 /* SBUMessageInputMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71B3F2FD57DFBE297702E05 /* SBUMessageInputMode.swift */; }; - 163E6B7D21930E62190874FD /* SBUForm.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5A71462A25A4CA253308676 /* SBUForm.Deprecated.swift */; }; - 1682BB9363F3F7CC8E73F37F /* SBUCreateOpenChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09DBF0EC83E4E1209BF7031 /* SBUCreateOpenChannelModule.Deprecated.swift */; }; + 0B6AE62D23A5C0B19A49DA6B /* SBUMessageReactionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8697D802A32FDDFE7CA0E53F /* SBUMessageReactionView.swift */; }; + 0BCBF99DEDC305F5C361BA1E /* SBUBaseChannelSettingsViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BA8979879F319E9210A9114 /* SBUBaseChannelSettingsViewController.Deprecated.swift */; }; + 0C2B461AEC9DA2A04C4FE866 /* SBUIconSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091765502ECC694C6C1232FF /* SBUIconSet.swift */; }; + 0CEDDB80FE5F787C3E43C318 /* SBUPropertyWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1063DC1B3EC17EC82DC2827C /* SBUPropertyWrapper.swift */; }; + 0D07D037D04FBC48B9F5C390 /* SBUGroupChannelViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D48FDCD85AD0971FC3BF896 /* SBUGroupChannelViewController.Deprecated.swift */; }; + 0E462DC1A4001E706D07DE2B /* SBUViewModelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9692FF050F42210BFCF6B3C /* SBUViewModelDelegate.swift */; }; + 0E48C2D5CBF46E1080E7F532 /* SBUOpenChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DB6EB01052825063F888E1C /* SBUOpenChannelViewModel.swift */; }; + 0F2839909F63779558D35396 /* SBUStringSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7EF819DB69451205ACD514D /* SBUStringSet.swift */; }; + 102032265A52213DECE8D624 /* SBUCreateOpenChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EB14B7E6ECC3FB7331A5638 /* SBUCreateOpenChannelModule.Deprecated.swift */; }; + 109FCAE34E79403D95C5510C /* SBULoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = B310291234962FDCD219CA29 /* SBULoading.swift */; }; + 11831D32FB6DF64168EFF466 /* Sequence+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45154CBDED471591E1058E18 /* Sequence+SBUIKit.swift */; }; + 118DAD44A629451250C39833 /* SBUNotificationEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9412FC79CA00FB3846A53F /* SBUNotificationEmptyView.swift */; }; + 12471A58B789BCE56BC11CCA /* SBUCommonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB4E609F0F56A3A6785D70A2 /* SBUCommonItem.swift */; }; + 12C0AA5A156D78B36978D993 /* SBUGlobals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71C8271A11BE982092DA07F9 /* SBUGlobals.swift */; }; + 12F343E4C7125E78B52B461F /* SBUUserProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9BA7B959F6864DF50326000 /* SBUUserProfileView.swift */; }; + 13014EB3B5C7712701E0E77B /* SBUNotificationNavigationTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B98C6D21843D388F6AB9CB9 /* SBUNotificationNavigationTitleView.swift */; }; + 1398308CEC1D2B7E695FF9C9 /* SBUAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AE4104792D75CA431666D3 /* SBUAnimation.swift */; }; + 14B33750A5C0825A154276A0 /* SBUEmojiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331BD4D2293D4C13964CDEA4 /* SBUEmojiManager.swift */; }; + 14E93AB1F9E0588FABA776DF /* SBUGroupChannelPushSettingsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7524EEC19FD2161959072A /* SBUGroupChannelPushSettingsModule.List.swift */; }; + 16046275C3DA17C86B2478DE /* SBUCreateOpenChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 805C16C6977AB2E9F1865F31 /* SBUCreateOpenChannelModule.swift */; }; 16BD02B59AC7265751BE7F3D /* MessageTranslationMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FF0C3A9D41F9CA7E230D440 /* MessageTranslationMessageCell.swift */; }; - 16D6617A9CBE459E1C34BD9F /* SBUMessageInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59857C7D2CC2649D6D9B4588 /* SBUMessageInputView.swift */; }; - 17A65C7B69016FE6A0A01401 /* SBUInviteUserModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCD1091E08A9D9F154CDC2C0 /* SBUInviteUserModule.List.swift */; }; - 17F15A0DCCB37ACEA3E8679B /* SBUOpenChannelSettingsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8FBFA88F380C0DB3B7952DF /* SBUOpenChannelSettingsModule.List.swift */; }; - 18184CDC18D44DA9E249A3E5 /* SBUGroupChannelViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2EFAAD40957BEB30ADC9532 /* SBUGroupChannelViewController.Deprecated.swift */; }; + 17A8D4619AF60BC0683E1572 /* Formatter+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 160407074FE87FA4C356A225 /* Formatter+SBUIKit.swift */; }; 18E798E65CBA3F331117FD2C /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9025529DFA82D4C194EB5391 /* ViewController.swift */; }; - 18F6E927A590FE2D08A0674E /* SBUConfig.Base.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA98D7A26F90ED5D3C8D0552 /* SBUConfig.Base.swift */; }; - 19641DAAF07FFBFCF61424E1 /* SBUOpenChannelFileMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BD7FBB468AAE322B76088BA /* SBUOpenChannelFileMessageCell.swift */; }; - 196916A19FC7201C8968EB5D /* SBUChatNotificationChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B72B84D8197B89255974E36 /* SBUChatNotificationChannelModule.Header.swift */; }; - 19F2EFD05500C57C8F35E70D /* SBUColorSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969E0A8ADC1B8381ACBA1B1F /* SBUColorSet.swift */; }; - 1A4A80D6484826D7512F4A53 /* SBUFeedNotificationChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2106A5AFCD89A80F1D4218FF /* SBUFeedNotificationChannelViewController.swift */; }; 1A7DBAA217C2575918761E3E /* BasicUsagesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F3E74E3C6D05FAC47D2B7FE /* BasicUsagesView.swift */; }; - 1B46CCCDAAB5C28445E7F4A1 /* SBUBaseChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D3B9EF3C2445FE1C52CD30 /* SBUBaseChannelViewModel.swift */; }; - 1B703CA9C49E64A7377525FA /* SBUMessageTemplateCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFAEEEFE5278165149ED3E44 /* SBUMessageTemplateCell.swift */; }; - 1BCE5B9037ABA084B86C4B91 /* SBUTemplateLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68F7DD03795E7F72E2E3D7A5 /* SBUTemplateLabel.swift */; }; - 1BF99D5BA258D6F1EBF9A3AB /* SBUOpenChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0A3CB6F711BD58217836B3 /* SBUOpenChannelModule.swift */; }; - 1C73433BE654C98C51F508D3 /* SBUMultipleFilesMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71A027C49ABEAAB520F25148 /* SBUMultipleFilesMessageCell.swift */; }; - 1C79F8472D64D9AA16DD05DC /* SBUGroupChannelSettingsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D826F745DAE2521F5F82AC5 /* SBUGroupChannelSettingsModule.Header.swift */; }; + 1AE080F1AD4A76CF537093E5 /* SBUDateFormatSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7FD314A275F9EE69C49BE2B /* SBUDateFormatSet.swift */; }; + 1B9C6B80827F064019FA5D17 /* SBUUnknownMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57E54FFC45003C2B9C6B0182 /* SBUUnknownMessageCellParams.swift */; }; + 1BA31707DC1EB3B1FA1A050B /* SBUAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EED45B2BA19040E9E0D3345 /* SBUAlertView.swift */; }; + 1C302A943D8447128BA7CF52 /* SBUConfig.Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87EF2A05B984D8F621163298 /* SBUConfig.Common.swift */; }; + 1C424728C17D31495FAC8229 /* SBUInviteUserModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0326EBEF25364538B353DD0 /* SBUInviteUserModule.swift */; }; + 1C919B5C486FEAE7BFC7C4F0 /* SBUOpenChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE86374D9622697D836E37EC /* SBUOpenChannelViewController.swift */; }; 1CBCB3FEC9820A63CEF3F809 /* MySettingsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 126A54F8F111E828995FD06C /* MySettingsCell.swift */; }; + 1CC7562C555EA45884DB876E /* UITextField+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21728A585D06CEBECD786C47 /* UITextField+SBUIKit.swift */; }; + 1D0110DD6C43E18871203515 /* SBUMessageThreadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8C7146E20C14178D218D0F /* SBUMessageThreadViewModel.swift */; }; 1E1AF8B33F4559B343A5FB58 /* CommunityChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8338080AC9AE1F8F89DFF05 /* CommunityChannelListViewController.swift */; }; - 201FBBB691E81B927E0CB182 /* SBUScrollBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E747965D976B362F29A76025 /* SBUScrollBottomView.swift */; }; - 20888D7D78CB4C08428D7907 /* SBUUserListModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22CAD48F00CAF7563928667 /* SBUUserListModule.Header.swift */; }; - 213AC350F367EBB96C3BBC78 /* StringProtocol+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57C491CE4E8339CF2EB880A /* StringProtocol+SBUIKit.swift */; }; - 21CEF9D4507F81FCBEF5E51C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A2E86EB1B0B880489D4987EB /* Assets.xcassets */; }; - 21EED0DCCC8D5BE3FF10337C /* SBUOpenChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AF6D0E947D04AD2DF9B330C /* SBUOpenChannelModule.List.swift */; }; - 21FDF6AD0174FDCB2C1841BA /* SBUMessageFormItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C29B5B55241C104AB00977 /* SBUMessageFormItemView.swift */; }; + 1E78F486C49B35B97137FF68 /* SBUBaseSelectUserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94160588974EDDA4EBAADDF7 /* SBUBaseSelectUserViewController.swift */; }; + 1E9ACEF77FF2954FAB698215 /* SBUFeedNotificationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6692C7DC98D5A0ED508B2E65 /* SBUFeedNotificationCell.swift */; }; + 1EC783195092253E9A2929BF /* SBUUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607B42FE473E8A6E170EA74E /* SBUUser.swift */; }; + 1FA3E6DFB2D5541780E5C2CF /* SBUActionSheet.Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA91BE839D9DE47DE817D68B /* SBUActionSheet.Item.swift */; }; + 1FE4226D142D3643E865A646 /* SBUNotificationChannelManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544DDF9B4A8EF42E9EEC62C5 /* SBUNotificationChannelManager.swift */; }; + 20A0CD5587D8D036ED896DD3 /* SBUMessageTemplateCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0EECFE4C75C6F4FBD143730 /* SBUMessageTemplateCell.swift */; }; + 20F58252A971163CB1ECD4A0 /* SBUOpenChannelSettingsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1A00A8435BCB02C95EA2EFD /* SBUOpenChannelSettingsModule.swift */; }; + 22429183F564B531B9DFDCDF /* SBUGroupChannelListModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9253D190106102D9D927B1B8 /* SBUGroupChannelListModule.Deprecated.swift */; }; + 2250C88BB1ABE3B65EBDE5AC /* SBUQuotedMessageViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAE10ED574FAD7F9ED55DD9 /* SBUQuotedMessageViewProtocol.swift */; }; 22D4EA3A00FBF521FE3D1624 /* BusinessMessagingTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 748F2518BAA37399D41DD3CC /* BusinessMessagingTabBarController.swift */; }; - 22DF9A7F9C6506622FAC4533 /* SBUCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18F0D9753CF2825B748B02DD /* SBUCollectionViewFlowLayout.swift */; }; - 235CD47C6532AA6E4C908EA2 /* SBUGroupChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83EBCC4EE4DD8257F4CA32B1 /* SBUGroupChannelModule.swift */; }; - 23ACD6070E5BE0494775D445 /* SBUAdminMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4063A03A01AE9C1D9ED96FC0 /* SBUAdminMessageCell.swift */; }; + 2318B21FA6FCB7DC23527F95 /* SBUBaseChannelListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90DE6F47C51A871EC1231DC /* SBUBaseChannelListViewModel.swift */; }; + 23FEFD9EFC112F097C468545 /* SBUMentionLimitGuideCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6DA5302A886FEF8E44B9CF8 /* SBUMentionLimitGuideCell.swift */; }; + 24387E6C0B960CBA9000D530 /* CommonProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06DD68EE074C2AEB36D0D3D8 /* CommonProtocols.swift */; }; 24B9B0D5DB8619080A104320 /* CustomEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DE6549CE553EFCA6E649E6F /* CustomEmptyView.swift */; }; - 25155CF285997C8E21408FBA /* SBUGroupChannelViewController.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFBFB5FD5BBC6FBBF82545AD /* SBUGroupChannelViewController.Unavailable.swift */; }; - 2539F5D72FC72984B857EEA1 /* SBUToastView.Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5B1130755BC5BD8A5077F6 /* SBUToastView.Internal.swift */; }; - 25712D8C82D49853C68FD088 /* SBUInviteUserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E50812E1BE59E25B6A6369D /* SBUInviteUserViewController.swift */; }; - 272163E47F1425C6F3B79A00 /* SBUFeedNotificationChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DD1C6EBB30609466FDEE62 /* SBUFeedNotificationChannelModule.Header.swift */; }; - 277F9CEA0C149A3CA146504B /* SBUPendingMessageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6C860D49E72966CE515EB5 /* SBUPendingMessageManager.swift */; }; - 27AB6FD6FF6FCC0EE0FBC7F8 /* SBUGroupChannelPushSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D055E1C7D8FB4A8F3552F98E /* SBUGroupChannelPushSettingsViewController.swift */; }; - 2852C6BF7360B8277B534410 /* SBUFeedbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12C7E05BDFB700749617933C /* SBUFeedbackView.swift */; }; - 2878D33AA8E88D95B249E704 /* SBUVerticalSuggestedReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B991AD06D53B6F51F10B1FED /* SBUVerticalSuggestedReplyView.swift */; }; - 28EF2C2266D825AA3EF47287 /* SBUQuoteMessageInputViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2F8D1EB1D894DD952339175 /* SBUQuoteMessageInputViewParams.swift */; }; - 292ABCDE8853C81CFC26C56E /* SBUCreateOpenChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70519D8FB40DB45F829EF9FF /* SBUCreateOpenChannelViewModel.swift */; }; - 2990A59B9FD171AE34C2BA0F /* SBULinkClickableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AA53823579A67AEF2491504 /* SBULinkClickableTextView.swift */; }; + 2588AC9BBCD66A140311B635 /* SBUScrollOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53751B7045EA78E02FBB7B25 /* SBUScrollOptions.swift */; }; + 26DC976103E1E6730F127679 /* SBUCacheManager.NotificationSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EA0C05DFEE707F582F5F0ED /* SBUCacheManager.NotificationSetting.swift */; }; + 2730F078562AC8C86545B4B0 /* SBUExtendedMessagePayloadForUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7FA6407241634DBD62B76F9 /* SBUExtendedMessagePayloadForUI.swift */; }; + 275A4570BF15797A99285AFB /* SBUCommonDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FBF75480C4B97D8899C057 /* SBUCommonDelegate.swift */; }; + 27ACF7E9384630EAA4BC138A /* SBUOpenChannelListModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28DA61B394B90A15CE024663 /* SBUOpenChannelListModule.List.swift */; }; + 28B1FF5FD159EECDACBF25B4 /* SBUTypingIndicatorMessageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F70F42A31C241A9DFA53850 /* SBUTypingIndicatorMessageManager.swift */; }; + 28F23F21DDED30DFE80677C9 /* SBUFeedNotificationChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C796BD143FCD81CEF30E13CE /* SBUFeedNotificationChannelViewController.swift */; }; + 296C0D1DFC6459CE35F87E46 /* UIApplication+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 554E88B94EABB3AFE34858E6 /* UIApplication+SBUIKit.swift */; }; + 29E83767995C57F3965F8011 /* SBUCacheManager.Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3F2B4D4DEE6B7025D7BD9C3 /* SBUCacheManager.Image.swift */; }; 29F21CACC3E083C248649E81 /* GeneralSignInViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A8BCEC00EED3979EA4524D08 /* GeneralSignInViewController.xib */; }; - 2A2B3D874CB7384A69B55CFE /* SBUTypingMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 243147D65D160EDDABF07E7E /* SBUTypingMessageCellParams.swift */; }; - 2AAD55045818B48FAEEF2465 /* SBUToastType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D3C4F194B98FEC243B2203D /* SBUToastType.swift */; }; - 2ADEC2B2EED7A726EB29DF0A /* SBUModuleSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 712395536ABEF68B35D2A5AE /* SBUModuleSet.swift */; }; - 2B1A1555983F3341970E3ECA /* SBUMessageTemplate.Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = E45EA21ABFDC566C52C5B851 /* SBUMessageTemplate.Action.swift */; }; - 2B48A9D6A1326433F95F584D /* SBUEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E737652B7CC0957AD9113F9F /* SBUEmptyView.swift */; }; - 2C2E60816D9A1D0CBE982812 /* SBUModerationsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD315DD060E0A7F6ACF32325 /* SBUModerationsModule.swift */; }; - 2D0D9C51BDF91F4D1FC0E047 /* SBUBaseChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 494AACC2369B97D7A129A6E9 /* SBUBaseChannelModule.swift */; }; - 2D76A3FC4C0D45B70BB4E5AF /* SBUFormView.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B721F21C9C029F3427A0711F /* SBUFormView.Deprecated.swift */; }; - 2DA4B01F855397D580803AF4 /* SBUConfig.OpenChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72ADC3A02610A1FECB17939B /* SBUConfig.OpenChannel.swift */; }; - 2EE942D3FB8E7116F8C714FC /* SBUSuggestedMentionList.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7228CF5F19E467365AAB04 /* SBUSuggestedMentionList.swift */; }; - 2F9641F8F9BF4B6943E1BCDB /* SBUSuggestedReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEC26E9D6CA4DAB0FFD3991F /* SBUSuggestedReplyView.swift */; }; - 305B6295428F8361AB110547 /* SBUMessageStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FED8843DCE23EC513800DE /* SBUMessageStateView.swift */; }; - 3086842BF1FFEECEE7442A4B /* SBUInviteUserModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96C73D47D58841602582626D /* SBUInviteUserModule.Header.swift */; }; + 2AB04DCEEEC0CE2C9A407C26 /* SBUHorizontalSuggestedReplyOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D21FD81BE3D86B64E101A5 /* SBUHorizontalSuggestedReplyOptionView.swift */; }; + 2AD9B7636FD359F9717D97D1 /* SBUCreateChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC90403A35689CAF4FC0F495 /* SBUCreateChannelModule.List.swift */; }; + 2AE88EA2D3D9637311946419 /* Collection+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = E66DFF02F9BC48A669A1FABE /* Collection+SBUIKit.swift */; }; + 2AFC9A383FF500CE109FA653 /* SBUInviteUserViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE2DC902897DA8C9B706D138 /* SBUInviteUserViewModel.swift */; }; + 2B8F1AE7B2504E253CE76F4B /* SBUTemplateLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45310F1A62F1B4E5F9FACF45 /* SBUTemplateLabel.swift */; }; + 2C4D6C2BBC56593D62ADA968 /* SBUFeedNotificationChannelModule.CategoryFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEB459518675E36121D8503F /* SBUFeedNotificationChannelModule.CategoryFilter.swift */; }; + 2CE3151A43ADE274E4B1364C /* SBUUserNameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD886E49DD2C00DC3173F7D6 /* SBUUserNameView.swift */; }; + 2D26801B00871ED07A4219C8 /* SBUGroupChannelPushSettingsModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44ABD98D4565D23E2F60FB33 /* SBUGroupChannelPushSettingsModule.Deprecated.swift */; }; + 2D4B03E4EA2BDA0E6130BF55 /* SBUOpenChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 006892806DB9C7DC09CAA142 /* SBUOpenChannelModule.Deprecated.swift */; }; + 2D58CFEB71504B5091C7DEFF /* SBUThreadInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 018C80E9E0766DABE70434EA /* SBUThreadInfoView.swift */; }; + 2D909187CECC80192A363839 /* SBUGroupChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99BE2AE129A67EB04D94E44D /* SBUGroupChannelModule.swift */; }; + 2F18B3FAB8B76389B6F876A4 /* SBUBaseChannelViewController.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B80713CB5871E2BC5C1F647E /* SBUBaseChannelViewController.Unavailable.swift */; }; + 304B3AE19B79F577FA539D11 /* Data+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FEAEB09E73D10EA062EB110 /* Data+SBUIKit.swift */; }; + 307730DBADF79E6C9C252F2B /* SBUBaseChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEBF6CAB375E4C0A98B3703F /* SBUBaseChannelCell.swift */; }; + 30B07C0FE69F4EA61E88081D /* SBUMessageSearchModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B6A5EA6AB1BD482B56E9D15 /* SBUMessageSearchModule.Header.swift */; }; 30D6FD3C65C007D6F59D3B51 /* ConnectBusinessMessagingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E00D6DB472E2D89F05B58CFD /* ConnectBusinessMessagingView.xib */; }; - 31064A73E50DF83127D91F2F /* SBUVoiceMessageInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F98605B0DD442AD06325B5F /* SBUVoiceMessageInputView.swift */; }; - 31D2E7C68C01E021A0756FA8 /* SBUTemplateType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840025E10C4D2DDD5EE017D8 /* SBUTemplateType.swift */; }; - 31D9AB3CDE49DB38342783C7 /* SBUGroupChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0631DE516FBCB87956BAC3 /* SBUGroupChannelViewController.swift */; }; - 31FC45AC3DF9A6E98B2102EB /* SBUGroupChannelListModule.Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2558FBC469097A05B40DD8B9 /* SBUGroupChannelListModule.Common.swift */; }; - 3209A0CD58B3D11F8BC8D971 /* SBUTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB6B3ADC98B9C071ABAB009D /* SBUTextView.swift */; }; - 32235F35EB71146C090C8C22 /* SBUQuotedBaseMessageViewParams.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = F23AAA8E953539D1693FE962 /* SBUQuotedBaseMessageViewParams.Deprecated.swift */; }; - 336D364A7E530FFEA4A93B50 /* SBUDashboardConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33DEB4A5F180E4FCF222F510 /* SBUDashboardConfig.swift */; }; - 338811107C04EBB0352A6464 /* SBUOpenChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54A9A8933A162614D63D0DC6 /* SBUOpenChannelModule.Deprecated.swift */; }; + 31ACAE422280F954E664A104 /* SBUGroupChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3444A0B80EACB198221A55A7 /* SBUGroupChannelModule.Header.swift */; }; + 32C26EEEA10F74DF0F68796C /* SBUHorizontalSuggestedReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA76BB388D71729F63EB35D3 /* SBUHorizontalSuggestedReplyView.swift */; }; + 32E88D86DE216247512C854E /* SBUCacheManager.PathType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85C0714BFA668EDB85894F9D /* SBUCacheManager.PathType.swift */; }; + 33BE2DA014908FCF65BEAB98 /* SBUCreateChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1579C847E96A96951C1DD122 /* SBUCreateChannelViewModel.swift */; }; 33C9D1883866C8184AE70AEF /* CustomChannelListModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4099E93E16C27E5CEB12785B /* CustomChannelListModule.swift */; }; - 3424052206350C6D80B49DEC /* SBUOpenChannelContentBaseMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4BC41F11085BDC53B4A3BA6 /* SBUOpenChannelContentBaseMessageCell.swift */; }; - 349486C54773C95CCBA12576 /* SBUCommonViewControllerSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D0E23C23196DDA9D880BDB6 /* SBUCommonViewControllerSet.swift */; }; - 34BAF956B5C72FBD42A25EC2 /* SBUChatNotificationChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB69A7EAA719CEEC2CDD571A /* SBUChatNotificationChannelModule.List.swift */; }; + 3440652CA97F7E1008A69405 /* SBUGroupChannelViewController.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8906F1A56ED44007FBDF7CFD /* SBUGroupChannelViewController.Unavailable.swift */; }; + 3449DE14B32BA6EE5AC62C1B /* SBUTypingMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFEF2B7C6374DF55580D0732 /* SBUTypingMessageCellParams.swift */; }; + 348E580D52EFF48E01A496EF /* SBUCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D38C2A58A5023E3E86F48A24 /* SBUCollectionViewCell.swift */; }; + 34E3AE02CCD4A31BF79F191F /* SBUOpenChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21D78A65BE3591620DAA47EA /* SBUOpenChannelModule.List.swift */; }; 3546B8997F37360ACD9B296D /* BusinessMessagingSignInViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7F6412A0B94483A3C585B666 /* BusinessMessagingSignInViewController.xib */; }; - 3697838314334A007BF415E0 /* SBUTypingIndicatorMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79DE5898F2F988FDDBBE2FE3 /* SBUTypingIndicatorMessage.swift */; }; - 36E10E11EE332D8B95E4F892 /* SBUUnknownMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0085E75416FEEE609AD7CFD0 /* SBUUnknownMessageCellParams.swift */; }; - 36F30D02E9DEC9AC44F73762 /* SBUOpenChannelMessageWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 417F229A4E0737E350CCCD76 /* SBUOpenChannelMessageWebView.swift */; }; - 36FA0E71A095D97C08BBCA64 /* SBUUnderLineTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964EF76CD4B76CCB680AD5EC /* SBUUnderLineTextField.swift */; }; - 3715C1D13E9F87E3FC72829E /* SBUFeedNotificationChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195D69A9AA7F2ADED2E52755 /* SBUFeedNotificationChannelModule.swift */; }; - 37B29B414376D9B51FD7DCA4 /* SBUMentionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1B8A7DEC66855D188B1B3A /* SBUMentionManager.swift */; }; - 38C73FD0F0856D4AAA83368B /* SBUPaddingLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B32083ACA8AD24B96C195022 /* SBUPaddingLabel.swift */; }; - 398C16F6F35B047BB4A3CBC8 /* SBUNotificationEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF6AE8EC96A46BEC3415399C /* SBUNotificationEmptyView.swift */; }; - 3A0B261457195E3C47772143 /* SBUCreateChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 004B59BEFA679B50DC596FE9 /* SBUCreateChannelModule.swift */; }; - 3AAE7FE059796653DACDF1A5 /* UIScrollView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE8456A5754CEB8284EA838 /* UIScrollView+SBUIKit.swift */; }; - 3AFFE8913450F54115A1536E /* SBUMessageTemplate.ErrorMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 271F375602E0485BD6B133CB /* SBUMessageTemplate.ErrorMessages.swift */; }; - 3B5F893CC427EF30536F85CF /* SBUMessageTemplateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6544A8D91C7E66D9706B0D86 /* SBUMessageTemplateManager.swift */; }; + 35BA4C70FF32428E331807B9 /* SBUMultipleFilesMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FCE4259320B5D0A3DA298DC /* SBUMultipleFilesMessageCellParams.swift */; }; + 3637874CE365EAFA79B0E303 /* SBUAvailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9398026B4E2F0089B2EFF389 /* SBUAvailable.swift */; }; + 3733C78990F397C25B60016B /* SBUBaseChannelViewController.Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3255B2074BCFD6D08DD5BDB /* SBUBaseChannelViewController.Keyboard.swift */; }; + 3743EED80D99CD4ED33625EB /* SBUTypingIndicatorMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5322419D7DC948E4C59CBE3C /* SBUTypingIndicatorMessage.swift */; }; + 37A2620962920E5FDF84EA43 /* SBUConstant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F6224ED2E1D6F26238669BF /* SBUConstant.swift */; }; + 37CCBCCCCD3DE73EDB85171E /* SBUBaseChannelSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D161DCF76A14D06BB55629B4 /* SBUBaseChannelSettingsViewController.swift */; }; + 3808C9B9C4A566C506DFFC61 /* SBUMessageCellConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40A0E8F60DD81F09F14E4741 /* SBUMessageCellConfiguration.swift */; }; + 3962B5DDF35ACFB49CD0E7C5 /* SBUGroupChannelPushSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48FFBB2C5CC0396BB8A42D1C /* SBUGroupChannelPushSettingsViewModel.swift */; }; + 399FAD6EA06B8715156A4649 /* SBUViewLifeCycle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 675C40A04B393401D57CA4CE /* SBUViewLifeCycle.swift */; }; + 39E527C5373CBBD6C25E615A /* SBUQuoteMessageInputViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9428676B5E783417ADBB503 /* SBUQuoteMessageInputViewProtocol.swift */; }; + 3BC771C85B8EBBA4564F414F /* SBUFeedNotificationCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = E51843B00A50F6A7E9C974F8 /* SBUFeedNotificationCellParams.swift */; }; 3C09757B8F0E2A770B427896 /* LiveStreamChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7336ED3EEE080DDF052F158 /* LiveStreamChannelCell.swift */; }; - 3C28D09F5445576352F25FCF /* SBUBaseChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AD3DBE7340A752112C57014 /* SBUBaseChannelModule.Header.swift */; }; - 3C84696762454874158EE72E /* SBUToastView.Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 815D4832D88AB11A6E9CC866 /* SBUToastView.Item.swift */; }; - 3C95A4A1BC39446D1FF0FB8A /* SBUBaseMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1AF51D7CE8D04E799D606E9 /* SBUBaseMessageCell.swift */; }; - 3EA9B59DC3F3BA0D8FFEC608 /* SBUChannelSettingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 748E749BEDE5F43C9746B194 /* SBUChannelSettingItem.swift */; }; - 3F0A63E14C70A57957F87034 /* SendbirdUI.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C09C396BCBF26C81585EF79 /* SendbirdUI.Deprecated.swift */; }; - 3F9CCDC97B2256D24FCE6500 /* SBUActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5564F9C50888E26CD11E0454 /* SBUActionSheet.swift */; }; - 3FB86A394E6E22C557970714 /* SBUUserMentionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37BAAB79E1B626ED52E4839 /* SBUUserMentionConfiguration.swift */; }; - 40316590398FE6CBF860E65B /* SBUOpenChannelBaseMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AAA09139558B87179AA7ED7 /* SBUOpenChannelBaseMessageCell.swift */; }; - 409FF74804C48D8FFCD5858D /* SBUCacheManager.Template.swift in Sources */ = {isa = PBXBuildFile; fileRef = 713D526E6FA405E9A5B0E634 /* SBUCacheManager.Template.swift */; }; - 40B1BBBFBD6B392EDEB6753C /* SBUBaseChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92F377DEB112155C99CC552E /* SBUBaseChannelViewController.swift */; }; + 3C31B95D9B9E5C13D4FEE107 /* SBUOpenChannelImageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFEA35277DDBD7BD1D23617 /* SBUOpenChannelImageContentView.swift */; }; + 3C7C54F91AFFF677F303F70F /* SBUCategoryFilterCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C813B96E07AD8AF029EF524B /* SBUCategoryFilterCell.swift */; }; + 3D3E828BFA8F91A2D4DB4A52 /* SBUMessageTemplate.Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = C78A7319F85E70BFC808F143 /* SBUMessageTemplate.Action.swift */; }; + 3D8BDE3686B173FCD33A217F /* SBUModuleSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E46B7345AA987A0E840CCA3 /* SBUModuleSet.swift */; }; + 3D992E3B2818844BC8D4D36D /* UILabel+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094E070E26A56309ACF7EDB2 /* UILabel+SBUIKit.swift */; }; + 3DFB72F8E258961C1BFD56DE /* SBUCacheManager.Template.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A234C4E9C841FA02395BA20 /* SBUCacheManager.Template.swift */; }; + 3E6D2B22410F33955520A6F8 /* SBUFileMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDDD233D1B439D981ED8E09 /* SBUFileMessageCell.swift */; }; + 3EB7DD92A842320DFDBC3E36 /* SendbirdUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10D3423573BF6095B38CBAB7 /* SendbirdUI.swift */; }; + 3F131B92EDBA9F6053C60922 /* SBUCommonContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A29388DC75BF0C2E8DB98BB /* SBUCommonContentView.swift */; }; + 4018962DDE442059A33C9664 /* SBUGroupChannelSettingsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFE9C0D2F680E8AD1E577DA /* SBUGroupChannelSettingsModule.Header.swift */; }; + 4030ADCE290CC75D5B12F19A /* SBUPaddingLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE660373834E053B02FD109 /* SBUPaddingLabel.swift */; }; + 40DDDE3C4FA105EA3B8EFDFF /* SBUUserListModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15D8B0E56DC7B2989C82ACF1 /* SBUUserListModule.swift */; }; + 40F38C92056CD96F8876CD83 /* SBUMessageThreadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05ADC08876C839B4E4F10C89 /* SBUMessageThreadViewController.swift */; }; + 4145877FF9CC8E8B048C97E0 /* QuotedFileCommonContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A78E70F1638CB818B9F747 /* QuotedFileCommonContentView.swift */; }; + 41545E45A81F3EFE6475CA8B /* SBUMessageStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F963307DB6D64936A82369A /* SBUMessageStateView.swift */; }; + 417D72D33BCEA40CB17D161B /* SBUPhotoAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A4074EAFBED0F6EE67A062F /* SBUPhotoAccess.swift */; }; 419552E6D0EC71D3EEA92E13 /* FeedChannelListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EB6FAC1C2EC8D79D3474335 /* FeedChannelListViewCell.swift */; }; - 4270F6BFFABE3D067F8D6B22 /* SBUOpenChannelSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D3301A6BAEAEA0CB68D850F /* SBUOpenChannelSettingCell.swift */; }; - 428DB3C76DD0B583F6F5CE9A /* SBUGroupChannelSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E90A0C200855E3C6BB11C5B /* SBUGroupChannelSettingsViewModel.swift */; }; - 428E2E6929383107F93DD392 /* SBURegisterOperatorModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 040FE131B697E17C13A1C4B2 /* SBURegisterOperatorModule.Deprecated.swift */; }; - 42FD4DF4EFA8A7704BFE52C3 /* SBUEnums.swift in Sources */ = {isa = PBXBuildFile; fileRef = B78CAA75DD967758186FF283 /* SBUEnums.swift */; }; - 43A77D98E193F222ED6580DC /* SBUBaseChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A665256F14DCE575A7FDCA /* SBUBaseChannelModule.Deprecated.swift */; }; - 43B42E3DF3E6158C7941ED58 /* SBUOpenChannelSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79E77CDB516F249D7A030C67 /* SBUOpenChannelSettingsViewController.swift */; }; - 43C582D5693EAA336D971083 /* SBUQuotedFileMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F7303EC4ED56FB94F77A75 /* SBUQuotedFileMessageView.swift */; }; - 449B90AD7FE3F048D7ABE73D /* SBUTypingIndicatorMessageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1633D800A421312B3980F3A1 /* SBUTypingIndicatorMessageManager.swift */; }; - 44EB8EAEA5F214EE1B7B4798 /* SBUChatNotificationChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890E8C4360AAE2F581975028 /* SBUChatNotificationChannelModule.Deprecated.swift */; }; - 45E725D52DB53654AB78965A /* SBUMessageDateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA9B3CA61FB46D5F57319572 /* SBUMessageDateView.swift */; }; - 469C1E0147E3C59B59648941 /* SBUGroupChannelSettingsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39305DCC7521E039CAA011B0 /* SBUGroupChannelSettingsModule.swift */; }; - 46CEC4A27578C59EBD37B6DF /* SBUChatNotificationChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A6A22BFC57DD8576BA395B /* SBUChatNotificationChannelViewModel.swift */; }; - 4710D6D2A7E21C244553CE89 /* SBUOpenChannelImageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C88AB486291B68F04471DA6 /* SBUOpenChannelImageContentView.swift */; }; - 48856F1E8BE26CE478900CC5 /* SBUCacheManager.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FD0225D9064381240C54F6 /* SBUCacheManager.Config.swift */; }; + 448ECB1134BC6F6562791566 /* SBUToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875ED58CFDDA04F2E44E2C27 /* SBUToastView.swift */; }; + 458E4389570378DC34D02CE9 /* SBUBaseChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1B31519149586518A897715 /* SBUBaseChannelModule.swift */; }; + 463FB2980D19AD005550753D /* SBUMessageTemplate.RendererType.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABFA71E5A451DB78DF62B5F0 /* SBUMessageTemplate.RendererType.swift */; }; + 46AD92C554D7638C2A7D89FB /* SBUMessageFormSingleTextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4ACC7708281A52BB86BBF6 /* SBUMessageFormSingleTextItemView.swift */; }; + 46F4D52A4615112FADE6F5EE /* SBUSuggestedReplyViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1B987C3F4B8C128AC650DF5 /* SBUSuggestedReplyViewParams.swift */; }; + 46FC87BC702806E3CF5D4CA4 /* SBUInviteUserModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 203C076985EA8D760D6221BA /* SBUInviteUserModule.Deprecated.swift */; }; + 47DBB458984D7C2C405EFEB7 /* UICollectionView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A8D44EC4A943B5EDBA0F92E /* UICollectionView+SBUIKit.swift */; }; + 482B6EEB4D421D5DF4AC5395 /* SBUOpenChannelModule.Media.swift in Sources */ = {isa = PBXBuildFile; fileRef = 947C7D3725CAABA7688DC140 /* SBUOpenChannelModule.Media.swift */; }; 48B8EC5BAB2F8F2E2C97A23D /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2B6689974C44EA060F592DE /* NotificationService.swift */; }; - 490B588A0A64CE928DAE6705 /* SBUMessageTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C845B62CD493FD6875E9C3D9 /* SBUMessageTemplate.swift */; }; - 4939795375329232D00555A4 /* SBUMessageWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DE1F144DE16F62BC068620B /* SBUMessageWebView.swift */; }; - 4984013C813737D40F831B51 /* BaseMessage+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = F43A5FC7EB56EB0E85482B5A /* BaseMessage+SBUIKit.swift */; }; - 49A6913A97425F61644FE524 /* SBURegisterOperatorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3758C48483D58ED5C97113F4 /* SBURegisterOperatorViewModel.swift */; }; - 4A0193DB4E3F0B610694D07D /* MessageForm+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE1E93B8FCF62DE1F85F506E /* MessageForm+SBUIKit.swift */; }; - 4AA328F3A7B5C29F79AA8352 /* SBUMessageFormView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE43DB444DF9960D183A301D /* SBUMessageFormView.swift */; }; + 48BF1C5CEB694E94A926C100 /* SBUOpenChannelViewController.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99BE0F27C266AB6A9FC75B09 /* SBUOpenChannelViewController.Unavailable.swift */; }; + 496252DCDB7D17CAF67A8BFF /* SBUToastView.Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450B2CBD60BB544A030CA079 /* SBUToastView.Internal.swift */; }; + 4964A4291144823BAC39732E /* SBUMessageTemplate.TemplateType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5133204741EA232A84D9AC /* SBUMessageTemplate.TemplateType.swift */; }; + 49E07196EB4161BEAB20D62C /* UIViewController+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = E07C67CF5B53FDCBBCE857FC /* UIViewController+SBUIKit.swift */; }; + 49F18ADCF98AD04A65A2D737 /* SBUPhotoCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 352D910607F70A45FDCB16C5 /* SBUPhotoCollectionViewCell.swift */; }; + 4A3E7FBF20A0D46F51C5D410 /* SBUSearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72BAA589EB7899C0543E88A8 /* SBUSearchBar.swift */; }; 4AAF1B44CF90589E66243951 /* ChannelVC_CustomList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D71A9CFA36C34EF4264A465 /* ChannelVC_CustomList.swift */; }; - 4AE62F63E6043A0489DA11CE /* VoiceMessageStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CA0A3C97568158FCA60B1A0 /* VoiceMessageStatus.swift */; }; - 4B1CEEF0A2DAD54D7F5FE022 /* SBUFeedNotificationChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C681ED2007956EEE9D894BA /* SBUFeedNotificationChannelModule.Deprecated.swift */; }; - 4B3E473A457014964F2DC7B3 /* SBUMultipleFilesMessageCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7FC723CA3B3F942FFBF10FD /* SBUMultipleFilesMessageCollectionView.swift */; }; + 4B38B971594C4F817F8851F3 /* SBUCreateOpenChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C535404C3F77E48A02987C /* SBUCreateOpenChannelModule.Header.swift */; }; 4BD508FBC49EA9E0BE3628B1 /* UILabel+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D7ED4A7D6E59E73E28846C0 /* UILabel+Ext.swift */; }; - 4BF112784A79654A6A6D42D8 /* SBUMessageSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B1C521FA40B1BCE57E17268 /* SBUMessageSearchViewModel.swift */; }; - 4C6E5C9621E30E36FCCEC564 /* SBUFeedNotificationChannelViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B6D4605DE3785CF7BC755C /* SBUFeedNotificationChannelViewParams.swift */; }; + 4C3F1D5EACBBD8624A96C17A /* SBUUserListModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE3B8DCB7406F0C1C1C20C8 /* SBUUserListModule.Deprecated.swift */; }; + 4D1D89D6415DF203A5DA5285 /* SBUDashboardConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A56D56DB9C54E9FCE376D245 /* SBUDashboardConfig.swift */; }; 4D6EA72ADA7759C80ADC1478 /* CustomUserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96AF77F22C3689DA980F0EFF /* CustomUserCell.swift */; }; 4D876D744765ED547B7DCE05 /* InviteUserCustomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56585FF472897189202B81E3 /* InviteUserCustomManager.swift */; }; - 4E0BA02B072A2D8DFA4B6F3D /* SBUGroupChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD6EBB6238C0E6B3288EFB7A /* SBUGroupChannelModule.Header.swift */; }; - 4E65E47A38F272B4E83EC3A0 /* SBUTypingIndicatorInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDE4BE315EA68C5AB211C7C0 /* SBUTypingIndicatorInfo.swift */; }; - 4EA4CF786661F9B146F4735A /* SBUOpenChannelModule.Input.swift in Sources */ = {isa = PBXBuildFile; fileRef = D31BB5551F5B0C4B761B4D4A /* SBUOpenChannelModule.Input.swift */; }; - 4F7162A9565FF6D875C757D2 /* SBUNotificationChannelManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0CC82C0AC905923C25117 /* SBUNotificationChannelManager.swift */; }; - 4FA20DDBD46B76441F7E9560 /* SBUVoiceMessageConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8143A7D6E5428869072F8F3 /* SBUVoiceMessageConfiguration.swift */; }; - 4FCCC04FD18C9D5112234ECB /* SBUPhotoAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D313F2DDAFBB50136DD7DAC /* SBUPhotoAccess.swift */; }; - 4FF20B0AD29F08D70697C639 /* SBUError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05617EB655FE8DFC8C4D874E /* SBUError.swift */; }; + 4E7A90FAB67572D67BF18849 /* SBUVoiceFileInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 250DE586B2E8ED7C913DEFC0 /* SBUVoiceFileInfo.swift */; }; + 4F3F0DF5F8EF7BDE5DB18820 /* BaseMessage+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5638EBB5B0EC531033CB218E /* BaseMessage+SBUIKit.swift */; }; + 4F9C1239F64A0D5D7EAAD706 /* SBURegisterOperatorModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62AA388B840F11B3D6DE3BB6 /* SBURegisterOperatorModule.Header.swift */; }; + 4FC8CFF773ED51A9FCF4FE04 /* SBUParentMessageInfoReactionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 779F7EEC56669BD6E766492C /* SBUParentMessageInfoReactionView.swift */; }; 506C2D85BE783568031D0EF2 /* FeedChannelListViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3900205508594F1BE53CC509 /* FeedChannelListViewCell.xib */; }; - 50CF1B96A842FBF8D173E476 /* SBUBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B062DEC7647CC0D2D962C3F /* SBUBaseViewController.swift */; }; 5123C0FD8A89CF53F15B67CD /* AdditionalFeaturesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59E9C3F514B55549435BAE9D /* AdditionalFeaturesManager.swift */; }; - 518AF77DD3CA64A998C8F2DB /* UIViewController+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = E63214C27114B413C99BC200 /* UIViewController+SBUIKit.swift */; }; - 51C545D87BF919577589549F /* SBUViewControllerSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = A321BEB3FBBF14905C29AA97 /* SBUViewControllerSet.swift */; }; - 524B43C45A8D717126479195 /* Sequence+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE65E9F31BA0AC98929110F3 /* Sequence+SBUIKit.swift */; }; + 516B3A4E4261AA6DBA650CE0 /* SBUBaseFileContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0776A5FE380B8F0B9AF78774 /* SBUBaseFileContentView.swift */; }; + 51A64B27520FAA970D1E8A1A /* SBUBaseChannelSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA8BDA2D985782A35F57D0AF /* SBUBaseChannelSettingsViewModel.swift */; }; + 51B1C2A8E62A266551D6773B /* SBUMessageSearchModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1053284DDA7205A0DB124298 /* SBUMessageSearchModule.swift */; }; + 5273FFFEABD9A1ACD3EB65B0 /* SBUImageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DA9C0BFBB42D524F16CA6F4 /* SBUImageContentView.swift */; }; + 52D1774BAF35B5484A797C06 /* SBUVoiceMessageInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27ADA51C845387A916A0DFD0 /* SBUVoiceMessageInputView.swift */; }; 52D4C02380313387757C91D7 /* ConnectBusinessMessagingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81DF637316DF97C04D7CECB /* ConnectBusinessMessagingView.swift */; }; - 5377233C1AFD80188DF7EE9F /* SBUUserProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1705ECF2EFDD64ADA42CF1 /* SBUUserProfileView.swift */; }; + 536DC110E2B80FF67DA01AE9 /* SBUMentionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A6ECC2F132D72ED6195C5FD /* SBUMentionConfiguration.swift */; }; 53778F6EB1FE32ECA01C5E7C /* GeneralSignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B943C8F50DD6CA3985E33CF6 /* GeneralSignInViewController.swift */; }; 538AF7C4BC1CCB21DFE4948B /* LiveStreamChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3094ABD7D9756A038A5AB4 /* LiveStreamChannelListViewController.swift */; }; - 545E4FF841DFBA46D83D4A2A /* SBUMessageSearchModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9829D64688D3B09D3D150D9C /* SBUMessageSearchModule.Header.swift */; }; - 547B35224DB2693DDA35B9FE /* SBUCreateOpenChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39B2512D4E9513712EDC507C /* SBUCreateOpenChannelViewController.swift */; }; - 547EAE5E1663593578E1016B /* SBUMessageReactionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FD7BB24F69EE0C3973B92C3 /* SBUMessageReactionView.swift */; }; - 5493995F2E803CD472563AB4 /* SBUBaseChannelListModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621EF9178BA129EC840A562D /* SBUBaseChannelListModule.Header.swift */; }; - 54984DC9B66CDD287A53F2E8 /* SBUAlertView.Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1545896B4D9FAFE6DD9D2399 /* SBUAlertView.Item.swift */; }; - 54D853D05FDB21B4FA4BA92E /* SBUCacheManager.NotificationSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16919409D2126B2391F13EC /* SBUCacheManager.NotificationSetting.swift */; }; - 556B5CF7709D79A35A37A024 /* SBUBaseCarouselView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 060F8041E96B5586F59E01D0 /* SBUBaseCarouselView.swift */; }; - 55FCA07674E3268DC33C8E10 /* SBUGroupChannelListModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69F42BD6AE2609C5128AEE18 /* SBUGroupChannelListModule.Header.swift */; }; - 56401A5E819973A3FBEB9493 /* SBUOpenChannelListModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5B5ABC746F6AAC7FC3BB90 /* SBUOpenChannelListModule.List.swift */; }; - 564D74651DA65E0E9D6266B7 /* SBUViewModelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20233A168B917F3A17855F2C /* SBUViewModelDelegate.swift */; }; - 56876CE6DF626C47658DF458 /* SBUHorizontalSuggestedReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F2076E63837BFBB449A82C /* SBUHorizontalSuggestedReplyView.swift */; }; 570FF873D0A7052239BF3E5A /* CustomChannelListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2BB9D321E4FDE1E679A0373 /* CustomChannelListCell.swift */; }; - 57784394BD3DEB685E11B138 /* SBUQuoteMessageInputViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74ED44885947815D317C147 /* SBUQuoteMessageInputViewProtocol.swift */; }; - 57CE66E2DE84745CED43C8DC /* SBUGlobalCustomParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F1BF3E729261E2B6B93B279 /* SBUGlobalCustomParams.swift */; }; + 571000A42FC7A651DB70D6B5 /* SBUSelectableStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E56AB990ACF1FFA47AE0A60 /* SBUSelectableStackView.swift */; }; + 57280DEA75397DC3F56B81C4 /* SBUBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 511330D36A5E47DAEAA11080 /* SBUBarButtonItem.swift */; }; + 57B1E3078E67A81C4B304B83 /* SBUMenuSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F45838C7174CC45916A778F /* SBUMenuSheetViewController.swift */; }; 57E98E83B28121FB413D2F15 /* GroupChannelViewModel_AdditionalFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBB823C463947E90BA7D1148 /* GroupChannelViewModel_AdditionalFeatures.swift */; }; 58006CE7B8A9632219EA02D8 /* MyOpenChannelSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E27F72A0D096280795BF7D61 /* MyOpenChannelSettingsViewController.swift */; }; - 5813EAC89773E7C2F17D73C8 /* SBUMessageTemplateCell.MessageTemplateLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED6FDF8D412E93F70FD9C9C /* SBUMessageTemplateCell.MessageTemplateLayer.swift */; }; + 58123B32AA965AC87D9275C0 /* SBUNewNotificationInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B39CC4AF578941788CD3E1 /* SBUNewNotificationInfo.swift */; }; + 58BE21D169A8397FAFACA357 /* SBUCoverImageView.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57205339932D82EE186C0AF0 /* SBUCoverImageView.Deprecated.swift */; }; 58C2E06A73C39A7CFD96AEC5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 49BBC7DDD507E9E01F953ABC /* Assets.xcassets */; }; - 592B48AEE32EA2C385764767 /* SBUFormFieldView.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79AED1DD2EC37D026D96331 /* SBUFormFieldView.Deprecated.swift */; }; + 593E8360EAD80FB70BBD9FCB /* SBUGroupChannelSettingsModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F07A30DB1A96BBFE300649 /* SBUGroupChannelSettingsModule.Deprecated.swift */; }; + 597F0B054BFDDA8EB52D78A3 /* SBUCreateOpenChannelModule.ProfileInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98D0571FF12C2682337FF1D /* SBUCreateOpenChannelModule.ProfileInput.swift */; }; + 59CEFAF672CB6FD3F00ABD8A /* SBUMessageSearchModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = A744CC744FFB1405AF8AA00A /* SBUMessageSearchModule.List.swift */; }; + 59FDBF023D7A3116159B2E01 /* SBUNotificationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF6D1095CA8005959E7B71 /* SBUNotificationCell.swift */; }; + 5A78736A5207D04039DF5F27 /* SBUOpenChannelContentBaseMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D675CC2000A8677CD0C1991E /* SBUOpenChannelContentBaseMessageCell.swift */; }; + 5A85A2B12702A94FF03DB52A /* SBUOpenChannelSettingsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = B448B1F464716E77062E6426 /* SBUOpenChannelSettingsModule.List.swift */; }; + 5A9A7E497598E1EC1F8C9BF8 /* NSObject+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3D4BE2AEC2D977E48B78628 /* NSObject+SBUIKit.swift */; }; 5AA3DC845C501D4C88640071 /* CustomAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96B138E411365EF1895EFC0A /* CustomAlertController.swift */; }; - 5AB8467A215C3FBFA9A14E15 /* SBUGroupChannelListModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD0E6B88CC7F9E80C8F6B305 /* SBUGroupChannelListModule.List.swift */; }; + 5AEFCFA128CF318577E61BE2 /* SBUGroupChannelListModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8574ED84A64B555EBC412662 /* SBUGroupChannelListModule.swift */; }; + 5B6FE36C1B38B491B0746FEF /* SBUModerationsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6518B49C84627DAC33B5CFEB /* SBUModerationsViewModel.swift */; }; 5B807D3794B90D50D08E662B /* UIImageView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBA3029EE0577CF7753B87E4 /* UIImageView+Ext.swift */; }; - 5BAD1DB6D2ED01E617CB30E0 /* SBUGroupChannelPushSettingsModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757A554AF91A46AF49BDB886 /* SBUGroupChannelPushSettingsModule.Deprecated.swift */; }; 5C0DC19BAC05C2F286A3B078 /* CustomBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D41DC19666A44BCF0D3C6F9E /* CustomBaseViewController.swift */; }; - 5C56F090EA045C55A83513E2 /* SBUTheme.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A618D2C77EE9DE59F28522B /* SBUTheme.Deprecated.swift */; }; - 5D005BF3397F68DBF1B31A8D /* UIView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0274A314CF90AC819BB67606 /* UIView+SBUIKit.swift */; }; - 5D949A0186099BEE1929DBF8 /* SBUExtendedMessagePayloadForUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A73E337872DEE7F4B811560 /* SBUExtendedMessagePayloadForUI.swift */; }; - 5DC4F3DB1C38AC2B0E26CF0B /* SBUMediaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD1958ABF18FC7814345A68C /* SBUMediaView.swift */; }; - 5E64AB318FF38A6365289165 /* SBUMessageTemplateCellLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3690DECFBFEF36D5E20F7DC /* SBUMessageTemplateCellLayout.swift */; }; - 5E94D74A3C8B11428ED93D42 /* SBUDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D6175D0E27503A2FAED1ACF /* SBUDownloadManager.swift */; }; - 5EB4D287728DD9C36B43365A /* SBUMessageFormFallbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984899098C13FC5DC9C03E99 /* SBUMessageFormFallbackView.swift */; }; - 5EE2E5216552403C43119491 /* SBUBaseChannelSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3932D029F3549E9C2C2EEE8E /* SBUBaseChannelSettingCell.swift */; }; + 5C2AD3FBB2EE86ABDEBB9F6D /* SBUStringSet.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 316B2AADB4CF1C35B0526FB1 /* SBUStringSet.Deprecated.swift */; }; + 5C5D3A4797123C6C3A93CA82 /* SBUOpenChannelListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA28E3A6A2866B7F3BE604B /* SBUOpenChannelListViewModel.swift */; }; + 5CE82E77435CCB1D36E040A0 /* SBUUserMessageTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C63F463A8F116869B93914B /* SBUUserMessageTextView.swift */; }; + 5D22446F333D3FC188B11466 /* SBUTypingIndicatorInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC3D4969A0B940A716B6606A /* SBUTypingIndicatorInfo.swift */; }; + 5EB07F9E232DDFB8EA69401C /* SBUMessageTemplateCell.MessageTemplateLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 924DC6DE64F7D68922F0BD4A /* SBUMessageTemplateCell.MessageTemplateLayer.swift */; }; 5F40B6683AE1DC1B62CDAAE5 /* AIChatBotViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D387FF3E314AF4F7AFA265F3 /* AIChatBotViewController.xib */; }; - 5FD2C344485C6EACC1AC2997 /* NSObject+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C33A3E985A6F3433E2CD80 /* NSObject+SBUIKit.swift */; }; - 606C6CC05EC78D73F691B04F /* SBUMessageSearchModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBA7B36A02323800A3015055 /* SBUMessageSearchModule.Deprecated.swift */; }; - 612125EB13A29B5CD166D2C8 /* SBUGroupChannelListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FFC715F2C57B702F024E1F2 /* SBUGroupChannelListViewModel.swift */; }; - 616C89E4A323AFEAB1901F58 /* SBUUserMessageTextViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18199E460A717BAF37F51353 /* SBUUserMessageTextViewModel.swift */; }; - 61997FDF4B378F942A4633BE /* BaseMessage+SBUIKit.MessageTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31AD44B06FF0438622D51196 /* BaseMessage+SBUIKit.MessageTemplate.swift */; }; + 5F541E48C523FB25041C5ED2 /* SBUView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03942D4AC85136F312BA954 /* SBUView.swift */; }; + 5F5CAE4EF1FFE44A0DAC9FED /* SBUView.Unavaliable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E265D52B22E59716DA12D153 /* SBUView.Unavaliable.swift */; }; + 5F96A4C3FD4C81717FA0007A /* SBUEnums.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15AF7EF71D958D849882CF0A /* SBUEnums.swift */; }; + 5FA6076F09CD02DF60A157B3 /* SBUTypingIndicatorBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED3A22444BA1F9C60D05FDA /* SBUTypingIndicatorBubbleView.swift */; }; + 603CD221648A07110F8697BE /* BaseMesssage+SBUIKit.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED6D07FA5FF12BE89365401 /* BaseMesssage+SBUIKit.Deprecated.swift */; }; + 60C6DB82824EFAF8CCBB1596 /* SBUScrollBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FAF480DC85E05894E9B9A97 /* SBUScrollBottomView.swift */; }; 622F668D006F8DF72A17C68C /* CustomWebView_ChatBotWidgetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F3F02F0620C9666AB8EFA7D /* CustomWebView_ChatBotWidgetController.swift */; }; - 6230B926AD64917D8A9D6EDB /* SBUMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2623C0CBE46E87C8667F172 /* SBUMenuView.swift */; }; - 6245254964AF2882DDA36305 /* SBUChannelTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9FBA83D0706529AD357223 /* SBUChannelTitleView.swift */; }; - 6304F74A0B5F769CD18F7B1D /* SBUOpenChannelSettingsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ACBB25153EFF189E0608A11 /* SBUOpenChannelSettingsModule.swift */; }; - 63421D1E54B106C4BA7B8B39 /* SBUChatNotificationChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515C6843C390B95516B79D78 /* SBUChatNotificationChannelViewController.swift */; }; - 6346114C9D88339B6380DF93 /* SBUCommonContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C20A075EE6772B0E0C79F30 /* SBUCommonContentView.swift */; }; - 640582D63F08F5FCACF2846E /* MessageTemplateTestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 003BB38A1D8B821A076D86F7 /* MessageTemplateTestViewController.swift */; }; - 642D77F753082F10EE6D33C6 /* SBUCreateChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876E7F8C4C488F8438196674 /* SBUCreateChannelModule.List.swift */; }; - 646B09634C7C2143DCE2611D /* SBUMessageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0E5E6F1298AF3CA7A26F6FC /* SBUMessageCache.swift */; }; - 650BFC0BC8D99E60952C8C84 /* SBUGroupChannelPushSettingsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = E63C644AE0DACDB608F39C48 /* SBUGroupChannelPushSettingsModule.Header.swift */; }; - 66480FDAEA8109835A308D99 /* UINavigationController+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81C11108DC261338213DD256 /* UINavigationController+SBUIKit.swift */; }; + 62E1CFD4D9105D2DDBBA5FEC /* SBUMessageFormChipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55C4BAFAC38A50BF76B1E271 /* SBUMessageFormChipView.swift */; }; + 63086D558BBC1859B0458C2C /* UINavigationController+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043F0FE4FD1A702067F84F61 /* UINavigationController+SBUIKit.swift */; }; + 64E03FD9947068B6ED1F6499 /* SBUBaseSelectUserViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4185895F77850C4C00604065 /* SBUBaseSelectUserViewModel.swift */; }; + 652664074D284B39945DF623 /* SBUMessageTemplate.TemplateCacheState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56E0C1C535623CC2D43B3627 /* SBUMessageTemplate.TemplateCacheState.swift */; }; + 6526738B1D12C3D386FC0512 /* SBUFileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC9B433DC2BC0714581C7B95 /* SBUFileViewController.swift */; }; + 654A8EC021187583237B5616 /* SBUMessageCellProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 862EF4C61A83BEEE967F9628 /* SBUMessageCellProtocol.swift */; }; + 65B953366BBF1AD26E136FC6 /* SBUQuoteMessageInputViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5207F3F120CE694715C475D6 /* SBUQuoteMessageInputViewParams.swift */; }; + 661A681EBF370024D1505F09 /* SBUQuotedBaseMessageViewParams.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA1939BC6F004959CE98D410 /* SBUQuotedBaseMessageViewParams.Deprecated.swift */; }; 66A93DE4905CD2DC8D2701D0 /* ChannelListVC_CustomList.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB3DB814003F6E3D146BDC70 /* ChannelListVC_CustomList.swift */; }; 66ADA39339C0B53AA3B3FE8A /* BasicUsagesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D22C301C4940E6DCA7C64C8D /* BasicUsagesView.xib */; }; + 66BEDA9F35A4970402618607 /* SBUGroupChannelPushSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 870A7BFC025E57EC8BA10FA5 /* SBUGroupChannelPushSettingsViewController.swift */; }; 66C385F18479DB17BDDE1E67 /* ChannelVC_AdditionalFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = A43EA4B59C42F807C76F7B74 /* ChannelVC_AdditionalFeatures.swift */; }; - 67ED820C30991972E2AD65C5 /* SBUMessageSearchModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93F0796E438A3E19F039537B /* SBUMessageSearchModule.swift */; }; - 6835F2DDE4BF7931DDDF3CC5 /* SBUAdminMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2F2EF8119C41C81BB2C99C9 /* SBUAdminMessageCellParams.swift */; }; - 683B11C49FF73ED504E3EBC8 /* SBUOpenChannelListModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31EF2A01C5FBAE453CB2B6F6 /* SBUOpenChannelListModule.Header.swift */; }; - 68C75D9663E71B2812232FC3 /* SBUMessageTemplate.Renderer.Views.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17275291DAC0564917272496 /* SBUMessageTemplate.Renderer.Views.swift */; }; - 68DBDC2463E500762B12A5B7 /* SBUBaseChannelListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3BDD1F1E1C54E7BBF7EF34B /* SBUBaseChannelListViewModel.swift */; }; - 69246EF1C49EC6C7DC8305FA /* SBUEnums.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3FFD5E66EA2EC7853D25F7A /* SBUEnums.Deprecated.swift */; }; - 6967E509EC13BDDAFD043AEE /* SBUSelectableStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FF2724740780F1EE9EDE298 /* SBUSelectableStackView.swift */; }; - 6987CD81318F0DD37A8668AB /* SBUGlobals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 052DFE5F922B005DBD1C7CC3 /* SBUGlobals.swift */; }; - 698E795ABA4D91E02B3CCD5C /* SBUHorizontalSuggestedReplyOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B22F7428FDC86B6CE10840E /* SBUHorizontalSuggestedReplyOptionView.swift */; }; - 6A1FB5AF60E8050AB3E2F9BF /* SBUAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7861BB13B20D6858309BF60A /* SBUAnimation.swift */; }; - 6A468C98C796A2C8BFCBBC75 /* SBUDateFormatSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E2FEFC59E1B00C8E8BBBC7A /* SBUDateFormatSet.swift */; }; - 6A7A6F182316B4045AE16287 /* Data+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF6345F69FDF5A157D241BC9 /* Data+SBUIKit.swift */; }; - 6A7C1E8C73286917594CC011 /* SBUGroupChannelPushSettingsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E86C809A6133718AE7762D7 /* SBUGroupChannelPushSettingsModule.List.swift */; }; - 6AB858C55B49E9CBABADF394 /* SBUNewNotificationInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A2652A8AAC5E0A13CD59F6 /* SBUNewNotificationInfo.swift */; }; - 6AD6F7ED657FE98F8E1995AD /* SBUBaseChannelListModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8E80FD38269894222F55CD7 /* SBUBaseChannelListModule.List.swift */; }; - 6B457C31619CA7BED4102170 /* SBUBaseSelectUserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D6C7D252AAE674B0E29A7CA /* SBUBaseSelectUserViewController.swift */; }; - 6C010894D10F8F290A0096C3 /* SBUBaseChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFB7154FE781C99D4007E411 /* SBUBaseChannelModule.List.swift */; }; - 6C589E441C251424FF58A194 /* SBUMessageTemplate.Syntax.Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929C9FCFB2007BB7E70959DD /* SBUMessageTemplate.Syntax.Item.swift */; }; - 6D0A3EF358FF62CC8C906990 /* SBUMessageWebViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7423908DEA4CAD97D811D06F /* SBUMessageWebViewModel.swift */; }; - 6D814DA42C4D01F2AAC3B26E /* SBUFileMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = E751C7C8B6E94111A95CD998 /* SBUFileMessageCellParams.swift */; }; - 6D872B8D0ED6065BD6EA7958 /* SBUMessageTemplate.Payload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68A392D80685B111FD18F3C8 /* SBUMessageTemplate.Payload.swift */; }; + 675D7495D2FBB4E62D0A704C /* SBUChatNotificationChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292090C9C63F0856F1012F02 /* SBUChatNotificationChannelModule.Deprecated.swift */; }; + 67B29EAF1CC40778417AE92D /* SBUPendingMessageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F9BCFDC9EF5BD23AA4B2584 /* SBUPendingMessageManager.swift */; }; + 680D01799B9BA8C7E6FEAE28 /* SBUChannelPushSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56BEE659A0A918AA173C99B4 /* SBUChannelPushSettingCell.swift */; }; + 68215E6ED1E788F18930E312 /* SBULogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44FC391CDE2C92F3F9F798C7 /* SBULogger.swift */; }; + 694E6FE94DD9648C084645D7 /* SBUOpenChannelUserMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662718DF0E9EF2709818FB6C /* SBUOpenChannelUserMessageCell.swift */; }; + 697009EF8A31C2535FB9F6DC /* SBUMessageFormChipsItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A84C2F13525D60CF3896D4AD /* SBUMessageFormChipsItemView.swift */; }; + 69E6CE9F99F6A981FC36653A /* SBURegisterOperatorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 055942829ACDEA773BDB2D41 /* SBURegisterOperatorViewController.swift */; }; + 6A051B34F7FD8871428B5755 /* SBUFeedNotificationChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8329F074DD38B41DFA67FC16 /* SBUFeedNotificationChannelModule.swift */; }; + 6A41E7397C84FADD39C0E09E /* SBUTheme.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3B2D6BB71315AE3EFA4F82 /* SBUTheme.Deprecated.swift */; }; + 6A9347E2A4721316C8F1448E /* SBUActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D7A37D081E801C937A0251 /* SBUActionSheet.swift */; }; + 6A98708A6A0478CD02A29277 /* SBUUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6AA96123433E0E7D8AEAA80 /* SBUUtils.swift */; }; + 6B33CE6BDBF2A760B7E58B99 /* SBUMessageThreadModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2E6F24CC3DECE07E0C46F0A /* SBUMessageThreadModule.List.swift */; }; + 6B8F3F1179B70AFFE6C9727E /* SBUCommonModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23B22ADEC5DEA48C89785025 /* SBUCommonModule.swift */; }; + 6BA1BFFB8DCB4BCC8F56C6DB /* SBUTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 905EA788F69B2FB8D289270B /* SBUTheme.swift */; }; + 6C4070AE31BBC4EDF4E9B146 /* SBUBaseChannelListModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B5A0380301B657A2D7D80F /* SBUBaseChannelListModule.swift */; }; + 6D0E4FD63C061A96D2E22578 /* SBUOpenChannelMessageWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 254D450D9EEED391B877B507 /* SBUOpenChannelMessageWebView.swift */; }; + 6D507239E9EA3D0CC0B9927E /* SBUBottomSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D55146E9657B5320577D2C3 /* SBUBottomSheetController.swift */; }; + 6D655E49569B55DFF293C6D9 /* SBUMention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01C800B2B494C239581740B7 /* SBUMention.swift */; }; + 6D6F954A560F3B15C37EBB12 /* SBUCacheManager.MemoryCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2D36BCF6C98D072930D2FA7 /* SBUCacheManager.MemoryCache.swift */; }; 6DDF71BD4482F73E16BE4248 /* MySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9663C9727C1B5E234A8A18C5 /* MySettingsViewController.swift */; }; - 6E92D40CD5656E20B88F4893 /* SBUMessageTemplate.Renderer+RenderItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = F146389B9310D3B2A12C036F /* SBUMessageTemplate.Renderer+RenderItems.swift */; }; - 6ED4DAF1F227C24C6198D394 /* SBUThreadInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B07532AD08A24CAD78C92A3 /* SBUThreadInfoView.swift */; }; 6FEF3676C6D77FADD7C9A257 /* CreateCommunityChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38115CD65C402F937815BDA2 /* CreateCommunityChannelViewController.swift */; }; - 7004477F3B3FC4F09154ED04 /* QuotedFileCommonContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACA0413BCD82C337FEB653FB /* QuotedFileCommonContentView.swift */; }; - 70F2B8701F2A24E1839E975D /* SBUChatNotificationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D75D43D7C8A4332088263FA6 /* SBUChatNotificationCell.swift */; }; - 711C518B6620C2D299564736 /* SBUMessageTemplate.Syntax.Sizes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 733B3A136EDCAE5F32E98A55 /* SBUMessageTemplate.Syntax.Sizes.swift */; }; - 71B45698FAA92EAE0FE3092F /* SBUConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7683E59F45AB08C01149C787 /* SBUConfig.swift */; }; - 71F16FEF542252BE4830E8C4 /* SBUCoverImageView.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0228B7F8CB3C9255317E99E5 /* SBUCoverImageView.Deprecated.swift */; }; - 724CA1381B3D03E3BDCDD556 /* Float+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E0E9B50C527EAEC31E714DE /* Float+SBUIKit.swift */; }; - 72571077EC7B70D849B6BE22 /* BlockingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 794012A0EC901C1933678F7C /* BlockingOperation.swift */; }; - 72A7D8AD235D2467DC5BB2AC /* SBUUserMessageTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE946BA3CE6D36E1809DE776 /* SBUUserMessageTextView.swift */; }; - 7337428C0B44C436FDADAA2A /* SBUQuotedMessageViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2686E8D69FDB24F9DCCCB4C /* SBUQuotedMessageViewProtocol.swift */; }; - 7381B6798BBBF3B8CFD8C999 /* SBUMessageTemplate.Renderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBDDDF4C45F5BFA4AA239DFE /* SBUMessageTemplate.Renderer.swift */; }; - 744767316F343B24558A553D /* SBUPropertyWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3F17D54D127F0810720DDA /* SBUPropertyWrapper.swift */; }; - 75294A616CE898609F25538E /* SBUCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 773CBC0C8D8547AA443453C9 /* SBUCollectionViewCell.swift */; }; - 7538F0E65C79C7FAB52F6B99 /* SBUGroupChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F47F9078584B2213E6A852 /* SBUGroupChannelModule.List.swift */; }; - 766AAD8609B8CC8CBBB9E716 /* SBUCacheManager.File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B966EB8AB52BEFCD3C0ECF9 /* SBUCacheManager.File.swift */; }; - 774DEC9605EB17F3B4D2AD8B /* SBUVoicePlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AFF065AB6B0A162B6E0573A /* SBUVoicePlayer.swift */; }; - 7794F8100C24A4CD99C86DC2 /* UITextField+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00B6560E812A93A38C1E7FFB /* UITextField+SBUIKit.swift */; }; + 70FC64A015A51BE7C191E116 /* SBUBaseMessageCellParams.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE80157439A29278502A4508 /* SBUBaseMessageCellParams.Deprecated.swift */; }; + 712E25296130027871C4FF02 /* SBUMessageFormView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3862095750B6D557CBC5C209 /* SBUMessageFormView.swift */; }; + 713B473AB6470D6CB899375D /* SBUMessageThreadModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 386A9AF0AFD4A482BC38A3D1 /* SBUMessageThreadModule.Deprecated.swift */; }; + 713D262622CBDCC1FAC23AE0 /* SBUGroupChannelListModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E37BCE397F72E8FD87AB536 /* SBUGroupChannelListModule.Header.swift */; }; + 71B7B148E380A189DFBF6125 /* SBUCommonViewControllerSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EE5A4AA2EF847A68E27C1E9 /* SBUCommonViewControllerSet.swift */; }; + 7287ACC6B7D3D9044ACD8AFD /* SBUChannelSettingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF729A9FEEDC7C1C5748A8D /* SBUChannelSettingItem.swift */; }; + 735912F7C751A84CECD9F9A1 /* SBUFeedNotificationChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 139EAB8860A7F325F77B9C3F /* SBUFeedNotificationChannelModule.List.swift */; }; + 7368F31715B1F3334460F645 /* SBUCacheManager.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9645E038A02078E94025F0D /* SBUCacheManager.Config.swift */; }; + 74F09F7A0ECA41BBC7846124 /* SBUGroupChannelPushSettingsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59A9F2CE3947A76617E76D8 /* SBUGroupChannelPushSettingsModule.Header.swift */; }; + 758ED21D50FAE7E4500E7EAF /* SBUBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A7E4BC2B941C753B4D1A8A8 /* SBUBaseViewController.swift */; }; + 76C537921EA2887BCE5706F2 /* SBUFeedNotificationChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22C2F79731D0834AA4AF2E1D /* SBUFeedNotificationChannelModule.Deprecated.swift */; }; + 76ECD646877B1B4B0D93B304 /* SBUOpenChannelListModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97154C63DB7911FEA3C7D5BB /* SBUOpenChannelListModule.Header.swift */; }; 77C597431727A055167F594E /* BaseCustomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8770EE3BC2BF785C82D31C /* BaseCustomManager.swift */; }; - 786BA721134163C82FC5DB5D /* SBUMessageTemplate.Syntax.Identifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A912AB54CD1B06747EC40E1 /* SBUMessageTemplate.Syntax.Identifier.swift */; }; - 79238A4F35078D28DE0A93B7 /* SBUGroupChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDBE78CDC2C84B8A02219C0A /* SBUGroupChannelListViewController.swift */; }; - 797686BA984FDCC60B457B76 /* SBUImageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1B3BEE36D30232B2CF92AD /* SBUImageContentView.swift */; }; - 799769873147B19E77527E05 /* SBUMessageTemplate.PayloadType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01B32F68AD76DC2D2D5C2378 /* SBUMessageTemplate.PayloadType.swift */; }; - 7A89A9C582CF46E2242E4539 /* SBUToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171790422D68B86FE1122193 /* SBUToastView.swift */; }; - 7BB72348E9C79A1407521504 /* SBUNotificationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6FC93D7B877D701B03AF862 /* SBUNotificationCell.swift */; }; - 7BE7D16AA268041DA4311D83 /* SBUGroupChannelModule.Input.swift in Sources */ = {isa = PBXBuildFile; fileRef = 428B326E33CBBA89207D59DA /* SBUGroupChannelModule.Input.swift */; }; + 77FB641ADCCA6ADFFD2FAD62 /* SBUHighlightMessageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 445E5B82F8E01824006A0945 /* SBUHighlightMessageInfo.swift */; }; + 786C85EEE390036AB41661B2 /* SBUUnknownMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CFBE0AFC194BC1EB64FA401 /* SBUUnknownMessageCell.swift */; }; + 7982A5FD51725C1FE6AFD95F /* SBUGroupChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAFDCE58C837943EDDD9BC0A /* SBUGroupChannelListViewController.swift */; }; + 79F4C1E956F08CF44FC61BDB /* SBUGroupChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0105109D19EF199B812A642 /* SBUGroupChannelModule.List.swift */; }; + 7A95C737A13D4D9BA5D527A5 /* SBUDebouncer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4880F4499928C03FE04EFD18 /* SBUDebouncer.swift */; }; + 7B45A66312DCA6F23283B66B /* SBUBaseChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 479DAD6BC69CDC717FDE6A1A /* SBUBaseChannelModule.Header.swift */; }; + 7C18A5504A27DE958069B59A /* SBUFeedNotificationChannelViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731BBF448AC6D1BF0DC87F3A /* SBUFeedNotificationChannelViewParams.swift */; }; 7C71E7DA9216F9F86D741BB4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AA91801860324BF877C2336 /* AppDelegate.swift */; }; - 7C747E0B460BB7A426757559 /* SBUMessageSearchViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDEBD429C35EA9038A2DC6C5 /* SBUMessageSearchViewController.Deprecated.swift */; }; 7C7E0462A6E79795564A5B29 /* FeedChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 254D891AE9CDFE3A829B3DC7 /* FeedChannelListViewController.swift */; }; + 7D33149CAEA5993FF6DBADBB /* SBUReactionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0F2D09151D1CCABD46BF3A6 /* SBUReactionsViewController.swift */; }; + 7D41D501CA86AD9373DC6750 /* UITableView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFE0937BADAE1A6B4BF3DB0 /* UITableView+SBUIKit.swift */; }; + 7DD00D3279E4E952537B9CFB /* SBUBaseSelectUserModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FF68CC8A2AE5A73C0998A61 /* SBUBaseSelectUserModule.Header.swift */; }; 7E24A56F2CD8C58FD4259FE7 /* GlobalSetCustomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52175BB76AF7926133CF704 /* GlobalSetCustomManager.swift */; }; - 7EEBA539C1AFF2E7AC2D4BEE /* SBUBaseChannelViewController.Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = C11814B0E6E55BA5279B168D /* SBUBaseChannelViewController.Keyboard.swift */; }; - 7F23CCD58F661E86EC6245A2 /* SBUMessageTemplate.Syntax.Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AFA7E902B856644158A8A60 /* SBUMessageTemplate.Syntax.Types.swift */; }; - 7F72A5801440B97D94C31741 /* SBUNewMessageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E4CB7E50D35A8458B5AC457 /* SBUNewMessageInfo.swift */; }; - 7FD8752CDD05A4CF72200FB1 /* SBUDebouncer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62793278995373070FC56D80 /* SBUDebouncer.swift */; }; - 7FF62F99C3FE34E51DA6E376 /* SBUBaseSelectUserModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F69F5FE63EA170346C2652 /* SBUBaseSelectUserModule.Header.swift */; }; + 7E88965168041C61F35A9EC4 /* SBUCreateOpenChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 231E4F4EEB05790DF24DDFA6 /* SBUCreateOpenChannelViewController.swift */; }; + 7F3BE925A4BDAF463D61FD08 /* SBUCreateOpenChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06072EEA79444B09D16E7020 /* SBUCreateOpenChannelViewModel.swift */; }; 800F7734676CE52E234F5FF6 /* LiveStreamChannelListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897288F81F1F785225072583 /* LiveStreamChannelListViewModel.swift */; }; - 806E11DA5C05EE35A441CCD1 /* SBUCategoryFilterCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88B9B3E2144119A6083D7E6A /* SBUCategoryFilterCell.swift */; }; - 80AF4BF0E3336AAA33FB3DED /* SBUOpenChannelSettingsModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9F293CB1BA36B9D8D335A8 /* SBUOpenChannelSettingsModule.Deprecated.swift */; }; - 80B874AF2960A59349130FC3 /* SBUBaseChannelViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DA4DFE6F962C791023523F6 /* SBUBaseChannelViewController.Deprecated.swift */; }; - 80F25CBE6ABDFD744533BA90 /* URL+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4537DE89EF4104AB5A7C665 /* URL+SBUIKit.swift */; }; - 8147EE76406BB0090A57EC6C /* SBUUserMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B88FE3F8E3336F59441204 /* SBUUserMessageCellParams.swift */; }; - 81712053ED0CB017663A2539 /* SBUBaseSelectUserViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF993CB5C1201F1DD90E95C8 /* SBUBaseSelectUserViewController.Deprecated.swift */; }; - 837B7A74F5B474BE8709E71D /* SBUSimpleSuggestedReplyOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A9B1B098246B901D124B136 /* SBUSimpleSuggestedReplyOptionView.swift */; }; - 83CBFE32260293EBD7D3404D /* SBUExtendedMessagePayloadCustomViewFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958E583E5420CED500AE56CB /* SBUExtendedMessagePayloadCustomViewFactory.swift */; }; - 8438D731A1E5DF5D032ED1E2 /* UITableView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C117838EC1C4DBB199BC3F12 /* UITableView+SBUIKit.swift */; }; - 84E1F272D806AA6DF2BE44F6 /* SBUCreateChannelViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE9AD43339DF3FFAFF9E9621 /* SBUCreateChannelViewController.Deprecated.swift */; }; + 809EE64F19A1F28018204F1A /* SBUMessageThreadModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F2A59CCD24B316A1AA0BB7 /* SBUMessageThreadModule.swift */; }; + 80BE8ADE50ED422A837BC0CD /* SBUUserListModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BC73EA508B5842EE69BF80C /* SBUUserListModule.List.swift */; }; + 82308D857AAD56F320740AFF /* SBUBaseSelectUserViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8247167CB37263AD5C5C4B38 /* SBUBaseSelectUserViewController.Deprecated.swift */; }; + 83BE08DDA363AA2C674BB9C9 /* SBUIconSetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D2D13198CD475B3BFE7CF75 /* SBUIconSetType.swift */; }; + 8466CF8863438B423F9A4C28 /* SBUOpenChannelSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BED4AD675E4F406DB4F49EA /* SBUOpenChannelSettingCell.swift */; }; + 84C1788864332167EC7E1286 /* SBUUserListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3263601D709F1BD13C3EA774 /* SBUUserListViewModel.swift */; }; + 85001497BC896D80FD94EC60 /* SBUBaseMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55AB72C32B0B260DB39E839 /* SBUBaseMessageCellParams.swift */; }; + 850AD5AA2F8DABCF0273DB5C /* SBUMessageFormMultiTextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D2817787289EFF0DAFBC54 /* SBUMessageFormMultiTextItemView.swift */; }; + 8540F9577C272B4166514720 /* SBUMessageThreadModule.Input.swift in Sources */ = {isa = PBXBuildFile; fileRef = 675D505622AB2A639B404288 /* SBUMessageThreadModule.Input.swift */; }; + 8554532040A0184FD8190CE1 /* SBUStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDBEE7CE1D348D227F6510E /* SBUStackView.swift */; }; + 85D0CC01EBBDDB41D997EE0F /* SBUMessageTemplateCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 679EE5A260FFAEE98382A95D /* SBUMessageTemplateCellParams.swift */; }; + 86501695B3551AAA83AF1B39 /* SBUBaseChannelSettingsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77D3B0857BDEFCCD9F0591FD /* SBUBaseChannelSettingsModule.Header.swift */; }; + 86E489F503386792C21DD631 /* SBUMessageProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D1E8970B46D7627FE122009 /* SBUMessageProfileView.swift */; }; 87404C792A8BD0A1441DD8BF /* PaddingLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39CEC371C1FBADB87EA861F0 /* PaddingLabel.swift */; }; - 87AAF68C32F753042B51DD67 /* SBUQuotedBaseMessageViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDF8D72848C64E37CB61015 /* SBUQuotedBaseMessageViewParams.swift */; }; + 8772153D81BE6A27078C34B8 /* UIImageView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 597875139B52BA61E56C4664 /* UIImageView+SBUIKit.swift */; }; + 87BC6197FEAD502D379C1636 /* SBUUserListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CFBBF1707E6C855B0FD690E /* SBUUserListViewController.swift */; }; 87DCE33E11F0C22513EEAD18 /* MetadataViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F911922A1B0E98CBD9500A /* MetadataViewController.swift */; }; - 87E23DC7D78C1B70AEAB0735 /* SBUPhotoCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B643397F995A39D749A46298 /* SBUPhotoCollectionViewCell.swift */; }; - 8A60E595DBD273FAA3DCF48C /* SBUMessageFormSingleTextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8B19DA6FA7D4FD35CD58F44 /* SBUMessageFormSingleTextItemView.swift */; }; - 8A94409504D094AD9F13DB2D /* SBUMessageTemplateCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E1D18D025A5A7F0D7EA79FC /* SBUMessageTemplateCellParams.swift */; }; - 8AA14DC1A4E1F4C308F431F1 /* SBUTableViewCell.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F465DBE537C3922DCF8B5A /* SBUTableViewCell.Unavailable.swift */; }; - 8B33B2334812CD3E4BC58BB0 /* SBUMentionLimitGuideCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 338726E7B1F43DC2AEA22230 /* SBUMentionLimitGuideCell.swift */; }; - 8B80A3AEBA6D7B152CD808E2 /* SBUMessageThreadModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = E67D8C702401812614027E07 /* SBUMessageThreadModule.swift */; }; - 8BA49BF6C27BF4EEF881E180 /* SBUInviteUserViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEF8CB410B525E4FBDE9C59 /* SBUInviteUserViewModel.swift */; }; - 8CC58146E32D38AA662F573F /* SBUSearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 708B69B5FD94D3F36A73D95B /* SBUSearchBar.swift */; }; - 8D6F401F044923A8D07EF7A5 /* SBUTypingIndicatorBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1063EB35331F4506C4F0B8F /* SBUTypingIndicatorBubbleView.swift */; }; - 8E5346F894889DED67223BD9 /* SBUBaseChannelSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B8F94D8EE3FB46EBA10783 /* SBUBaseChannelSettingsViewModel.swift */; }; - 908D6E65C10AAE1EDD05CDD9 /* SBUMessageTemplate.Renderer+Events.swift in Sources */ = {isa = PBXBuildFile; fileRef = 004B588C26D26E9E4F2B863C /* SBUMessageTemplate.Renderer+Events.swift */; }; - 9128D89E4C547238ED2CD414 /* SBUMessageTemplate.Renderer+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8563AAF96E2695F5C8E6149 /* SBUMessageTemplate.Renderer+Utils.swift */; }; - 914B37A8A8BBA4E3DE10759B /* UIApplication+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4BD0DF774EA634A2B89AF8F /* UIApplication+SBUIKit.swift */; }; + 8867926F9E648DA1F7BC85DF /* UIColor+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA96EB90B623A2FBD7CCE9DC /* UIColor+SBUIKit.swift */; }; + 88B92AD20F26792D359CAABD /* SBUFeedbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C813D8CD1E5824BC6079D0 /* SBUFeedbackView.swift */; }; + 88E8D29395D11BD6F94CF913 /* SBUAdminMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B078B3E4C8CB5D02351FDE /* SBUAdminMessageCellParams.swift */; }; + 8911328B8B6085E87A6F1E6C /* SBUMessageFormItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E9CC24044618969EC46F63 /* SBUMessageFormItemView.swift */; }; + 89C9EE9BD67FE0C8B1C871E3 /* SBUMultipleFilesMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969014C3CE65DBB59C133FF1 /* SBUMultipleFilesMessageCollectionViewCell.swift */; }; + 8B484D0C2FF16ACB539EED6C /* SBUCreateChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D15355333E36E3A3332D4DB /* SBUCreateChannelModule.swift */; }; + 8B55522FCE18AA303E58A5A7 /* SBUModerationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1404FA36259746705B6E2A3 /* SBUModerationCell.swift */; }; + 8C14F752576F2236756E98FA /* SBUForm.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 441C5380E715D9DC021F6A2C /* SBUForm.Deprecated.swift */; }; + 8C1B21C33686EDA0A8FD6F50 /* SBUModerationsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 367949391DA1D08EE2DB2DB6 /* SBUModerationsModule.List.swift */; }; + 8C3D0DB2EAC914E47F5DCE72 /* SBUMessageThreadTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1384AB05BC3D019EF0010C0A /* SBUMessageThreadTitleView.swift */; }; + 8C748C492B431BD48ED934B1 /* SBUGroupChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8AF2A3C52D2591C7C41208A /* SBUGroupChannelViewModel.swift */; }; + 8CED52205513894C0BA45BE1 /* SBUMediaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E289D89AD764DC1511EBA5 /* SBUMediaView.swift */; }; + 8D3E0D74B48615D35DF2CCD7 /* SBULayoutableButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC96D93AB851F99AD829A2D9 /* SBULayoutableButton.swift */; }; + 8D42C1882866C48A1CA5606E /* SBUCreateChannelViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0B8614A86D475EFD2FFB4D /* SBUCreateChannelViewController.Deprecated.swift */; }; + 8ECE6CA119A8541B0384DA7A /* SBUConfig.CodingKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74E165FE8B985EC72B3F5760 /* SBUConfig.CodingKeys.swift */; }; + 8EEF72455867BE1311424CE6 /* SBUOpenChannelSettingsModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7037CB3811EC6F2827C135E4 /* SBUOpenChannelSettingsModule.Deprecated.swift */; }; + 8FB18D04F3352A34027E0545 /* SBUBaseChannelListModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FE81425E037F54AB03482EB /* SBUBaseChannelListModule.List.swift */; }; + 9068BE2419767A0511EE5E16 /* SBUMessageTemplate.ErrorMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508F6B2ABF51B19A0FE67651 /* SBUMessageTemplate.ErrorMessages.swift */; }; + 90E18F278AC7C886503BA432 /* SBUChannelStateBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9CFF321A0335FFDF4798BC /* SBUChannelStateBanner.swift */; }; 925717A33FF0F3E458F1996C /* ChannelVC_CustomInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDF0FBB0F38EFF12B4C20E59 /* ChannelVC_CustomInput.swift */; }; 926A8E489652739554C4D14B /* ChannelVC_CustomMessageMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 130D7FD868022B51CE1EC067 /* ChannelVC_CustomMessageMenuItem.swift */; }; - 9298DD060DCA713933ACDBBC /* SBUView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADFE528E3F7FAD8397BB167 /* SBUView.swift */; }; - 930F5032D7A298D7EA8B3019 /* SBUFeedbackViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 351800BCBED343863F88C6F5 /* SBUFeedbackViewParams.swift */; }; - 93C1BFB8E003D8EF2D0601D1 /* SBUVoiceRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BCE2663136F68F00AF004AD /* SBUVoiceRecorder.swift */; }; - 94BEA30D5B285FEFB153A28E /* SBUModerationsModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3FA63D9B60F878938D7C620 /* SBUModerationsModule.Deprecated.swift */; }; - 94EE970075241AB99172A184 /* SBUOpenChannelListModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3718D19B8262FD4FE55D45E3 /* SBUOpenChannelListModule.swift */; }; + 930A83838B5F6A67C18C4FCD /* SBUBaseChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7448C79501C8F7C0E6833411 /* SBUBaseChannelViewController.swift */; }; + 938118BEBDD93F6871F9B0B9 /* SBUGroupChannelPushSettingsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E6A4FDA788BC9DD9B880AFA /* SBUGroupChannelPushSettingsModule.swift */; }; + 93F9895F06202889CD374F70 /* SBUOpenChannelSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341EE2BEF0AB66334E9F72D6 /* SBUOpenChannelSettingsViewModel.swift */; }; 952CABAB72144676A0E7E404 /* MainView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5526A6E24F389AC90F29DF8B /* MainView.xib */; }; - 95582ABC7DC10CBFFD531C8A /* SBUFeedNotificationChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C79C6C925FC164D7A744849 /* SBUFeedNotificationChannelModule.List.swift */; }; 957337090E0D7D9281B8BDE1 /* MainOpenChannelTabbarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3837EC8A55E0857C0891EF2 /* MainOpenChannelTabbarController.swift */; }; - 960A6155D4B8BD018FCF2365 /* SBUBaseSelectUserModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFBA75BFD34AA4CB733AFD67 /* SBUBaseSelectUserModule.List.swift */; }; - 96D53A009C5B6B152447E1D4 /* SBUBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FDA8031558C550C5DC613F4 /* SBUBarButtonItem.swift */; }; + 9637924BF8EF1D5BE8D5B911 /* SBUVoiceMessageConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 795AD469E503419F2F03D44B /* SBUVoiceMessageConfiguration.swift */; }; + 96954C363D7F4D6C7FC0DD46 /* CGSize+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A183ED99993473DC9210E0A5 /* CGSize+SBUIKit.swift */; }; 96EED00877902A648770B59B /* LiveStreamChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81E4ADC71E7932D806E84DA7 /* LiveStreamChannelViewController.swift */; }; - 973DED65E9B29A2C8B4BCB30 /* SBUCreateOpenChannelModule.ProfileInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3F8FA2679A556B5B6170572 /* SBUCreateOpenChannelModule.ProfileInput.swift */; }; - 9830D26433E7F7C3E69BFDB7 /* SBUUserMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66FE3FFCF4A356A0C78D1029 /* SBUUserMessageCell.swift */; }; - 9998BEFC501F4AF7B7B34C1A /* SBUEmojiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAF1B4C2E5F8F0D0D15A31E7 /* SBUEmojiManager.swift */; }; - 99CCE36011AFFD3A03EDA812 /* SBUMessageTemplate.Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DFF0F24B9E826B1F6713EF /* SBUMessageTemplate.Coordinator.swift */; }; + 96F312B6FBC8A151B8CF7C9E /* SBUMessageTemplateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15554F1B6FC6160B44958857 /* SBUMessageTemplateManager.swift */; }; + 97048704F3B016E2B56A55CF /* SBUMultipleFilesMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295EECE198D5BAEB03EF0398 /* SBUMultipleFilesMessageCell.swift */; }; + 971A675037247BC5860FC038 /* SBUMemberListViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28B2FDEA8FD5787F552C6612 /* SBUMemberListViewController.Deprecated.swift */; }; + 973C42DEB471F6E60F11FD7E /* SBUModerationsModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56E0778A68BA0E40CFAD16CD /* SBUModerationsModule.Deprecated.swift */; }; + 9756356766AFBD83ED6CC014 /* SBUAdminMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B333ECB4F15E7DDDB30886AC /* SBUAdminMessageCell.swift */; }; + 98271BADC9083F1128E15C02 /* SBUTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3775EEC122A3F8EB8A002A7E /* SBUTableViewCell.swift */; }; + 9886FB2E31222EE5613C22F0 /* SBUVoiceContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A001243167C67B9CE3B7C2E4 /* SBUVoiceContentView.swift */; }; + 9916176345C1CC0F22B37585 /* SBUGroupChannelListModule.Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0301C9D577F51D4A4331FAE /* SBUGroupChannelListModule.Common.swift */; }; + 996A0F29943487F2915D3605 /* SBUGroupChannelSettingsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 255681C53CE8C6A0AADBEDBF /* SBUGroupChannelSettingsModule.swift */; }; + 99CF91C0DC7366585987382F /* SBUTableViewCell.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EEA1E282900BB4466EEA33 /* SBUTableViewCell.Unavailable.swift */; }; 9A8D758220E732AE969929D5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 21E496B5D944391AA42862B4 /* LaunchScreen.storyboard */; }; - 9AA0C46EFD620ECC88C55D90 /* MessageTemplateParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766315D52EBCAC0E94D256D2 /* MessageTemplateParserTest.swift */; }; - 9B155C92529DE8A70CE8301C /* SBUChannelInfoHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEBB33A58E1762A5864B199E /* SBUChannelInfoHeaderView.swift */; }; - 9B8A84E4DC4EFDA29E20EDC7 /* SBUOpenChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90835C2299445B0E4408124B /* SBUOpenChannelViewModel.swift */; }; 9C1A59941D2B1C7180BE67F1 /* ChannelListVC_Overriding.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955962B69D2F809DEE4655F /* ChannelListVC_Overriding.swift */; }; - 9C3D9BF77424E28173AE5594 /* UIImageView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8480353864F682CD4B6BBF9 /* UIImageView+SBUIKit.swift */; }; - 9CA754E9A53619E4C5BB1C7A /* SBUBaseChannelModule.Input.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66A6C69E56F2F195D47753BA /* SBUBaseChannelModule.Input.swift */; }; + 9CF60EB5E6189924CE953F19 /* SBUGlobalCustomParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81AD21988ED6672CEFD7E07 /* SBUGlobalCustomParams.swift */; }; 9D3DBE68062216DF2B1D2493 /* BasicUsagesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8400C45D0E11FBE37587B089 /* BasicUsagesViewController.xib */; }; - 9E5342A02F016252999E0B7C /* SBUMarginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22EF4EBB5E024E3278931826 /* SBUMarginView.swift */; }; + 9D512AE874DC1703EA332329 /* SBUUserListModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2658CFC7A952537FA514B929 /* SBUUserListModule.Header.swift */; }; + 9DEB4002098CB66C343364C7 /* SBUMessageFormFallbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54B0A14CDD13B14978F30042 /* SBUMessageFormFallbackView.swift */; }; + 9E224603647BAFFDB7BC9877 /* SBUViewModelSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8179684119E32E863E37C29 /* SBUViewModelSet.swift */; }; + 9E5B7F99F4B671A3DC964531 /* SBUExtendedMessagePayloadCustomViewFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17CCF10C147D01EA08E472AA /* SBUExtendedMessagePayloadCustomViewFactory.swift */; }; 9E7F67BE1D168D0FE1D423E6 /* BusinessMessagingSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38BA3AA66634C2E531849F9A /* BusinessMessagingSelectionViewController.swift */; }; 9EAF7E11B3B47D9E2F46EC85 /* ChannelSettingsVC_Overriding.swift in Sources */ = {isa = PBXBuildFile; fileRef = E332E035DA3DA5F7E9D98CBA /* ChannelSettingsVC_Overriding.swift */; }; + 9ED12D4FA4628D61F75227B8 /* SBUConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC476031F13EE7B380C4A52 /* SBUConfig.swift */; }; + 9F462FEFE50A95722645D1F7 /* SBUToastView.Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5769F55C182E1257D255DF6 /* SBUToastView.Item.swift */; }; + 9F467E52157A894975238025 /* SBUChatNotificationChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC16BFD1AC1191A41EA6C132 /* SBUChatNotificationChannelModule.Header.swift */; }; + A004A2F9DFF29C88B084C96C /* SBUBaseChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F83154FFF362124CA0A80AA /* SBUBaseChannelModule.List.swift */; }; A0875C861E06C0E0796252CE /* UIcolor+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = C65E9DA0B945AC6F2978B9E6 /* UIcolor+Ext.swift */; }; - A0B8620473C72A621C336560 /* SBUOpenChannelSettingsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C492FACFF8132FD24B3692 /* SBUOpenChannelSettingsModule.Header.swift */; }; - A1344A549B21BC91E86172D4 /* SBUFeedNotificationChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC925CC682F157053C6991C4 /* SBUFeedNotificationChannelViewModel.swift */; }; - A14C5BF7F778C57FB6BAFB66 /* Date+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52A8DA18B596725EA66D7623 /* Date+SBUIKit.swift */; }; - A17C22336716D9CD5D01F126 /* SBUSuggestedReplyViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = F61FBE9899FDCE7D66E99D9C /* SBUSuggestedReplyViewParams.swift */; }; - A1C706E48C166566EB0DED90 /* SBUFontSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B851C2061AD8CF9384B327AB /* SBUFontSet.swift */; }; - A2A28C9F00E2DEBCBFF0DCBB /* SBUOpenChannelListModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E132C5991C1524B53625974 /* SBUOpenChannelListModule.Deprecated.swift */; }; - A320818E4557003A4C845F6A /* SBUTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED26C2B108FA667F4A2B97F /* SBUTableViewCell.swift */; }; + A0A989D1CE1ED8CE9C21869B /* SBUCacheManager.Image+FileMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D345015DF5D696480ECF7436 /* SBUCacheManager.Image+FileMessage.swift */; }; + A0DA5CE39FB6F2348945B725 /* SBUGroupChannelListModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = A02B34286008BA45A18CB10D /* SBUGroupChannelListModule.List.swift */; }; + A184B5D79AB75A6818763DBF /* SBUBaseSelectUserModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CE34F566F014D5F0326AEE9 /* SBUBaseSelectUserModule.swift */; }; + A1AE6F4848B70DD90AABD6A7 /* SBUCoverImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02F80CCE36A240909668D82 /* SBUCoverImageView.swift */; }; + A2A52E10A576A61CBEC5CFEA /* SBUTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7E42CE447C8C5F2F135BA53 /* SBUTextView.swift */; }; + A2A86B1B95580AD8B36CEC7D /* SBUOpenChannelSettingsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8117FE1B7B4550219C1A8C5A /* SBUOpenChannelSettingsModule.Header.swift */; }; A37522222D21889E328B3130 /* AIChatBotSignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D5AFCA30BC1E493AC342DB7 /* AIChatBotSignInViewController.swift */; }; - A40899BF23F24B02410C548E /* SBUStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA884B9C05518C89428F530D /* SBUStackView.swift */; }; - A5B2158118F346AA2611EDF5 /* SBUMention.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAC9F6BE599CBC05780C6B5E /* SBUMention.swift */; }; - A6AB1D7C2A27EEEFFAE38EED /* SBUReactionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7273381A16F8119BC363616 /* SBUReactionCollectionViewCell.swift */; }; - A6B67132703B583F5FEA876B /* SBUMessageFormViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285D3B5D6B90E85834D424B7 /* SBUMessageFormViewParams.swift */; }; + A3EDA9B7D8DE6096F81BAC85 /* SBUTheme+Type.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D397650F90F2674F715403C /* SBUTheme+Type.swift */; }; + A3EE31A2749547D94EBF8039 /* SBUDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 407B36E295240B492E765329 /* SBUDownloadManager.swift */; }; + A475850FAB3680259B3D17E5 /* SBUChatNotificationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 302ED9F9A0AD14D1C3405AAB /* SBUChatNotificationCell.swift */; }; + A4A32A281F4F723565589BF4 /* SBUChannelTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 509771838EA18AA17B4179FB /* SBUChannelTitleView.swift */; }; + A524D74B58AA3459DD06A946 /* SBURegisterOperatorModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5E8919EDF3DFE91A6EAF7D /* SBURegisterOperatorModule.List.swift */; }; + A5EBC0EFE37423C41BD1B6B0 /* SBUReplyConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD600FF515CB38A6D762194 /* SBUReplyConfiguration.swift */; }; + A61F0D353C156136948FC6E6 /* SBUBaseSelectUserModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0CF33E9AF61E3D65FEE0C31 /* SBUBaseSelectUserModule.List.swift */; }; A6B78F6ADA3514C55C3A04B4 /* CreateChannelCustomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7368083040846A8BFD1A786 /* CreateChannelCustomManager.swift */; }; - A6C21FBA527924B90E4B65A7 /* SBUMessageThreadTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F3BC6F13906B366FA51B6AD /* SBUMessageThreadTitleView.swift */; }; - A72D5B61415C2222C74754DB /* SBUParentMessageInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0036DC96E92E8838D13981BA /* SBUParentMessageInfoView.swift */; }; - A7300555684C3ECC83E551C2 /* SBUHighlightMessageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0697520CC7B478CCF34160 /* SBUHighlightMessageInfo.swift */; }; - A780D7EED85AB9305B63EBDB /* SBUBaseSelectUserViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98CD0CD854A6E398B24F4ABA /* SBUBaseSelectUserViewModel.swift */; }; - A78D4F202B5EE59BDC47B5EE /* SBUGroupChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 820597A15A4A1AF51171E99F /* SBUGroupChannelCell.swift */; }; - A7B76CD20A0BAC495019D727 /* SBUInviteUserModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF0D45750E5BD5CD2BBF62C /* SBUInviteUserModule.Deprecated.swift */; }; + A7749831B60A089336DA0FBD /* WeakDelegateStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2C7149B8560A6F2FA73439 /* WeakDelegateStorage.swift */; }; A819CA3ED9DF12723954D907 /* PaddedLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60919A8A488385F6A325B787 /* PaddedLabel.swift */; }; - A84226985091B2C3313E6C56 /* SBUOpenChannelSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A947D08810EFFB1B6B004BB1 /* SBUOpenChannelSettingsViewModel.swift */; }; - A8984B91D1F6C78D2F7CE3E5 /* SBUOpenChannelUnknownMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE33118AFAADE5A66A92ED8F /* SBUOpenChannelUnknownMessageCell.swift */; }; - A9B684C838F45A0048C1E184 /* SBUFileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AEDFE0D309842977DE7E7C9 /* SBUFileViewController.swift */; }; - AA9C47F4C89934DD140E9F08 /* SBUExtendedMessagePayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05318C3A623C0EDA38676EFE /* SBUExtendedMessagePayload.swift */; }; - AB818DC97E67255B845B0B2E /* SBUGroupChannelPushSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5652136A37B967878B06BAEF /* SBUGroupChannelPushSettingsViewModel.swift */; }; + A9ECEF172915C40CFA42AACA /* SBUMentionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26C689CAA86B9C23FD48BDA7 /* SBUMentionManager.swift */; }; + AB49C925869C575C30422B62 /* SBUChannelSettingsChannelInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7CF787DB2966C05452D6A6 /* SBUChannelSettingsChannelInfoView.swift */; }; AB9441B3BB4B841F9584306C /* ChannelListCustomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 899E2ADDC3C3A19F2D429597 /* ChannelListCustomManager.swift */; }; - AC512D9109047939BF3257A9 /* SBUMessageTemplate.Renderer+RenderStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28A4719021E78C4959DDBBC9 /* SBUMessageTemplate.Renderer+RenderStyles.swift */; }; - AC9C302075D77AC8CB68D2A6 /* SBUBaseChannelSettingsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF3F7F5A6D16081EEAB5519 /* SBUBaseChannelSettingsModule.List.swift */; }; - ADA703D703EFB2984693773D /* SBUBaseChannelListModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63DA6C648BAD818E7843590E /* SBUBaseChannelListModule.swift */; }; + ABA02BE103404FCBB1D86EC4 /* SBUFontSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F2EEC9F62E8C45DB2270994 /* SBUFontSet.swift */; }; + ABC5B8F9CF66EA252A1FB7AE /* BlockingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16B1F3F1E3C65FDDE35B7FB4 /* BlockingOperation.swift */; }; + ABCE73B50B09ECBA3DFC8AD0 /* SBUMessageSearchModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E3230A2EB4D40A6182F2A7C /* SBUMessageSearchModule.Deprecated.swift */; }; + ACA4ABC0B29DF115408395EE /* SBUOpenChannelViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F715B477D4B9CF28A20C45C /* SBUOpenChannelViewController.Deprecated.swift */; }; + ACC82029ED9DB4DCEEC6C21B /* SBUEnums.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = D584CA1792D8FC14CA8004D2 /* SBUEnums.Deprecated.swift */; }; + ACD91F92E74F9008E424EBEE /* Float+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 247E246A7F9CE24C355FC901 /* Float+SBUIKit.swift */; }; + AD0C956D0AB1330206126CCD /* SBUSuggestedMentionList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA1D1E52A87BE51627AEB53 /* SBUSuggestedMentionList.swift */; }; + AD0EA5D7A399047450CE899D /* SBUOpenChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48C102E1288E410BE67F35E5 /* SBUOpenChannelModule.swift */; }; ADC057E42C2ECAFCD505AB0E /* ChannelCustomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD023CFDA0DA56D59A5FA7BB /* ChannelCustomManager.swift */; }; - ADD247C32FD964E642436B36 /* SBUCreateChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44C845D173AE5DDD1F4C86F /* SBUCreateChannelModule.Deprecated.swift */; }; + AEAF0410870936BC5FB7E643 /* SBUNotificationTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B27D8BBB23A60FE74CEE82 /* SBUNotificationTimelineView.swift */; }; + AEB5994E3D5068A8843CD960 /* SBUUserMessageTextViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4F9A671E44FB87B56071B4 /* SBUUserMessageTextViewModel.swift */; }; AF093374CFB9B00CA1A02924 /* LiveStreamData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 582D12D87359656FC98A34F3 /* LiveStreamData.swift */; }; + AF4EB06CA4443670771FEF14 /* SBUParentMessageInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 863FEC0F9119AB3B46EF8EA4 /* SBUParentMessageInfoView.swift */; }; AF529FD7A016441500B37840 /* InviteUserVC_Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0291D6576C77D3732DADEB87 /* InviteUserVC_Cell.swift */; }; - AFC08AC83773A3AB193DDA2D /* SBUOpenChannelModule.Media.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8F09B00B590998A911E922 /* SBUOpenChannelModule.Media.swift */; }; - AFD7E333A8CF10EC8DFB5B07 /* SBUMultipleFilesMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5892E1E3573D45B170CA1657 /* SBUMultipleFilesMessageCellParams.swift */; }; - B01F3FBD9B61C9B53D16243D /* SBUMessageThreadModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 329E5F3C157C0310EFBE73F1 /* SBUMessageThreadModule.List.swift */; }; + B04A782D9294573B983BFCE5 /* SBURegisterOperatorModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06ACE85207F1E07FA12465D3 /* SBURegisterOperatorModule.swift */; }; B0948DD87CE109E2A2776EBC /* MemberListCustomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F781C196C840F15272F5D1C0 /* MemberListCustomManager.swift */; }; - B29D7680EEBB775988AC8571 /* WeakDelegateStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D114425A9DA1EF20A0A56E3 /* WeakDelegateStorage.swift */; }; - B29E5998D30089EEBAB243E6 /* SBUModerationsViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9EA14FFC7C4F584FBF37935 /* SBUModerationsViewController.Deprecated.swift */; }; - B2B65812D3375E3A7185CA98 /* UIColor+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = D915E9E6C658C2A6B320B54C /* UIColor+SBUIKit.swift */; }; - B2D250377BFE621FF7B365AF /* SBURegisterOperatorModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = A05F9C923BF28E9445A1B437 /* SBURegisterOperatorModule.swift */; }; - B3AF9C0DFEF207D7567FC9C2 /* SBUGroupChannelSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91BFD3F9C6F6D851B14E39E9 /* SBUGroupChannelSettingsViewController.swift */; }; - B3EA9B78FD03AB287A18E41A /* SBUBaseChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88F0D1AD67B2A02DFD4A4DCA /* SBUBaseChannelCell.swift */; }; - B4514F530F2C859A3C09CEA7 /* SBUBaseChannelSettingsViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C55837A6B6EB88A6FEE1FD6 /* SBUBaseChannelSettingsViewController.Deprecated.swift */; }; + B0A0DF929974683D5F9905BF /* SBUBaseChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD015BF00D81AEB2A1CA3C94 /* SBUBaseChannelModule.Deprecated.swift */; }; + B12C81FC4CE8BE8921E81F26 /* SBUChatNotificationChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F87D7CC2699AF1D033F9CEDD /* SBUChatNotificationChannelViewController.swift */; }; + B13C3994F02EA88B6ECB1959 /* SBUQuotedBaseMessageViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1045A1E37FDB19F6E2B4B051 /* SBUQuotedBaseMessageViewParams.swift */; }; + B1BA6B69EE87ADDC5FD7EFC0 /* SBUCreateChannelTypeSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCF3CBBEA1829842B656868 /* SBUCreateChannelTypeSelector.swift */; }; + B233D0966D404ACB9803278E /* SBUMultipleFilesMessageCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76A196C6443AE18D9B184506 /* SBUMultipleFilesMessageCollectionView.swift */; }; + B2B5C8033EBF7F55012744F2 /* SBUContentBaseMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB817CC8FF7C226396877617 /* SBUContentBaseMessageCell.swift */; }; + B33FCAC0953894D9F202AFB6 /* SBUVoicePlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA418D56B8B7C4F4E3670E57 /* SBUVoicePlayer.swift */; }; + B3A6835C6A28199C494DF891 /* SBUSelectablePhotoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16F13951208DB1C7B9C198D0 /* SBUSelectablePhotoViewController.swift */; }; + B3D5A5F760D3994F71473545 /* SBUMessageWebViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9A35E681FAA4974C97BB08B /* SBUMessageWebViewModel.swift */; }; + B451E841663564EA229FC10B /* SBUCreateChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC3282910C2FD4EEC1F1B5E /* SBUCreateChannelViewController.swift */; }; + B46714815F6B7EB8A12DB091 /* SBUBaseChannelViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0403C3912C3689CD98DD86C0 /* SBUBaseChannelViewController.Deprecated.swift */; }; + B4713D55209E3EDF6F4DC70F /* SBUModerationsViewModel.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB7D9DAF81AA000BEB6F000 /* SBUModerationsViewModel.Deprecated.swift */; }; + B48C0DAD357045D133FB8C4B /* SBUScrollPostionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF2C540E9A67901DAF734467 /* SBUScrollPostionConfiguration.swift */; }; + B4D085F33C7C84F86E6922C8 /* SBUMessageSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4EAA80940C2F0E0B4F55369 /* SBUMessageSearchViewController.swift */; }; + B4F957476E956B4C43E42A7D /* SBUMessageDateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87C2270A9B32D59276A9A61C /* SBUMessageDateView.swift */; }; B5856123F9358E8F052C9322 /* ChannelSettingsCustomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03CD5B640800DF99AAADDCA /* ChannelSettingsCustomManager.swift */; }; - B64560D394F185036E9DC812 /* SBUNotificationTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D1408922FF39794BCEBBD48 /* SBUNotificationTimelineView.swift */; }; - B6B76EEEBB8D986E65EC9797 /* SBUVoiceFileInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1B3CDBEF376A20747208A9 /* SBUVoiceFileInfo.swift */; }; - B7096284D2BB211EEA838060 /* SBUScrollPostionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2EB356C521D5C78FEA38B03 /* SBUScrollPostionConfiguration.swift */; }; - B73BCC410A4D5E5FA2F57036 /* SBURegisterOperatorModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = DADE9978AD80649A5C0DF233 /* SBURegisterOperatorModule.Header.swift */; }; - B778D47BEEF0AFD6D6633B06 /* SBUGroupChannelPushSettingsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1794FBF051FD2A95FFF1432 /* SBUGroupChannelPushSettingsModule.swift */; }; - B83BE0C70901516CF4F82C30 /* SBUUserListModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC42C303A5CE61E0137026B /* SBUUserListModule.Deprecated.swift */; }; - B85FEAF0DED9210AE12489EF /* SBUNotificationNavigationTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331376C1A9EA4A911F7EC5F4 /* SBUNotificationNavigationTitleView.swift */; }; - B86BE85129F3E3E340D34FC6 /* SBUMessageProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F018CDEF9EF6C9430886D5 /* SBUMessageProfileView.swift */; }; - B8D9B4DCE95C4C1A8BEF62C1 /* SBUMessageThreadModule.Input.swift in Sources */ = {isa = PBXBuildFile; fileRef = 272EF898BCF0CC28EE039480 /* SBUMessageThreadModule.Input.swift */; }; - B94A466C2A59C21FD4112DB8 /* SBUBaseMessageCellParams.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC378827B5740067C0447146 /* SBUBaseMessageCellParams.Deprecated.swift */; }; - B9E575DBEA36B7F6A0D02AB1 /* SBUQuoteMessageInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121FECC4AF40731A583783BE /* SBUQuoteMessageInputView.swift */; }; + B78C40DE47283DA9991D937F /* SBUModerationsViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8BCC6C91BC5B68C14BD636 /* SBUModerationsViewController.Deprecated.swift */; }; + B94D506394EDE7383C6E81BB /* SBUBaseChannelSettingsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756255F28A991BA33C41A1D4 /* SBUBaseChannelSettingsModule.List.swift */; }; + B9608F715B56F107F7088BAC /* SBUMarginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1434E50458E03A6FDDBD602F /* SBUMarginView.swift */; }; + B9D737C1F364BD53F64D95AA /* SBUNewMessageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 001129A438EF72D032E43E77 /* SBUNewMessageInfo.swift */; }; + B9F3C651ED1751FC8F3E96F1 /* SBUTheme+MessageTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93F18D0A20AD4E2528411D7E /* SBUTheme+MessageTemplate.swift */; }; + BA13CEDB7B40F39DCFD6F0C4 /* SBUBaseViewController.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841AE3E528F833560F4E1D77 /* SBUBaseViewController.Unavailable.swift */; }; BA6D6556E19151D810E62156 /* UserInfoTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AB9C8FA610D90A6D958CFD /* UserInfoTitleView.swift */; }; - BA8120C278F84EF7247DFF9A /* SBUMessageTemplate.TemplateList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0190755CC824BA406D56F8C3 /* SBUMessageTemplate.TemplateList.swift */; }; - BACC1F6500340C02D7082BDC /* SBUSuggestedReplyOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 889F7678C691B2C87260BECF /* SBUSuggestedReplyOptionView.swift */; }; - BF419109765133769BE9CB4D /* SBUMessageThreadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A3813E4ACFA04D7DD217CF7 /* SBUMessageThreadViewModel.swift */; }; - BFA17E50D38342A0EE2ADF9B /* SBUBaseChannelSettingsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472BC164A96EFA762E22DCD4 /* SBUBaseChannelSettingsModule.swift */; }; - BFE495817133713067AA3B87 /* SBUStringSet.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9281572105138A1113C06F0 /* SBUStringSet.Deprecated.swift */; }; + BB5FC43B7175E110C2E50F06 /* SBUGroupChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 065623B584B000C295F9405D /* SBUGroupChannelModule.Deprecated.swift */; }; + BBF583F4B921C1C320FD82D8 /* SBUMessageSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6924D235AA92673E6EC803F9 /* SBUMessageSearchViewModel.swift */; }; + BCAE2849BFDE3C50BA567935 /* SBUChatNotificationChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE8FBBBE3C12F5EE9E7BAAD0 /* SBUChatNotificationChannelModule.swift */; }; + BD53D420A7E39FE386685B47 /* SBUInviteUserModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0420C9D7152FFC4D1E693316 /* SBUInviteUserModule.List.swift */; }; + BD78F5FCE02537FC2E5C4156 /* SBUOpenChannelCommonContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829D5FC15D41DA1A55633BCC /* SBUOpenChannelCommonContentView.swift */; }; + BE0EC4518DCC4A3185EC5C88 /* SBUMessageTemplateCellLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = A870630AEBD66BEF9C6EA3FF /* SBUMessageTemplateCellLayout.swift */; }; + BF39E2D170663E0374D80C20 /* SBUMessageWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68407D7FEF5E7BB5D583C8DD /* SBUMessageWebView.swift */; }; + C09138A74DE3F12D743A3A72 /* SBUVerticalSuggestedReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 291F7BDA0D6969322D600F2F /* SBUVerticalSuggestedReplyView.swift */; }; + C0979DF5EE55A2E9C6AD73F5 /* URL+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 916F05CC3FD62B1EFF69F984 /* URL+SBUIKit.swift */; }; C0DBEBBE584043ECCE952B5D /* MemberListVC_Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3E3D00E36AC37C744C172B2 /* MemberListVC_Cell.swift */; }; C12184EC9A09DE75AC01149E /* MainItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2E7ECD1F679713F15B2F03D1 /* MainItemView.xib */; }; - C1CCBC9618A0BF48AE95351B /* SBUUserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2332CF954CF8CD146C176C2 /* SBUUserCell.swift */; }; + C192062D7EEFB59C3FA1277E /* SBUUserMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05DB76C632A00715B25D2E5C /* SBUUserMessageCell.swift */; }; + C22F3392FDDE72F161A975FF /* SBUMarkdownTransfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26DE9F3CDEEC51F45434B9D3 /* SBUMarkdownTransfer.swift */; }; + C2AEE3786985DDA73421794F /* SBUFeedbackViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94B1F00704771FF3281A9EE4 /* SBUFeedbackViewParams.swift */; }; C2FA7EA8A90E4335111397F1 /* FeedChannelListViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5098BF78CC647E5AE68278DE /* FeedChannelListViewController.xib */; }; C3211BC60F6672EA1631AB9B /* ConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CCAD14B5BF6413599AE53CF /* ConnectView.swift */; }; + C38282C772C6E2171E4E43D3 /* SBUChatNotificationChannelModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E59E3DE583E4F9F8E75D0E4 /* SBUChatNotificationChannelModule.List.swift */; }; C3B3DE4A638192CB81C941B0 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB4867F84990B821D04F2722 /* MainView.swift */; }; - C442881C52A6E97531255B38 /* SBUChatNotificationChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 770EA711778A5B8EF1E79631 /* SBUChatNotificationChannelModule.swift */; }; + C3C1B7C412BC2D08E333A7A6 /* SBUSuggestedReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AD885BB96E99D59FA2D278 /* SBUSuggestedReplyView.swift */; }; + C404FEB5C6EC188973C3FC10 /* SBUUnderLineTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43110898387DC349478B6F4 /* SBUUnderLineTextField.swift */; }; + C467304F19F43A22160E7D82 /* SBUInviteUserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F37245E81F8A783F774D5638 /* SBUInviteUserViewController.swift */; }; C4D54A5258E7079D6753007E /* OpenChannelVC_CustomMessageMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B61AEE060EFB0FC571830C /* OpenChannelVC_CustomMessageMenuItem.swift */; }; - C4EADBF3434333C0A87F52AF /* SBUVoiceContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507FF12B8D66ACA7D7384F17 /* SBUVoiceContentView.swift */; }; - C50E2A5C9ED5AFDB863C53C9 /* SBUOpenChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4C8248B1D3DF0BF523A3C2B /* SBUOpenChannelListViewController.swift */; }; - C52232967BAE2D4DEBD1BC3F /* SBUModerationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF820D8BAB863E12FE3420E5 /* SBUModerationCell.swift */; }; - C5B67C34FF461465953CDA10 /* SBUAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A007375F446C0D971DE442F /* SBUAlertView.swift */; }; + C57505F19E16B5B6849C7B57 /* SBUViewControllerSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89AA3B80AA07FD6AA83067C9 /* SBUViewControllerSet.swift */; }; + C63A53861471EA6BFDA61336 /* SBUOpenChannelListModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1E2BF47235135F0995B3D64 /* SBUOpenChannelListModule.swift */; }; + C67A0B8CCCB8E63BF417B86F /* SBURegisterOperatorModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = E665F93B614394907C4F7CA4 /* SBURegisterOperatorModule.Deprecated.swift */; }; C71C5C4827FAD824A0419100 /* SampleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83CEC3753C538D5BF2CA66F0 /* SampleManager.swift */; }; - C74800D2216A82A84BBF5424 /* SBUUserNameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16EF2A21EB7BC1B7810BE0B /* SBUUserNameView.swift */; }; - C78392DD6A521FD443F7C7C1 /* SBUUserListModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = E52352941A448E4E062B5441 /* SBUUserListModule.swift */; }; - C7AA3BB4D77F409E895E80D9 /* SBUModerationsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3842E8286E51A6EA5E72371 /* SBUModerationsViewModel.swift */; }; - C81C9315743145DB23ADACFE /* SBUContentBaseMessageCell.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06653308AECB127005256632 /* SBUContentBaseMessageCell.Deprecated.swift */; }; - C84AA53221AF5CF2A45A7E32 /* SBUConfig.GroupChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A86F2DF4A2A187EDEA0FB8 /* SBUConfig.GroupChannel.swift */; }; - C853A43750DECBF56762F53F /* SBUBaseViewController.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 468FC9277A0D8D397BC75FEB /* SBUBaseViewController.Unavailable.swift */; }; + C737EAA1DC0CCBD47F7B25C2 /* SBUToastType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942B18E2F4E33DCC2141C06 /* SBUToastType.swift */; }; + C7A9C853C04967BF5BF0BA99 /* SBURegisterOperatorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A30BFAC81CD038889AB58A4 /* SBURegisterOperatorViewModel.swift */; }; + C7E0F6D5150821BE61E9096F /* SBUExtendedMessagePayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3B3D201883F1491F8342F21 /* SBUExtendedMessagePayload.swift */; }; C86FD710C4DFC6F5FB48FA40 /* MainChannelTabbarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70A4957E68614935FB923A6 /* MainChannelTabbarController.swift */; }; - C8B75C5F2463E367E3F45A87 /* SBUChannelSettingsChannelInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA9323D6D646C3B960120113 /* SBUChannelSettingsChannelInfoView.swift */; }; - C95628EFBD4464AA1A981A72 /* SBUContentBaseMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98CEE0D6FB455F9CAC7090F /* SBUContentBaseMessageCell.swift */; }; - C9623A4CB087EF8899C96BAC /* SBUConfig.CodingKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 746BF7AF2CE5240E622426E7 /* SBUConfig.CodingKeys.swift */; }; + C8A7A1FF4BFBBEE96B85EE4D /* SBUConfig.Base.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8A0046F71984D9AA0F483C /* SBUConfig.Base.swift */; }; + C8C64D60429320E89EE507D6 /* SBUAlertView.Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0260EF105B52AD7BD81D08D8 /* SBUAlertView.Item.swift */; }; C96C938EB6943338326CEEAA /* AIChatBotSignInViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = FBCECAC20501BC1FA624C11C /* AIChatBotSignInViewController.xib */; }; - CAB01193528DC35A3C27D530 /* SBUTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2F629F9B7B99E3AA7B60AE /* SBUTheme.swift */; }; - CAC9B740E1595449555BED74 /* SBUChannelPushSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9664EC97EABA449ECD33D44 /* SBUChannelPushSettingCell.swift */; }; + C9D0AFEA93A6EE5EA622D849 /* SBUOpenChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A473C9986A872BAE8AC0A09 /* SBUOpenChannelModule.Header.swift */; }; + C9F1BC218CD343BF6A50B625 /* Date+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D38295C7C36E41525211F92 /* Date+SBUIKit.swift */; }; + CABB8E4D37000958052A6F97 /* SBUOpenChannelBaseMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48E1632E1278015CB685BF98 /* SBUOpenChannelBaseMessageCell.swift */; }; CBA903BC5423000FF3A2B6A5 /* ChannelVC_MessageParam.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39ED93546A3FDE91D6A3EF6F /* ChannelVC_MessageParam.swift */; }; - CBC6853524F8C51863E4D2AC /* SBUMessageThreadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B02CD640F8C25F84FAEC732E /* SBUMessageThreadViewController.swift */; }; - CC9798EDB0CA866FC5BF8C7E /* SBUCreateOpenChannelModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DC133317F2BEECBAE470888 /* SBUCreateOpenChannelModule.swift */; }; - CDC69C51937FE809F82C7716 /* SBUCommonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8527B5D24C2029F5E477847C /* SBUCommonItem.swift */; }; + CD3DA94546B398C3D45A3898 /* SBUBaseChannelSettingsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370581C6701AC5C3A7316F19 /* SBUBaseChannelSettingsModule.swift */; }; CE51D59D26E86F498F9916FB /* LiveStreamChannelModule.Media.swift in Sources */ = {isa = PBXBuildFile; fileRef = 013FD19BEF7E546880B3286C /* LiveStreamChannelModule.Media.swift */; }; - CE7147F5BA14D9B0858D7795 /* SBUCreateChannelTypeSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F9E329C5656BE3F04A553F3 /* SBUCreateChannelTypeSelector.swift */; }; - CEA24D3F839EB26BDC929798 /* SBUNavigationTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9AC601B0DF0FE1F84D85F02 /* SBUNavigationTitleView.swift */; }; - CF69118A6D31FEDDDD533440 /* SBUMentionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04942C921F139EE779FF009A /* SBUMentionConfiguration.swift */; }; + CE5327E400FAB138565948B3 /* SBULinkClickableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AEDE1414A1D7988C5CF8C11 /* SBULinkClickableTextView.swift */; }; + CE5F4D5A0868255FD5B99F9C /* SBUFeedbackAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF03593AAF01AB7403D97DC /* SBUFeedbackAction.swift */; }; + CEE39A16F34F39B04FC6D6BE /* SBULabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9920BEC6AC62524318D65C4E /* SBULabel.swift */; }; + CEFFEF2F8358CF17E0FC3C33 /* SBUError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD96F2547917952DFB51AB65 /* SBUError.swift */; }; + CF18B9B4974A810ED9297986 /* SBUGroupChannelSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0DC64C9238395B420FB2F20 /* SBUGroupChannelSettingsViewController.swift */; }; CF94275B179357EF4B2CF348 /* ConnectView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CC5C18901EE173180BB25C9F /* ConnectView.xib */; }; - CF96D6E337107CAD689ABB89 /* SBULabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83D1437997DEB6968F2EC2FB /* SBULabel.swift */; }; - CFC5E1EA1BF4B91BF8C8A71D /* SBUBaseChannelSettingsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E39C97839657F8471D6BDD6 /* SBUBaseChannelSettingsModule.Header.swift */; }; - D0349252880DBE87D2606FE4 /* SBUMessageTemplate.ImageRatioType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF65B7885DCFA75A65D253FF /* SBUMessageTemplate.ImageRatioType.swift */; }; - D07E64C37ACECB4DFA38A9F9 /* SBUChannelStateBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D92122E4097DC305A8145C /* SBUChannelStateBanner.swift */; }; - D11446A22421C48D49D1C4C4 /* SendbirdUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA83A2B6632271A76FC5AC78 /* SendbirdUI.swift */; }; - D11C7B07A3F68A3A4D4288EB /* SBUMessageFormMultiTextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D010876D601B1A3E11B87018 /* SBUMessageFormMultiTextItemView.swift */; }; - D1672B77066B45540C155A8D /* SBUOpenChannelListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB37194DEE2FBDFBCFC7F81 /* SBUOpenChannelListViewModel.swift */; }; + CF94DCC2BE56A910C3F777DB /* SBUModuleSet.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075A80DE3508756C5C94299C /* SBUModuleSet.Deprecated.swift */; }; + D1A0E74D4D3012F54D3BCB6B /* SBUOpenChannelSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C236BF248681700FCD30B9C /* SBUOpenChannelSettingsViewController.swift */; }; + D1A903EAF64D2955A899F4CE /* SBUModerationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738D0A47D21D12AAC961B689 /* SBUModerationsViewController.swift */; }; + D1EF17FC58AD53303C5760FF /* UIStackView.SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1570A6622C7EAF31A2AC4D05 /* UIStackView.SBUIKit.swift */; }; D1FD5E496C2C7607B3C2FEE2 /* BusinessMessagingSelectionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 890D8BFBF250A19F94A79665 /* BusinessMessagingSelectionViewController.xib */; }; D2A80C3F651E93B5D173C338 /* ChannelVC_CustomHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770E8EB0F632224D407C07B /* ChannelVC_CustomHeader.swift */; }; - D2F3D4A7DFC501CAC7E2DB89 /* SBUUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = F95EE58925E458E93D7FDCE6 /* SBUUser.swift */; }; - D3089A5F5E89CD6E7DC5976C /* SBUOpenChannelAdminMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F798358616E15E2552DCC9F /* SBUOpenChannelAdminMessageCell.swift */; }; - D34DD66BB4694BC58949CCFD /* SBUCacheManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51D591DE56DE28D1141C067 /* SBUCacheManager.swift */; }; - D36403502DA4F027E83C9236 /* SBUPermissionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891A746F3838DAC98E12433E /* SBUPermissionManager.swift */; }; - D3ADDB24529159F7E88DAE58 /* SBUMessageCellConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FED9F88AA80383C0B890598 /* SBUMessageCellConfiguration.swift */; }; - D3EE407715F3C4695B3F6E8C /* SBUOpenChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C550271EF998CCFDE576AE85 /* SBUOpenChannelCell.swift */; }; - D3F0BE727BD5D2068BA4A560 /* SBUCacheManager.Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 683DE6275052AED41B99BE1D /* SBUCacheManager.Image.swift */; }; - D45CCAF1581097C1C86DF023 /* SBUOpenChannelViewController.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF651C402E1392F0FB82A70F /* SBUOpenChannelViewController.Unavailable.swift */; }; + D2C7F25B6698800FD6C23F6A /* SBUOpenChannelFileMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8C640E0B8A35BEDA6E68F74 /* SBUOpenChannelFileMessageCell.swift */; }; + D2E80722CD1787E9AB4EE6F1 /* SBUNavigationTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6552B9E340734C47C91257BE /* SBUNavigationTitleView.swift */; }; + D3BD6B44E8C59B2011647F75 /* SBUConfigManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07EC7BDBCC05A5A80D84645D /* SBUConfigManager.swift */; }; + D42DC3D72F26823DBDDA7DA1 /* SBUGroupChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72408773056E8FF32BA7504F /* SBUGroupChannelViewController.swift */; }; + D4C4284BA81A7AEE5C337E38 /* SBUChannelListViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A04392DE6277152E8015EC0 /* SBUChannelListViewController.Deprecated.swift */; }; D51015E5093D390F10F99090 /* ChannelListVC_CustomHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3150FF4F1B532DC0159B7F2A /* ChannelListVC_CustomHeader.swift */; }; - D66512BF918C66EE07A31EEF /* SBUParentMessageInfoReactionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 765BF37122CC61258578D0F1 /* SBUParentMessageInfoReactionView.swift */; }; - D6C66BB02B03C6064A0E0857 /* SBUMultipleFilesMessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3195D6331AC1721504D82F43 /* SBUMultipleFilesMessageCollectionViewCell.swift */; }; - D73C26A5DF16F92E7AE5A521 /* SBUIconSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21F7684A21E11019D651003F /* SBUIconSet.swift */; }; - D7848CB8AAF0FF0636E95452 /* SBUIconSetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 511CF243955D25BEAF1552DE /* SBUIconSetType.swift */; }; + D63C4856535F2847A6133BFD /* SBUFileMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D2D8042865F9BE60419797 /* SBUFileMessageCellParams.swift */; }; + D654B9D7C3FABF21C014F84A /* SBUBaseChannelListModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58CE707E7CF1AEEA33868A3F /* SBUBaseChannelListModule.Header.swift */; }; + D67273711F602079DC738162 /* SBUOpenChannelAdminMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1DA648665C3CFF87923A429 /* SBUOpenChannelAdminMessageCell.swift */; }; + D724723E618315DFCB56E86B /* SBUBaseChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE48F8B0754D16FBBEDE3D5 /* SBUBaseChannelListViewController.swift */; }; + D73095EF792F7F8A68C90FD2 /* SBUMessageInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA7A34D778672B5428681438 /* SBUMessageInputView.swift */; }; D79010994001DE62C627DEEE /* MainItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4D36D999020A4FE9FD5455 /* MainItemView.swift */; }; - D7A5760180F7A6D435DDA8EF /* SBUModerationsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7A1219BC8738C3D6C42F341 /* SBUModerationsModule.List.swift */; }; - D7FB3DC7A7BE77AEE95C0971 /* SBUUserListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70C07E04365AFE0A517A7BE8 /* SBUUserListViewModel.swift */; }; + D7B6FF6D22A1643599224661 /* SBUMessageSearchViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED362612990C863472EC0C1 /* SBUMessageSearchViewController.Deprecated.swift */; }; D7FC5E8CAC1A3378C752DCC0 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BA68D9366EDD742F958A66 /* Models.swift */; }; - D82E542604F642AF8F1739B9 /* SBUCacheManager.Version.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93B64D39C0831A604871F1A /* SBUCacheManager.Version.swift */; }; D83808A83CE2874BBB6B83D5 /* CreateChannelVC_Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46527008E40B16B24514AD1E /* CreateChannelVC_Cell.swift */; }; - D86343978C89F7C95798CB4D /* String+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B2C88EF2BFC124EE8E9E82 /* String+SBUIKit.swift */; }; - DA4B12A222DA14149DC86718 /* SBUMessageTemplate.Binder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438EBCABB91C84B18C5ECA30 /* SBUMessageTemplate.Binder.swift */; }; + D8FDB154EFB6150130658EFF /* SBUOpenChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E7D681F8315DC6881561AEA /* SBUOpenChannelListViewController.swift */; }; + D94C07851AF225969EC66081 /* MessageForm+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = E232CCC55C6F5328E2A00785 /* MessageForm+SBUIKit.swift */; }; + DA1BE3CD057A0B1CED3ACD5E /* SBUSuggestedReplyOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEDE106154195F0E068E508 /* SBUSuggestedReplyOptionView.swift */; }; + DA2CC9C1219750C1B884DD6D /* UIImage+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A04237D86F2725D65C2702 /* UIImage+SBUIKit.swift */; }; DA4F87A993EC7A67423B671D /* NibCustomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF385EBE406D7A33EBF3AD17 /* NibCustomView.swift */; }; DA984E2F647685ACDFD6BFBA /* BusinessMessagingSignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755E7158A0056D52413EB3C7 /* BusinessMessagingSignInViewController.swift */; }; - DB3A2BA155A9F72E16FF917A /* SBUBaseChannelSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C143F7A0A06B7DE4AC97C363 /* SBUBaseChannelSettingsViewController.swift */; }; - DB47E162F5F43E3FD949ACAE /* SBUModerationsViewModel.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 650B4410DADB57E741DC71E9 /* SBUModerationsViewModel.Deprecated.swift */; }; + DB3F7986987023181284A9F0 /* SBUGlobals.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5052D82AC78987F8E417FF9A /* SBUGlobals.Deprecated.swift */; }; + DB987AC37304EFBDF5496CB7 /* SBUCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6B1F9002A6FC6B2585D425F /* SBUCollectionViewFlowLayout.swift */; }; + DC691EC893842D421034060C /* SBUChannelInfoHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DCCF2A299D66BBEB908AFCA /* SBUChannelInfoHeaderView.swift */; }; DC978CEEA0A082334F8F4450 /* OpenChannel+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A695D74204D2C1ADDF0BBBE2 /* OpenChannel+Ext.swift */; }; - DD41AE849AA528A2EF3767D4 /* SBUCommonModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAFC011AF7306E36EB8FCC30 /* SBUCommonModule.swift */; }; - DD8DDDE578A5500A682C086F /* SBUMessageTemplate.Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261C819AB2BB5F03295C09F2 /* SBUMessageTemplate.Container.swift */; }; + DD45844E342A2C976C6E4F2C /* SBUMessageThreadModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE26AE551C60094EC9811A23 /* SBUMessageThreadModule.Header.swift */; }; + DD4F04C1F578E3AD35E25725 /* StringProtocol+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E778A81E98B870B620BBE30 /* StringProtocol+SBUIKit.swift */; }; DD917A5F4C1B28BD3CB0EEA4 /* ChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA431857E8160340E7E545C3 /* ChannelListViewController.swift */; }; - DE56D2AEF9EAF0BC7EE1CA0B /* SBUMessageSearchModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ED1D13AC1F6F2291A9717D8 /* SBUMessageSearchModule.List.swift */; }; - DF4C92B9A10F40A3D320640F /* SBUGroupChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEBFB762A374274391B75D59 /* SBUGroupChannelModule.Deprecated.swift */; }; + DDB397DBE3C153B051076012 /* SBUBaseChannelModule.Input.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171266FF2A7A626668E63063 /* SBUBaseChannelModule.Input.swift */; }; + DF36BFFF252D6DC85507BC79 /* SBUBaseMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E45AE258701D31182073F012 /* SBUBaseMessageCell.swift */; }; E022C39DAE8F104CB09DD281 /* UserDefaults+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E08B9CB2AE173E9D2132006 /* UserDefaults+Ext.swift */; }; - E02567B2CAECEE8F2D052794 /* SBUFeedNotificationChannelModule.CategoryFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB4928B600EA46E7FC79D7AB /* SBUFeedNotificationChannelModule.CategoryFilter.swift */; }; - E152B2A44F429EC0672D3070 /* SBULayoutableButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC42BC4023ED4C214280A980 /* SBULayoutableButton.swift */; }; - E163F91AB9B5539431B0A572 /* SBURegisterOperatorModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 373D91F9E7B3D32297E6776E /* SBURegisterOperatorModule.List.swift */; }; - E254E362F2444CBBD0B93D22 /* SBUCreateChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B75E60CD5359A041DB6DE2 /* SBUCreateChannelModule.Header.swift */; }; - E34CBAF90FF2C1CAE9BCD8AA /* SBUMessageTemplate.Syntax.Views.swift in Sources */ = {isa = PBXBuildFile; fileRef = E29931EA22D00FB621B624E6 /* SBUMessageTemplate.Syntax.Views.swift */; }; + E0712A2ECD2CD49EED8393DD /* Thread+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B4C8408CF8FA2EF38D2A69A /* Thread+SBUIKit.swift */; }; + E1083358592D30DA09860E07 /* SBUMessageFormViewParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A03A8248CE86564CA9E065E /* SBUMessageFormViewParams.swift */; }; + E16D963AC23A607F5E6F7CF4 /* UIScrollView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5BE03F2141B70169EB47BCC /* UIScrollView+SBUIKit.swift */; }; + E2CDEC36629BBAE9CDDAFD26 /* SBUMessageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10081ABF448755F6ABE0B3CD /* SBUMessageCache.swift */; }; + E3167576DAC7934874947D04 /* SBUCacheManager.DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB71A8A5F46DAE8A39F9DD72 /* SBUCacheManager.DiskCache.swift */; }; + E3366B0529A9C85F20AFF2ED /* MultipleFilesMessage+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0E13A9E896E2DC26D38FC8 /* MultipleFilesMessage+SBUIKit.swift */; }; + E3CE20FC1FB6B31FAB0E2EAB /* SBUGroupChannelSettingsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A122472694CAAFA77CE6344 /* SBUGroupChannelSettingsModule.List.swift */; }; E3DEB020FBD0494C0EABC3FC /* NotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 26F15FDAB2EA2301931B3EB6 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - E45D7858FB56A47BC0A933FB /* SBUMessageTemplate.Renderer.RendererType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BA9E7DB55FE0615E1E310E0 /* SBUMessageTemplate.Renderer.RendererType.swift */; }; - E48FAB087F78E351A2ED2756 /* SBUFeedNotificationCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC924A6238617EECFFEF6F60 /* SBUFeedNotificationCellParams.swift */; }; - E4DBD6A9E84A27353852737C /* SendbirdChat+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AC0696DB83EED0C73CDED13 /* SendbirdChat+SBUIKit.swift */; }; - E4F55222D897C3B752F111B3 /* SBUConstant.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEECB941A8FBD37EFEFC553F /* SBUConstant.swift */; }; - E6808EF7297B7CF5F6DC9C75 /* MultipleFilesMessage+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65BD601D9C94A1360C6B358F /* MultipleFilesMessage+SBUIKit.swift */; }; - E6B69A09FD3B42914BC7BF81 /* SBUEmojiListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2A0491AA6BA0E7CD100BE3A /* SBUEmojiListViewController.swift */; }; - E7049DE05B9D48EB597B0CB3 /* SBUOpenChannelCommonContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2BCE6697D7354D59AB6D9BD /* SBUOpenChannelCommonContentView.swift */; }; - E7197523D100C8B3BD629E6F /* Collection+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 977B30FD3D3695ACF7EA24E1 /* Collection+SBUIKit.swift */; }; + E4B7C73B66517D2EB942E5B4 /* SBUGroupChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8797B8947A05E6961559FC70 /* SBUGroupChannelCell.swift */; }; + E561C9A3D1DA6B1F23880DD5 /* SBUCreateChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B38FB8FE54D75786DB993A /* SBUCreateChannelModule.Header.swift */; }; + E585F36C1AD3F04ADCAB1C4E /* SBUOpenChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21040A4827EEF5E2BD7EAC1 /* SBUOpenChannelCell.swift */; }; + E6990E40416A58BA96D021D6 /* SBUInviteUserModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA8609A278195715CFD10191 /* SBUInviteUserModule.Header.swift */; }; + E7019EF2EA13B251C4A4C5B8 /* UIView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16151D86B2C9CE9C4A88E659 /* UIView+SBUIKit.swift */; }; E76209DE1873B4FB76B34983 /* ChannelVC_Overriding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7C1654C625423EEF5E5B64 /* ChannelVC_Overriding.swift */; }; - E858E347BE23BD824DAFC45C /* SBUMessageThreadModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F3DC79E0E7967AAE716E8C9 /* SBUMessageThreadModule.Deprecated.swift */; }; - E8CACC9B47C909408B6E26C1 /* SBUCreateChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 561A231FF2067422D2DA5971 /* SBUCreateChannelViewModel.swift */; }; + E7F9C6293A9A3A093A6B0F41 /* SBUChatNotificationChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26A4D6C92A8CAF4D0387B6AE /* SBUChatNotificationChannelViewModel.swift */; }; + E87D314C852A863EECE70061 /* SBUPermissionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E68D00C7E474B6BDA0F2110C /* SBUPermissionManager.swift */; }; + E8D99E583804DD35F83CA1AD /* SBUGroupChannelSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BF2569429CEBC39031F66C /* SBUGroupChannelSettingCell.swift */; }; E9134545B3A6C96D0326C579 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B18CA8B590809EF2D58F4937 /* UserNotifications.framework */; }; - E91B54E68711D9793A9DA960 /* SBUBaseFileContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAB200A44A56BB6B4322FD77 /* SBUBaseFileContentView.swift */; }; - E92A52CA194A8FE62C19A242 /* SBUStringSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58750E2B95FA53D5A3EE1A3A /* SBUStringSet.swift */; }; - E992AD1DF399FAF49D150217 /* SBUChannelListViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBEAAD5F16B32284ECF914A3 /* SBUChannelListViewController.Deprecated.swift */; }; + E97544ABD942F912B3D371F9 /* SBUQuotedFileMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28FA6BB11398877A1D04EC65 /* SBUQuotedFileMessageView.swift */; }; E9A6F5F903149A4E37B67B55 /* CustomUserMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8691CE7F26F056317F1508C3 /* CustomUserMessageCell.swift */; }; - E9D49919948094A583639B0E /* SBUMessageCellProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CF00F8A7932FF7D21A97A52 /* SBUMessageCellProtocol.swift */; }; E9F0ECD97B4DBDD716601297 /* AIChatBotViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F30F5208F4A18ACABFB2FF34 /* AIChatBotViewController.swift */; }; - EA0EB80F343FA43FE9F2E7C6 /* SBUOpenChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 301241FFA67BBA747853A153 /* SBUOpenChannelViewController.swift */; }; - EA56B0BA1DDC0B70CCABC0FE /* SBUBaseChannelViewController.Unavailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E650103D74D3096368D9F8BE /* SBUBaseChannelViewController.Unavailable.swift */; }; - EA6330B57DA9C8B173469686 /* SBUCommonDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DE486B818026C5891E199C1 /* SBUCommonDelegate.swift */; }; + EA5EDED604173F802F5EFB65 /* SBUConfig.OpenChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A08081453CA8144B2347FF /* SBUConfig.OpenChannel.swift */; }; EA65CC9A04FD4D786ACC0F50 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AC0AEFF3AC3329E041214FB1 /* Main.storyboard */; }; - EA8151FD0F2CEF2F533CA3FC /* SBULogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7BBFC3D2F7F703921EC560B /* SBULogger.swift */; }; + EA74D4D94333A0A9CC58FDA8 /* SBUFormView.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6480215FBEB4249A56C7F89F /* SBUFormView.Deprecated.swift */; }; + EA8BCD7591CBDFF74E12E381 /* SBUGroupChannelSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F722A51B390124CD1A8B8C7A /* SBUGroupChannelSettingsViewModel.swift */; }; + EA9C2D42F97A79FAEB2307A8 /* SBUUserMessageCellParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA98EA0CCF6A7271C73BD7DE /* SBUUserMessageCellParams.swift */; }; EAB9B1A42F4598FC8A9141CC /* UIView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A5B795818DCC12A7EFFCC0 /* UIView+Ext.swift */; }; - EAE6856D9D5C22268221894D /* SBUSelectablePhotoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89338A5AE3FF6CB0FEBCF032 /* SBUSelectablePhotoViewController.swift */; }; - EB0FCAA7435B4007322EF470 /* SBUBaseMessageCell.Feedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5537A23D62065A51C3AF9E9D /* SBUBaseMessageCell.Feedback.swift */; }; - EBA7D023409D69E0153DA28B /* SBUGroupChannelSettingsModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77AC383BB93F275948CDD7C0 /* SBUGroupChannelSettingsModule.List.swift */; }; - ECBFC5D1B74329709E3065D1 /* SBUConfig.Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B5DBB1A9678F7DC7418F9F7 /* SBUConfig.Common.swift */; }; - ECD44CA80EE0EF4D719BC2E2 /* SBUScrollOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A51ADBDB378FA6499ED320F /* SBUScrollOptions.swift */; }; - ED76F131A779554CD0A8D7E7 /* SBUMenuSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCC8C31980DC15ADA27BAC64 /* SBUMenuSheetViewController.swift */; }; - EDDA8CECC339FBFF1F7F222F /* SBUMessageFormChipsItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DBEACF53A1FEE32AEA88EE /* SBUMessageFormChipsItemView.swift */; }; - EE5F9DB8ECD3046949EC7AD2 /* SBUBottomSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D69A3D78ED90E4089D3C07CD /* SBUBottomSheetController.swift */; }; - EE668D6E55BAC355CCA7D4AB /* Thread+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C7116D15D65A6EB152DDAB /* Thread+SBUIKit.swift */; }; - EEA61FD9E6C4E192BEE1F1DA /* Array+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8CF9CD6B1B63416319E375C /* Array+SBUIKit.swift */; }; + EAF08A4C016BB290F3384557 /* SBUEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6924D84F0B598828DF1C74D6 /* SBUEmptyView.swift */; }; + EB5FF878755D68232EA957A2 /* NSLayoutConstraint+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A934950C52F32BCFB343DC02 /* NSLayoutConstraint+SBUIKit.swift */; }; + ED7FC016E6D9A646888DAFEE /* SBUMessageTemplate.Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9165E981E2142D92EF4844 /* SBUMessageTemplate.Container.swift */; }; + ED87FFC08C66C4F23994C11B /* SendbirdChat+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7F91A991F92C4F68FFFD482 /* SendbirdChat+SBUIKit.swift */; }; + EDA62633CF60C7E9BD4F04DF /* QuotedFileImageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7D1E866BB8BE34190CEB17 /* QuotedFileImageContentView.swift */; }; + EE0AC5619FE4F11162A9E337 /* SBUGroupChannelModule.Input.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE727C8AA7A172CFD8709F1D /* SBUGroupChannelModule.Input.swift */; }; + EE534EC50116525B2D6014C7 /* SBUOpenChannelListModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CBED77C804D79D3429197D4 /* SBUOpenChannelListModule.Deprecated.swift */; }; + EEED94725DAA1266C517B048 /* SBUMessageSearchResultCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A02BD5E7F272E509F0000D86 /* SBUMessageSearchResultCell.swift */; }; EF0F09779E7E0C4AD632A3A1 /* NotificationChannelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E19F12713F807D512874CB50 /* NotificationChannelViewController.swift */; }; - EF0FD384D93120D67E8A61FE /* SBUMemberListViewController.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D10A03102A00F0EAD050D7 /* SBUMemberListViewController.Deprecated.swift */; }; - EF354F8C47910B8A75342488 /* Formatter+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA99DB33C37D0282FDD6ACB /* Formatter+SBUIKit.swift */; }; - EFABA7CA0B3D237F1F943B08 /* SBURegisterOperatorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCA7D97C1CF24D51B41510C /* SBURegisterOperatorViewController.swift */; }; - F09B3B9E53913C96392CAE26 /* SBUGroupChannelListModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E238435C5B02E7296851189 /* SBUGroupChannelListModule.swift */; }; - F119DAEDE7C7E3CE5C5A9FD1 /* SBUFeedNotificationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5EADB060500BBC37BF73911 /* SBUFeedNotificationCell.swift */; }; + EF362D809330B5B458F95ECA /* SBUCreateChannelModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B10793E1040C827B3124D46 /* SBUCreateChannelModule.Deprecated.swift */; }; + EF6CD874424B44CECC47BC31 /* String+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BB0DDCBBCD37656EE67BF01 /* String+SBUIKit.swift */; }; + F0AB64A0726F1CECBCBD3EF6 /* SBUConfig.GroupChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D02E7A8929FB82316556ADD /* SBUConfig.GroupChannel.swift */; }; + F0FAD6538EB858D51DB4D9B4 /* SBUBaseChannelSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4C2524E1433BAF65CDB5CF8 /* SBUBaseChannelSettingCell.swift */; }; F12B9953650B568F512C893B /* CreateChannelVC_UserList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B11815F7B056DAADAE9AA1DB /* CreateChannelVC_UserList.swift */; }; F17AAF5981B6824CAC23C3A5 /* LiveStreamChannelListModule.List.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C66209DE00D0888E84696B /* LiveStreamChannelListModule.List.swift */; }; - F18B4B787AF711D3CB5F529C /* SBUOpenChannelUserMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1AE141723D04C84A99407C4 /* SBUOpenChannelUserMessageCell.swift */; }; - F1F9C59D41EE7B043C50A19C /* UICollectionView+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECBD3BF61C51B2693FDABF96 /* UICollectionView+SBUIKit.swift */; }; - F277D4442F94884AAAEFA714 /* SBUActionSheet.Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 433BCD13FDDDABF5F518EAF1 /* SBUActionSheet.Item.swift */; }; - F2AAE077DFE8D688733159EE /* SBUModerationsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23872DE4580E4114EBAF5775 /* SBUModerationsModule.Header.swift */; }; - F35744669272393899FC67F9 /* UIImage+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97CC7AA39F3DEE6663FB116 /* UIImage+SBUIKit.swift */; }; - F44B4C42EB25D18A9571255B /* QuotedFileImageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B190D204180159C3D70E5F /* QuotedFileImageContentView.swift */; }; - F50426E1B731092D4409A6BE /* SBUMenuCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2890510DC6B33C2BB2943CE /* SBUMenuCell.swift */; }; - F533A32AFF949F76B9CE8AB6 /* SBUCoverImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD0BC8DC212FB085843FDCF5 /* SBUCoverImageView.swift */; }; - F5E142003F4648009E7156F0 /* SBUGlobals.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B566847DCDB97F47E3C3AFF /* SBUGlobals.Deprecated.swift */; }; - F5E61A71FF478D20A21B4667 /* SBUFeedbackAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5A8B4E3319F47AE4AF2136F /* SBUFeedbackAction.swift */; }; + F226D3C0EE74D3952C4D1225 /* SBUCacheManager.Version.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1116F0B86B59593F177F5355 /* SBUCacheManager.Version.swift */; }; + F365E54F08ED1EFECAD6F0C0 /* SBUQuotedUserMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E70E63DB609903DF2E27357D /* SBUQuotedUserMessageView.swift */; }; + F36A34B4CDC2FE7A34E35647 /* SBUMessageInputMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2A275D999F50B4A00D575A /* SBUMessageInputMode.swift */; }; + F3714CFC766F361B2D968B99 /* SendbirdUI.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B917035432DE51B511A7D1D5 /* SendbirdUI.Deprecated.swift */; }; + F389595FC301D06B38FB9B3C /* SBUQuoteMessageInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78C033ED3B5FC4D3566D4CC9 /* SBUQuoteMessageInputView.swift */; }; + F47DF872861EC724D082BD12 /* SBUColorSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33287F292240B14F1F4F8743 /* SBUColorSet.swift */; }; + F4C0AF0AFF126245FAD7F13C /* SBUBaseMessageCell.Feedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11935D29CE3C16910683A970 /* SBUBaseMessageCell.Feedback.swift */; }; + F54ADF0222BE8E51AA8F5A07 /* SBUUserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1876C227E6BEDB05D39C1B42 /* SBUUserCell.swift */; }; + F61920C3825A9455DFFBD94C /* SBUOpenChannelModule.Input.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C2B9D5C9ECC81437D1E4A8 /* SBUOpenChannelModule.Input.swift */; }; + F62180CAA418C757A5BD4854 /* Array+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 732FEE47DEE21F0B9D10A928 /* Array+SBUIKit.swift */; }; F6F67C6A3DF5B43452164B1B /* OpenChannelCustomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0F6E578BF4A8F50AC7929B4 /* OpenChannelCustomManager.swift */; }; - F70A4FB640AD9E9DF51A99AF /* SBUMessageSearchResultCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37FD61195950E1CA39327EC /* SBUMessageSearchResultCell.swift */; }; - F7DDEA8D7E0F37EC601A52AD /* SBUFileMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78630440AA9047A3C000DDA0 /* SBUFileMessageCell.swift */; }; + F75A2646F83D000F4A64E9C4 /* SBUUserMentionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42E8A1256BAD8D2C34D66021 /* SBUUserMentionConfiguration.swift */; }; + F7A7EF7CD20380F9E3C93EE8 /* SBUSimpleSuggestedReplyOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71FBCD49AF26DED2E6B5CF58 /* SBUSimpleSuggestedReplyOptionView.swift */; }; F7F4EF519DF5193542B02CF0 /* InviteUserVC_UserList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 578AE09A01FF4CD8682FAD86 /* InviteUserVC_UserList.swift */; }; - F82768B57FC7F22D21F43B69 /* CommonProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 359A8F95710D091998A5DA79 /* CommonProtocols.swift */; }; - F88664F238A4F9353B561600 /* SBUMessageTemplate.Syntax.Styles.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4E76CA93253D600216657C /* SBUMessageTemplate.Syntax.Styles.swift */; }; - F8B8898E1E8F72F80477F861 /* SBUMarkdownTransfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76BFE8E489A23629D2196FE3 /* SBUMarkdownTransfer.swift */; }; - F9359465E36107FDE883D3EA /* SBUMessageFormChipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D55D5D043B46684415DB672 /* SBUMessageFormChipView.swift */; }; - FAC8EADE60D7DDC662CF4D12 /* SBUModuleSet.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1173ECEC3916A870CF4BBE /* SBUModuleSet.Deprecated.swift */; }; - FACB0A9410DF19C31A04D4C1 /* SBUMessageTemplate.Renderer.Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29E31D84BF02E170C477B60E /* SBUMessageTemplate.Renderer.Image.swift */; }; - FB23B736C23A29ED8DB618DD /* UIStackView.SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCC5581F9677458AF778F7F4 /* UIStackView.SBUIKit.swift */; }; - FB25B140D542ADF1AA1ABA5D /* SBUGroupChannelSettingsModule.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23F0504A612CDADFC88C9BBB /* SBUGroupChannelSettingsModule.Deprecated.swift */; }; - FC50217901E1B98B3348ACD6 /* SBUReplyConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A615628DBAB1A2C5BCF6CBD /* SBUReplyConfiguration.swift */; }; - FC9BB39E4BF47330081DAE9E /* SBUMessageThreadModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40B95798B85C67C48C1E8AD8 /* SBUMessageThreadModule.Header.swift */; }; - FCCB1C12A5882872FCFE040F /* SBUAvailable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56922E5BE0AEAF6E3581B756 /* SBUAvailable.swift */; }; - FCD48C139CA39D8D14CC04A1 /* CGSize+SBUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97688B2278AFD93CCAF21CE8 /* CGSize+SBUIKit.swift */; }; - FD0BEBDF1C3FBCF3F2F365EA /* SBUTheme+Type.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A2E136580924E1911C1BDFF /* SBUTheme+Type.swift */; }; - FD5E83410214F607D0D82519 /* SBUGroupChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8A0BD43E64B98BE0A3E2B4 /* SBUGroupChannelViewModel.swift */; }; - FDB4E8A38EA5EB87AC17A75B /* SBUUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EAE8B53101F00B23803E524 /* SBUUtils.swift */; }; + F7FCFEB5B80A3ECA03820EE6 /* SBUFormViewParams.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 947C228F35B28207F57BF864 /* SBUFormViewParams.Deprecated.swift */; }; + F81C3B47EAA92D25F4CE8788 /* SBUContentBaseMessageCell.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F4389A4E75EE2D1DED876A /* SBUContentBaseMessageCell.Deprecated.swift */; }; + F9B4434EEA7AFD2C8B09E958 /* SBUCacheManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBEDD4886F43FE0CC69A1037 /* SBUCacheManager.swift */; }; + FA287103CBF93ABF7A7DBA1C /* SBUMessageTemplate.Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6909E89034096C6D2898E3B /* SBUMessageTemplate.Coordinator.swift */; }; + FAD1A427840AD8BEE369FB0F /* SBUModerationsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11689D32EA0D186E25C95746 /* SBUModerationsModule.swift */; }; + FC43B407AFCC698BB5C62E95 /* BaseMessage+SBUIKit.MessageTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 553C09FE57F5CD972A0DDE30 /* BaseMessage+SBUIKit.MessageTemplate.swift */; }; + FCA3A10EF8FAD9E4A9831A07 /* SBUModerationsModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = A61FC21BCE19CCA459FCD403 /* SBUModerationsModule.Header.swift */; }; + FCAFEC22449432377FC21B0E /* SBUVoiceRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D121E96E959189C97D6DB359 /* SBUVoiceRecorder.swift */; }; + FCB65A668D615B63509B4EC7 /* SBUFeedNotificationChannelModule.Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399F6E43419452C48B685175 /* SBUFeedNotificationChannelModule.Header.swift */; }; + FD079804A9AB29404FB5FC20 /* SBUCacheManager.File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71698090C79041033F6984DA /* SBUCacheManager.File.swift */; }; FEAC5DEA171AF4901728DD80 /* BasicUsagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651464849625AF16BC16BFD3 /* BasicUsagesViewController.swift */; }; - FEDA1FF0777EA897FD1A8215 /* BaseMesssage+SBUIKit.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89A7FB5F83E297EF2F0699B7 /* BaseMesssage+SBUIKit.Deprecated.swift */; }; - FEEA132C5DB0C1AF2FA8A8F0 /* SBUMessageTemplate.Syntax.Aligns.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7482327B20D718AB230DBA13 /* SBUMessageTemplate.Syntax.Aligns.swift */; }; - FF689B972964723106DF8D1B /* SBUUnknownMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06DE35DF7542F2D044B98020 /* SBUUnknownMessageCell.swift */; }; - FFEAB42E4A351B73ACD7E379 /* SBUBaseChannelListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B79C9122DCF777C65D083D28 /* SBUBaseChannelListViewController.swift */; }; + FF2D59701DA81F6FA1D3F355 /* SBUFeedNotificationChannelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5121F2BD2ADCD981402F504F /* SBUFeedNotificationChannelViewModel.swift */; }; + FFFD0BA359BF212F44EB957B /* SBUFormFieldView.Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0429E448268C3E49060B5952 /* SBUFormFieldView.Deprecated.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -594,571 +577,554 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0036DC96E92E8838D13981BA /* SBUParentMessageInfoView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUParentMessageInfoView.swift; path = ../Sources/View/MessageThread/SBUParentMessageInfoView.swift; sourceTree = ""; }; - 003BB38A1D8B821A076D86F7 /* MessageTemplateTestViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageTemplateTestViewController.swift; path = ../Sources/MessageTemplate/Tester/MessageTemplateTestViewController.swift; sourceTree = ""; }; - 004B588C26D26E9E4F2B863C /* SBUMessageTemplate.Renderer+Events.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SBUMessageTemplate.Renderer+Events.swift"; path = "../Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+Events.swift"; sourceTree = ""; }; - 004B59BEFA679B50DC596FE9 /* SBUCreateChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelModule.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateChannelModule.swift; sourceTree = ""; }; - 0085E75416FEEE609AD7CFD0 /* SBUUnknownMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUnknownMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUUnknownMessageCellParams.swift; sourceTree = ""; }; - 00B6560E812A93A38C1E7FFB /* UITextField+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITextField+SBUIKit.swift"; path = "../Sources/Extension/UITextField+SBUIKit.swift"; sourceTree = ""; }; + 001129A438EF72D032E43E77 /* SBUNewMessageInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNewMessageInfo.swift; path = ../Sources/View/Channel/NewMessageInfo/SBUNewMessageInfo.swift; sourceTree = ""; }; + 006892806DB9C7DC09CAA142 /* SBUOpenChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/SBUOpenChannelModule.Deprecated.swift; sourceTree = ""; }; 013FD19BEF7E546880B3286C /* LiveStreamChannelModule.Media.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveStreamChannelModule.Media.swift; sourceTree = ""; }; - 0190755CC824BA406D56F8C3 /* SBUMessageTemplate.TemplateList.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.TemplateList.swift; path = ../Sources/MessageTemplate/Processor/SBUMessageTemplate.TemplateList.swift; sourceTree = ""; }; - 01B32F68AD76DC2D2D5C2378 /* SBUMessageTemplate.PayloadType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.PayloadType.swift; path = ../Sources/MessageTemplate/Processor/SBUMessageTemplate.PayloadType.swift; sourceTree = ""; }; - 0228B7F8CB3C9255317E99E5 /* SBUCoverImageView.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCoverImageView.Deprecated.swift; path = ../Sources/Deprecated/SBUCoverImageView.Deprecated.swift; sourceTree = ""; }; - 0274A314CF90AC819BB67606 /* UIView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+SBUIKit.swift"; path = "../Sources/Extension/UIView+SBUIKit.swift"; sourceTree = ""; }; + 018C80E9E0766DABE70434EA /* SBUThreadInfoView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUThreadInfoView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/SBUThreadInfoView.swift; sourceTree = ""; }; + 01C800B2B494C239581740B7 /* SBUMention.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMention.swift; path = ../Sources/Model/SBUMention.swift; sourceTree = ""; }; + 0260EF105B52AD7BD81D08D8 /* SBUAlertView.Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAlertView.Item.swift; path = ../Sources/View/Common/AlertView/SBUAlertView.Item.swift; sourceTree = ""; }; 0291D6576C77D3732DADEB87 /* InviteUserVC_Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteUserVC_Cell.swift; sourceTree = ""; }; - 02F7303EC4ED56FB94F77A75 /* SBUQuotedFileMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedFileMessageView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/SBUQuotedFileMessageView.swift; sourceTree = ""; }; - 040FE131B697E17C13A1C4B2 /* SBURegisterOperatorModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorModule.Deprecated.swift; path = ../Sources/Deprecated/Module/SelectUser/SBURegisterOperatorModule.Deprecated.swift; sourceTree = ""; }; - 04942C921F139EE779FF009A /* SBUMentionConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMentionConfiguration.swift; path = ../Sources/Configuration/Mention/SBUMentionConfiguration.swift; sourceTree = ""; }; - 04B6D4605DE3785CF7BC755C /* SBUFeedNotificationChannelViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelViewParams.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/Params/SBUFeedNotificationChannelViewParams.swift; sourceTree = ""; }; - 04DE97EEAD63BBA59E0FB656 /* SBUInviteUserModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserModule.swift; path = ../Sources/Module/SelectUser/InviteUser/SBUInviteUserModule.swift; sourceTree = ""; }; - 052DFE5F922B005DBD1C7CC3 /* SBUGlobals.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGlobals.swift; path = ../Sources/SBUGlobals.swift; sourceTree = ""; }; - 05318C3A623C0EDA38676EFE /* SBUExtendedMessagePayload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUExtendedMessagePayload.swift; path = ../Sources/Model/SBUExtendedMessagePayload.swift; sourceTree = ""; }; - 05617EB655FE8DFC8C4D874E /* SBUError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUError.swift; path = ../Sources/Model/SBUError.swift; sourceTree = ""; }; + 03C2B9D5C9ECC81437D1E4A8 /* SBUOpenChannelModule.Input.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.Input.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.Input.swift; sourceTree = ""; }; + 0403C3912C3689CD98DD86C0 /* SBUBaseChannelViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewController.Deprecated.swift; path = ../Sources/Deprecated/Channel/SBUBaseChannelViewController.Deprecated.swift; sourceTree = ""; }; + 0420C9D7152FFC4D1E693316 /* SBUInviteUserModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserModule.List.swift; path = ../Sources/Module/SelectUser/InviteUser/SBUInviteUserModule.List.swift; sourceTree = ""; }; + 0429E448268C3E49060B5952 /* SBUFormFieldView.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFormFieldView.Deprecated.swift; path = ../Sources/Deprecated/SBUFormFieldView.Deprecated.swift; sourceTree = ""; }; + 043F0FE4FD1A702067F84F61 /* UINavigationController+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UINavigationController+SBUIKit.swift"; path = "../Sources/Extension/UINavigationController+SBUIKit.swift"; sourceTree = ""; }; + 055942829ACDEA773BDB2D41 /* SBURegisterOperatorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorViewController.swift; path = ../Sources/View/SelectUser/SBURegisterOperatorViewController.swift; sourceTree = ""; }; 05AB9C8FA610D90A6D958CFD /* UserInfoTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoTitleView.swift; sourceTree = ""; }; - 060F8041E96B5586F59E01D0 /* SBUBaseCarouselView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseCarouselView.swift; path = ../Sources/View/Channel/MessageCell/CarouselView/SBUBaseCarouselView.swift; sourceTree = ""; }; - 06653308AECB127005256632 /* SBUContentBaseMessageCell.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUContentBaseMessageCell.Deprecated.swift; path = ../Sources/Deprecated/Channel/MessageCell/SBUContentBaseMessageCell.Deprecated.swift; sourceTree = ""; }; - 06DE35DF7542F2D044B98020 /* SBUUnknownMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUnknownMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUUnknownMessageCell.swift; sourceTree = ""; }; + 05ADC08876C839B4E4F10C89 /* SBUMessageThreadViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadViewController.swift; path = ../Sources/View/MessageThread/SBUMessageThreadViewController.swift; sourceTree = ""; }; + 05DB76C632A00715B25D2E5C /* SBUUserMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUUserMessageCell.swift; sourceTree = ""; }; + 06072EEA79444B09D16E7020 /* SBUCreateOpenChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelViewModel.swift; path = ../Sources/ViewModel/SelectUser/CreateChannel/SBUCreateOpenChannelViewModel.swift; sourceTree = ""; }; + 065623B584B000C295F9405D /* SBUGroupChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/SBUGroupChannelModule.Deprecated.swift; sourceTree = ""; }; + 06ACE85207F1E07FA12465D3 /* SBURegisterOperatorModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorModule.swift; path = ../Sources/Module/SelectUser/RegisterOperator/SBURegisterOperatorModule.swift; sourceTree = ""; }; + 06DD68EE074C2AEB36D0D3D8 /* CommonProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommonProtocols.swift; path = ../Sources/Protocol/CommonProtocols.swift; sourceTree = ""; }; + 075A80DE3508756C5C94299C /* SBUModuleSet.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModuleSet.Deprecated.swift; path = ../Sources/Deprecated/Module/SBUModuleSet.Deprecated.swift; sourceTree = ""; }; 0770E8EB0F632224D407C07B /* ChannelVC_CustomHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelVC_CustomHeader.swift; sourceTree = ""; }; + 0776A5FE380B8F0B9AF78774 /* SBUBaseFileContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseFileContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUBaseFileContentView.swift; sourceTree = ""; }; + 07EC7BDBCC05A5A80D84645D /* SBUConfigManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfigManager.swift; path = ../Sources/Configuration/SBUConfigManager.swift; sourceTree = ""; }; 07F01935FF9C6D0A891C857A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 0940CD38AE9564E89E92B498 /* SBUOpenChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.Header.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.Header.swift; sourceTree = ""; }; - 09F018CDEF9EF6C9430886D5 /* SBUMessageProfileView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageProfileView.swift; path = ../Sources/View/Channel/CellView/SBUMessageProfileView.swift; sourceTree = ""; }; - 0AC56497B3B2BB2BEB4A0B35 /* SendbirdUIKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SendbirdUIKit.h; path = ../Sources/SendbirdUIKit.h; sourceTree = ""; }; - 0B1C521FA40B1BCE57E17268 /* SBUMessageSearchViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchViewModel.swift; path = ../Sources/ViewModel/MessageSearch/SBUMessageSearchViewModel.swift; sourceTree = ""; }; - 0B566847DCDB97F47E3C3AFF /* SBUGlobals.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGlobals.Deprecated.swift; path = ../Sources/Deprecated/SBUGlobals.Deprecated.swift; sourceTree = ""; }; - 0CA0A3C97568158FCA60B1A0 /* VoiceMessageStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VoiceMessageStatus.swift; path = ../Sources/Enums/VoiceMessageStatus.swift; sourceTree = ""; }; - 0E50812E1BE59E25B6A6369D /* SBUInviteUserViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserViewController.swift; path = ../Sources/View/SelectUser/SBUInviteUserViewController.swift; sourceTree = ""; }; - 121FECC4AF40731A583783BE /* SBUQuoteMessageInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuoteMessageInputView.swift; path = ../Sources/View/Channel/MessageInput/SBUQuoteMessageInputView.swift; sourceTree = ""; }; - 123580C191BBF7D8C9AF1116 /* SBUCreateOpenChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelModule.Header.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateOpenChannelModule.Header.swift; sourceTree = ""; }; + 08A04237D86F2725D65C2702 /* UIImage+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+SBUIKit.swift"; path = "../Sources/Extension/Shared/UIImage+SBUIKit.swift"; sourceTree = ""; }; + 091765502ECC694C6C1232FF /* SBUIconSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUIconSet.swift; path = ../Sources/Theme/SBUIconSet.swift; sourceTree = ""; }; + 094E070E26A56309ACF7EDB2 /* UILabel+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILabel+SBUIKit.swift"; path = "../Sources/Extension/Shared/UILabel+SBUIKit.swift"; sourceTree = ""; }; + 09FBF75480C4B97D8899C057 /* SBUCommonDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonDelegate.swift; path = ../Sources/ViewModel/Common/SBUCommonDelegate.swift; sourceTree = ""; }; + 0A122472694CAAFA77CE6344 /* SBUGroupChannelSettingsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsModule.List.swift; path = ../Sources/Module/ChannelSettings/GroupChannel/SBUGroupChannelSettingsModule.List.swift; sourceTree = ""; }; + 0AE3B8DCB7406F0C1C1C20C8 /* SBUUserListModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListModule.Deprecated.swift; path = ../Sources/Deprecated/Module/UserList/SBUUserListModule.Deprecated.swift; sourceTree = ""; }; + 0C9412FC79CA00FB3846A53F /* SBUNotificationEmptyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationEmptyView.swift; path = ../Sources/View/Common/SBUNotificationEmptyView.swift; sourceTree = ""; }; + 0D38295C7C36E41525211F92 /* Date+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Date+SBUIKit.swift"; path = "../Sources/Extension/Date+SBUIKit.swift"; sourceTree = ""; }; + 0D4F9A671E44FB87B56071B4 /* SBUUserMessageTextViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMessageTextViewModel.swift; path = ../Sources/View/Channel/ViewModel/SBUUserMessageTextViewModel.swift; sourceTree = ""; }; + 0ED3A22444BA1F9C60D05FDA /* SBUTypingIndicatorBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorBubbleView.swift; path = ../Sources/View/Common/SBUTypingIndicatorBubbleView.swift; sourceTree = ""; }; + 0FE81425E037F54AB03482EB /* SBUBaseChannelListModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListModule.List.swift; path = ../Sources/Module/ChannelList/SBUBaseChannelListModule.List.swift; sourceTree = ""; }; + 10081ABF448755F6ABE0B3CD /* SBUMessageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageCache.swift; path = ../Sources/Model/SBUMessageCache.swift; sourceTree = ""; }; + 1045A1E37FDB19F6E2B4B051 /* SBUQuotedBaseMessageViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedBaseMessageViewParams.swift; path = ../Sources/View/Channel/MessageCell/Replies/ViewParams/SBUQuotedBaseMessageViewParams.swift; sourceTree = ""; }; + 1053284DDA7205A0DB124298 /* SBUMessageSearchModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchModule.swift; path = ../Sources/Module/MessageSearch/SBUMessageSearchModule.swift; sourceTree = ""; }; + 1063DC1B3EC17EC82DC2827C /* SBUPropertyWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPropertyWrapper.swift; path = ../Sources/Util/SBUPropertyWrapper.swift; sourceTree = ""; }; + 10D3423573BF6095B38CBAB7 /* SendbirdUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SendbirdUI.swift; path = ../Sources/SendbirdUI.swift; sourceTree = ""; }; + 1116F0B86B59593F177F5355 /* SBUCacheManager.Version.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.Version.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.Version.swift; sourceTree = ""; }; + 11689D32EA0D186E25C95746 /* SBUModerationsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsModule.swift; path = ../Sources/Module/Moderations/SBUModerationsModule.swift; sourceTree = ""; }; + 11935D29CE3C16910683A970 /* SBUBaseMessageCell.Feedback.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseMessageCell.Feedback.swift; path = ../Sources/View/Channel/MessageCell/SBUBaseMessageCell.Feedback.swift; sourceTree = ""; }; 126A54F8F111E828995FD06C /* MySettingsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MySettingsCell.swift; sourceTree = ""; }; - 12C7E05BDFB700749617933C /* SBUFeedbackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedbackView.swift; path = ../Sources/View/Channel/MessageCell/Feedback/SBUFeedbackView.swift; sourceTree = ""; }; 130D7FD868022B51CE1EC067 /* ChannelVC_CustomMessageMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelVC_CustomMessageMenuItem.swift; sourceTree = ""; }; - 14C33A3E985A6F3433E2CD80 /* NSObject+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+SBUIKit.swift"; path = "../Sources/Extension/NSObject+SBUIKit.swift"; sourceTree = ""; }; - 14F4761B430C339CB959BDF8 /* SBUQuotedUserMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedUserMessageView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/SBUQuotedUserMessageView.swift; sourceTree = ""; }; - 1545896B4D9FAFE6DD9D2399 /* SBUAlertView.Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAlertView.Item.swift; path = ../Sources/View/Common/AlertView/SBUAlertView.Item.swift; sourceTree = ""; }; - 1560AA0991C25E804E2A7137 /* SBUMessageTemplate.Decoders.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Decoders.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.Decoders.swift; sourceTree = ""; }; - 1633D800A421312B3980F3A1 /* SBUTypingIndicatorMessageManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorMessageManager.swift; path = ../Sources/Manager/SBUTypingIndicatorMessageManager.swift; sourceTree = ""; }; - 171790422D68B86FE1122193 /* SBUToastView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUToastView.swift; path = ../Sources/View/Common/Toast/SBUToastView.swift; sourceTree = ""; }; - 17275291DAC0564917272496 /* SBUMessageTemplate.Renderer.Views.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Renderer.Views.swift; path = ../Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.Views.swift; sourceTree = ""; }; - 17A665256F14DCE575A7FDCA /* SBUBaseChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/SBUBaseChannelModule.Deprecated.swift; sourceTree = ""; }; - 18199E460A717BAF37F51353 /* SBUUserMessageTextViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMessageTextViewModel.swift; path = ../Sources/View/Channel/ViewModel/SBUUserMessageTextViewModel.swift; sourceTree = ""; }; - 18F0D9753CF2825B748B02DD /* SBUCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCollectionViewFlowLayout.swift; path = ../Sources/View/Common/SBUCollectionViewFlowLayout.swift; sourceTree = ""; }; - 195D69A9AA7F2ADED2E52755 /* SBUFeedNotificationChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.swift; sourceTree = ""; }; - 1A618D2C77EE9DE59F28522B /* SBUTheme.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTheme.Deprecated.swift; path = ../Sources/Deprecated/SBUTheme.Deprecated.swift; sourceTree = ""; }; - 1A9FBA83D0706529AD357223 /* SBUChannelTitleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelTitleView.swift; path = ../Sources/View/Channel/Header/SBUChannelTitleView.swift; sourceTree = ""; }; - 1AA53823579A67AEF2491504 /* SBULinkClickableTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULinkClickableTextView.swift; path = ../Sources/View/Channel/CellView/SBULinkClickableTextView.swift; sourceTree = ""; }; - 1AAA09139558B87179AA7ED7 /* SBUOpenChannelBaseMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelBaseMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelBaseMessageCell.swift; sourceTree = ""; }; - 1AFF065AB6B0A162B6E0573A /* SBUVoicePlayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoicePlayer.swift; path = ../Sources/Manager/SBUVoicePlayer.swift; sourceTree = ""; }; - 1B22F7428FDC86B6CE10840E /* SBUHorizontalSuggestedReplyOptionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUHorizontalSuggestedReplyOptionView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUHorizontalSuggestedReplyOptionView.swift; sourceTree = ""; }; - 1BD7FBB468AAE322B76088BA /* SBUOpenChannelFileMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelFileMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelFileMessageCell.swift; sourceTree = ""; }; - 1C681ED2007956EEE9D894BA /* SBUFeedNotificationChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/Notifications/SBUFeedNotificationChannelModule.Deprecated.swift; sourceTree = ""; }; + 1384AB05BC3D019EF0010C0A /* SBUMessageThreadTitleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadTitleView.swift; path = ../Sources/View/MessageThread/SBUMessageThreadTitleView.swift; sourceTree = ""; }; + 139EAB8860A7F325F77B9C3F /* SBUFeedNotificationChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.List.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.List.swift; sourceTree = ""; }; + 13A78E70F1638CB818B9F747 /* QuotedFileCommonContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuotedFileCommonContentView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/QuotedFileCommonContentView.swift; sourceTree = ""; }; + 13C813D8CD1E5824BC6079D0 /* SBUFeedbackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedbackView.swift; path = ../Sources/View/Channel/MessageCell/Feedback/SBUFeedbackView.swift; sourceTree = ""; }; + 1434E50458E03A6FDDBD602F /* SBUMarginView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMarginView.swift; path = ../Sources/View/Common/SBUMarginView.swift; sourceTree = ""; }; + 15554F1B6FC6160B44958857 /* SBUMessageTemplateManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateManager.swift; path = ../Sources/Template/SBUMessageTemplateManager.swift; sourceTree = ""; }; + 1570A6622C7EAF31A2AC4D05 /* UIStackView.SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIStackView.SBUIKit.swift; path = ../Sources/Extension/UIStackView.SBUIKit.swift; sourceTree = ""; }; + 1579C847E96A96951C1DD122 /* SBUCreateChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelViewModel.swift; path = ../Sources/ViewModel/SelectUser/CreateChannel/SBUCreateChannelViewModel.swift; sourceTree = ""; }; + 15AF7EF71D958D849882CF0A /* SBUEnums.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEnums.swift; path = ../Sources/Enums/SBUEnums.swift; sourceTree = ""; }; + 15D8B0E56DC7B2989C82ACF1 /* SBUUserListModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListModule.swift; path = ../Sources/Module/UserList/SBUUserListModule.swift; sourceTree = ""; }; + 160407074FE87FA4C356A225 /* Formatter+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Formatter+SBUIKit.swift"; path = "../Sources/Extension/Formatter+SBUIKit.swift"; sourceTree = ""; }; + 16151D86B2C9CE9C4A88E659 /* UIView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+SBUIKit.swift"; path = "../Sources/Extension/Shared/UIView+SBUIKit.swift"; sourceTree = ""; }; + 16B1F3F1E3C65FDDE35B7FB4 /* BlockingOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockingOperation.swift; path = ../Sources/Util/BlockingOperation.swift; sourceTree = ""; }; + 16F13951208DB1C7B9C198D0 /* SBUSelectablePhotoViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSelectablePhotoViewController.swift; path = ../Sources/View/Common/PhotoLibrary/SBUSelectablePhotoViewController.swift; sourceTree = ""; }; + 171266FF2A7A626668E63063 /* SBUBaseChannelModule.Input.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.Input.swift; path = ../Sources/Module/Channel/SBUBaseChannelModule.Input.swift; sourceTree = ""; }; + 17CCF10C147D01EA08E472AA /* SBUExtendedMessagePayloadCustomViewFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUExtendedMessagePayloadCustomViewFactory.swift; path = ../Sources/View/Channel/MessageCell/CustomView/SBUExtendedMessagePayloadCustomViewFactory.swift; sourceTree = ""; }; + 1876C227E6BEDB05D39C1B42 /* SBUUserCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserCell.swift; path = ../Sources/View/Common/UserCell/SBUUserCell.swift; sourceTree = ""; }; + 19E289D89AD764DC1511EBA5 /* SBUMediaView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMediaView.swift; path = ../Sources/View/Channel/Media/SBUMediaView.swift; sourceTree = ""; }; + 19F07A30DB1A96BBFE300649 /* SBUGroupChannelSettingsModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsModule.Deprecated.swift; path = ../Sources/Deprecated/Module/ChannelSettings/SBUGroupChannelSettingsModule.Deprecated.swift; sourceTree = ""; }; + 1A30BFAC81CD038889AB58A4 /* SBURegisterOperatorViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorViewModel.swift; path = ../Sources/ViewModel/SelectUser/SBURegisterOperatorViewModel.swift; sourceTree = ""; }; + 1A6ECC2F132D72ED6195C5FD /* SBUMentionConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMentionConfiguration.swift; path = ../Sources/Configuration/Mention/SBUMentionConfiguration.swift; sourceTree = ""; }; + 1BED4AD675E4F406DB4F49EA /* SBUOpenChannelSettingCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingCell.swift; path = ../Sources/View/ChannelSettings/Cell/SBUOpenChannelSettingCell.swift; sourceTree = ""; }; + 1C63F463A8F116869B93914B /* SBUUserMessageTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMessageTextView.swift; path = ../Sources/View/Channel/CellView/SBUUserMessageTextView.swift; sourceTree = ""; }; + 1CBED77C804D79D3429197D4 /* SBUOpenChannelListModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListModule.Deprecated.swift; path = ../Sources/Deprecated/Module/ChannelList/SBUOpenChannelListModule.Deprecated.swift; sourceTree = ""; }; + 1CC476031F13EE7B380C4A52 /* SBUConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.swift; path = ../Sources/Configuration/SBUConfig.swift; sourceTree = ""; }; + 1CE34F566F014D5F0326AEE9 /* SBUBaseSelectUserModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserModule.swift; path = ../Sources/Module/SelectUser/SBUBaseSelectUserModule.swift; sourceTree = ""; }; + 1CFBE0AFC194BC1EB64FA401 /* SBUUnknownMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUnknownMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUUnknownMessageCell.swift; sourceTree = ""; }; 1D5AFCA30BC1E493AC342DB7 /* AIChatBotSignInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIChatBotSignInViewController.swift; sourceTree = ""; }; - 1D6C7D252AAE674B0E29A7CA /* SBUBaseSelectUserViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserViewController.swift; path = ../Sources/View/SelectUser/SBUBaseSelectUserViewController.swift; sourceTree = ""; }; - 1E132C5991C1524B53625974 /* SBUOpenChannelListModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListModule.Deprecated.swift; path = ../Sources/Deprecated/Module/ChannelList/SBUOpenChannelListModule.Deprecated.swift; sourceTree = ""; }; - 1F1705ECF2EFDD64ADA42CF1 /* SBUUserProfileView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserProfileView.swift; path = ../Sources/View/Common/User/SBUUserProfileView.swift; sourceTree = ""; }; - 1F3BC6F13906B366FA51B6AD /* SBUMessageThreadTitleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadTitleView.swift; path = ../Sources/View/MessageThread/SBUMessageThreadTitleView.swift; sourceTree = ""; }; - 1FFC715F2C57B702F024E1F2 /* SBUGroupChannelListViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListViewModel.swift; path = ../Sources/ViewModel/ChannelList/SBUGroupChannelListViewModel.swift; sourceTree = ""; }; - 20233A168B917F3A17855F2C /* SBUViewModelDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUViewModelDelegate.swift; path = ../Sources/ViewModel/SBUViewModelDelegate.swift; sourceTree = ""; }; - 2106A5AFCD89A80F1D4218FF /* SBUFeedNotificationChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelViewController.swift; path = ../Sources/View/Channel/SBUFeedNotificationChannelViewController.swift; sourceTree = ""; }; - 21F7684A21E11019D651003F /* SBUIconSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUIconSet.swift; path = ../Sources/Theme/SBUIconSet.swift; sourceTree = ""; }; + 1E46B7345AA987A0E840CCA3 /* SBUModuleSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModuleSet.swift; path = ../Sources/Module/SBUModuleSet.swift; sourceTree = ""; }; + 1EA28E3A6A2866B7F3BE604B /* SBUOpenChannelListViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListViewModel.swift; path = ../Sources/ViewModel/ChannelList/SBUOpenChannelListViewModel.swift; sourceTree = ""; }; + 1EDBEE7CE1D348D227F6510E /* SBUStackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUStackView.swift; path = ../Sources/View/Common/SBUStackView.swift; sourceTree = ""; }; + 1F8A0046F71984D9AA0F483C /* SBUConfig.Base.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.Base.swift; path = ../Sources/Configuration/SBUConfig.Base.swift; sourceTree = ""; }; + 1FC3282910C2FD4EEC1F1B5E /* SBUCreateChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelViewController.swift; path = ../Sources/View/SelectUser/CreateChannel/SBUCreateChannelViewController.swift; sourceTree = ""; }; + 1FCE4259320B5D0A3DA298DC /* SBUMultipleFilesMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMultipleFilesMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUMultipleFilesMessageCellParams.swift; sourceTree = ""; }; + 203C076985EA8D760D6221BA /* SBUInviteUserModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserModule.Deprecated.swift; path = ../Sources/Deprecated/Module/SelectUser/SBUInviteUserModule.Deprecated.swift; sourceTree = ""; }; + 21728A585D06CEBECD786C47 /* UITextField+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITextField+SBUIKit.swift"; path = "../Sources/Extension/UITextField+SBUIKit.swift"; sourceTree = ""; }; + 21D78A65BE3591620DAA47EA /* SBUOpenChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.List.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.List.swift; sourceTree = ""; }; 22A5B795818DCC12A7EFFCC0 /* UIView+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Ext.swift"; sourceTree = ""; }; - 22EF4EBB5E024E3278931826 /* SBUMarginView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMarginView.swift; path = ../Sources/View/Common/SBUMarginView.swift; sourceTree = ""; }; - 23872DE4580E4114EBAF5775 /* SBUModerationsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsModule.Header.swift; path = ../Sources/Module/Moderations/SBUModerationsModule.Header.swift; sourceTree = ""; }; - 23F0504A612CDADFC88C9BBB /* SBUGroupChannelSettingsModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsModule.Deprecated.swift; path = ../Sources/Deprecated/Module/ChannelSettings/SBUGroupChannelSettingsModule.Deprecated.swift; sourceTree = ""; }; - 243147D65D160EDDABF07E7E /* SBUTypingMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUTypingMessageCellParams.swift; sourceTree = ""; }; + 22C2F79731D0834AA4AF2E1D /* SBUFeedNotificationChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/Notifications/SBUFeedNotificationChannelModule.Deprecated.swift; sourceTree = ""; }; + 231E4F4EEB05790DF24DDFA6 /* SBUCreateOpenChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelViewController.swift; path = ../Sources/View/SelectUser/CreateChannel/SBUCreateOpenChannelViewController.swift; sourceTree = ""; }; + 23AE4104792D75CA431666D3 /* SBUAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAnimation.swift; path = ../Sources/View/Common/SBUAnimation.swift; sourceTree = ""; }; + 23B22ADEC5DEA48C89785025 /* SBUCommonModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonModule.swift; path = ../Sources/Module/Common/SBUCommonModule.swift; sourceTree = ""; }; + 247E246A7F9CE24C355FC901 /* Float+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Float+SBUIKit.swift"; path = "../Sources/Extension/Shared/Float+SBUIKit.swift"; sourceTree = ""; }; + 250DE586B2E8ED7C913DEFC0 /* SBUVoiceFileInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceFileInfo.swift; path = ../Sources/Model/SBUVoiceFileInfo.swift; sourceTree = ""; }; + 254D450D9EEED391B877B507 /* SBUOpenChannelMessageWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelMessageWebView.swift; path = ../Sources/View/Channel/CellView/SBUOpenChannelMessageWebView.swift; sourceTree = ""; }; 254D891AE9CDFE3A829B3DC7 /* FeedChannelListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedChannelListViewController.swift; sourceTree = ""; }; - 2558FBC469097A05B40DD8B9 /* SBUGroupChannelListModule.Common.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.Common.swift; path = ../Sources/Module/ChannelList/GroupChannel/SBUGroupChannelListModule.Common.swift; sourceTree = ""; }; - 261C819AB2BB5F03295C09F2 /* SBUMessageTemplate.Container.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Container.swift; path = ../Sources/MessageTemplate/Processor/SBUMessageTemplate.Container.swift; sourceTree = ""; }; + 255681C53CE8C6A0AADBEDBF /* SBUGroupChannelSettingsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsModule.swift; path = ../Sources/Module/ChannelSettings/GroupChannel/SBUGroupChannelSettingsModule.swift; sourceTree = ""; }; + 2658CFC7A952537FA514B929 /* SBUUserListModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListModule.Header.swift; path = ../Sources/Module/UserList/SBUUserListModule.Header.swift; sourceTree = ""; }; + 26A4D6C92A8CAF4D0387B6AE /* SBUChatNotificationChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUChatNotificationChannelViewModel.swift; sourceTree = ""; }; + 26C689CAA86B9C23FD48BDA7 /* SBUMentionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMentionManager.swift; path = ../Sources/Util/SBUMentionManager.swift; sourceTree = ""; }; + 26DE9F3CDEEC51F45434B9D3 /* SBUMarkdownTransfer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMarkdownTransfer.swift; path = ../Sources/View/Channel/CellView/SBUMarkdownTransfer.swift; sourceTree = ""; }; + 26EEA1E282900BB4466EEA33 /* SBUTableViewCell.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTableViewCell.Unavailable.swift; path = ../Sources/Deprecated/SBUTableViewCell.Unavailable.swift; sourceTree = ""; }; 26F15FDAB2EA2301931B3EB6 /* NotificationService.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 271F375602E0485BD6B133CB /* SBUMessageTemplate.ErrorMessages.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.ErrorMessages.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.ErrorMessages.swift; sourceTree = ""; }; - 272EF898BCF0CC28EE039480 /* SBUMessageThreadModule.Input.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.Input.swift; path = ../Sources/Module/MessageThread/SBUMessageThreadModule.Input.swift; sourceTree = ""; }; - 285D3B5D6B90E85834D424B7 /* SBUMessageFormViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormViewParams.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/ViewParams/SBUMessageFormViewParams.swift; sourceTree = ""; }; - 28A4719021E78C4959DDBBC9 /* SBUMessageTemplate.Renderer+RenderStyles.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SBUMessageTemplate.Renderer+RenderStyles.swift"; path = "../Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+RenderStyles.swift"; sourceTree = ""; }; - 29E31D84BF02E170C477B60E /* SBUMessageTemplate.Renderer.Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Renderer.Image.swift; path = ../Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.Image.swift; sourceTree = ""; }; - 2A51ADBDB378FA6499ED320F /* SBUScrollOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUScrollOptions.swift; path = ../Sources/Model/SBUScrollOptions.swift; sourceTree = ""; }; - 2A73E337872DEE7F4B811560 /* SBUExtendedMessagePayloadForUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUExtendedMessagePayloadForUI.swift; path = ../Sources/Model/SBUExtendedMessagePayloadForUI.swift; sourceTree = ""; }; + 27ADA51C845387A916A0DFD0 /* SBUVoiceMessageInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceMessageInputView.swift; path = ../Sources/View/VoiceNote/SBUVoiceMessageInputView.swift; sourceTree = ""; }; + 27BF2569429CEBC39031F66C /* SBUGroupChannelSettingCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingCell.swift; path = ../Sources/View/ChannelSettings/Cell/SBUGroupChannelSettingCell.swift; sourceTree = ""; }; + 27E9CC24044618969EC46F63 /* SBUMessageFormItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormItemView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormItemView.swift; sourceTree = ""; }; + 28B2FDEA8FD5787F552C6612 /* SBUMemberListViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMemberListViewController.Deprecated.swift; path = ../Sources/Deprecated/MemberList/SBUMemberListViewController.Deprecated.swift; sourceTree = ""; }; + 28DA61B394B90A15CE024663 /* SBUOpenChannelListModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListModule.List.swift; path = ../Sources/Module/ChannelList/OpenChannel/SBUOpenChannelListModule.List.swift; sourceTree = ""; }; + 28FA6BB11398877A1D04EC65 /* SBUQuotedFileMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedFileMessageView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/SBUQuotedFileMessageView.swift; sourceTree = ""; }; + 291F7BDA0D6969322D600F2F /* SBUVerticalSuggestedReplyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVerticalSuggestedReplyView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUVerticalSuggestedReplyView.swift; sourceTree = ""; }; + 292090C9C63F0856F1012F02 /* SBUChatNotificationChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/Notifications/SBUChatNotificationChannelModule.Deprecated.swift; sourceTree = ""; }; + 2942B18E2F4E33DCC2141C06 /* SBUToastType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUToastType.swift; path = ../Sources/View/Common/Toast/SBUToastType.swift; sourceTree = ""; }; + 295EECE198D5BAEB03EF0398 /* SBUMultipleFilesMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMultipleFilesMessageCell.swift; path = ../Sources/View/Channel/MessageCell/MultipleFilesMessage/SBUMultipleFilesMessageCell.swift; sourceTree = ""; }; + 2A2A275D999F50B4A00D575A /* SBUMessageInputMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageInputMode.swift; path = ../Sources/View/Channel/MessageInput/SBUMessageInputMode.swift; sourceTree = ""; }; + 2A4074EAFBED0F6EE67A062F /* SBUPhotoAccess.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPhotoAccess.swift; path = ../Sources/View/Common/PhotoLibrary/SBUPhotoAccess.swift; sourceTree = ""; }; 2A8770EE3BC2BF785C82D31C /* BaseCustomManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseCustomManager.swift; sourceTree = ""; }; - 2A912AB54CD1B06747EC40E1 /* SBUMessageTemplate.Syntax.Identifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Syntax.Identifier.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Identifier.swift; sourceTree = ""; }; - 2B8A0BD43E64B98BE0A3E2B4 /* SBUGroupChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUGroupChannelViewModel.swift; sourceTree = ""; }; - 2BF3F7F5A6D16081EEAB5519 /* SBUBaseChannelSettingsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsModule.List.swift; path = ../Sources/Module/ChannelSettings/SBUBaseChannelSettingsModule.List.swift; sourceTree = ""; }; - 2C09C396BCBF26C81585EF79 /* SendbirdUI.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SendbirdUI.Deprecated.swift; path = ../Sources/Deprecated/SendbirdUI.Deprecated.swift; sourceTree = ""; }; - 2D1B3BEE36D30232B2CF92AD /* SBUImageContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUImageContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUImageContentView.swift; sourceTree = ""; }; - 2D826F745DAE2521F5F82AC5 /* SBUGroupChannelSettingsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsModule.Header.swift; path = ../Sources/Module/ChannelSettings/GroupChannel/SBUGroupChannelSettingsModule.Header.swift; sourceTree = ""; }; - 2DC133317F2BEECBAE470888 /* SBUCreateOpenChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelModule.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateOpenChannelModule.swift; sourceTree = ""; }; + 2A8C7146E20C14178D218D0F /* SBUMessageThreadViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadViewModel.swift; path = ../Sources/ViewModel/MessageThread/SBUMessageThreadViewModel.swift; sourceTree = ""; }; + 2B4C8408CF8FA2EF38D2A69A /* Thread+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Thread+SBUIKit.swift"; path = "../Sources/Extension/Shared/Thread+SBUIKit.swift"; sourceTree = ""; }; + 2C236BF248681700FCD30B9C /* SBUOpenChannelSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsViewController.swift; path = ../Sources/View/ChannelSettings/SBUOpenChannelSettingsViewController.swift; sourceTree = ""; }; + 2DA9C0BFBB42D524F16CA6F4 /* SBUImageContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUImageContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUImageContentView.swift; sourceTree = ""; }; 2DE6549CE553EFCA6E649E6F /* CustomEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEmptyView.swift; sourceTree = ""; }; + 2E7D681F8315DC6881561AEA /* SBUOpenChannelListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListViewController.swift; path = ../Sources/View/ChannelList/SBUOpenChannelListViewController.swift; sourceTree = ""; }; 2E7ECD1F679713F15B2F03D1 /* MainItemView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainItemView.xib; sourceTree = ""; }; + 2F2EEC9F62E8C45DB2270994 /* SBUFontSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFontSet.swift; path = ../Sources/Theme/SBUFontSet.swift; sourceTree = ""; }; 2F3F02F0620C9666AB8EFA7D /* CustomWebView_ChatBotWidgetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomWebView_ChatBotWidgetController.swift; sourceTree = ""; }; + 2F7524EEC19FD2161959072A /* SBUGroupChannelPushSettingsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsModule.List.swift; path = ../Sources/Module/NotificationSettings/SBUGroupChannelPushSettingsModule.List.swift; sourceTree = ""; }; 2F7C1654C625423EEF5E5B64 /* ChannelVC_Overriding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelVC_Overriding.swift; sourceTree = ""; }; 2FF0C3A9D41F9CA7E230D440 /* MessageTranslationMessageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageTranslationMessageCell.swift; sourceTree = ""; }; - 301241FFA67BBA747853A153 /* SBUOpenChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelViewController.swift; path = ../Sources/View/Channel/SBUOpenChannelViewController.swift; sourceTree = ""; }; + 2FF68CC8A2AE5A73C0998A61 /* SBUBaseSelectUserModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserModule.Header.swift; path = ../Sources/Module/SelectUser/SBUBaseSelectUserModule.Header.swift; sourceTree = ""; }; + 302ED9F9A0AD14D1C3405AAB /* SBUChatNotificationCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationCell.swift; path = ../Sources/View/Channel/MessageCell/NotificationChannel/SBUChatNotificationCell.swift; sourceTree = ""; }; 306450A7F711E55CAAF1B6A6 /* NotificationService.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NotificationService.entitlements; sourceTree = ""; }; - 30FED8843DCE23EC513800DE /* SBUMessageStateView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageStateView.swift; path = ../Sources/View/Channel/CellView/SBUMessageStateView.swift; sourceTree = ""; }; 3150FF4F1B532DC0159B7F2A /* ChannelListVC_CustomHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelListVC_CustomHeader.swift; sourceTree = ""; }; - 318FFA50D14FA7DBF2D42D6A /* SBUOpenChannelViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelViewController.Deprecated.swift; path = ../Sources/Deprecated/Channel/SBUOpenChannelViewController.Deprecated.swift; sourceTree = ""; }; - 3195D6331AC1721504D82F43 /* SBUMultipleFilesMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMultipleFilesMessageCollectionViewCell.swift; path = ../Sources/View/Channel/MessageCell/MultipleFilesMessage/SBUMultipleFilesMessageCollectionViewCell.swift; sourceTree = ""; }; - 31AD44B06FF0438622D51196 /* BaseMessage+SBUIKit.MessageTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "BaseMessage+SBUIKit.MessageTemplate.swift"; path = "../Sources/Extension/ChatSDK/BaseMessage+SBUIKit.MessageTemplate.swift"; sourceTree = ""; }; - 31EF2A01C5FBAE453CB2B6F6 /* SBUOpenChannelListModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListModule.Header.swift; path = ../Sources/Module/ChannelList/OpenChannel/SBUOpenChannelListModule.Header.swift; sourceTree = ""; }; - 329E5F3C157C0310EFBE73F1 /* SBUMessageThreadModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.List.swift; path = ../Sources/Module/MessageThread/SBUMessageThreadModule.List.swift; sourceTree = ""; }; - 331376C1A9EA4A911F7EC5F4 /* SBUNotificationNavigationTitleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationNavigationTitleView.swift; path = ../Sources/View/Common/SBUNotificationNavigationTitleView.swift; sourceTree = ""; }; - 338726E7B1F43DC2AEA22230 /* SBUMentionLimitGuideCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMentionLimitGuideCell.swift; path = ../Sources/View/Channel/MessageInput/SBUMentionLimitGuideCell.swift; sourceTree = ""; }; - 33DEB4A5F180E4FCF222F510 /* SBUDashboardConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUDashboardConfig.swift; path = ../Sources/Configuration/SBUDashboardConfig.swift; sourceTree = ""; }; - 34F465DBE537C3922DCF8B5A /* SBUTableViewCell.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTableViewCell.Unavailable.swift; path = ../Sources/Deprecated/SBUTableViewCell.Unavailable.swift; sourceTree = ""; }; - 351800BCBED343863F88C6F5 /* SBUFeedbackViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedbackViewParams.swift; path = ../Sources/View/Channel/MessageCell/Feedback/SBUFeedbackViewParams.swift; sourceTree = ""; }; - 359A8F95710D091998A5DA79 /* CommonProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommonProtocols.swift; path = ../Sources/Protocol/CommonProtocols.swift; sourceTree = ""; }; - 36707C3537ECA9B171E2C286 /* SBUView.Unavaliable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUView.Unavaliable.swift; path = ../Sources/Deprecated/SBUView.Unavaliable.swift; sourceTree = ""; }; - 3718D19B8262FD4FE55D45E3 /* SBUOpenChannelListModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListModule.swift; path = ../Sources/Module/ChannelList/OpenChannel/SBUOpenChannelListModule.swift; sourceTree = ""; }; - 373D91F9E7B3D32297E6776E /* SBURegisterOperatorModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorModule.List.swift; path = ../Sources/Module/SelectUser/RegisterOperator/SBURegisterOperatorModule.List.swift; sourceTree = ""; }; - 3758C48483D58ED5C97113F4 /* SBURegisterOperatorViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorViewModel.swift; path = ../Sources/ViewModel/SelectUser/SBURegisterOperatorViewModel.swift; sourceTree = ""; }; - 37DFF0F24B9E826B1F6713EF /* SBUMessageTemplate.Coordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Coordinator.swift; path = ../Sources/MessageTemplate/Processor/SBUMessageTemplate.Coordinator.swift; sourceTree = ""; }; + 316B2AADB4CF1C35B0526FB1 /* SBUStringSet.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUStringSet.Deprecated.swift; path = ../Sources/Constant/SBUStringSet.Deprecated.swift; sourceTree = ""; }; + 3263601D709F1BD13C3EA774 /* SBUUserListViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListViewModel.swift; path = ../Sources/ViewModel/UserList/SBUUserListViewModel.swift; sourceTree = ""; }; + 331BD4D2293D4C13964CDEA4 /* SBUEmojiManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEmojiManager.swift; path = ../Sources/Manager/SBUEmojiManager.swift; sourceTree = ""; }; + 33287F292240B14F1F4F8743 /* SBUColorSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUColorSet.swift; path = ../Sources/Theme/SBUColorSet.swift; sourceTree = ""; }; + 341EE2BEF0AB66334E9F72D6 /* SBUOpenChannelSettingsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsViewModel.swift; path = ../Sources/ViewModel/ChannelSettings/SBUOpenChannelSettingsViewModel.swift; sourceTree = ""; }; + 3444A0B80EACB198221A55A7 /* SBUGroupChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.Header.swift; path = ../Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.Header.swift; sourceTree = ""; }; + 352D910607F70A45FDCB16C5 /* SBUPhotoCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPhotoCollectionViewCell.swift; path = ../Sources/View/Common/PhotoLibrary/SBUPhotoCollectionViewCell.swift; sourceTree = ""; }; + 367949391DA1D08EE2DB2DB6 /* SBUModerationsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsModule.List.swift; path = ../Sources/Module/Moderations/SBUModerationsModule.List.swift; sourceTree = ""; }; + 370581C6701AC5C3A7316F19 /* SBUBaseChannelSettingsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsModule.swift; path = ../Sources/Module/ChannelSettings/SBUBaseChannelSettingsModule.swift; sourceTree = ""; }; + 3775EEC122A3F8EB8A002A7E /* SBUTableViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTableViewCell.swift; path = "../Sources/View/Life cycles/SBUTableViewCell.swift"; sourceTree = ""; }; 38115CD65C402F937815BDA2 /* CreateCommunityChannelViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateCommunityChannelViewController.swift; sourceTree = ""; }; + 3862095750B6D557CBC5C209 /* SBUMessageFormView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormView.swift; sourceTree = ""; }; + 386A9AF0AFD4A482BC38A3D1 /* SBUMessageThreadModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.Deprecated.swift; path = ../Sources/Deprecated/Module/MessageThread/SBUMessageThreadModule.Deprecated.swift; sourceTree = ""; }; 38BA3AA66634C2E531849F9A /* BusinessMessagingSelectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BusinessMessagingSelectionViewController.swift; sourceTree = ""; }; 3900205508594F1BE53CC509 /* FeedChannelListViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FeedChannelListViewCell.xib; sourceTree = ""; }; - 39305DCC7521E039CAA011B0 /* SBUGroupChannelSettingsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsModule.swift; path = ../Sources/Module/ChannelSettings/GroupChannel/SBUGroupChannelSettingsModule.swift; sourceTree = ""; }; - 3932D029F3549E9C2C2EEE8E /* SBUBaseChannelSettingCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingCell.swift; path = ../Sources/View/ChannelSettings/Cell/SBUBaseChannelSettingCell.swift; sourceTree = ""; }; - 39B2512D4E9513712EDC507C /* SBUCreateOpenChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelViewController.swift; path = ../Sources/View/SelectUser/CreateChannel/SBUCreateOpenChannelViewController.swift; sourceTree = ""; }; + 399F6E43419452C48B685175 /* SBUFeedNotificationChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.Header.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.Header.swift; sourceTree = ""; }; 39CEC371C1FBADB87EA861F0 /* PaddingLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaddingLabel.swift; sourceTree = ""; }; 39ED93546A3FDE91D6A3EF6F /* ChannelVC_MessageParam.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelVC_MessageParam.swift; sourceTree = ""; }; - 3B062DEC7647CC0D2D962C3F /* SBUBaseViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseViewController.swift; path = ../Sources/View/SBUBaseViewController.swift; sourceTree = ""; }; - 3BB7D281DAD481F3E43747A8 /* SBUBaseSelectUserModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserModule.swift; path = ../Sources/Module/SelectUser/SBUBaseSelectUserModule.swift; sourceTree = ""; }; - 3C5B5ABC746F6AAC7FC3BB90 /* SBUOpenChannelListModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListModule.List.swift; path = ../Sources/Module/ChannelList/OpenChannel/SBUOpenChannelListModule.List.swift; sourceTree = ""; }; + 3B10793E1040C827B3124D46 /* SBUCreateChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/SelectUser/SBUCreateChannelModule.Deprecated.swift; sourceTree = ""; }; + 3B98C6D21843D388F6AB9CB9 /* SBUNotificationNavigationTitleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationNavigationTitleView.swift; path = ../Sources/View/Common/SBUNotificationNavigationTitleView.swift; sourceTree = ""; }; + 3BE48F8B0754D16FBBEDE3D5 /* SBUBaseChannelListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListViewController.swift; path = ../Sources/View/ChannelList/SBUBaseChannelListViewController.swift; sourceTree = ""; }; 3C6D0B11292492D7AFB3AF13 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 3C79C6C925FC164D7A744849 /* SBUFeedNotificationChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.List.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.List.swift; sourceTree = ""; }; - 3D114425A9DA1EF20A0A56E3 /* WeakDelegateStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WeakDelegateStorage.swift; path = ../Sources/Util/WeakDelegateStorage.swift; sourceTree = ""; }; - 3DA4DFE6F962C791023523F6 /* SBUBaseChannelViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewController.Deprecated.swift; path = ../Sources/Deprecated/Channel/SBUBaseChannelViewController.Deprecated.swift; sourceTree = ""; }; - 3E238435C5B02E7296851189 /* SBUGroupChannelListModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.swift; path = ../Sources/Module/ChannelList/GroupChannel/SBUGroupChannelListModule.swift; sourceTree = ""; }; - 3E4CB7E50D35A8458B5AC457 /* SBUNewMessageInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNewMessageInfo.swift; path = ../Sources/View/Channel/NewMessageInfo/SBUNewMessageInfo.swift; sourceTree = ""; }; - 3ED26C2B108FA667F4A2B97F /* SBUTableViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTableViewCell.swift; path = "../Sources/View/Life cycles/SBUTableViewCell.swift"; sourceTree = ""; }; - 3F98605B0DD442AD06325B5F /* SBUVoiceMessageInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceMessageInputView.swift; path = ../Sources/View/VoiceNote/SBUVoiceMessageInputView.swift; sourceTree = ""; }; - 4063A03A01AE9C1D9ED96FC0 /* SBUAdminMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAdminMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUAdminMessageCell.swift; sourceTree = ""; }; + 3CFBBF1707E6C855B0FD690E /* SBUUserListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListViewController.swift; path = ../Sources/View/UserList/SBUUserListViewController.swift; sourceTree = ""; }; + 3D02E7A8929FB82316556ADD /* SBUConfig.GroupChannel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.GroupChannel.swift; path = ../Sources/Configuration/SBUConfig.GroupChannel.swift; sourceTree = ""; }; + 3D15355333E36E3A3332D4DB /* SBUCreateChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelModule.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateChannelModule.swift; sourceTree = ""; }; + 3D2D13198CD475B3BFE7CF75 /* SBUIconSetType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUIconSetType.swift; path = ../Sources/Enums/SBUIconSetType.swift; sourceTree = ""; }; + 3D55146E9657B5320577D2C3 /* SBUBottomSheetController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBottomSheetController.swift; path = ../Sources/View/Common/Menu/SBUBottomSheetController.swift; sourceTree = ""; }; + 3DCCF2A299D66BBEB908AFCA /* SBUChannelInfoHeaderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelInfoHeaderView.swift; path = ../Sources/View/Channel/Header/SBUChannelInfoHeaderView.swift; sourceTree = ""; }; + 3EDDD233D1B439D981ED8E09 /* SBUFileMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFileMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUFileMessageCell.swift; sourceTree = ""; }; + 3F37C738B0DF21E04D5F643D /* VoiceMessageStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VoiceMessageStatus.swift; path = ../Sources/Enums/VoiceMessageStatus.swift; sourceTree = ""; }; + 3F70F42A31C241A9DFA53850 /* SBUTypingIndicatorMessageManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorMessageManager.swift; path = ../Sources/Manager/SBUTypingIndicatorMessageManager.swift; sourceTree = ""; }; + 3F83154FFF362124CA0A80AA /* SBUBaseChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.List.swift; path = ../Sources/Module/Channel/SBUBaseChannelModule.List.swift; sourceTree = ""; }; + 3F9BCFDC9EF5BD23AA4B2584 /* SBUPendingMessageManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPendingMessageManager.swift; path = ../Sources/Manager/SBUPendingMessageManager.swift; sourceTree = ""; }; + 3FAF480DC85E05894E9B9A97 /* SBUScrollBottomView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUScrollBottomView.swift; path = ../Sources/View/Channel/ScrollBottomView/SBUScrollBottomView.swift; sourceTree = ""; }; + 407B36E295240B492E765329 /* SBUDownloadManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUDownloadManager.swift; path = ../Sources/Manager/SBUDownloadManager.swift; sourceTree = ""; }; 4099E93E16C27E5CEB12785B /* CustomChannelListModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomChannelListModule.swift; sourceTree = ""; }; - 40B95798B85C67C48C1E8AD8 /* SBUMessageThreadModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.Header.swift; path = ../Sources/Module/MessageThread/SBUMessageThreadModule.Header.swift; sourceTree = ""; }; - 417F229A4E0737E350CCCD76 /* SBUOpenChannelMessageWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelMessageWebView.swift; path = ../Sources/View/Channel/CellView/SBUOpenChannelMessageWebView.swift; sourceTree = ""; }; - 428B326E33CBBA89207D59DA /* SBUGroupChannelModule.Input.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.Input.swift; path = ../Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.Input.swift; sourceTree = ""; }; - 42D3B9EF3C2445FE1C52CD30 /* SBUBaseChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUBaseChannelViewModel.swift; sourceTree = ""; }; - 433BCD13FDDDABF5F518EAF1 /* SBUActionSheet.Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUActionSheet.Item.swift; path = ../Sources/View/Common/ActionSheet/SBUActionSheet.Item.swift; sourceTree = ""; }; - 438EBCABB91C84B18C5ECA30 /* SBUMessageTemplate.Binder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Binder.swift; path = ../Sources/MessageTemplate/Processor/SBUMessageTemplate.Binder.swift; sourceTree = ""; }; - 43EA07BFE9725B76DDCC82D8 /* SBULoading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULoading.swift; path = ../Sources/View/Common/SBULoading.swift; sourceTree = ""; }; + 40A0E8F60DD81F09F14E4741 /* SBUMessageCellConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageCellConfiguration.swift; path = ../Sources/Configuration/MessageCell/SBUMessageCellConfiguration.swift; sourceTree = ""; }; + 4185895F77850C4C00604065 /* SBUBaseSelectUserViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserViewModel.swift; path = ../Sources/ViewModel/SelectUser/SBUBaseSelectUserViewModel.swift; sourceTree = ""; }; + 42E8A1256BAD8D2C34D66021 /* SBUUserMentionConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMentionConfiguration.swift; path = ../Sources/Configuration/Mention/SBUUserMentionConfiguration.swift; sourceTree = ""; }; + 43AD885BB96E99D59FA2D278 /* SBUSuggestedReplyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSuggestedReplyView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUSuggestedReplyView.swift; sourceTree = ""; }; + 441C5380E715D9DC021F6A2C /* SBUForm.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUForm.Deprecated.swift; path = ../Sources/Deprecated/SBUForm.Deprecated.swift; sourceTree = ""; }; + 445E5B82F8E01824006A0945 /* SBUHighlightMessageInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUHighlightMessageInfo.swift; path = ../Sources/Model/SBUHighlightMessageInfo.swift; sourceTree = ""; }; + 44ABD98D4565D23E2F60FB33 /* SBUGroupChannelPushSettingsModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsModule.Deprecated.swift; path = ../Sources/Deprecated/Module/NotificationSettings/SBUGroupChannelPushSettingsModule.Deprecated.swift; sourceTree = ""; }; + 44FC391CDE2C92F3F9F798C7 /* SBULogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULogger.swift; path = ../Sources/Util/SBULogger.swift; sourceTree = ""; }; + 450B2CBD60BB544A030CA079 /* SBUToastView.Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUToastView.Internal.swift; path = ../Sources/View/Common/Toast/SBUToastView.Internal.swift; sourceTree = ""; }; + 45154CBDED471591E1058E18 /* Sequence+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Sequence+SBUIKit.swift"; path = "../Sources/Extension/Sequence+SBUIKit.swift"; sourceTree = ""; }; + 45310F1A62F1B4E5F9FACF45 /* SBUTemplateLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTemplateLabel.swift; path = ../Sources/View/Common/SBUTemplateLabel.swift; sourceTree = ""; }; 46527008E40B16B24514AD1E /* CreateChannelVC_Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateChannelVC_Cell.swift; sourceTree = ""; }; - 468FC9277A0D8D397BC75FEB /* SBUBaseViewController.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseViewController.Unavailable.swift; path = ../Sources/Deprecated/SBUBaseViewController.Unavailable.swift; sourceTree = ""; }; - 472BC164A96EFA762E22DCD4 /* SBUBaseChannelSettingsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsModule.swift; path = ../Sources/Module/ChannelSettings/SBUBaseChannelSettingsModule.swift; sourceTree = ""; }; + 479DAD6BC69CDC717FDE6A1A /* SBUBaseChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.Header.swift; path = ../Sources/Module/Channel/SBUBaseChannelModule.Header.swift; sourceTree = ""; }; + 47B38FB8FE54D75786DB993A /* SBUCreateChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelModule.Header.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateChannelModule.Header.swift; sourceTree = ""; }; 47D94B4A0B6065B7390DCC40 /* QuickStart.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = QuickStart.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 494AACC2369B97D7A129A6E9 /* SBUBaseChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.swift; path = ../Sources/Module/Channel/SBUBaseChannelModule.swift; sourceTree = ""; }; + 4880F4499928C03FE04EFD18 /* SBUDebouncer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUDebouncer.swift; path = ../Sources/Util/SBUDebouncer.swift; sourceTree = ""; }; + 48C102E1288E410BE67F35E5 /* SBUOpenChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.swift; sourceTree = ""; }; + 48E1632E1278015CB685BF98 /* SBUOpenChannelBaseMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelBaseMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelBaseMessageCell.swift; sourceTree = ""; }; + 48FFBB2C5CC0396BB8A42D1C /* SBUGroupChannelPushSettingsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsViewModel.swift; path = ../Sources/ViewModel/NotificationSettings/SBUGroupChannelPushSettingsViewModel.swift; sourceTree = ""; }; 49BBC7DDD507E9E01F953ABC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 4AF6D0E947D04AD2DF9B330C /* SBUOpenChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.List.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.List.swift; sourceTree = ""; }; - 4BCE2663136F68F00AF004AD /* SBUVoiceRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceRecorder.swift; path = ../Sources/Manager/SBUVoiceRecorder.swift; sourceTree = ""; }; - 4D3301A6BAEAEA0CB68D850F /* SBUOpenChannelSettingCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingCell.swift; path = ../Sources/View/ChannelSettings/Cell/SBUOpenChannelSettingCell.swift; sourceTree = ""; }; - 4DE486B818026C5891E199C1 /* SBUCommonDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonDelegate.swift; path = ../Sources/ViewModel/Common/SBUCommonDelegate.swift; sourceTree = ""; }; - 4DF0D45750E5BD5CD2BBF62C /* SBUInviteUserModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserModule.Deprecated.swift; path = ../Sources/Deprecated/Module/SelectUser/SBUInviteUserModule.Deprecated.swift; sourceTree = ""; }; - 4ED1D13AC1F6F2291A9717D8 /* SBUMessageSearchModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchModule.List.swift; path = ../Sources/Module/MessageSearch/SBUMessageSearchModule.List.swift; sourceTree = ""; }; - 4FDA8031558C550C5DC613F4 /* SBUBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBarButtonItem.swift; path = ../Sources/View/Common/SBUBarButtonItem.swift; sourceTree = ""; }; - 507FF12B8D66ACA7D7384F17 /* SBUVoiceContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUVoiceContentView.swift; sourceTree = ""; }; + 4A7E4BC2B941C753B4D1A8A8 /* SBUBaseViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseViewController.swift; path = ../Sources/View/SBUBaseViewController.swift; sourceTree = ""; }; + 4BA8979879F319E9210A9114 /* SBUBaseChannelSettingsViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsViewController.Deprecated.swift; path = ../Sources/Deprecated/ChannelSettings/SBUBaseChannelSettingsViewController.Deprecated.swift; sourceTree = ""; }; + 4BC73EA508B5842EE69BF80C /* SBUUserListModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListModule.List.swift; path = ../Sources/Module/UserList/SBUUserListModule.List.swift; sourceTree = ""; }; + 4BF729A9FEEDC7C1C5748A8D /* SBUChannelSettingItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelSettingItem.swift; path = ../Sources/Module/ChannelSettings/ChannelSettingItem/SBUChannelSettingItem.swift; sourceTree = ""; }; + 4D48FDCD85AD0971FC3BF896 /* SBUGroupChannelViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelViewController.Deprecated.swift; path = ../Sources/Deprecated/Channel/SBUGroupChannelViewController.Deprecated.swift; sourceTree = ""; }; + 4E778A81E98B870B620BBE30 /* StringProtocol+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "StringProtocol+SBUIKit.swift"; path = "../Sources/Extension/StringProtocol+SBUIKit.swift"; sourceTree = ""; }; + 4FEAEB09E73D10EA062EB110 /* Data+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+SBUIKit.swift"; path = "../Sources/Extension/Shared/Data+SBUIKit.swift"; sourceTree = ""; }; + 5052D82AC78987F8E417FF9A /* SBUGlobals.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGlobals.Deprecated.swift; path = ../Sources/Deprecated/SBUGlobals.Deprecated.swift; sourceTree = ""; }; + 508F6B2ABF51B19A0FE67651 /* SBUMessageTemplate.ErrorMessages.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.ErrorMessages.swift; path = ../Sources/Template/SBUMessageTemplate.ErrorMessages.swift; sourceTree = ""; }; + 509771838EA18AA17B4179FB /* SBUChannelTitleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelTitleView.swift; path = ../Sources/View/Channel/Header/SBUChannelTitleView.swift; sourceTree = ""; }; 5098BF78CC647E5AE68278DE /* FeedChannelListViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FeedChannelListViewController.xib; sourceTree = ""; }; - 50D10A03102A00F0EAD050D7 /* SBUMemberListViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMemberListViewController.Deprecated.swift; path = ../Sources/Deprecated/MemberList/SBUMemberListViewController.Deprecated.swift; sourceTree = ""; }; - 511CF243955D25BEAF1552DE /* SBUIconSetType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUIconSetType.swift; path = ../Sources/Enums/SBUIconSetType.swift; sourceTree = ""; }; - 515C6843C390B95516B79D78 /* SBUChatNotificationChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelViewController.swift; path = ../Sources/View/Channel/SBUChatNotificationChannelViewController.swift; sourceTree = ""; }; - 52A8DA18B596725EA66D7623 /* Date+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Date+SBUIKit.swift"; path = "../Sources/Extension/Date+SBUIKit.swift"; sourceTree = ""; }; + 511330D36A5E47DAEAA11080 /* SBUBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBarButtonItem.swift; path = ../Sources/View/Common/SBUBarButtonItem.swift; sourceTree = ""; }; + 5121F2BD2ADCD981402F504F /* SBUFeedNotificationChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUFeedNotificationChannelViewModel.swift; sourceTree = ""; }; + 5207F3F120CE694715C475D6 /* SBUQuoteMessageInputViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuoteMessageInputViewParams.swift; path = ../Sources/View/Channel/MessageInput/ViewParams/SBUQuoteMessageInputViewParams.swift; sourceTree = ""; }; + 52D7A37D081E801C937A0251 /* SBUActionSheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUActionSheet.swift; path = ../Sources/View/Common/ActionSheet/SBUActionSheet.swift; sourceTree = ""; }; + 5322419D7DC948E4C59CBE3C /* SBUTypingIndicatorMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorMessage.swift; path = ../Sources/Model/SBUTypingIndicatorMessage.swift; sourceTree = ""; }; + 53751B7045EA78E02FBB7B25 /* SBUScrollOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUScrollOptions.swift; path = ../Sources/Model/SBUScrollOptions.swift; sourceTree = ""; }; + 53E13940CB4B33B22925AE6C /* SBUEmojiListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEmojiListViewController.swift; path = ../Sources/View/Channel/Reaction/SBUEmojiListViewController.swift; sourceTree = ""; }; + 544DDF9B4A8EF42E9EEC62C5 /* SBUNotificationChannelManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationChannelManager.swift; path = ../Sources/Manager/SBUNotificationChannelManager.swift; sourceTree = ""; }; 54738A17EFAA5A55C27FCBA3 /* QuickStart.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = QuickStart.entitlements; sourceTree = ""; }; - 54A9A8933A162614D63D0DC6 /* SBUOpenChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/SBUOpenChannelModule.Deprecated.swift; sourceTree = ""; }; + 54B0A14CDD13B14978F30042 /* SBUMessageFormFallbackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormFallbackView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormFallbackView.swift; sourceTree = ""; }; 5526A6E24F389AC90F29DF8B /* MainView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainView.xib; sourceTree = ""; }; - 5537A23D62065A51C3AF9E9D /* SBUBaseMessageCell.Feedback.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseMessageCell.Feedback.swift; path = ../Sources/View/Channel/MessageCell/SBUBaseMessageCell.Feedback.swift; sourceTree = ""; }; - 5564F9C50888E26CD11E0454 /* SBUActionSheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUActionSheet.swift; path = ../Sources/View/Common/ActionSheet/SBUActionSheet.swift; sourceTree = ""; }; - 561A231FF2067422D2DA5971 /* SBUCreateChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelViewModel.swift; path = ../Sources/ViewModel/SelectUser/CreateChannel/SBUCreateChannelViewModel.swift; sourceTree = ""; }; - 5652136A37B967878B06BAEF /* SBUGroupChannelPushSettingsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsViewModel.swift; path = ../Sources/ViewModel/NotificationSettings/SBUGroupChannelPushSettingsViewModel.swift; sourceTree = ""; }; - 56569FB15519EDD68ED03257 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = ../Sources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 553C09FE57F5CD972A0DDE30 /* BaseMessage+SBUIKit.MessageTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "BaseMessage+SBUIKit.MessageTemplate.swift"; path = "../Sources/Extension/ChatSDK/BaseMessage+SBUIKit.MessageTemplate.swift"; sourceTree = ""; }; + 554E88B94EABB3AFE34858E6 /* UIApplication+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIApplication+SBUIKit.swift"; path = "../Sources/Extension/Shared/UIApplication+SBUIKit.swift"; sourceTree = ""; }; + 55C4BAFAC38A50BF76B1E271 /* SBUMessageFormChipView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormChipView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SubViews/SBUMessageFormChipView.swift; sourceTree = ""; }; + 5638EBB5B0EC531033CB218E /* BaseMessage+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "BaseMessage+SBUIKit.swift"; path = "../Sources/Extension/ChatSDK/BaseMessage+SBUIKit.swift"; sourceTree = ""; }; 56585FF472897189202B81E3 /* InviteUserCustomManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteUserCustomManager.swift; sourceTree = ""; }; - 56922E5BE0AEAF6E3581B756 /* SBUAvailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAvailable.swift; path = ../Sources/SBUAvailable.swift; sourceTree = ""; }; + 56BEE659A0A918AA173C99B4 /* SBUChannelPushSettingCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelPushSettingCell.swift; path = ../Sources/View/NotificationSettings/Cell/SBUChannelPushSettingCell.swift; sourceTree = ""; }; + 56E0778A68BA0E40CFAD16CD /* SBUModerationsModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Moderations/SBUModerationsModule.Deprecated.swift; sourceTree = ""; }; + 56E0C1C535623CC2D43B3627 /* SBUMessageTemplate.TemplateCacheState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.TemplateCacheState.swift; path = ../Sources/Template/SBUMessageTemplate.TemplateCacheState.swift; sourceTree = ""; }; + 56F8FC4DB72D3E97BED16797 /* SendbirdUIKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SendbirdUIKit.h; path = ../Sources/SendbirdUIKit.h; sourceTree = ""; }; + 57205339932D82EE186C0AF0 /* SBUCoverImageView.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCoverImageView.Deprecated.swift; path = ../Sources/Deprecated/SBUCoverImageView.Deprecated.swift; sourceTree = ""; }; 578AE09A01FF4CD8682FAD86 /* InviteUserVC_UserList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteUserVC_UserList.swift; sourceTree = ""; }; + 57E54FFC45003C2B9C6B0182 /* SBUUnknownMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUnknownMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUUnknownMessageCellParams.swift; sourceTree = ""; }; + 57F4389A4E75EE2D1DED876A /* SBUContentBaseMessageCell.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUContentBaseMessageCell.Deprecated.swift; path = ../Sources/Deprecated/Channel/MessageCell/SBUContentBaseMessageCell.Deprecated.swift; sourceTree = ""; }; 582D12D87359656FC98A34F3 /* LiveStreamData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveStreamData.swift; sourceTree = ""; }; - 58750E2B95FA53D5A3EE1A3A /* SBUStringSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUStringSet.swift; path = ../Sources/Constant/SBUStringSet.swift; sourceTree = ""; }; - 5892E1E3573D45B170CA1657 /* SBUMultipleFilesMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMultipleFilesMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUMultipleFilesMessageCellParams.swift; sourceTree = ""; }; - 59857C7D2CC2649D6D9B4588 /* SBUMessageInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageInputView.swift; path = ../Sources/View/Channel/MessageInput/SBUMessageInputView.swift; sourceTree = ""; }; + 58CE707E7CF1AEEA33868A3F /* SBUBaseChannelListModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListModule.Header.swift; path = ../Sources/Module/ChannelList/SBUBaseChannelListModule.Header.swift; sourceTree = ""; }; + 597875139B52BA61E56C4664 /* UIImageView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+SBUIKit.swift"; path = "../Sources/Extension/Shared/UIImageView+SBUIKit.swift"; sourceTree = ""; }; + 59B27D8BBB23A60FE74CEE82 /* SBUNotificationTimelineView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationTimelineView.swift; path = ../Sources/View/Channel/CellView/SBUNotificationTimelineView.swift; sourceTree = ""; }; 59B61AEE060EFB0FC571830C /* OpenChannelVC_CustomMessageMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenChannelVC_CustomMessageMenuItem.swift; sourceTree = ""; }; - 59C7116D15D65A6EB152DDAB /* Thread+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Thread+SBUIKit.swift"; path = "../Sources/Extension/Thread+SBUIKit.swift"; sourceTree = ""; }; 59E9C3F514B55549435BAE9D /* AdditionalFeaturesManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdditionalFeaturesManager.swift; sourceTree = ""; }; - 5A615628DBAB1A2C5BCF6CBD /* SBUReplyConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUReplyConfiguration.swift; path = ../Sources/Configuration/Replies/SBUReplyConfiguration.swift; sourceTree = ""; }; - 5B07532AD08A24CAD78C92A3 /* SBUThreadInfoView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUThreadInfoView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/SBUThreadInfoView.swift; sourceTree = ""; }; - 5C88AB486291B68F04471DA6 /* SBUOpenChannelImageContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelImageContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUOpenChannelImageContentView.swift; sourceTree = ""; }; - 5D313F2DDAFBB50136DD7DAC /* SBUPhotoAccess.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPhotoAccess.swift; path = ../Sources/View/Common/PhotoLibrary/SBUPhotoAccess.swift; sourceTree = ""; }; - 5D6175D0E27503A2FAED1ACF /* SBUDownloadManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUDownloadManager.swift; path = ../Sources/Manager/SBUDownloadManager.swift; sourceTree = ""; }; - 5E0697520CC7B478CCF34160 /* SBUHighlightMessageInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUHighlightMessageInfo.swift; path = ../Sources/Model/SBUHighlightMessageInfo.swift; sourceTree = ""; }; - 5E2FEFC59E1B00C8E8BBBC7A /* SBUDateFormatSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUDateFormatSet.swift; path = ../Sources/Constant/SBUDateFormatSet.swift; sourceTree = ""; }; - 5E90A0C200855E3C6BB11C5B /* SBUGroupChannelSettingsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsViewModel.swift; path = ../Sources/ViewModel/ChannelSettings/SBUGroupChannelSettingsViewModel.swift; sourceTree = ""; }; - 5F9E329C5656BE3F04A553F3 /* SBUCreateChannelTypeSelector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelTypeSelector.swift; path = ../Sources/View/SelectUser/CreateChannel/View/SBUCreateChannelTypeSelector.swift; sourceTree = ""; }; - 5FF2724740780F1EE9EDE298 /* SBUSelectableStackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSelectableStackView.swift; path = ../Sources/View/Channel/CellView/SBUSelectableStackView.swift; sourceTree = ""; }; + 5A234C4E9C841FA02395BA20 /* SBUCacheManager.Template.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.Template.swift; path = ../Sources/Template/SBUCacheManager.Template.swift; sourceTree = ""; }; + 5A8D44EC4A943B5EDBA0F92E /* UICollectionView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UICollectionView+SBUIKit.swift"; path = "../Sources/Extension/UICollectionView+SBUIKit.swift"; sourceTree = ""; }; + 5AD600FF515CB38A6D762194 /* SBUReplyConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUReplyConfiguration.swift; path = ../Sources/Configuration/Replies/SBUReplyConfiguration.swift; sourceTree = ""; }; + 5E56AB990ACF1FFA47AE0A60 /* SBUSelectableStackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSelectableStackView.swift; path = ../Sources/View/Channel/CellView/SBUSelectableStackView.swift; sourceTree = ""; }; + 5E59E3DE583E4F9F8E75D0E4 /* SBUChatNotificationChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelModule.List.swift; path = ../Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.List.swift; sourceTree = ""; }; + 5EED45B2BA19040E9E0D3345 /* SBUAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAlertView.swift; path = ../Sources/View/Common/AlertView/SBUAlertView.swift; sourceTree = ""; }; + 5EFE9C0D2F680E8AD1E577DA /* SBUGroupChannelSettingsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsModule.Header.swift; path = ../Sources/Module/ChannelSettings/GroupChannel/SBUGroupChannelSettingsModule.Header.swift; sourceTree = ""; }; + 607B42FE473E8A6E170EA74E /* SBUUser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUser.swift; path = ../Sources/Model/SBUUser.swift; sourceTree = ""; }; 60919A8A488385F6A325B787 /* PaddedLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaddedLabel.swift; sourceTree = ""; }; - 621EF9178BA129EC840A562D /* SBUBaseChannelListModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListModule.Header.swift; path = ../Sources/Module/ChannelList/SBUBaseChannelListModule.Header.swift; sourceTree = ""; }; - 62793278995373070FC56D80 /* SBUDebouncer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUDebouncer.swift; path = ../Sources/Util/SBUDebouncer.swift; sourceTree = ""; }; - 62B80927EA163A99A9AB0F9C /* SBUConfigManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfigManager.swift; path = ../Sources/Configuration/SBUConfigManager.swift; sourceTree = ""; }; - 62DD1C6EBB30609466FDEE62 /* SBUFeedNotificationChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.Header.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.Header.swift; sourceTree = ""; }; - 62FD0225D9064381240C54F6 /* SBUCacheManager.Config.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.Config.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.Config.swift; sourceTree = ""; }; - 63DA6C648BAD818E7843590E /* SBUBaseChannelListModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListModule.swift; path = ../Sources/Module/ChannelList/SBUBaseChannelListModule.swift; sourceTree = ""; }; - 64A2652A8AAC5E0A13CD59F6 /* SBUNewNotificationInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNewNotificationInfo.swift; path = ../Sources/View/Channel/NewMessageInfo/SBUNewNotificationInfo.swift; sourceTree = ""; }; - 650B4410DADB57E741DC71E9 /* SBUModerationsViewModel.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsViewModel.Deprecated.swift; path = ../Sources/Deprecated/Moderations/SBUModerationsViewModel.Deprecated.swift; sourceTree = ""; }; + 62AA388B840F11B3D6DE3BB6 /* SBURegisterOperatorModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorModule.Header.swift; path = ../Sources/Module/SelectUser/RegisterOperator/SBURegisterOperatorModule.Header.swift; sourceTree = ""; }; + 6480215FBEB4249A56C7F89F /* SBUFormView.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFormView.Deprecated.swift; path = ../Sources/Deprecated/SBUFormView.Deprecated.swift; sourceTree = ""; }; + 648068FD96A99201642600C7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = ../Sources/PrivacyInfo.xcprivacy; sourceTree = ""; }; 651464849625AF16BC16BFD3 /* BasicUsagesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicUsagesViewController.swift; sourceTree = ""; }; - 6544A8D91C7E66D9706B0D86 /* SBUMessageTemplateManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateManager.swift; path = ../Sources/Manager/SBUMessageTemplateManager.swift; sourceTree = ""; }; - 65BD601D9C94A1360C6B358F /* MultipleFilesMessage+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MultipleFilesMessage+SBUIKit.swift"; path = "../Sources/Extension/ChatSDK/MultipleFilesMessage+SBUIKit.swift"; sourceTree = ""; }; - 66A6C69E56F2F195D47753BA /* SBUBaseChannelModule.Input.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.Input.swift; path = ../Sources/Module/Channel/SBUBaseChannelModule.Input.swift; sourceTree = ""; }; - 66FE3FFCF4A356A0C78D1029 /* SBUUserMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUUserMessageCell.swift; sourceTree = ""; }; - 683DE6275052AED41B99BE1D /* SBUCacheManager.Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.Image.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.Image.swift; sourceTree = ""; }; - 68A392D80685B111FD18F3C8 /* SBUMessageTemplate.Payload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Payload.swift; path = ../Sources/MessageTemplate/Processor/SBUMessageTemplate.Payload.swift; sourceTree = ""; }; - 68F7DD03795E7F72E2E3D7A5 /* SBUTemplateLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTemplateLabel.swift; path = ../Sources/View/Common/SBUTemplateLabel.swift; sourceTree = ""; }; - 69F42BD6AE2609C5128AEE18 /* SBUGroupChannelListModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.Header.swift; path = ../Sources/Module/ChannelList/GroupChannel/SBUGroupChannelListModule.Header.swift; sourceTree = ""; }; - 6A007375F446C0D971DE442F /* SBUAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAlertView.swift; path = ../Sources/View/Common/AlertView/SBUAlertView.swift; sourceTree = ""; }; - 6A9B1B098246B901D124B136 /* SBUSimpleSuggestedReplyOptionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSimpleSuggestedReplyOptionView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUSimpleSuggestedReplyOptionView.swift; sourceTree = ""; }; + 6518B49C84627DAC33B5CFEB /* SBUModerationsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsViewModel.swift; path = ../Sources/ViewModel/ChannelSettings/SBUModerationsViewModel.swift; sourceTree = ""; }; + 6552B9E340734C47C91257BE /* SBUNavigationTitleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNavigationTitleView.swift; path = ../Sources/View/Common/SBUNavigationTitleView.swift; sourceTree = ""; }; + 662718DF0E9EF2709818FB6C /* SBUOpenChannelUserMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelUserMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelUserMessageCell.swift; sourceTree = ""; }; + 6692C7DC98D5A0ED508B2E65 /* SBUFeedNotificationCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationCell.swift; path = ../Sources/View/Channel/MessageCell/NotificationChannel/SBUFeedNotificationCell.swift; sourceTree = ""; }; + 675C40A04B393401D57CA4CE /* SBUViewLifeCycle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUViewLifeCycle.swift; path = "../Sources/View/Life cycles/SBUViewLifeCycle.swift"; sourceTree = ""; }; + 675D505622AB2A639B404288 /* SBUMessageThreadModule.Input.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.Input.swift; path = ../Sources/Module/MessageThread/SBUMessageThreadModule.Input.swift; sourceTree = ""; }; + 679EE5A260FFAEE98382A95D /* SBUMessageTemplateCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUMessageTemplateCellParams.swift; sourceTree = ""; }; + 68407D7FEF5E7BB5D583C8DD /* SBUMessageWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageWebView.swift; path = ../Sources/View/Channel/CellView/SBUMessageWebView.swift; sourceTree = ""; }; + 6924D235AA92673E6EC803F9 /* SBUMessageSearchViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchViewModel.swift; path = ../Sources/ViewModel/MessageSearch/SBUMessageSearchViewModel.swift; sourceTree = ""; }; + 6924D84F0B598828DF1C74D6 /* SBUEmptyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEmptyView.swift; path = ../Sources/View/Common/SBUEmptyView.swift; sourceTree = ""; }; + 6A03A8248CE86564CA9E065E /* SBUMessageFormViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormViewParams.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/ViewParams/SBUMessageFormViewParams.swift; sourceTree = ""; }; + 6A04392DE6277152E8015EC0 /* SBUChannelListViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelListViewController.Deprecated.swift; path = ../Sources/Deprecated/ChannelList/SBUChannelListViewController.Deprecated.swift; sourceTree = ""; }; 6AA91801860324BF877C2336 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 6B575CA3A534C9F671A54E3C /* SBUModerationsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsViewController.swift; path = ../Sources/View/Moderations/SBUModerationsViewController.swift; sourceTree = ""; }; - 6BA9E7DB55FE0615E1E310E0 /* SBUMessageTemplate.Renderer.RendererType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Renderer.RendererType.swift; path = ../Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.RendererType.swift; sourceTree = ""; }; + 6BB0DDCBBCD37656EE67BF01 /* String+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+SBUIKit.swift"; path = "../Sources/Extension/Shared/String+SBUIKit.swift"; sourceTree = ""; }; 6CCAD14B5BF6413599AE53CF /* ConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectView.swift; sourceTree = ""; }; - 6CF00F8A7932FF7D21A97A52 /* SBUMessageCellProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageCellProtocol.swift; path = "../Sources/View/Life cycles/SBUMessageCellProtocol.swift"; sourceTree = ""; }; - 6D55D5D043B46684415DB672 /* SBUMessageFormChipView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormChipView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SubViews/SBUMessageFormChipView.swift; sourceTree = ""; }; + 6D397650F90F2674F715403C /* SBUTheme+Type.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SBUTheme+Type.swift"; path = "../Sources/Theme/SBUTheme+Type.swift"; sourceTree = ""; }; 6D7ED4A7D6E59E73E28846C0 /* UILabel+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+Ext.swift"; sourceTree = ""; }; - 6DE1F144DE16F62BC068620B /* SBUMessageWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageWebView.swift; path = ../Sources/View/Channel/CellView/SBUMessageWebView.swift; sourceTree = ""; }; - 6E0E9B50C527EAEC31E714DE /* Float+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Float+SBUIKit.swift"; path = "../Sources/Extension/Float+SBUIKit.swift"; sourceTree = ""; }; - 6F798358616E15E2552DCC9F /* SBUOpenChannelAdminMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelAdminMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelAdminMessageCell.swift; sourceTree = ""; }; - 70519D8FB40DB45F829EF9FF /* SBUCreateOpenChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelViewModel.swift; path = ../Sources/ViewModel/SelectUser/CreateChannel/SBUCreateOpenChannelViewModel.swift; sourceTree = ""; }; - 708B69B5FD94D3F36A73D95B /* SBUSearchBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSearchBar.swift; path = ../Sources/View/Common/SBUSearchBar.swift; sourceTree = ""; }; - 70C07E04365AFE0A517A7BE8 /* SBUUserListViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListViewModel.swift; path = ../Sources/ViewModel/UserList/SBUUserListViewModel.swift; sourceTree = ""; }; - 712395536ABEF68B35D2A5AE /* SBUModuleSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModuleSet.swift; path = ../Sources/Module/SBUModuleSet.swift; sourceTree = ""; }; - 713D526E6FA405E9A5B0E634 /* SBUCacheManager.Template.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.Template.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.Template.swift; sourceTree = ""; }; + 6D9CFF321A0335FFDF4798BC /* SBUChannelStateBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelStateBanner.swift; path = ../Sources/View/Channel/ChannelStateBanner/SBUChannelStateBanner.swift; sourceTree = ""; }; + 6DB6EB01052825063F888E1C /* SBUOpenChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUOpenChannelViewModel.swift; sourceTree = ""; }; + 6E37BCE397F72E8FD87AB536 /* SBUGroupChannelListModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.Header.swift; path = ../Sources/Module/ChannelList/GroupChannel/SBUGroupChannelListModule.Header.swift; sourceTree = ""; }; + 6EA0C05DFEE707F582F5F0ED /* SBUCacheManager.NotificationSetting.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.NotificationSetting.swift; path = ../Sources/Template/SBUCacheManager.NotificationSetting.swift; sourceTree = ""; }; + 6EB14B7E6ECC3FB7331A5638 /* SBUCreateOpenChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/SelectUser/SBUCreateOpenChannelModule.Deprecated.swift; sourceTree = ""; }; + 6EE5A4AA2EF847A68E27C1E9 /* SBUCommonViewControllerSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonViewControllerSet.swift; path = ../Sources/View/Common/SBUCommonViewControllerSet.swift; sourceTree = ""; }; + 7037CB3811EC6F2827C135E4 /* SBUOpenChannelSettingsModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsModule.Deprecated.swift; path = ../Sources/Deprecated/Module/ChannelSettings/SBUOpenChannelSettingsModule.Deprecated.swift; sourceTree = ""; }; 715A32E5B024249C175D3A73 /* MemberListVC_Overriding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberListVC_Overriding.swift; sourceTree = ""; }; - 71A027C49ABEAAB520F25148 /* SBUMultipleFilesMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMultipleFilesMessageCell.swift; path = ../Sources/View/Channel/MessageCell/MultipleFilesMessage/SBUMultipleFilesMessageCell.swift; sourceTree = ""; }; - 72ADC3A02610A1FECB17939B /* SBUConfig.OpenChannel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.OpenChannel.swift; path = ../Sources/Configuration/SBUConfig.OpenChannel.swift; sourceTree = ""; }; - 733B3A136EDCAE5F32E98A55 /* SBUMessageTemplate.Syntax.Sizes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Syntax.Sizes.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Sizes.swift; sourceTree = ""; }; - 7423908DEA4CAD97D811D06F /* SBUMessageWebViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageWebViewModel.swift; path = ../Sources/View/Channel/ViewModel/SBUMessageWebViewModel.swift; sourceTree = ""; }; - 746BF7AF2CE5240E622426E7 /* SBUConfig.CodingKeys.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.CodingKeys.swift; path = ../Sources/Configuration/SBUConfig.CodingKeys.swift; sourceTree = ""; }; - 7482327B20D718AB230DBA13 /* SBUMessageTemplate.Syntax.Aligns.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Syntax.Aligns.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Aligns.swift; sourceTree = ""; }; - 748E749BEDE5F43C9746B194 /* SBUChannelSettingItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelSettingItem.swift; path = ../Sources/Module/ChannelSettings/ChannelSettingItem/SBUChannelSettingItem.swift; sourceTree = ""; }; + 71698090C79041033F6984DA /* SBUCacheManager.File.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.File.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.File.swift; sourceTree = ""; }; + 71C8271A11BE982092DA07F9 /* SBUGlobals.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGlobals.swift; path = ../Sources/SBUGlobals.swift; sourceTree = ""; }; + 71FBCD49AF26DED2E6B5CF58 /* SBUSimpleSuggestedReplyOptionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSimpleSuggestedReplyOptionView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUSimpleSuggestedReplyOptionView.swift; sourceTree = ""; }; + 72408773056E8FF32BA7504F /* SBUGroupChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelViewController.swift; path = ../Sources/View/Channel/SBUGroupChannelViewController.swift; sourceTree = ""; }; + 72BAA589EB7899C0543E88A8 /* SBUSearchBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSearchBar.swift; path = ../Sources/View/Common/SBUSearchBar.swift; sourceTree = ""; }; + 731BBF448AC6D1BF0DC87F3A /* SBUFeedNotificationChannelViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelViewParams.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/Params/SBUFeedNotificationChannelViewParams.swift; sourceTree = ""; }; + 732FEE47DEE21F0B9D10A928 /* Array+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+SBUIKit.swift"; path = "../Sources/Extension/Array+SBUIKit.swift"; sourceTree = ""; }; + 738D0A47D21D12AAC961B689 /* SBUModerationsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsViewController.swift; path = ../Sources/View/Moderations/SBUModerationsViewController.swift; sourceTree = ""; }; + 7448C79501C8F7C0E6833411 /* SBUBaseChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewController.swift; path = ../Sources/View/Channel/SBUBaseChannelViewController.swift; sourceTree = ""; }; 748F2518BAA37399D41DD3CC /* BusinessMessagingTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BusinessMessagingTabBarController.swift; sourceTree = ""; }; + 74E165FE8B985EC72B3F5760 /* SBUConfig.CodingKeys.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.CodingKeys.swift; path = ../Sources/Configuration/SBUConfig.CodingKeys.swift; sourceTree = ""; }; 755E7158A0056D52413EB3C7 /* BusinessMessagingSignInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BusinessMessagingSignInViewController.swift; sourceTree = ""; }; - 757A554AF91A46AF49BDB886 /* SBUGroupChannelPushSettingsModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsModule.Deprecated.swift; path = ../Sources/Deprecated/Module/NotificationSettings/SBUGroupChannelPushSettingsModule.Deprecated.swift; sourceTree = ""; }; - 765BF37122CC61258578D0F1 /* SBUParentMessageInfoReactionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUParentMessageInfoReactionView.swift; path = ../Sources/View/Channel/Reaction/SBUParentMessageInfoReactionView.swift; sourceTree = ""; }; - 766315D52EBCAC0E94D256D2 /* MessageTemplateParserTest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageTemplateParserTest.swift; path = ../Sources/MessageTemplate/Tester/MessageTemplateParserTest.swift; sourceTree = ""; }; - 7683E59F45AB08C01149C787 /* SBUConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.swift; path = ../Sources/Configuration/SBUConfig.swift; sourceTree = ""; }; - 76BFE8E489A23629D2196FE3 /* SBUMarkdownTransfer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMarkdownTransfer.swift; path = ../Sources/View/Channel/CellView/SBUMarkdownTransfer.swift; sourceTree = ""; }; - 76E7B76170E32DBEA8298098 /* NSLayoutConstraint+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSLayoutConstraint+SBUIKit.swift"; path = "../Sources/Extension/NSLayoutConstraint+SBUIKit.swift"; sourceTree = ""; }; - 770EA711778A5B8EF1E79631 /* SBUChatNotificationChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelModule.swift; path = ../Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.swift; sourceTree = ""; }; - 773CBC0C8D8547AA443453C9 /* SBUCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCollectionViewCell.swift; path = "../Sources/View/Life cycles/SBUCollectionViewCell.swift"; sourceTree = ""; }; - 77AC383BB93F275948CDD7C0 /* SBUGroupChannelSettingsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsModule.List.swift; path = ../Sources/Module/ChannelSettings/GroupChannel/SBUGroupChannelSettingsModule.List.swift; sourceTree = ""; }; - 7861BB13B20D6858309BF60A /* SBUAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAnimation.swift; path = ../Sources/View/Common/SBUAnimation.swift; sourceTree = ""; }; - 78630440AA9047A3C000DDA0 /* SBUFileMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFileMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUFileMessageCell.swift; sourceTree = ""; }; - 78B190D204180159C3D70E5F /* QuotedFileImageContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuotedFileImageContentView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/QuotedFileImageContentView.swift; sourceTree = ""; }; - 794012A0EC901C1933678F7C /* BlockingOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockingOperation.swift; path = ../Sources/Util/BlockingOperation.swift; sourceTree = ""; }; - 79DE5898F2F988FDDBBE2FE3 /* SBUTypingIndicatorMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorMessage.swift; path = ../Sources/Model/SBUTypingIndicatorMessage.swift; sourceTree = ""; }; - 79E05EC2053A3F33A4D72CAA /* SBUCreateChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelViewController.swift; path = ../Sources/View/SelectUser/CreateChannel/SBUCreateChannelViewController.swift; sourceTree = ""; }; - 79E77CDB516F249D7A030C67 /* SBUOpenChannelSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsViewController.swift; path = ../Sources/View/ChannelSettings/SBUOpenChannelSettingsViewController.swift; sourceTree = ""; }; - 7ACBB25153EFF189E0608A11 /* SBUOpenChannelSettingsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsModule.swift; path = ../Sources/Module/ChannelSettings/OpenChannel/SBUOpenChannelSettingsModule.swift; sourceTree = ""; }; - 7ADFE528E3F7FAD8397BB167 /* SBUView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUView.swift; path = "../Sources/View/Life cycles/SBUView.swift"; sourceTree = ""; }; - 7AEDFE0D309842977DE7E7C9 /* SBUFileViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFileViewController.swift; path = ../Sources/View/Channel/FileViewer/SBUFileViewController.swift; sourceTree = ""; }; - 7D1408922FF39794BCEBBD48 /* SBUNotificationTimelineView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationTimelineView.swift; path = ../Sources/View/Channel/CellView/SBUNotificationTimelineView.swift; sourceTree = ""; }; - 7D8EABEB1992CD5141939413 /* SBUUserListModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListModule.List.swift; path = ../Sources/Module/UserList/SBUUserListModule.List.swift; sourceTree = ""; }; - 7E86C809A6133718AE7762D7 /* SBUGroupChannelPushSettingsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsModule.List.swift; path = ../Sources/Module/NotificationSettings/SBUGroupChannelPushSettingsModule.List.swift; sourceTree = ""; }; + 756255F28A991BA33C41A1D4 /* SBUBaseChannelSettingsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsModule.List.swift; path = ../Sources/Module/ChannelSettings/SBUBaseChannelSettingsModule.List.swift; sourceTree = ""; }; + 76A196C6443AE18D9B184506 /* SBUMultipleFilesMessageCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMultipleFilesMessageCollectionView.swift; path = ../Sources/View/Channel/MessageCell/MultipleFilesMessage/SBUMultipleFilesMessageCollectionView.swift; sourceTree = ""; }; + 779F7EEC56669BD6E766492C /* SBUParentMessageInfoReactionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUParentMessageInfoReactionView.swift; path = ../Sources/View/Channel/Reaction/SBUParentMessageInfoReactionView.swift; sourceTree = ""; }; + 77D3B0857BDEFCCD9F0591FD /* SBUBaseChannelSettingsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsModule.Header.swift; path = ../Sources/Module/ChannelSettings/SBUBaseChannelSettingsModule.Header.swift; sourceTree = ""; }; + 78C033ED3B5FC4D3566D4CC9 /* SBUQuoteMessageInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuoteMessageInputView.swift; path = ../Sources/View/Channel/MessageInput/SBUQuoteMessageInputView.swift; sourceTree = ""; }; + 795AD469E503419F2F03D44B /* SBUVoiceMessageConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceMessageConfiguration.swift; path = ../Sources/Configuration/VoiceMessage/SBUVoiceMessageConfiguration.swift; sourceTree = ""; }; + 7A473C9986A872BAE8AC0A09 /* SBUOpenChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.Header.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.Header.swift; sourceTree = ""; }; + 7B9C5DC79836381B4EBB75F2 /* SBUMenuView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMenuView.swift; path = ../Sources/View/Common/Menu/SBUMenuView.swift; sourceTree = ""; }; + 7D1E8970B46D7627FE122009 /* SBUMessageProfileView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageProfileView.swift; path = ../Sources/View/Channel/CellView/SBUMessageProfileView.swift; sourceTree = ""; }; + 7D4ACC7708281A52BB86BBF6 /* SBUMessageFormSingleTextItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormSingleTextItemView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormSingleTextItemView.swift; sourceTree = ""; }; + 7E3230A2EB4D40A6182F2A7C /* SBUMessageSearchModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchModule.Deprecated.swift; path = ../Sources/Deprecated/Module/MessageSearch/SBUMessageSearchModule.Deprecated.swift; sourceTree = ""; }; 7EB6FAC1C2EC8D79D3474335 /* FeedChannelListViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedChannelListViewCell.swift; sourceTree = ""; }; - 7F1173ECEC3916A870CF4BBE /* SBUModuleSet.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModuleSet.Deprecated.swift; path = ../Sources/Deprecated/Module/SBUModuleSet.Deprecated.swift; sourceTree = ""; }; - 7F3DC79E0E7967AAE716E8C9 /* SBUMessageThreadModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.Deprecated.swift; path = ../Sources/Deprecated/Module/MessageThread/SBUMessageThreadModule.Deprecated.swift; sourceTree = ""; }; 7F6412A0B94483A3C585B666 /* BusinessMessagingSignInViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BusinessMessagingSignInViewController.xib; sourceTree = ""; }; - 7FED9F88AA80383C0B890598 /* SBUMessageCellConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageCellConfiguration.swift; path = ../Sources/Configuration/MessageCell/SBUMessageCellConfiguration.swift; sourceTree = ""; }; - 815D4832D88AB11A6E9CC866 /* SBUToastView.Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUToastView.Item.swift; path = ../Sources/View/Common/Toast/SBUToastView.Item.swift; sourceTree = ""; }; - 81C11108DC261338213DD256 /* UINavigationController+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UINavigationController+SBUIKit.swift"; path = "../Sources/Extension/UINavigationController+SBUIKit.swift"; sourceTree = ""; }; + 7F715B477D4B9CF28A20C45C /* SBUOpenChannelViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelViewController.Deprecated.swift; path = ../Sources/Deprecated/Channel/SBUOpenChannelViewController.Deprecated.swift; sourceTree = ""; }; + 7F963307DB6D64936A82369A /* SBUMessageStateView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageStateView.swift; path = ../Sources/View/Channel/CellView/SBUMessageStateView.swift; sourceTree = ""; }; + 805C16C6977AB2E9F1865F31 /* SBUCreateOpenChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelModule.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateOpenChannelModule.swift; sourceTree = ""; }; + 8117FE1B7B4550219C1A8C5A /* SBUOpenChannelSettingsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsModule.Header.swift; path = ../Sources/Module/ChannelSettings/OpenChannel/SBUOpenChannelSettingsModule.Header.swift; sourceTree = ""; }; 81E4ADC71E7932D806E84DA7 /* LiveStreamChannelViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveStreamChannelViewController.swift; sourceTree = ""; }; - 820597A15A4A1AF51171E99F /* SBUGroupChannelCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelCell.swift; path = ../Sources/View/ChannelList/ChannelCell/SBUGroupChannelCell.swift; sourceTree = ""; }; + 8247167CB37263AD5C5C4B38 /* SBUBaseSelectUserViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserViewController.Deprecated.swift; path = ../Sources/Deprecated/UserList/SBUBaseSelectUserViewController.Deprecated.swift; sourceTree = ""; }; + 829D5FC15D41DA1A55633BCC /* SBUOpenChannelCommonContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelCommonContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUOpenChannelCommonContentView.swift; sourceTree = ""; }; + 8329F074DD38B41DFA67FC16 /* SBUFeedNotificationChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.swift; sourceTree = ""; }; 83CEC3753C538D5BF2CA66F0 /* SampleManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleManager.swift; sourceTree = ""; }; - 83D1437997DEB6968F2EC2FB /* SBULabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULabel.swift; path = "../Sources/View/Life cycles/SBULabel.swift"; sourceTree = ""; }; - 83EBCC4EE4DD8257F4CA32B1 /* SBUGroupChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.swift; path = ../Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.swift; sourceTree = ""; }; - 840025E10C4D2DDD5EE017D8 /* SBUTemplateType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTemplateType.swift; path = ../Sources/Manager/SBUTemplateType.swift; sourceTree = ""; }; 8400C45D0E11FBE37587B089 /* BasicUsagesViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BasicUsagesViewController.xib; sourceTree = ""; }; - 84B88FE3F8E3336F59441204 /* SBUUserMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUUserMessageCellParams.swift; sourceTree = ""; }; - 8527B5D24C2029F5E477847C /* SBUCommonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonItem.swift; path = ../Sources/View/Common/SBUCommonItem.swift; sourceTree = ""; }; + 841AE3E528F833560F4E1D77 /* SBUBaseViewController.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseViewController.Unavailable.swift; path = ../Sources/Deprecated/SBUBaseViewController.Unavailable.swift; sourceTree = ""; }; + 8574ED84A64B555EBC412662 /* SBUGroupChannelListModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.swift; path = ../Sources/Module/ChannelList/GroupChannel/SBUGroupChannelListModule.swift; sourceTree = ""; }; + 85C0714BFA668EDB85894F9D /* SBUCacheManager.PathType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.PathType.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.PathType.swift; sourceTree = ""; }; + 862EF4C61A83BEEE967F9628 /* SBUMessageCellProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageCellProtocol.swift; path = "../Sources/View/Life cycles/SBUMessageCellProtocol.swift"; sourceTree = ""; }; + 863FEC0F9119AB3B46EF8EA4 /* SBUParentMessageInfoView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUParentMessageInfoView.swift; path = ../Sources/View/MessageThread/SBUParentMessageInfoView.swift; sourceTree = ""; }; 8691CE7F26F056317F1508C3 /* CustomUserMessageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomUserMessageCell.swift; sourceTree = ""; }; - 876E7F8C4C488F8438196674 /* SBUCreateChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelModule.List.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateChannelModule.List.swift; sourceTree = ""; }; - 889F7678C691B2C87260BECF /* SBUSuggestedReplyOptionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSuggestedReplyOptionView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUSuggestedReplyOptionView.swift; sourceTree = ""; }; - 88B9B3E2144119A6083D7E6A /* SBUCategoryFilterCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCategoryFilterCell.swift; path = ../Sources/View/Channel/CategoryFilterCell/SBUCategoryFilterCell.swift; sourceTree = ""; }; - 88F0D1AD67B2A02DFD4A4DCA /* SBUBaseChannelCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelCell.swift; path = ../Sources/View/ChannelList/ChannelCell/SBUBaseChannelCell.swift; sourceTree = ""; }; + 8697D802A32FDDFE7CA0E53F /* SBUMessageReactionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageReactionView.swift; path = ../Sources/View/Channel/Reaction/SBUMessageReactionView.swift; sourceTree = ""; }; + 870A7BFC025E57EC8BA10FA5 /* SBUGroupChannelPushSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsViewController.swift; path = ../Sources/View/NotificationSettings/SBUGroupChannelPushSettingsViewController.swift; sourceTree = ""; }; + 875ED58CFDDA04F2E44E2C27 /* SBUToastView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUToastView.swift; path = ../Sources/View/Common/Toast/SBUToastView.swift; sourceTree = ""; }; + 877084DBA5955D3BF90AABAE /* SBUOpenChannelUnknownMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelUnknownMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelUnknownMessageCell.swift; sourceTree = ""; }; + 8797B8947A05E6961559FC70 /* SBUGroupChannelCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelCell.swift; path = ../Sources/View/ChannelList/ChannelCell/SBUGroupChannelCell.swift; sourceTree = ""; }; + 87C2270A9B32D59276A9A61C /* SBUMessageDateView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageDateView.swift; path = ../Sources/View/Channel/CellView/SBUMessageDateView.swift; sourceTree = ""; }; + 87D21FD81BE3D86B64E101A5 /* SBUHorizontalSuggestedReplyOptionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUHorizontalSuggestedReplyOptionView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUHorizontalSuggestedReplyOptionView.swift; sourceTree = ""; }; + 87EF2A05B984D8F621163298 /* SBUConfig.Common.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.Common.swift; path = ../Sources/Configuration/SBUConfig.Common.swift; sourceTree = ""; }; + 8906F1A56ED44007FBDF7CFD /* SBUGroupChannelViewController.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelViewController.Unavailable.swift; path = ../Sources/Deprecated/Channel/SBUGroupChannelViewController.Unavailable.swift; sourceTree = ""; }; 890D8BFBF250A19F94A79665 /* BusinessMessagingSelectionViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BusinessMessagingSelectionViewController.xib; sourceTree = ""; }; - 890E8C4360AAE2F581975028 /* SBUChatNotificationChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/Notifications/SBUChatNotificationChannelModule.Deprecated.swift; sourceTree = ""; }; - 891A746F3838DAC98E12433E /* SBUPermissionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPermissionManager.swift; path = ../Sources/Manager/SBUPermissionManager.swift; sourceTree = ""; }; - 89338A5AE3FF6CB0FEBCF032 /* SBUSelectablePhotoViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSelectablePhotoViewController.swift; path = ../Sources/View/Common/PhotoLibrary/SBUSelectablePhotoViewController.swift; sourceTree = ""; }; 897288F81F1F785225072583 /* LiveStreamChannelListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveStreamChannelListViewModel.swift; sourceTree = ""; }; 899E2ADDC3C3A19F2D429597 /* ChannelListCustomManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelListCustomManager.swift; sourceTree = ""; }; - 89A7FB5F83E297EF2F0699B7 /* BaseMesssage+SBUIKit.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "BaseMesssage+SBUIKit.Deprecated.swift"; path = "../Sources/Deprecated/BaseMesssage+SBUIKit.Deprecated.swift"; sourceTree = ""; }; - 8A2E136580924E1911C1BDFF /* SBUTheme+Type.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SBUTheme+Type.swift"; path = "../Sources/Theme/SBUTheme+Type.swift"; sourceTree = ""; }; - 8AFA7E902B856644158A8A60 /* SBUMessageTemplate.Syntax.Types.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Syntax.Types.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Types.swift; sourceTree = ""; }; - 8B966EB8AB52BEFCD3C0ECF9 /* SBUCacheManager.File.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.File.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.File.swift; sourceTree = ""; }; - 8C20A075EE6772B0E0C79F30 /* SBUCommonContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUCommonContentView.swift; sourceTree = ""; }; - 8C55837A6B6EB88A6FEE1FD6 /* SBUBaseChannelSettingsViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsViewController.Deprecated.swift; path = ../Sources/Deprecated/ChannelSettings/SBUBaseChannelSettingsViewController.Deprecated.swift; sourceTree = ""; }; - 8CE127AC25B1E03735523FE7 /* SBUGroupChannelSettingCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingCell.swift; path = ../Sources/View/ChannelSettings/Cell/SBUGroupChannelSettingCell.swift; sourceTree = ""; }; + 89AA3B80AA07FD6AA83067C9 /* SBUViewControllerSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUViewControllerSet.swift; path = ../Sources/View/SBUViewControllerSet.swift; sourceTree = ""; }; + 8BB7D9DAF81AA000BEB6F000 /* SBUModerationsViewModel.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsViewModel.Deprecated.swift; path = ../Sources/Deprecated/Moderations/SBUModerationsViewModel.Deprecated.swift; sourceTree = ""; }; 8CE46B6A8BC32C4E80DD8CA4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 8D3C4F194B98FEC243B2203D /* SBUToastType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUToastType.swift; path = ../Sources/View/Common/Toast/SBUToastType.swift; sourceTree = ""; }; - 8E39C97839657F8471D6BDD6 /* SBUBaseChannelSettingsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsModule.Header.swift; path = ../Sources/Module/ChannelSettings/SBUBaseChannelSettingsModule.Header.swift; sourceTree = ""; }; - 8F1BF3E729261E2B6B93B279 /* SBUGlobalCustomParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGlobalCustomParams.swift; path = ../Sources/SBUGlobalCustomParams.swift; sourceTree = ""; }; + 8E6A4FDA788BC9DD9B880AFA /* SBUGroupChannelPushSettingsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsModule.swift; path = ../Sources/Module/NotificationSettings/SBUGroupChannelPushSettingsModule.swift; sourceTree = ""; }; 8F3E74E3C6D05FAC47D2B7FE /* BasicUsagesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicUsagesView.swift; sourceTree = ""; }; - 8FD7BB24F69EE0C3973B92C3 /* SBUMessageReactionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageReactionView.swift; path = ../Sources/View/Channel/Reaction/SBUMessageReactionView.swift; sourceTree = ""; }; + 8F6224ED2E1D6F26238669BF /* SBUConstant.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConstant.swift; path = ../Sources/Constant/SBUConstant.swift; sourceTree = ""; }; + 8F81F37811DBBF0C6750F046 /* Assets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = ../Sources/Resource/Assets.xcassets; sourceTree = ""; }; 9025529DFA82D4C194EB5391 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 90835C2299445B0E4408124B /* SBUOpenChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUOpenChannelViewModel.swift; sourceTree = ""; }; - 91B75E60CD5359A041DB6DE2 /* SBUCreateChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelModule.Header.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateChannelModule.Header.swift; sourceTree = ""; }; - 91BFD3F9C6F6D851B14E39E9 /* SBUGroupChannelSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsViewController.swift; path = ../Sources/View/ChannelSettings/SBUGroupChannelSettingsViewController.swift; sourceTree = ""; }; - 929C9FCFB2007BB7E70959DD /* SBUMessageTemplate.Syntax.Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Syntax.Item.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Item.swift; sourceTree = ""; }; - 92F377DEB112155C99CC552E /* SBUBaseChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewController.swift; path = ../Sources/View/Channel/SBUBaseChannelViewController.swift; sourceTree = ""; }; + 905EA788F69B2FB8D289270B /* SBUTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTheme.swift; path = ../Sources/Theme/SBUTheme.swift; sourceTree = ""; }; + 916F05CC3FD62B1EFF69F984 /* URL+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+SBUIKit.swift"; path = "../Sources/Extension/URL+SBUIKit.swift"; sourceTree = ""; }; + 924DC6DE64F7D68922F0BD4A /* SBUMessageTemplateCell.MessageTemplateLayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateCell.MessageTemplateLayer.swift; path = ../Sources/View/Channel/MessageCell/SBUMessageTemplateCell.MessageTemplateLayer.swift; sourceTree = ""; }; + 9253D190106102D9D927B1B8 /* SBUGroupChannelListModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.Deprecated.swift; path = ../Sources/Deprecated/Module/ChannelList/SBUGroupChannelListModule.Deprecated.swift; sourceTree = ""; }; + 92B078B3E4C8CB5D02351FDE /* SBUAdminMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAdminMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUAdminMessageCellParams.swift; sourceTree = ""; }; 932048A2DF2D18C5E7B0241C /* CustomSampleEnums.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomSampleEnums.swift; sourceTree = ""; }; - 93F0796E438A3E19F039537B /* SBUMessageSearchModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchModule.swift; path = ../Sources/Module/MessageSearch/SBUMessageSearchModule.swift; sourceTree = ""; }; - 958E583E5420CED500AE56CB /* SBUExtendedMessagePayloadCustomViewFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUExtendedMessagePayloadCustomViewFactory.swift; path = ../Sources/View/Channel/MessageCell/CustomView/SBUExtendedMessagePayloadCustomViewFactory.swift; sourceTree = ""; }; - 95A6A22BFC57DD8576BA395B /* SBUChatNotificationChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUChatNotificationChannelViewModel.swift; sourceTree = ""; }; - 964EF76CD4B76CCB680AD5EC /* SBUUnderLineTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUnderLineTextField.swift; path = ../Sources/View/Common/SBUUnderLineTextField.swift; sourceTree = ""; }; - 965CDE99D3CE7B2C8878BF20 /* SBUViewLifeCycle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUViewLifeCycle.swift; path = "../Sources/View/Life cycles/SBUViewLifeCycle.swift"; sourceTree = ""; }; + 9398026B4E2F0089B2EFF389 /* SBUAvailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAvailable.swift; path = ../Sources/SBUAvailable.swift; sourceTree = ""; }; + 93F18D0A20AD4E2528411D7E /* SBUTheme+MessageTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SBUTheme+MessageTemplate.swift"; path = "../Sources/Template/SBUTheme+MessageTemplate.swift"; sourceTree = ""; }; + 94160588974EDDA4EBAADDF7 /* SBUBaseSelectUserViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserViewController.swift; path = ../Sources/View/SelectUser/SBUBaseSelectUserViewController.swift; sourceTree = ""; }; + 947C228F35B28207F57BF864 /* SBUFormViewParams.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFormViewParams.Deprecated.swift; path = ../Sources/Deprecated/SBUFormViewParams.Deprecated.swift; sourceTree = ""; }; + 947C7D3725CAABA7688DC140 /* SBUOpenChannelModule.Media.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.Media.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.Media.swift; sourceTree = ""; }; + 94B1F00704771FF3281A9EE4 /* SBUFeedbackViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedbackViewParams.swift; path = ../Sources/View/Channel/MessageCell/Feedback/SBUFeedbackViewParams.swift; sourceTree = ""; }; + 94DBF4C540EFF4387E7269B0 /* SBUQuotedBaseMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedBaseMessageView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/SBUQuotedBaseMessageView.swift; sourceTree = ""; }; + 95C535404C3F77E48A02987C /* SBUCreateOpenChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelModule.Header.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateOpenChannelModule.Header.swift; sourceTree = ""; }; 9663C9727C1B5E234A8A18C5 /* MySettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MySettingsViewController.swift; sourceTree = ""; }; - 969E0A8ADC1B8381ACBA1B1F /* SBUColorSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUColorSet.swift; path = ../Sources/Theme/SBUColorSet.swift; sourceTree = ""; }; + 969014C3CE65DBB59C133FF1 /* SBUMultipleFilesMessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMultipleFilesMessageCollectionViewCell.swift; path = ../Sources/View/Channel/MessageCell/MultipleFilesMessage/SBUMultipleFilesMessageCollectionViewCell.swift; sourceTree = ""; }; 96AF77F22C3689DA980F0EFF /* CustomUserCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomUserCell.swift; sourceTree = ""; }; 96B138E411365EF1895EFC0A /* CustomAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomAlertController.swift; sourceTree = ""; }; - 96C73D47D58841602582626D /* SBUInviteUserModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserModule.Header.swift; path = ../Sources/Module/SelectUser/InviteUser/SBUInviteUserModule.Header.swift; sourceTree = ""; }; - 97688B2278AFD93CCAF21CE8 /* CGSize+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGSize+SBUIKit.swift"; path = "../Sources/Extension/CGSize+SBUIKit.swift"; sourceTree = ""; }; - 977B30FD3D3695ACF7EA24E1 /* Collection+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Collection+SBUIKit.swift"; path = "../Sources/Extension/Collection+SBUIKit.swift"; sourceTree = ""; }; - 9829D64688D3B09D3D150D9C /* SBUMessageSearchModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchModule.Header.swift; path = ../Sources/Module/MessageSearch/SBUMessageSearchModule.Header.swift; sourceTree = ""; }; - 984899098C13FC5DC9C03E99 /* SBUMessageFormFallbackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormFallbackView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormFallbackView.swift; sourceTree = ""; }; - 98B2C88EF2BFC124EE8E9E82 /* String+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+SBUIKit.swift"; path = "../Sources/Extension/String+SBUIKit.swift"; sourceTree = ""; }; - 98CD0CD854A6E398B24F4ABA /* SBUBaseSelectUserViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserViewModel.swift; path = ../Sources/ViewModel/SelectUser/SBUBaseSelectUserViewModel.swift; sourceTree = ""; }; - 9A3813E4ACFA04D7DD217CF7 /* SBUMessageThreadViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadViewModel.swift; path = ../Sources/ViewModel/MessageThread/SBUMessageThreadViewModel.swift; sourceTree = ""; }; - 9AC0696DB83EED0C73CDED13 /* SendbirdChat+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SendbirdChat+SBUIKit.swift"; path = "../Sources/Extension/ChatSDK/SendbirdChat+SBUIKit.swift"; sourceTree = ""; }; - 9AD3DBE7340A752112C57014 /* SBUBaseChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.Header.swift; path = ../Sources/Module/Channel/SBUBaseChannelModule.Header.swift; sourceTree = ""; }; - 9B5DBB1A9678F7DC7418F9F7 /* SBUConfig.Common.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.Common.swift; path = ../Sources/Configuration/SBUConfig.Common.swift; sourceTree = ""; }; - 9B72B84D8197B89255974E36 /* SBUChatNotificationChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelModule.Header.swift; path = ../Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.Header.swift; sourceTree = ""; }; - 9D0E23C23196DDA9D880BDB6 /* SBUCommonViewControllerSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonViewControllerSet.swift; path = ../Sources/View/Common/SBUCommonViewControllerSet.swift; sourceTree = ""; }; + 97154C63DB7911FEA3C7D5BB /* SBUOpenChannelListModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListModule.Header.swift; path = ../Sources/Module/ChannelList/OpenChannel/SBUOpenChannelListModule.Header.swift; sourceTree = ""; }; + 9920BEC6AC62524318D65C4E /* SBULabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULabel.swift; path = "../Sources/View/Life cycles/SBULabel.swift"; sourceTree = ""; }; + 99BE0F27C266AB6A9FC75B09 /* SBUOpenChannelViewController.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelViewController.Unavailable.swift; path = ../Sources/Deprecated/Channel/SBUOpenChannelViewController.Unavailable.swift; sourceTree = ""; }; + 99BE2AE129A67EB04D94E44D /* SBUGroupChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.swift; path = ../Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.swift; sourceTree = ""; }; + 9A29388DC75BF0C2E8DB98BB /* SBUCommonContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUCommonContentView.swift; sourceTree = ""; }; + 9AEDE1414A1D7988C5CF8C11 /* SBULinkClickableTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULinkClickableTextView.swift; path = ../Sources/View/Channel/CellView/SBULinkClickableTextView.swift; sourceTree = ""; }; + 9B6A5EA6AB1BD482B56E9D15 /* SBUMessageSearchModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchModule.Header.swift; path = ../Sources/Module/MessageSearch/SBUMessageSearchModule.Header.swift; sourceTree = ""; }; + 9BA1D1E52A87BE51627AEB53 /* SBUSuggestedMentionList.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSuggestedMentionList.swift; path = ../Sources/View/Channel/MessageInput/SBUSuggestedMentionList.swift; sourceTree = ""; }; + 9BE660373834E053B02FD109 /* SBUPaddingLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPaddingLabel.swift; path = ../Sources/View/Common/SBUPaddingLabel.swift; sourceTree = ""; }; 9D71A9CFA36C34EF4264A465 /* ChannelVC_CustomList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelVC_CustomList.swift; sourceTree = ""; }; 9E08B9CB2AE173E9D2132006 /* UserDefaults+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Ext.swift"; sourceTree = ""; }; - 9E1D18D025A5A7F0D7EA79FC /* SBUMessageTemplateCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUMessageTemplateCellParams.swift; sourceTree = ""; }; - 9E2F629F9B7B99E3AA7B60AE /* SBUTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTheme.swift; path = ../Sources/Theme/SBUTheme.swift; sourceTree = ""; }; - 9E3F17D54D127F0810720DDA /* SBUPropertyWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPropertyWrapper.swift; path = ../Sources/Util/SBUPropertyWrapper.swift; sourceTree = ""; }; 9E4D36D999020A4FE9FD5455 /* MainItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainItemView.swift; sourceTree = ""; }; - 9E5B1130755BC5BD8A5077F6 /* SBUToastView.Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUToastView.Internal.swift; path = ../Sources/View/Common/Toast/SBUToastView.Internal.swift; sourceTree = ""; }; - 9EAE8B53101F00B23803E524 /* SBUUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUtils.swift; path = ../Sources/Util/SBUUtils.swift; sourceTree = ""; }; - 9FCA7D97C1CF24D51B41510C /* SBURegisterOperatorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorViewController.swift; path = ../Sources/View/SelectUser/SBURegisterOperatorViewController.swift; sourceTree = ""; }; - A05F9C923BF28E9445A1B437 /* SBURegisterOperatorModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorModule.swift; path = ../Sources/Module/SelectUser/RegisterOperator/SBURegisterOperatorModule.swift; sourceTree = ""; }; - A0E5E6F1298AF3CA7A26F6FC /* SBUMessageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageCache.swift; path = ../Sources/Model/SBUMessageCache.swift; sourceTree = ""; }; - A1AE141723D04C84A99407C4 /* SBUOpenChannelUserMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelUserMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelUserMessageCell.swift; sourceTree = ""; }; - A2686E8D69FDB24F9DCCCB4C /* SBUQuotedMessageViewProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedMessageViewProtocol.swift; path = "../Sources/View/Life cycles/SBUQuotedMessageViewProtocol.swift"; sourceTree = ""; }; + 9EEDE106154195F0E068E508 /* SBUSuggestedReplyOptionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSuggestedReplyOptionView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUSuggestedReplyOptionView.swift; sourceTree = ""; }; + 9F45838C7174CC45916A778F /* SBUMenuSheetViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMenuSheetViewController.swift; path = ../Sources/View/Common/Menu/SBUMenuSheetViewController.swift; sourceTree = ""; }; + A001243167C67B9CE3B7C2E4 /* SBUVoiceContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUVoiceContentView.swift; sourceTree = ""; }; + A02B34286008BA45A18CB10D /* SBUGroupChannelListModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.List.swift; path = ../Sources/Module/ChannelList/GroupChannel/SBUGroupChannelListModule.List.swift; sourceTree = ""; }; + A02BD5E7F272E509F0000D86 /* SBUMessageSearchResultCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchResultCell.swift; path = ../Sources/View/MessageSearch/Cell/SBUMessageSearchResultCell.swift; sourceTree = ""; }; + A0326EBEF25364538B353DD0 /* SBUInviteUserModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserModule.swift; path = ../Sources/Module/SelectUser/InviteUser/SBUInviteUserModule.swift; sourceTree = ""; }; + A183ED99993473DC9210E0A5 /* CGSize+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGSize+SBUIKit.swift"; path = "../Sources/Extension/CGSize+SBUIKit.swift"; sourceTree = ""; }; + A1A00A8435BCB02C95EA2EFD /* SBUOpenChannelSettingsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsModule.swift; path = ../Sources/Module/ChannelSettings/OpenChannel/SBUOpenChannelSettingsModule.swift; sourceTree = ""; }; A2B6689974C44EA060F592DE /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; - A2E86EB1B0B880489D4987EB /* Assets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = ../Sources/Resource/Assets.xcassets; sourceTree = ""; }; - A2F2EF8119C41C81BB2C99C9 /* SBUAdminMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAdminMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUAdminMessageCellParams.swift; sourceTree = ""; }; - A321BEB3FBBF14905C29AA97 /* SBUViewControllerSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUViewControllerSet.swift; path = ../Sources/View/SBUViewControllerSet.swift; sourceTree = ""; }; + A2D36BCF6C98D072930D2FA7 /* SBUCacheManager.MemoryCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.MemoryCache.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.MemoryCache.swift; sourceTree = ""; }; A3837EC8A55E0857C0891EF2 /* MainOpenChannelTabbarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainOpenChannelTabbarController.swift; sourceTree = ""; }; + A3B3D201883F1491F8342F21 /* SBUExtendedMessagePayload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUExtendedMessagePayload.swift; path = ../Sources/Model/SBUExtendedMessagePayload.swift; sourceTree = ""; }; + A3D2D8042865F9BE60419797 /* SBUFileMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFileMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUFileMessageCellParams.swift; sourceTree = ""; }; A3E3D00E36AC37C744C172B2 /* MemberListVC_Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberListVC_Cell.swift; sourceTree = ""; }; A43EA4B59C42F807C76F7B74 /* ChannelVC_AdditionalFeatures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelVC_AdditionalFeatures.swift; sourceTree = ""; }; - A48BA23BAC1C688AE03630C9 /* SBUReactionsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUReactionsViewController.swift; path = ../Sources/View/Channel/Reaction/SBUReactionsViewController.swift; sourceTree = ""; }; - A4C8248B1D3DF0BF523A3C2B /* SBUOpenChannelListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListViewController.swift; path = ../Sources/View/ChannelList/SBUOpenChannelListViewController.swift; sourceTree = ""; }; + A56D56DB9C54E9FCE376D245 /* SBUDashboardConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUDashboardConfig.swift; path = ../Sources/Configuration/SBUDashboardConfig.swift; sourceTree = ""; }; + A5BE03F2141B70169EB47BCC /* UIScrollView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+SBUIKit.swift"; path = "../Sources/Extension/UIScrollView+SBUIKit.swift"; sourceTree = ""; }; + A61FC21BCE19CCA459FCD403 /* SBUModerationsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsModule.Header.swift; path = ../Sources/Module/Moderations/SBUModerationsModule.Header.swift; sourceTree = ""; }; A695D74204D2C1ADDF0BBBE2 /* OpenChannel+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OpenChannel+Ext.swift"; sourceTree = ""; }; A70A4957E68614935FB923A6 /* MainChannelTabbarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainChannelTabbarController.swift; sourceTree = ""; }; - A71B3F2FD57DFBE297702E05 /* SBUMessageInputMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageInputMode.swift; path = ../Sources/View/Channel/MessageInput/SBUMessageInputMode.swift; sourceTree = ""; }; - A7273381A16F8119BC363616 /* SBUReactionCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUReactionCollectionViewCell.swift; path = ../Sources/View/Channel/Reaction/SBUReactionCollectionViewCell.swift; sourceTree = ""; }; - A79AED1DD2EC37D026D96331 /* SBUFormFieldView.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFormFieldView.Deprecated.swift; path = ../Sources/Deprecated/SBUFormFieldView.Deprecated.swift; sourceTree = ""; }; - A7B8F94D8EE3FB46EBA10783 /* SBUBaseChannelSettingsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsViewModel.swift; path = ../Sources/ViewModel/ChannelSettings/SBUBaseChannelSettingsViewModel.swift; sourceTree = ""; }; + A744CC744FFB1405AF8AA00A /* SBUMessageSearchModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchModule.List.swift; path = ../Sources/Module/MessageSearch/SBUMessageSearchModule.List.swift; sourceTree = ""; }; + A7FA6407241634DBD62B76F9 /* SBUExtendedMessagePayloadForUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUExtendedMessagePayloadForUI.swift; path = ../Sources/Model/SBUExtendedMessagePayloadForUI.swift; sourceTree = ""; }; + A81AD21988ED6672CEFD7E07 /* SBUGlobalCustomParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGlobalCustomParams.swift; path = ../Sources/SBUGlobalCustomParams.swift; sourceTree = ""; }; A81DF637316DF97C04D7CECB /* ConnectBusinessMessagingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectBusinessMessagingView.swift; sourceTree = ""; }; A8338080AC9AE1F8F89DFF05 /* CommunityChannelListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityChannelListViewController.swift; sourceTree = ""; }; - A8480353864F682CD4B6BBF9 /* UIImageView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+SBUIKit.swift"; path = "../Sources/Extension/UIImageView+SBUIKit.swift"; sourceTree = ""; }; - A8741AB0AF5C9267260E074F /* SBUTypingIndicatorMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUTypingIndicatorMessageCell.swift; sourceTree = ""; }; + A84C2F13525D60CF3896D4AD /* SBUMessageFormChipsItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormChipsItemView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormChipsItemView.swift; sourceTree = ""; }; + A870630AEBD66BEF9C6EA3FF /* SBUMessageTemplateCellLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateCellLayout.swift; path = ../Sources/View/Channel/MessageCell/SBUMessageTemplateCellLayout.swift; sourceTree = ""; }; A8BCEC00EED3979EA4524D08 /* GeneralSignInViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GeneralSignInViewController.xib; sourceTree = ""; }; - A947D08810EFFB1B6B004BB1 /* SBUOpenChannelSettingsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsViewModel.swift; path = ../Sources/ViewModel/ChannelSettings/SBUOpenChannelSettingsViewModel.swift; sourceTree = ""; }; + A90DE6F47C51A871EC1231DC /* SBUBaseChannelListViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListViewModel.swift; path = ../Sources/ViewModel/ChannelList/SBUBaseChannelListViewModel.swift; sourceTree = ""; }; + A934950C52F32BCFB343DC02 /* NSLayoutConstraint+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSLayoutConstraint+SBUIKit.swift"; path = "../Sources/Extension/Shared/NSLayoutConstraint+SBUIKit.swift"; sourceTree = ""; }; A955962B69D2F809DEE4655F /* ChannelListVC_Overriding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelListVC_Overriding.swift; sourceTree = ""; }; - A9F2076E63837BFBB449A82C /* SBUHorizontalSuggestedReplyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUHorizontalSuggestedReplyView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUHorizontalSuggestedReplyView.swift; sourceTree = ""; }; - AA565082C3C3A3C9CAFA572D /* SBUMessageSearchViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchViewController.swift; path = ../Sources/View/MessageSearch/SBUMessageSearchViewController.swift; sourceTree = ""; }; + A9645E038A02078E94025F0D /* SBUCacheManager.Config.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.Config.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.Config.swift; sourceTree = ""; }; + A98D0571FF12C2682337FF1D /* SBUCreateOpenChannelModule.ProfileInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelModule.ProfileInput.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateOpenChannelModule.ProfileInput.swift; sourceTree = ""; }; AA8781BA2734284427927163 /* CustomNewMessageInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNewMessageInfo.swift; sourceTree = ""; }; - AA98D7A26F90ED5D3C8D0552 /* SBUConfig.Base.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.Base.swift; path = ../Sources/Configuration/SBUConfig.Base.swift; sourceTree = ""; }; - AAFC011AF7306E36EB8FCC30 /* SBUCommonModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonModule.swift; path = ../Sources/Module/Common/SBUCommonModule.swift; sourceTree = ""; }; - AC42BC4023ED4C214280A980 /* SBULayoutableButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULayoutableButton.swift; path = ../Sources/View/Common/SBULayoutableButton.swift; sourceTree = ""; }; - ACA0413BCD82C337FEB653FB /* QuotedFileCommonContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuotedFileCommonContentView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/QuotedFileCommonContentView.swift; sourceTree = ""; }; - AD6EBB6238C0E6B3288EFB7A /* SBUGroupChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.Header.swift; path = ../Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.Header.swift; sourceTree = ""; }; - AD7228CF5F19E467365AAB04 /* SBUSuggestedMentionList.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSuggestedMentionList.swift; path = ../Sources/View/Channel/MessageInput/SBUSuggestedMentionList.swift; sourceTree = ""; }; - AE1B8A7DEC66855D188B1B3A /* SBUMentionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMentionManager.swift; path = ../Sources/Util/SBUMentionManager.swift; sourceTree = ""; }; - AEBB33A58E1762A5864B199E /* SBUChannelInfoHeaderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelInfoHeaderView.swift; path = ../Sources/View/Channel/Header/SBUChannelInfoHeaderView.swift; sourceTree = ""; }; - AFB7154FE781C99D4007E411 /* SBUBaseChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.List.swift; path = ../Sources/Module/Channel/SBUBaseChannelModule.List.swift; sourceTree = ""; }; - B02CD640F8C25F84FAEC732E /* SBUMessageThreadViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadViewController.swift; path = ../Sources/View/MessageThread/SBUMessageThreadViewController.swift; sourceTree = ""; }; + AA96EB90B623A2FBD7CCE9DC /* UIColor+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+SBUIKit.swift"; path = "../Sources/Extension/Shared/UIColor+SBUIKit.swift"; sourceTree = ""; }; + ABFA71E5A451DB78DF62B5F0 /* SBUMessageTemplate.RendererType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.RendererType.swift; path = ../Sources/Template/SBUMessageTemplate.RendererType.swift; sourceTree = ""; }; + AE8FBBBE3C12F5EE9E7BAAD0 /* SBUChatNotificationChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelModule.swift; path = ../Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.swift; sourceTree = ""; }; + AEBF6CAB375E4C0A98B3703F /* SBUBaseChannelCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelCell.swift; path = ../Sources/View/ChannelList/ChannelCell/SBUBaseChannelCell.swift; sourceTree = ""; }; + AFEF2B7C6374DF55580D0732 /* SBUTypingMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUTypingMessageCellParams.swift; sourceTree = ""; }; + B0301C9D577F51D4A4331FAE /* SBUGroupChannelListModule.Common.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.Common.swift; path = ../Sources/Module/ChannelList/GroupChannel/SBUGroupChannelListModule.Common.swift; sourceTree = ""; }; + B0CF33E9AF61E3D65FEE0C31 /* SBUBaseSelectUserModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserModule.List.swift; path = ../Sources/Module/SelectUser/SBUBaseSelectUserModule.List.swift; sourceTree = ""; }; B11815F7B056DAADAE9AA1DB /* CreateChannelVC_UserList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateChannelVC_UserList.swift; sourceTree = ""; }; - B16919409D2126B2391F13EC /* SBUCacheManager.NotificationSetting.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.NotificationSetting.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.NotificationSetting.swift; sourceTree = ""; }; + B15D5A49D7BA08FF6852E56B /* SBUGroupChannelListViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListViewModel.swift; path = ../Sources/ViewModel/ChannelList/SBUGroupChannelListViewModel.swift; sourceTree = ""; }; B18CA8B590809EF2D58F4937 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; - B2623C0CBE46E87C8667F172 /* SBUMenuView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMenuView.swift; path = ../Sources/View/Common/Menu/SBUMenuView.swift; sourceTree = ""; }; - B2A0491AA6BA0E7CD100BE3A /* SBUEmojiListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEmojiListViewController.swift; path = ../Sources/View/Channel/Reaction/SBUEmojiListViewController.swift; sourceTree = ""; }; - B2F8D1EB1D894DD952339175 /* SBUQuoteMessageInputViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuoteMessageInputViewParams.swift; path = ../Sources/View/Channel/MessageInput/ViewParams/SBUQuoteMessageInputViewParams.swift; sourceTree = ""; }; - B32083ACA8AD24B96C195022 /* SBUPaddingLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPaddingLabel.swift; path = ../Sources/View/Common/SBUPaddingLabel.swift; sourceTree = ""; }; - B37BAAB79E1B626ED52E4839 /* SBUUserMentionConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMentionConfiguration.swift; path = ../Sources/Configuration/Mention/SBUUserMentionConfiguration.swift; sourceTree = ""; }; - B37FD61195950E1CA39327EC /* SBUMessageSearchResultCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchResultCell.swift; path = ../Sources/View/MessageSearch/Cell/SBUMessageSearchResultCell.swift; sourceTree = ""; }; - B3F69F5FE63EA170346C2652 /* SBUBaseSelectUserModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserModule.Header.swift; path = ../Sources/Module/SelectUser/SBUBaseSelectUserModule.Header.swift; sourceTree = ""; }; - B3FFD5E66EA2EC7853D25F7A /* SBUEnums.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEnums.Deprecated.swift; path = ../Sources/Deprecated/SBUEnums.Deprecated.swift; sourceTree = ""; }; - B4537DE89EF4104AB5A7C665 /* URL+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+SBUIKit.swift"; path = "../Sources/Extension/URL+SBUIKit.swift"; sourceTree = ""; }; - B4BC41F11085BDC53B4A3BA6 /* SBUOpenChannelContentBaseMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelContentBaseMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelContentBaseMessageCell.swift; sourceTree = ""; }; - B643397F995A39D749A46298 /* SBUPhotoCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPhotoCollectionViewCell.swift; path = ../Sources/View/Common/PhotoLibrary/SBUPhotoCollectionViewCell.swift; sourceTree = ""; }; - B6FC93D7B877D701B03AF862 /* SBUNotificationCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationCell.swift; path = ../Sources/View/Channel/MessageCell/NotificationChannel/SBUNotificationCell.swift; sourceTree = ""; }; - B721F21C9C029F3427A0711F /* SBUFormView.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFormView.Deprecated.swift; path = ../Sources/Deprecated/SBUFormView.Deprecated.swift; sourceTree = ""; }; + B2E6F24CC3DECE07E0C46F0A /* SBUMessageThreadModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.List.swift; path = ../Sources/Module/MessageThread/SBUMessageThreadModule.List.swift; sourceTree = ""; }; + B310291234962FDCD219CA29 /* SBULoading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULoading.swift; path = ../Sources/View/Common/SBULoading.swift; sourceTree = ""; }; + B333ECB4F15E7DDDB30886AC /* SBUAdminMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUAdminMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUAdminMessageCell.swift; sourceTree = ""; }; + B448B1F464716E77062E6426 /* SBUOpenChannelSettingsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsModule.List.swift; path = ../Sources/Module/ChannelSettings/OpenChannel/SBUOpenChannelSettingsModule.List.swift; sourceTree = ""; }; + B59A9F2CE3947A76617E76D8 /* SBUGroupChannelPushSettingsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsModule.Header.swift; path = ../Sources/Module/NotificationSettings/SBUGroupChannelPushSettingsModule.Header.swift; sourceTree = ""; }; + B6AA96123433E0E7D8AEAA80 /* SBUUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUtils.swift; path = ../Sources/Util/SBUUtils.swift; sourceTree = ""; }; + B6DA5302A886FEF8E44B9CF8 /* SBUMentionLimitGuideCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMentionLimitGuideCell.swift; path = ../Sources/View/Channel/MessageInput/SBUMentionLimitGuideCell.swift; sourceTree = ""; }; B7336ED3EEE080DDF052F158 /* LiveStreamChannelCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveStreamChannelCell.swift; sourceTree = ""; }; - B78CAA75DD967758186FF283 /* SBUEnums.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEnums.swift; path = ../Sources/Enums/SBUEnums.swift; sourceTree = ""; }; - B79C9122DCF777C65D083D28 /* SBUBaseChannelListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListViewController.swift; path = ../Sources/View/ChannelList/SBUBaseChannelListViewController.swift; sourceTree = ""; }; - B7D92122E4097DC305A8145C /* SBUChannelStateBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelStateBanner.swift; path = ../Sources/View/Channel/ChannelStateBanner/SBUChannelStateBanner.swift; sourceTree = ""; }; - B8143A7D6E5428869072F8F3 /* SBUVoiceMessageConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceMessageConfiguration.swift; path = ../Sources/Configuration/VoiceMessage/SBUVoiceMessageConfiguration.swift; sourceTree = ""; }; - B851C2061AD8CF9384B327AB /* SBUFontSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFontSet.swift; path = ../Sources/Theme/SBUFontSet.swift; sourceTree = ""; }; - B8CF9CD6B1B63416319E375C /* Array+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+SBUIKit.swift"; path = "../Sources/Extension/Array+SBUIKit.swift"; sourceTree = ""; }; - B8FBFA88F380C0DB3B7952DF /* SBUOpenChannelSettingsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsModule.List.swift; path = ../Sources/Module/ChannelSettings/OpenChannel/SBUOpenChannelSettingsModule.List.swift; sourceTree = ""; }; + B7FD314A275F9EE69C49BE2B /* SBUDateFormatSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUDateFormatSet.swift; path = ../Sources/Constant/SBUDateFormatSet.swift; sourceTree = ""; }; + B80713CB5871E2BC5C1F647E /* SBUBaseChannelViewController.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewController.Unavailable.swift; path = ../Sources/Deprecated/Channel/SBUBaseChannelViewController.Unavailable.swift; sourceTree = ""; }; + B8B39CC4AF578941788CD3E1 /* SBUNewNotificationInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNewNotificationInfo.swift; path = ../Sources/View/Channel/NewMessageInfo/SBUNewNotificationInfo.swift; sourceTree = ""; }; + B917035432DE51B511A7D1D5 /* SendbirdUI.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SendbirdUI.Deprecated.swift; path = ../Sources/Deprecated/SendbirdUI.Deprecated.swift; sourceTree = ""; }; B943C8F50DD6CA3985E33CF6 /* GeneralSignInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSignInViewController.swift; sourceTree = ""; }; - B98CEE0D6FB455F9CAC7090F /* SBUContentBaseMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUContentBaseMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUContentBaseMessageCell.swift; sourceTree = ""; }; - B991AD06D53B6F51F10B1FED /* SBUVerticalSuggestedReplyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVerticalSuggestedReplyView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUVerticalSuggestedReplyView.swift; sourceTree = ""; }; - B9EA14FFC7C4F584FBF37935 /* SBUModerationsViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsViewController.Deprecated.swift; path = ../Sources/Deprecated/Moderations/SBUModerationsViewController.Deprecated.swift; sourceTree = ""; }; - BA9B3CA61FB46D5F57319572 /* SBUMessageDateView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageDateView.swift; path = ../Sources/View/Channel/CellView/SBUMessageDateView.swift; sourceTree = ""; }; - BAC9F6BE599CBC05780C6B5E /* SBUMention.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMention.swift; path = ../Sources/Model/SBUMention.swift; sourceTree = ""; }; + BA1939BC6F004959CE98D410 /* SBUQuotedBaseMessageViewParams.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedBaseMessageViewParams.Deprecated.swift; path = ../Sources/Deprecated/Channel/MessageCell/Replies/SBUQuotedBaseMessageViewParams.Deprecated.swift; sourceTree = ""; }; + BA98EA0CCF6A7271C73BD7DE /* SBUUserMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUUserMessageCellParams.swift; sourceTree = ""; }; BB4867F84990B821D04F2722 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; - BB4928B600EA46E7FC79D7AB /* SBUFeedNotificationChannelModule.CategoryFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.CategoryFilter.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.CategoryFilter.swift; sourceTree = ""; }; - BBDDDF4C45F5BFA4AA239DFE /* SBUMessageTemplate.Renderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Renderer.swift; path = ../Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.swift; sourceTree = ""; }; - BCC42C303A5CE61E0137026B /* SBUUserListModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListModule.Deprecated.swift; path = ../Sources/Deprecated/Module/UserList/SBUUserListModule.Deprecated.swift; sourceTree = ""; }; - BE1E93B8FCF62DE1F85F506E /* MessageForm+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MessageForm+SBUIKit.swift"; path = "../Sources/Extension/ChatSDK/MessageForm+SBUIKit.swift"; sourceTree = ""; }; - BF651C402E1392F0FB82A70F /* SBUOpenChannelViewController.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelViewController.Unavailable.swift; path = ../Sources/Deprecated/Channel/SBUOpenChannelViewController.Unavailable.swift; sourceTree = ""; }; - BF820D8BAB863E12FE3420E5 /* SBUModerationCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationCell.swift; path = ../Sources/View/ChannelSettings/Cell/SBUModerationCell.swift; sourceTree = ""; }; - BFA99DB33C37D0282FDD6ACB /* Formatter+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Formatter+SBUIKit.swift"; path = "../Sources/Extension/Formatter+SBUIKit.swift"; sourceTree = ""; }; - C117838EC1C4DBB199BC3F12 /* UITableView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITableView+SBUIKit.swift"; path = "../Sources/Extension/UITableView+SBUIKit.swift"; sourceTree = ""; }; - C11814B0E6E55BA5279B168D /* SBUBaseChannelViewController.Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewController.Keyboard.swift; path = ../Sources/View/Channel/SBUBaseChannelViewController.Keyboard.swift; sourceTree = ""; }; - C143F7A0A06B7DE4AC97C363 /* SBUBaseChannelSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsViewController.swift; path = ../Sources/View/ChannelSettings/SBUBaseChannelSettingsViewController.swift; sourceTree = ""; }; - C16EF2A21EB7BC1B7810BE0B /* SBUUserNameView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserNameView.swift; path = ../Sources/View/Channel/CellView/SBUUserNameView.swift; sourceTree = ""; }; - C1DBEACF53A1FEE32AEA88EE /* SBUMessageFormChipsItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormChipsItemView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormChipsItemView.swift; sourceTree = ""; }; - C2BCE6697D7354D59AB6D9BD /* SBUOpenChannelCommonContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelCommonContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUOpenChannelCommonContentView.swift; sourceTree = ""; }; - C2EB356C521D5C78FEA38B03 /* SBUScrollPostionConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUScrollPostionConfiguration.swift; path = ../Sources/Configuration/ScrollPostion/SBUScrollPostionConfiguration.swift; sourceTree = ""; }; - C2EFAAD40957BEB30ADC9532 /* SBUGroupChannelViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelViewController.Deprecated.swift; path = ../Sources/Deprecated/Channel/SBUGroupChannelViewController.Deprecated.swift; sourceTree = ""; }; - C3690DECFBFEF36D5E20F7DC /* SBUMessageTemplateCellLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateCellLayout.swift; path = ../Sources/View/Channel/MessageCell/SBUMessageTemplateCellLayout.swift; sourceTree = ""; }; - C3842E8286E51A6EA5E72371 /* SBUModerationsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsViewModel.swift; path = ../Sources/ViewModel/ChannelSettings/SBUModerationsViewModel.swift; sourceTree = ""; }; - C4A334AF18EE7A1524DDAA02 /* SBUViewModelSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUViewModelSet.swift; path = ../Sources/ViewModel/SBUViewModelSet.swift; sourceTree = ""; }; - C51D591DE56DE28D1141C067 /* SBUCacheManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.swift; sourceTree = ""; }; - C550271EF998CCFDE576AE85 /* SBUOpenChannelCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelCell.swift; path = ../Sources/View/ChannelList/ChannelCell/SBUOpenChannelCell.swift; sourceTree = ""; }; - C5A8B4E3319F47AE4AF2136F /* SBUFeedbackAction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedbackAction.swift; path = ../Sources/Model/SBUFeedbackAction.swift; sourceTree = ""; }; + BD886E49DD2C00DC3173F7D6 /* SBUUserNameView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserNameView.swift; path = ../Sources/View/Channel/CellView/SBUUserNameView.swift; sourceTree = ""; }; + BDCF3CBBEA1829842B656868 /* SBUCreateChannelTypeSelector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelTypeSelector.swift; path = ../Sources/View/SelectUser/CreateChannel/View/SBUCreateChannelTypeSelector.swift; sourceTree = ""; }; + BDF03593AAF01AB7403D97DC /* SBUFeedbackAction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedbackAction.swift; path = ../Sources/Model/SBUFeedbackAction.swift; sourceTree = ""; }; + BDFE0937BADAE1A6B4BF3DB0 /* UITableView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITableView+SBUIKit.swift"; path = "../Sources/Extension/UITableView+SBUIKit.swift"; sourceTree = ""; }; + BE86374D9622697D836E37EC /* SBUOpenChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelViewController.swift; path = ../Sources/View/Channel/SBUOpenChannelViewController.swift; sourceTree = ""; }; + BEB459518675E36121D8503F /* SBUFeedNotificationChannelModule.CategoryFilter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelModule.CategoryFilter.swift; path = ../Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.CategoryFilter.swift; sourceTree = ""; }; + BF5E8919EDF3DFE91A6EAF7D /* SBURegisterOperatorModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorModule.List.swift; path = ../Sources/Module/SelectUser/RegisterOperator/SBURegisterOperatorModule.List.swift; sourceTree = ""; }; + C1404FA36259746705B6E2A3 /* SBUModerationCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationCell.swift; path = ../Sources/View/ChannelSettings/Cell/SBUModerationCell.swift; sourceTree = ""; }; + C1A08081453CA8144B2347FF /* SBUConfig.OpenChannel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.OpenChannel.swift; path = ../Sources/Configuration/SBUConfig.OpenChannel.swift; sourceTree = ""; }; + C1B987C3F4B8C128AC650DF5 /* SBUSuggestedReplyViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSuggestedReplyViewParams.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/ViewParams/SBUSuggestedReplyViewParams.swift; sourceTree = ""; }; + C38D0D322E0898F77B513394 /* UIButton+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+SBUIKit.swift"; path = "../Sources/Extension/UIButton+SBUIKit.swift"; sourceTree = ""; }; + C4C2524E1433BAF65CDB5CF8 /* SBUBaseChannelSettingCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingCell.swift; path = ../Sources/View/ChannelSettings/Cell/SBUBaseChannelSettingCell.swift; sourceTree = ""; }; + C55AB72C32B0B260DB39E839 /* SBUBaseMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUBaseMessageCellParams.swift; sourceTree = ""; }; C65E9DA0B945AC6F2978B9E6 /* UIcolor+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIcolor+Ext.swift"; sourceTree = ""; }; C7368083040846A8BFD1A786 /* CreateChannelCustomManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateChannelCustomManager.swift; sourceTree = ""; }; - C7A1219BC8738C3D6C42F341 /* SBUModerationsModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsModule.List.swift; path = ../Sources/Module/Moderations/SBUModerationsModule.List.swift; sourceTree = ""; }; - C7F59295553F372937A267AE /* UIButton+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+SBUIKit.swift"; path = "../Sources/Extension/UIButton+SBUIKit.swift"; sourceTree = ""; }; - C845B62CD493FD6875E9C3D9 /* SBUMessageTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.swift; path = ../Sources/MessageTemplate/SBUMessageTemplate.swift; sourceTree = ""; }; - C8B19DA6FA7D4FD35CD58F44 /* SBUMessageFormSingleTextItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormSingleTextItemView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormSingleTextItemView.swift; sourceTree = ""; }; - C93B64D39C0831A604871F1A /* SBUCacheManager.Version.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.Version.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.Version.swift; sourceTree = ""; }; - C97CC7AA39F3DEE6663FB116 /* UIImage+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+SBUIKit.swift"; path = "../Sources/Extension/UIImage+SBUIKit.swift"; sourceTree = ""; }; - CAB200A44A56BB6B4322FD77 /* SBUBaseFileContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseFileContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUBaseFileContentView.swift; sourceTree = ""; }; - CB0A3CB6F711BD58217836B3 /* SBUOpenChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.swift; sourceTree = ""; }; - CBA7B36A02323800A3015055 /* SBUMessageSearchModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchModule.Deprecated.swift; path = ../Sources/Deprecated/Module/MessageSearch/SBUMessageSearchModule.Deprecated.swift; sourceTree = ""; }; - CBEF8CB410B525E4FBDE9C59 /* SBUInviteUserViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserViewModel.swift; path = ../Sources/ViewModel/SelectUser/SBUInviteUserViewModel.swift; sourceTree = ""; }; + C78A7319F85E70BFC808F143 /* SBUMessageTemplate.Action.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Action.swift; path = ../Sources/Template/SBUMessageTemplate.Action.swift; sourceTree = ""; }; + C796BD143FCD81CEF30E13CE /* SBUFeedNotificationChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelViewController.swift; path = ../Sources/View/Channel/SBUFeedNotificationChannelViewController.swift; sourceTree = ""; }; + C813B96E07AD8AF029EF524B /* SBUCategoryFilterCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCategoryFilterCell.swift; path = ../Sources/View/Channel/CategoryFilterCell/SBUCategoryFilterCell.swift; sourceTree = ""; }; + C8AF2A3C52D2591C7C41208A /* SBUGroupChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUGroupChannelViewModel.swift; sourceTree = ""; }; + CA7A34D778672B5428681438 /* SBUMessageInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageInputView.swift; path = ../Sources/View/Channel/MessageInput/SBUMessageInputView.swift; sourceTree = ""; }; + CA8609A278195715CFD10191 /* SBUInviteUserModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserModule.Header.swift; path = ../Sources/Module/SelectUser/InviteUser/SBUInviteUserModule.Header.swift; sourceTree = ""; }; + CA91BE839D9DE47DE817D68B /* SBUActionSheet.Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUActionSheet.Item.swift; path = ../Sources/View/Common/ActionSheet/SBUActionSheet.Item.swift; sourceTree = ""; }; + CAFEA35277DDBD7BD1D23617 /* SBUOpenChannelImageContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelImageContentView.swift; path = ../Sources/View/Channel/MessageCell/FileMessageContentView/SBUOpenChannelImageContentView.swift; sourceTree = ""; }; + CB817CC8FF7C226396877617 /* SBUContentBaseMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUContentBaseMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUContentBaseMessageCell.swift; sourceTree = ""; }; + CC3D4969A0B940A716B6606A /* SBUTypingIndicatorInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorInfo.swift; path = ../Sources/Model/SBUTypingIndicatorInfo.swift; sourceTree = ""; }; CC5C18901EE173180BB25C9F /* ConnectView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ConnectView.xib; sourceTree = ""; }; - CC924A6238617EECFFEF6F60 /* SBUFeedNotificationCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUFeedNotificationCellParams.swift; sourceTree = ""; }; - CC925CC682F157053C6991C4 /* SBUFeedNotificationChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUFeedNotificationChannelViewModel.swift; sourceTree = ""; }; CD023CFDA0DA56D59A5FA7BB /* ChannelCustomManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelCustomManager.swift; sourceTree = ""; }; - CD315DD060E0A7F6ACF32325 /* SBUModerationsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsModule.swift; path = ../Sources/Module/Moderations/SBUModerationsModule.swift; sourceTree = ""; }; - CDDF8D72848C64E37CB61015 /* SBUQuotedBaseMessageViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedBaseMessageViewParams.swift; path = ../Sources/View/Channel/MessageCell/Replies/ViewParams/SBUQuotedBaseMessageViewParams.swift; sourceTree = ""; }; - CDE8456A5754CEB8284EA838 /* UIScrollView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+SBUIKit.swift"; path = "../Sources/Extension/UIScrollView+SBUIKit.swift"; sourceTree = ""; }; - CE0631DE516FBCB87956BAC3 /* SBUGroupChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelViewController.swift; path = ../Sources/View/Channel/SBUGroupChannelViewController.swift; sourceTree = ""; }; + CD0E13A9E896E2DC26D38FC8 /* MultipleFilesMessage+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MultipleFilesMessage+SBUIKit.swift"; path = "../Sources/Extension/ChatSDK/MultipleFilesMessage+SBUIKit.swift"; sourceTree = ""; }; + CD2C7149B8560A6F2FA73439 /* WeakDelegateStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WeakDelegateStorage.swift; path = ../Sources/Util/WeakDelegateStorage.swift; sourceTree = ""; }; + CD3B2D6BB71315AE3EFA4F82 /* SBUTheme.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTheme.Deprecated.swift; path = ../Sources/Deprecated/SBUTheme.Deprecated.swift; sourceTree = ""; }; CE3094ABD7D9756A038A5AB4 /* LiveStreamChannelListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveStreamChannelListViewController.swift; sourceTree = ""; }; - CEECB941A8FBD37EFEFC553F /* SBUConstant.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConstant.swift; path = ../Sources/Constant/SBUConstant.swift; sourceTree = ""; }; - CF65B7885DCFA75A65D253FF /* SBUMessageTemplate.ImageRatioType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.ImageRatioType.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.ImageRatioType.swift; sourceTree = ""; }; - CFBA75BFD34AA4CB733AFD67 /* SBUBaseSelectUserModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserModule.List.swift; path = ../Sources/Module/SelectUser/SBUBaseSelectUserModule.List.swift; sourceTree = ""; }; - CFBFB5FD5BBC6FBBF82545AD /* SBUGroupChannelViewController.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelViewController.Unavailable.swift; path = ../Sources/Deprecated/Channel/SBUGroupChannelViewController.Unavailable.swift; sourceTree = ""; }; - CFFE0FADB7DF38D0A9529A96 /* SBUBaseMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUBaseMessageCellParams.swift; sourceTree = ""; }; - D010876D601B1A3E11B87018 /* SBUMessageFormMultiTextItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormMultiTextItemView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormMultiTextItemView.swift; sourceTree = ""; }; - D055E1C7D8FB4A8F3552F98E /* SBUGroupChannelPushSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsViewController.swift; path = ../Sources/View/NotificationSettings/SBUGroupChannelPushSettingsViewController.swift; sourceTree = ""; }; - D09DBF0EC83E4E1209BF7031 /* SBUCreateOpenChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/SelectUser/SBUCreateOpenChannelModule.Deprecated.swift; sourceTree = ""; }; - D0A86F2DF4A2A187EDEA0FB8 /* SBUConfig.GroupChannel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUConfig.GroupChannel.swift; path = ../Sources/Configuration/SBUConfig.GroupChannel.swift; sourceTree = ""; }; - D0C29B5B55241C104AB00977 /* SBUMessageFormItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormItemView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormItemView.swift; sourceTree = ""; }; - D1063EB35331F4506C4F0B8F /* SBUTypingIndicatorBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorBubbleView.swift; path = ../Sources/View/Common/SBUTypingIndicatorBubbleView.swift; sourceTree = ""; }; - D1AF51D7CE8D04E799D606E9 /* SBUBaseMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUBaseMessageCell.swift; sourceTree = ""; }; + CE9165E981E2142D92EF4844 /* SBUMessageTemplate.Container.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Container.swift; path = ../Sources/Template/SBUMessageTemplate.Container.swift; sourceTree = ""; }; + CF2C540E9A67901DAF734467 /* SBUScrollPostionConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUScrollPostionConfiguration.swift; path = ../Sources/Configuration/ScrollPostion/SBUScrollPostionConfiguration.swift; sourceTree = ""; }; + D02F80CCE36A240909668D82 /* SBUCoverImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCoverImageView.swift; path = ../Sources/View/Common/SBUCoverImageView.swift; sourceTree = ""; }; + D0D2817787289EFF0DAFBC54 /* SBUMessageFormMultiTextItemView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormMultiTextItemView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormMultiTextItemView.swift; sourceTree = ""; }; + D0EECFE4C75C6F4FBD143730 /* SBUMessageTemplateCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateCell.swift; path = ../Sources/View/Channel/MessageCell/SBUMessageTemplateCell.swift; sourceTree = ""; }; + D121E96E959189C97D6DB359 /* SBUVoiceRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceRecorder.swift; path = ../Sources/Manager/SBUVoiceRecorder.swift; sourceTree = ""; }; + D161DCF76A14D06BB55629B4 /* SBUBaseChannelSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsViewController.swift; path = ../Sources/View/ChannelSettings/SBUBaseChannelSettingsViewController.swift; sourceTree = ""; }; + D1E2BF47235135F0995B3D64 /* SBUOpenChannelListModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListModule.swift; path = ../Sources/Module/ChannelList/OpenChannel/SBUOpenChannelListModule.swift; sourceTree = ""; }; + D21040A4827EEF5E2BD7EAC1 /* SBUOpenChannelCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelCell.swift; path = ../Sources/View/ChannelList/ChannelCell/SBUOpenChannelCell.swift; sourceTree = ""; }; D22C301C4940E6DCA7C64C8D /* BasicUsagesView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BasicUsagesView.xib; sourceTree = ""; }; - D22CAD48F00CAF7563928667 /* SBUUserListModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListModule.Header.swift; path = ../Sources/Module/UserList/SBUUserListModule.Header.swift; sourceTree = ""; }; - D2DDED6713E40ABD4BD1DBE1 /* SBUFormViewParams.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFormViewParams.Deprecated.swift; path = ../Sources/Deprecated/SBUFormViewParams.Deprecated.swift; sourceTree = ""; }; D2F911922A1B0E98CBD9500A /* MetadataViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetadataViewController.swift; sourceTree = ""; }; - D31BB5551F5B0C4B761B4D4A /* SBUOpenChannelModule.Input.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.Input.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.Input.swift; sourceTree = ""; }; + D345015DF5D696480ECF7436 /* SBUCacheManager.Image+FileMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SBUCacheManager.Image+FileMessage.swift"; path = "../Sources/Manager/CacheManager/SBUCacheManager.Image+FileMessage.swift"; sourceTree = ""; }; D387FF3E314AF4F7AFA265F3 /* AIChatBotViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AIChatBotViewController.xib; sourceTree = ""; }; - D3BDD1F1E1C54E7BBF7EF34B /* SBUBaseChannelListViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListViewModel.swift; path = ../Sources/ViewModel/ChannelList/SBUBaseChannelListViewModel.swift; sourceTree = ""; }; - D3FA63D9B60F878938D7C620 /* SBUModerationsModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Moderations/SBUModerationsModule.Deprecated.swift; sourceTree = ""; }; + D38C2A58A5023E3E86F48A24 /* SBUCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCollectionViewCell.swift; path = "../Sources/View/Life cycles/SBUCollectionViewCell.swift"; sourceTree = ""; }; D41DC19666A44BCF0D3C6F9E /* CustomBaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomBaseViewController.swift; sourceTree = ""; }; - D44C845D173AE5DDD1F4C86F /* SBUCreateChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/SelectUser/SBUCreateChannelModule.Deprecated.swift; sourceTree = ""; }; - D4BD0DF774EA634A2B89AF8F /* UIApplication+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIApplication+SBUIKit.swift"; path = "../Sources/Extension/UIApplication+SBUIKit.swift"; sourceTree = ""; }; D52175BB76AF7926133CF704 /* GlobalSetCustomManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalSetCustomManager.swift; sourceTree = ""; }; - D57C491CE4E8339CF2EB880A /* StringProtocol+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "StringProtocol+SBUIKit.swift"; path = "../Sources/Extension/StringProtocol+SBUIKit.swift"; sourceTree = ""; }; - D69A3D78ED90E4089D3C07CD /* SBUBottomSheetController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBottomSheetController.swift; path = ../Sources/View/Common/Menu/SBUBottomSheetController.swift; sourceTree = ""; }; - D75D43D7C8A4332088263FA6 /* SBUChatNotificationCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationCell.swift; path = ../Sources/View/Channel/MessageCell/NotificationChannel/SBUChatNotificationCell.swift; sourceTree = ""; }; - D7FC723CA3B3F942FFBF10FD /* SBUMultipleFilesMessageCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMultipleFilesMessageCollectionView.swift; path = ../Sources/View/Channel/MessageCell/MultipleFilesMessage/SBUMultipleFilesMessageCollectionView.swift; sourceTree = ""; }; + D5769F55C182E1257D255DF6 /* SBUToastView.Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUToastView.Item.swift; path = ../Sources/View/Common/Toast/SBUToastView.Item.swift; sourceTree = ""; }; + D584CA1792D8FC14CA8004D2 /* SBUEnums.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEnums.Deprecated.swift; path = ../Sources/Deprecated/SBUEnums.Deprecated.swift; sourceTree = ""; }; + D675CC2000A8677CD0C1991E /* SBUOpenChannelContentBaseMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelContentBaseMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelContentBaseMessageCell.swift; sourceTree = ""; }; D8BA68D9366EDD742F958A66 /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = ""; }; - D915E9E6C658C2A6B320B54C /* UIColor+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+SBUIKit.swift"; path = "../Sources/Extension/UIColor+SBUIKit.swift"; sourceTree = ""; }; - DA884B9C05518C89428F530D /* SBUStackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUStackView.swift; path = ../Sources/View/Common/SBUStackView.swift; sourceTree = ""; }; - DADE9978AD80649A5C0DF233 /* SBURegisterOperatorModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorModule.Header.swift; path = ../Sources/Module/SelectUser/RegisterOperator/SBURegisterOperatorModule.Header.swift; sourceTree = ""; }; - DAF1B4C2E5F8F0D0D15A31E7 /* SBUEmojiManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEmojiManager.swift; path = ../Sources/Manager/SBUEmojiManager.swift; sourceTree = ""; }; - DCD1091E08A9D9F154CDC2C0 /* SBUInviteUserModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserModule.List.swift; path = ../Sources/Module/SelectUser/InviteUser/SBUInviteUserModule.List.swift; sourceTree = ""; }; - DD0E6B88CC7F9E80C8F6B305 /* SBUGroupChannelListModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.List.swift; path = ../Sources/Module/ChannelList/GroupChannel/SBUGroupChannelListModule.List.swift; sourceTree = ""; }; - DD4E76CA93253D600216657C /* SBUMessageTemplate.Syntax.Styles.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Syntax.Styles.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Styles.swift; sourceTree = ""; }; - DD9F293CB1BA36B9D8D335A8 /* SBUOpenChannelSettingsModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsModule.Deprecated.swift; path = ../Sources/Deprecated/Module/ChannelSettings/SBUOpenChannelSettingsModule.Deprecated.swift; sourceTree = ""; }; - DDBE78CDC2C84B8A02219C0A /* SBUGroupChannelListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListViewController.swift; path = ../Sources/View/ChannelList/SBUGroupChannelListViewController.swift; sourceTree = ""; }; - DE65E9F31BA0AC98929110F3 /* Sequence+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Sequence+SBUIKit.swift"; path = "../Sources/Extension/Sequence+SBUIKit.swift"; sourceTree = ""; }; - DE6C860D49E72966CE515EB5 /* SBUPendingMessageManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPendingMessageManager.swift; path = ../Sources/Manager/SBUPendingMessageManager.swift; sourceTree = ""; }; - DE8F09B00B590998A911E922 /* SBUOpenChannelModule.Media.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelModule.Media.swift; path = ../Sources/Module/Channel/OpenChannel/SBUOpenChannelModule.Media.swift; sourceTree = ""; }; - DE9AD43339DF3FFAFF9E9621 /* SBUCreateChannelViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelViewController.Deprecated.swift; path = ../Sources/Deprecated/CreateChannel/SBUCreateChannelViewController.Deprecated.swift; sourceTree = ""; }; - DEB37194DEE2FBDFBCFC7F81 /* SBUOpenChannelListViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelListViewModel.swift; path = ../Sources/ViewModel/ChannelList/SBUOpenChannelListViewModel.swift; sourceTree = ""; }; - DEE2B4EFD32A67B6176A299A /* SBUGroupChannelListModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListModule.Deprecated.swift; path = ../Sources/Deprecated/Module/ChannelList/SBUGroupChannelListModule.Deprecated.swift; sourceTree = ""; }; + D9692FF050F42210BFCF6B3C /* SBUViewModelDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUViewModelDelegate.swift; path = ../Sources/ViewModel/SBUViewModelDelegate.swift; sourceTree = ""; }; + D9A35E681FAA4974C97BB08B /* SBUMessageWebViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageWebViewModel.swift; path = ../Sources/View/Channel/ViewModel/SBUMessageWebViewModel.swift; sourceTree = ""; }; + DB0B8614A86D475EFD2FFB4D /* SBUCreateChannelViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelViewController.Deprecated.swift; path = ../Sources/Deprecated/CreateChannel/SBUCreateChannelViewController.Deprecated.swift; sourceTree = ""; }; + DBEDD4886F43FE0CC69A1037 /* SBUCacheManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.swift; sourceTree = ""; }; + DC16BFD1AC1191A41EA6C132 /* SBUChatNotificationChannelModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelModule.Header.swift; path = ../Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.Header.swift; sourceTree = ""; }; + DC90403A35689CAF4FC0F495 /* SBUCreateChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateChannelModule.List.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateChannelModule.List.swift; sourceTree = ""; }; + DC9B433DC2BC0714581C7B95 /* SBUFileViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFileViewController.swift; path = ../Sources/View/Channel/FileViewer/SBUFileViewController.swift; sourceTree = ""; }; + DCD4B760FD91A460F7D3558E /* SBUBaseChannelViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewModel.swift; path = ../Sources/ViewModel/Channel/SBUBaseChannelViewModel.swift; sourceTree = ""; }; + DD7CF787DB2966C05452D6A6 /* SBUChannelSettingsChannelInfoView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelSettingsChannelInfoView.swift; path = ../Sources/View/ChannelSettings/View/SBUChannelSettingsChannelInfoView.swift; sourceTree = ""; }; + DD96F2547917952DFB51AB65 /* SBUError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUError.swift; path = ../Sources/Model/SBUError.swift; sourceTree = ""; }; + DDAF6D1095CA8005959E7B71 /* SBUNotificationCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationCell.swift; path = ../Sources/View/Channel/MessageCell/NotificationChannel/SBUNotificationCell.swift; sourceTree = ""; }; + DE1AE659DF5214E274DFDEDD /* SBUMenuCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMenuCell.swift; path = ../Sources/View/Common/Menu/SBUMenuCell.swift; sourceTree = ""; }; + DE26AE551C60094EC9811A23 /* SBUMessageThreadModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.Header.swift; path = ../Sources/Module/MessageThread/SBUMessageThreadModule.Header.swift; sourceTree = ""; }; + DE2DC902897DA8C9B706D138 /* SBUInviteUserViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserViewModel.swift; path = ../Sources/ViewModel/SelectUser/SBUInviteUserViewModel.swift; sourceTree = ""; }; + DE5133204741EA232A84D9AC /* SBUMessageTemplate.TemplateType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.TemplateType.swift; path = ../Sources/Template/SBUMessageTemplate.TemplateType.swift; sourceTree = ""; }; + DE727C8AA7A172CFD8709F1D /* SBUGroupChannelModule.Input.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.Input.swift; path = ../Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.Input.swift; sourceTree = ""; }; + DE80157439A29278502A4508 /* SBUBaseMessageCellParams.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseMessageCellParams.Deprecated.swift; path = ../Sources/Deprecated/Channel/MessageCell/MessageCellParams/SBUBaseMessageCellParams.Deprecated.swift; sourceTree = ""; }; + DED6D07FA5FF12BE89365401 /* BaseMesssage+SBUIKit.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "BaseMesssage+SBUIKit.Deprecated.swift"; path = "../Sources/Deprecated/BaseMesssage+SBUIKit.Deprecated.swift"; sourceTree = ""; }; DF385EBE406D7A33EBF3AD17 /* NibCustomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NibCustomView.swift; sourceTree = ""; }; - DF6345F69FDF5A157D241BC9 /* Data+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+SBUIKit.swift"; path = "../Sources/Extension/Data+SBUIKit.swift"; sourceTree = ""; }; + DFAE10ED574FAD7F9ED55DD9 /* SBUQuotedMessageViewProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedMessageViewProtocol.swift; path = "../Sources/View/Life cycles/SBUQuotedMessageViewProtocol.swift"; sourceTree = ""; }; E00D6DB472E2D89F05B58CFD /* ConnectBusinessMessagingView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ConnectBusinessMessagingView.xib; sourceTree = ""; }; - E0DF16EFEDABAEFA74F71CD9 /* SBUQuotedBaseMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedBaseMessageView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/SBUQuotedBaseMessageView.swift; sourceTree = ""; }; - E1794FBF051FD2A95FFF1432 /* SBUGroupChannelPushSettingsModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsModule.swift; path = ../Sources/Module/NotificationSettings/SBUGroupChannelPushSettingsModule.swift; sourceTree = ""; }; + E0105109D19EF199B812A642 /* SBUGroupChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.List.swift; path = ../Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.List.swift; sourceTree = ""; }; + E07C67CF5B53FDCBBCE857FC /* UIViewController+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+SBUIKit.swift"; path = "../Sources/Extension/UIViewController+SBUIKit.swift"; sourceTree = ""; }; E19F12713F807D512874CB50 /* NotificationChannelViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationChannelViewController.swift; sourceTree = ""; }; - E1F0CC82C0AC905923C25117 /* SBUNotificationChannelManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationChannelManager.swift; path = ../Sources/Manager/SBUNotificationChannelManager.swift; sourceTree = ""; }; + E1B31519149586518A897715 /* SBUBaseChannelModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.swift; path = ../Sources/Module/Channel/SBUBaseChannelModule.swift; sourceTree = ""; }; + E1DA648665C3CFF87923A429 /* SBUOpenChannelAdminMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelAdminMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelAdminMessageCell.swift; sourceTree = ""; }; + E1F2A59CCD24B316A1AA0BB7 /* SBUMessageThreadModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.swift; path = ../Sources/Module/MessageThread/SBUMessageThreadModule.swift; sourceTree = ""; }; + E232CCC55C6F5328E2A00785 /* MessageForm+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MessageForm+SBUIKit.swift"; path = "../Sources/Extension/ChatSDK/MessageForm+SBUIKit.swift"; sourceTree = ""; }; + E265D52B22E59716DA12D153 /* SBUView.Unavaliable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUView.Unavaliable.swift; path = ../Sources/Deprecated/SBUView.Unavaliable.swift; sourceTree = ""; }; E27F72A0D096280795BF7D61 /* MyOpenChannelSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyOpenChannelSettingsViewController.swift; sourceTree = ""; }; - E29931EA22D00FB621B624E6 /* SBUMessageTemplate.Syntax.Views.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Syntax.Views.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Views.swift; sourceTree = ""; }; E2BB9D321E4FDE1E679A0373 /* CustomChannelListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomChannelListCell.swift; sourceTree = ""; }; + E321314C869482D4596032AB /* SBUReactionCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUReactionCollectionViewCell.swift; path = ../Sources/View/Channel/Reaction/SBUReactionCollectionViewCell.swift; sourceTree = ""; }; + E3255B2074BCFD6D08DD5BDB /* SBUBaseChannelViewController.Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewController.Keyboard.swift; path = ../Sources/View/Channel/SBUBaseChannelViewController.Keyboard.swift; sourceTree = ""; }; E332E035DA3DA5F7E9D98CBA /* ChannelSettingsVC_Overriding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelSettingsVC_Overriding.swift; sourceTree = ""; }; - E3C492FACFF8132FD24B3692 /* SBUOpenChannelSettingsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelSettingsModule.Header.swift; path = ../Sources/Module/ChannelSettings/OpenChannel/SBUOpenChannelSettingsModule.Header.swift; sourceTree = ""; }; - E3F8FA2679A556B5B6170572 /* SBUCreateOpenChannelModule.ProfileInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCreateOpenChannelModule.ProfileInput.swift; path = ../Sources/Module/SelectUser/CreateChannel/SBUCreateOpenChannelModule.ProfileInput.swift; sourceTree = ""; }; - E45EA21ABFDC566C52C5B851 /* SBUMessageTemplate.Action.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Action.swift; path = ../Sources/MessageTemplate/Syntax/SBUMessageTemplate.Action.swift; sourceTree = ""; }; - E52352941A448E4E062B5441 /* SBUUserListModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListModule.swift; path = ../Sources/Module/UserList/SBUUserListModule.swift; sourceTree = ""; }; - E5EADB060500BBC37BF73911 /* SBUFeedNotificationCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationCell.swift; path = ../Sources/View/Channel/MessageCell/NotificationChannel/SBUFeedNotificationCell.swift; sourceTree = ""; }; - E63214C27114B413C99BC200 /* UIViewController+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+SBUIKit.swift"; path = "../Sources/Extension/UIViewController+SBUIKit.swift"; sourceTree = ""; }; - E63C644AE0DACDB608F39C48 /* SBUGroupChannelPushSettingsModule.Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelPushSettingsModule.Header.swift; path = ../Sources/Module/NotificationSettings/SBUGroupChannelPushSettingsModule.Header.swift; sourceTree = ""; }; - E650103D74D3096368D9F8BE /* SBUBaseChannelViewController.Unavailable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelViewController.Unavailable.swift; path = ../Sources/Deprecated/Channel/SBUBaseChannelViewController.Unavailable.swift; sourceTree = ""; }; - E67D8C702401812614027E07 /* SBUMessageThreadModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageThreadModule.swift; path = ../Sources/Module/MessageThread/SBUMessageThreadModule.swift; sourceTree = ""; }; - E6F47F9078584B2213E6A852 /* SBUGroupChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.List.swift; path = ../Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.List.swift; sourceTree = ""; }; - E737652B7CC0957AD9113F9F /* SBUEmptyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUEmptyView.swift; path = ../Sources/View/Common/SBUEmptyView.swift; sourceTree = ""; }; - E747965D976B362F29A76025 /* SBUScrollBottomView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUScrollBottomView.swift; path = ../Sources/View/Channel/ScrollBottomView/SBUScrollBottomView.swift; sourceTree = ""; }; - E74ED44885947815D317C147 /* SBUQuoteMessageInputViewProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuoteMessageInputViewProtocol.swift; path = "../Sources/View/Life cycles/SBUQuoteMessageInputViewProtocol.swift"; sourceTree = ""; }; - E751C7C8B6E94111A95CD998 /* SBUFileMessageCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFileMessageCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUFileMessageCellParams.swift; sourceTree = ""; }; - E8563AAF96E2695F5C8E6149 /* SBUMessageTemplate.Renderer+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SBUMessageTemplate.Renderer+Utils.swift"; path = "../Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+Utils.swift"; sourceTree = ""; }; - E8E80FD38269894222F55CD7 /* SBUBaseChannelListModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListModule.List.swift; path = ../Sources/Module/ChannelList/SBUBaseChannelListModule.List.swift; sourceTree = ""; }; - E9664EC97EABA449ECD33D44 /* SBUChannelPushSettingCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelPushSettingCell.swift; path = ../Sources/View/NotificationSettings/Cell/SBUChannelPushSettingCell.swift; sourceTree = ""; }; - E9AC601B0DF0FE1F84D85F02 /* SBUNavigationTitleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNavigationTitleView.swift; path = ../Sources/View/Common/SBUNavigationTitleView.swift; sourceTree = ""; }; + E3F2B4D4DEE6B7025D7BD9C3 /* SBUCacheManager.Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.Image.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.Image.swift; sourceTree = ""; }; + E43110898387DC349478B6F4 /* SBUUnderLineTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUnderLineTextField.swift; path = ../Sources/View/Common/SBUUnderLineTextField.swift; sourceTree = ""; }; + E45AE258701D31182073F012 /* SBUBaseMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUBaseMessageCell.swift; sourceTree = ""; }; + E4EAA80940C2F0E0B4F55369 /* SBUMessageSearchViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchViewController.swift; path = ../Sources/View/MessageSearch/SBUMessageSearchViewController.swift; sourceTree = ""; }; + E51843B00A50F6A7E9C974F8 /* SBUFeedNotificationCellParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUFeedNotificationCellParams.swift; path = ../Sources/View/Channel/MessageCell/MessageCellParams/SBUFeedNotificationCellParams.swift; sourceTree = ""; }; + E665F93B614394907C4F7CA4 /* SBURegisterOperatorModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBURegisterOperatorModule.Deprecated.swift; path = ../Sources/Deprecated/Module/SelectUser/SBURegisterOperatorModule.Deprecated.swift; sourceTree = ""; }; + E66DFF02F9BC48A669A1FABE /* Collection+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Collection+SBUIKit.swift"; path = "../Sources/Extension/Shared/Collection+SBUIKit.swift"; sourceTree = ""; }; + E68D00C7E474B6BDA0F2110C /* SBUPermissionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUPermissionManager.swift; path = ../Sources/Manager/SBUPermissionManager.swift; sourceTree = ""; }; + E70E63DB609903DF2E27357D /* SBUQuotedUserMessageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedUserMessageView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/SBUQuotedUserMessageView.swift; sourceTree = ""; }; + E7E42CE447C8C5F2F135BA53 /* SBUTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTextView.swift; path = "../Sources/View/Life cycles/SBUTextView.swift"; sourceTree = ""; }; + E7EF819DB69451205ACD514D /* SBUStringSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUStringSet.swift; path = ../Sources/Constant/SBUStringSet.swift; sourceTree = ""; }; + E7F91A991F92C4F68FFFD482 /* SendbirdChat+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SendbirdChat+SBUIKit.swift"; path = "../Sources/Extension/ChatSDK/SendbirdChat+SBUIKit.swift"; sourceTree = ""; }; + E8179684119E32E863E37C29 /* SBUViewModelSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUViewModelSet.swift; path = ../Sources/ViewModel/SBUViewModelSet.swift; sourceTree = ""; }; + E8C640E0B8A35BEDA6E68F74 /* SBUOpenChannelFileMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelFileMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelFileMessageCell.swift; sourceTree = ""; }; E9C66209DE00D0888E84696B /* LiveStreamChannelListModule.List.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveStreamChannelListModule.List.swift; sourceTree = ""; }; - EA9323D6D646C3B960120113 /* SBUChannelSettingsChannelInfoView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelSettingsChannelInfoView.swift; path = ../Sources/View/ChannelSettings/View/SBUChannelSettingsChannelInfoView.swift; sourceTree = ""; }; + EA418D56B8B7C4F4E3670E57 /* SBUVoicePlayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoicePlayer.swift; path = ../Sources/Manager/SBUVoicePlayer.swift; sourceTree = ""; }; + EA76BB388D71729F63EB35D3 /* SBUHorizontalSuggestedReplyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUHorizontalSuggestedReplyView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUHorizontalSuggestedReplyView.swift; sourceTree = ""; }; EB3DB814003F6E3D146BDC70 /* ChannelListVC_CustomList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelListVC_CustomList.swift; sourceTree = ""; }; EBB823C463947E90BA7D1148 /* GroupChannelViewModel_AdditionalFeatures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupChannelViewModel_AdditionalFeatures.swift; sourceTree = ""; }; - EC1B3CDBEF376A20747208A9 /* SBUVoiceFileInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUVoiceFileInfo.swift; path = ../Sources/Model/SBUVoiceFileInfo.swift; sourceTree = ""; }; - ECBD3BF61C51B2693FDABF96 /* UICollectionView+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UICollectionView+SBUIKit.swift"; path = "../Sources/Extension/UICollectionView+SBUIKit.swift"; sourceTree = ""; }; + EC96D93AB851F99AD829A2D9 /* SBULayoutableButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULayoutableButton.swift; path = ../Sources/View/Common/SBULayoutableButton.swift; sourceTree = ""; }; EDF0FBB0F38EFF12B4C20E59 /* ChannelVC_CustomInput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelVC_CustomInput.swift; sourceTree = ""; }; - EE43DB444DF9960D183A301D /* SBUMessageFormView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageFormView.swift; path = ../Sources/View/Channel/MessageCell/MessageForm/Views/SBUMessageFormView.swift; sourceTree = ""; }; - EE946BA3CE6D36E1809DE776 /* SBUUserMessageTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserMessageTextView.swift; path = ../Sources/View/Channel/CellView/SBUUserMessageTextView.swift; sourceTree = ""; }; - EEBFB762A374274391B75D59 /* SBUGroupChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/SBUGroupChannelModule.Deprecated.swift; sourceTree = ""; }; - EF993CB5C1201F1DD90E95C8 /* SBUBaseSelectUserViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseSelectUserViewController.Deprecated.swift; path = ../Sources/Deprecated/UserList/SBUBaseSelectUserViewController.Deprecated.swift; sourceTree = ""; }; - EFAEEEFE5278165149ED3E44 /* SBUMessageTemplateCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateCell.swift; path = ../Sources/View/Channel/MessageCell/SBUMessageTemplateCell.swift; sourceTree = ""; }; + F03942D4AC85136F312BA954 /* SBUView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUView.swift; path = "../Sources/View/Life cycles/SBUView.swift"; sourceTree = ""; }; F03CD5B640800DF99AAADDCA /* ChannelSettingsCustomManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelSettingsCustomManager.swift; sourceTree = ""; }; + F0DC64C9238395B420FB2F20 /* SBUGroupChannelSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsViewController.swift; path = ../Sources/View/ChannelSettings/SBUGroupChannelSettingsViewController.swift; sourceTree = ""; }; + F0F2D09151D1CCABD46BF3A6 /* SBUReactionsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUReactionsViewController.swift; path = ../Sources/View/Channel/Reaction/SBUReactionsViewController.swift; sourceTree = ""; }; F0F6E578BF4A8F50AC7929B4 /* OpenChannelCustomManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenChannelCustomManager.swift; sourceTree = ""; }; - F146389B9310D3B2A12C036F /* SBUMessageTemplate.Renderer+RenderItems.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SBUMessageTemplate.Renderer+RenderItems.swift"; path = "../Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+RenderItems.swift"; sourceTree = ""; }; - F2332CF954CF8CD146C176C2 /* SBUUserCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserCell.swift; path = ../Sources/View/Common/UserCell/SBUUserCell.swift; sourceTree = ""; }; - F23AAA8E953539D1693FE962 /* SBUQuotedBaseMessageViewParams.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuotedBaseMessageViewParams.Deprecated.swift; path = ../Sources/Deprecated/Channel/MessageCell/Replies/SBUQuotedBaseMessageViewParams.Deprecated.swift; sourceTree = ""; }; - F2890510DC6B33C2BB2943CE /* SBUMenuCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMenuCell.swift; path = ../Sources/View/Common/Menu/SBUMenuCell.swift; sourceTree = ""; }; F30F5208F4A18ACABFB2FF34 /* AIChatBotViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIChatBotViewController.swift; sourceTree = ""; }; - F43A5FC7EB56EB0E85482B5A /* BaseMessage+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "BaseMessage+SBUIKit.swift"; path = "../Sources/Extension/ChatSDK/BaseMessage+SBUIKit.swift"; sourceTree = ""; }; - F5A71462A25A4CA253308676 /* SBUForm.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUForm.Deprecated.swift; path = ../Sources/Deprecated/SBUForm.Deprecated.swift; sourceTree = ""; }; - F61FBE9899FDCE7D66E99D9C /* SBUSuggestedReplyViewParams.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSuggestedReplyViewParams.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/ViewParams/SBUSuggestedReplyViewParams.swift; sourceTree = ""; }; + F37245E81F8A783F774D5638 /* SBUInviteUserViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUInviteUserViewController.swift; path = ../Sources/View/SelectUser/SBUInviteUserViewController.swift; sourceTree = ""; }; + F3D4BE2AEC2D977E48B78628 /* NSObject+SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+SBUIKit.swift"; path = "../Sources/Extension/NSObject+SBUIKit.swift"; sourceTree = ""; }; + F6909E89034096C6D2898E3B /* SBUMessageTemplate.Coordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplate.Coordinator.swift; path = ../Sources/Template/SBUMessageTemplate.Coordinator.swift; sourceTree = ""; }; + F6B1F9002A6FC6B2585D425F /* SBUCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCollectionViewFlowLayout.swift; path = ../Sources/View/Common/SBUCollectionViewFlowLayout.swift; sourceTree = ""; }; + F722A51B390124CD1A8B8C7A /* SBUGroupChannelSettingsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelSettingsViewModel.swift; path = ../Sources/ViewModel/ChannelSettings/SBUGroupChannelSettingsViewModel.swift; sourceTree = ""; }; F781C196C840F15272F5D1C0 /* MemberListCustomManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberListCustomManager.swift; sourceTree = ""; }; - F7BBFC3D2F7F703921EC560B /* SBULogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBULogger.swift; path = ../Sources/Util/SBULogger.swift; sourceTree = ""; }; - F9281572105138A1113C06F0 /* SBUStringSet.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUStringSet.Deprecated.swift; path = ../Sources/Constant/SBUStringSet.Deprecated.swift; sourceTree = ""; }; - F95EE58925E458E93D7FDCE6 /* SBUUser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUser.swift; path = ../Sources/Model/SBUUser.swift; sourceTree = ""; }; + F7B5A0380301B657A2D7D80F /* SBUBaseChannelListModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelListModule.swift; path = ../Sources/Module/ChannelList/SBUBaseChannelListModule.swift; sourceTree = ""; }; + F87D7CC2699AF1D033F9CEDD /* SBUChatNotificationChannelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelViewController.swift; path = ../Sources/View/Channel/SBUChatNotificationChannelViewController.swift; sourceTree = ""; }; + F9428676B5E783417ADBB503 /* SBUQuoteMessageInputViewProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUQuoteMessageInputViewProtocol.swift; path = "../Sources/View/Life cycles/SBUQuoteMessageInputViewProtocol.swift"; sourceTree = ""; }; + F9BA7B959F6864DF50326000 /* SBUUserProfileView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserProfileView.swift; path = ../Sources/View/Common/User/SBUUserProfileView.swift; sourceTree = ""; }; FA431857E8160340E7E545C3 /* ChannelListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelListViewController.swift; sourceTree = ""; }; - FA83A2B6632271A76FC5AC78 /* SendbirdUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SendbirdUI.swift; path = ../Sources/SendbirdUI.swift; sourceTree = ""; }; - FB69A7EAA719CEEC2CDD571A /* SBUChatNotificationChannelModule.List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChatNotificationChannelModule.List.swift; path = ../Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.List.swift; sourceTree = ""; }; - FB6B3ADC98B9C071ABAB009D /* SBUTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTextView.swift; path = "../Sources/View/Life cycles/SBUTextView.swift"; sourceTree = ""; }; + FA8BDA2D985782A35F57D0AF /* SBUBaseChannelSettingsViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelSettingsViewModel.swift; path = ../Sources/ViewModel/ChannelSettings/SBUBaseChannelSettingsViewModel.swift; sourceTree = ""; }; + FAFDCE58C837943EDDD9BC0A /* SBUGroupChannelListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUGroupChannelListViewController.swift; path = ../Sources/View/ChannelList/SBUGroupChannelListViewController.swift; sourceTree = ""; }; + FB4E609F0F56A3A6785D70A2 /* SBUCommonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCommonItem.swift; path = ../Sources/View/Common/SBUCommonItem.swift; sourceTree = ""; }; + FB71A8A5F46DAE8A39F9DD72 /* SBUCacheManager.DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCacheManager.DiskCache.swift; path = ../Sources/Manager/CacheManager/SBUCacheManager.DiskCache.swift; sourceTree = ""; }; FBA3029EE0577CF7753B87E4 /* UIImageView+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Ext.swift"; sourceTree = ""; }; FBCECAC20501BC1FA624C11C /* AIChatBotSignInViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AIChatBotSignInViewController.xib; sourceTree = ""; }; - FBEAAD5F16B32284ECF914A3 /* SBUChannelListViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUChannelListViewController.Deprecated.swift; path = ../Sources/Deprecated/ChannelList/SBUChannelListViewController.Deprecated.swift; sourceTree = ""; }; - FC378827B5740067C0447146 /* SBUBaseMessageCellParams.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseMessageCellParams.Deprecated.swift; path = ../Sources/Deprecated/Channel/MessageCell/MessageCellParams/SBUBaseMessageCellParams.Deprecated.swift; sourceTree = ""; }; - FCB5700F5D0D4B10B740AEF4 /* SBUUserListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUUserListViewController.swift; path = ../Sources/View/UserList/SBUUserListViewController.swift; sourceTree = ""; }; - FCC5581F9677458AF778F7F4 /* UIStackView.SBUIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIStackView.SBUIKit.swift; path = ../Sources/Extension/UIStackView.SBUIKit.swift; sourceTree = ""; }; - FCC8C31980DC15ADA27BAC64 /* SBUMenuSheetViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMenuSheetViewController.swift; path = ../Sources/View/Common/Menu/SBUMenuSheetViewController.swift; sourceTree = ""; }; - FD0BC8DC212FB085843FDCF5 /* SBUCoverImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUCoverImageView.swift; path = ../Sources/View/Common/SBUCoverImageView.swift; sourceTree = ""; }; - FD1958ABF18FC7814345A68C /* SBUMediaView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMediaView.swift; path = ../Sources/View/Channel/Media/SBUMediaView.swift; sourceTree = ""; }; - FDE4BE315EA68C5AB211C7C0 /* SBUTypingIndicatorInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorInfo.swift; path = ../Sources/Model/SBUTypingIndicatorInfo.swift; sourceTree = ""; }; - FDEBD429C35EA9038A2DC6C5 /* SBUMessageSearchViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchViewController.Deprecated.swift; path = ../Sources/Deprecated/MessageSearch/SBUMessageSearchViewController.Deprecated.swift; sourceTree = ""; }; - FE33118AFAADE5A66A92ED8F /* SBUOpenChannelUnknownMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUOpenChannelUnknownMessageCell.swift; path = ../Sources/View/Channel/MessageCell/OpenChannel/SBUOpenChannelUnknownMessageCell.swift; sourceTree = ""; }; - FEC26E9D6CA4DAB0FFD3991F /* SBUSuggestedReplyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUSuggestedReplyView.swift; path = ../Sources/View/Channel/MessageCell/SuggestedReply/Views/SBUSuggestedReplyView.swift; sourceTree = ""; }; - FED6FDF8D412E93F70FD9C9C /* SBUMessageTemplateCell.MessageTemplateLayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageTemplateCell.MessageTemplateLayer.swift; path = ../Sources/View/Channel/MessageCell/SBUMessageTemplateCell.MessageTemplateLayer.swift; sourceTree = ""; }; - FF6AE8EC96A46BEC3415399C /* SBUNotificationEmptyView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUNotificationEmptyView.swift; path = ../Sources/View/Common/SBUNotificationEmptyView.swift; sourceTree = ""; }; + FD015BF00D81AEB2A1CA3C94 /* SBUBaseChannelModule.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUBaseChannelModule.Deprecated.swift; path = ../Sources/Deprecated/Module/Channel/SBUBaseChannelModule.Deprecated.swift; sourceTree = ""; }; + FD7D1E866BB8BE34190CEB17 /* QuotedFileImageContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuotedFileImageContentView.swift; path = ../Sources/View/Channel/MessageCell/Replies/MessageView/QuotedFileImageContentView.swift; sourceTree = ""; }; + FED362612990C863472EC0C1 /* SBUMessageSearchViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUMessageSearchViewController.Deprecated.swift; path = ../Sources/Deprecated/MessageSearch/SBUMessageSearchViewController.Deprecated.swift; sourceTree = ""; }; + FF8BCC6C91BC5B68C14BD636 /* SBUModerationsViewController.Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUModerationsViewController.Deprecated.swift; path = ../Sources/Deprecated/Moderations/SBUModerationsViewController.Deprecated.swift; sourceTree = ""; }; + FF95A5440DFB1097E0DC090D /* SBUTypingIndicatorMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SBUTypingIndicatorMessageCell.swift; path = ../Sources/View/Channel/MessageCell/SBUTypingIndicatorMessageCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1174,23 +1140,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 01251B2761FF6CA563F540EE /* Header */ = { - isa = PBXGroup; - children = ( - AEBB33A58E1762A5864B199E /* SBUChannelInfoHeaderView.swift */, - 1A9FBA83D0706529AD357223 /* SBUChannelTitleView.swift */, - ); - name = Header; - sourceTree = ""; - }; - 0164B16CC190160CB48818BB /* ScrollBottomView */ = { - isa = PBXGroup; - children = ( - E747965D976B362F29A76025 /* SBUScrollBottomView.swift */, - ); - name = ScrollBottomView; - sourceTree = ""; - }; 017756283A183F1F06F0DDA0 /* ChannelList */ = { isa = PBXGroup; children = ( @@ -1211,30 +1160,23 @@ path = ChannelSettings; sourceTree = ""; }; - 049B1136F3EDE8CCD4A35675 /* Replies */ = { - isa = PBXGroup; - children = ( - F23AAA8E953539D1693FE962 /* SBUQuotedBaseMessageViewParams.Deprecated.swift */, - ); - name = Replies; - sourceTree = ""; - }; - 05021E801F5319038E6B7699 /* NotificationChannel */ = { + 02F3C30880AF2997B9FCA459 /* MessageForm */ = { isa = PBXGroup; children = ( - D75D43D7C8A4332088263FA6 /* SBUChatNotificationCell.swift */, - E5EADB060500BBC37BF73911 /* SBUFeedNotificationCell.swift */, - B6FC93D7B877D701B03AF862 /* SBUNotificationCell.swift */, + 73008754C9269339728BC5F5 /* ViewParams */, + C9D205FC1FFDE066BCEAAFFC /* Views */, ); - name = NotificationChannel; + name = MessageForm; sourceTree = ""; }; - 052BE3F28A22AB5ECE24AFE2 /* ChannelStateBanner */ = { + 04EA12CBCAF17CE01704A942 /* ChannelList */ = { isa = PBXGroup; children = ( - B7D92122E4097DC305A8145C /* SBUChannelStateBanner.swift */, + B15D5A49D7BA08FF6852E56B /* SBUGroupChannelListViewModel.swift */, + 1EA28E3A6A2866B7F3BE604B /* SBUOpenChannelListViewModel.swift */, + A90DE6F47C51A871EC1231DC /* SBUBaseChannelListViewModel.swift */, ); - name = ChannelStateBanner; + name = ChannelList; sourceTree = ""; }; 05CC6894EE8BB6036AFC3D60 /* User */ = { @@ -1260,65 +1202,45 @@ path = InviteUser; sourceTree = ""; }; - 08B71F343E56302FC2E7983B /* Syntax */ = { - isa = PBXGroup; - children = ( - E45EA21ABFDC566C52C5B851 /* SBUMessageTemplate.Action.swift */, - 1560AA0991C25E804E2A7137 /* SBUMessageTemplate.Decoders.swift */, - 271F375602E0485BD6B133CB /* SBUMessageTemplate.ErrorMessages.swift */, - CF65B7885DCFA75A65D253FF /* SBUMessageTemplate.ImageRatioType.swift */, - 7482327B20D718AB230DBA13 /* SBUMessageTemplate.Syntax.Aligns.swift */, - 2A912AB54CD1B06747EC40E1 /* SBUMessageTemplate.Syntax.Identifier.swift */, - 929C9FCFB2007BB7E70959DD /* SBUMessageTemplate.Syntax.Item.swift */, - 733B3A136EDCAE5F32E98A55 /* SBUMessageTemplate.Syntax.Sizes.swift */, - DD4E76CA93253D600216657C /* SBUMessageTemplate.Syntax.Styles.swift */, - 8AFA7E902B856644158A8A60 /* SBUMessageTemplate.Syntax.Types.swift */, - E29931EA22D00FB621B624E6 /* SBUMessageTemplate.Syntax.Views.swift */, - ); - name = Syntax; - sourceTree = ""; - }; - 094189D8BF37978BE68B47E2 /* Customize */ = { + 07666CE7914B1F4A0918B211 /* Notifications */ = { isa = PBXGroup; children = ( - D41DC19666A44BCF0D3C6F9E /* CustomBaseViewController.swift */, - 39CEC371C1FBADB87EA861F0 /* PaddingLabel.swift */, - 91261FB22D42BDA2AACB1002 /* Manager */, - 512F0F2FA832B397FCF4C97F /* View */, - 112E8D882A5A6D20616A93E1 /* ViewModel */, + 22C2F79731D0834AA4AF2E1D /* SBUFeedNotificationChannelModule.Deprecated.swift */, + 292090C9C63F0856F1012F02 /* SBUChatNotificationChannelModule.Deprecated.swift */, ); - path = Customize; + name = Notifications; sourceTree = ""; }; - 0971D86A836127B4F6DC8476 /* ChannelList */ = { + 0774EC2A4133C47EB6EE392C /* Constant */ = { isa = PBXGroup; children = ( - FBEAAD5F16B32284ECF914A3 /* SBUChannelListViewController.Deprecated.swift */, + 316B2AADB4CF1C35B0526FB1 /* SBUStringSet.Deprecated.swift */, + B7FD314A275F9EE69C49BE2B /* SBUDateFormatSet.swift */, + 8F6224ED2E1D6F26238669BF /* SBUConstant.swift */, + E7EF819DB69451205ACD514D /* SBUStringSet.swift */, ); - name = ChannelList; + name = Constant; sourceTree = ""; }; - 09A3C5E20A48BF3ACA8ED195 /* SelectUser */ = { + 08508EDD59945AE752CF82AD /* NewMessageInfo */ = { isa = PBXGroup; children = ( - 72688E383B2A36C10F88E28A /* CreateChannel */, - DCA7427E20468C03218C4761 /* InviteUser */, - 9719F1254CECB3FED1351F5F /* RegisterOperator */, - B3F69F5FE63EA170346C2652 /* SBUBaseSelectUserModule.Header.swift */, - CFBA75BFD34AA4CB733AFD67 /* SBUBaseSelectUserModule.List.swift */, - 3BB7D281DAD481F3E43747A8 /* SBUBaseSelectUserModule.swift */, + B8B39CC4AF578941788CD3E1 /* SBUNewNotificationInfo.swift */, + 001129A438EF72D032E43E77 /* SBUNewMessageInfo.swift */, ); - name = SelectUser; + name = NewMessageInfo; sourceTree = ""; }; - 09E8F6B04E131672BA37D8D5 /* Moderations */ = { + 094189D8BF37978BE68B47E2 /* Customize */ = { isa = PBXGroup; children = ( - 23872DE4580E4114EBAF5775 /* SBUModerationsModule.Header.swift */, - C7A1219BC8738C3D6C42F341 /* SBUModerationsModule.List.swift */, - CD315DD060E0A7F6ACF32325 /* SBUModerationsModule.swift */, + D41DC19666A44BCF0D3C6F9E /* CustomBaseViewController.swift */, + 39CEC371C1FBADB87EA861F0 /* PaddingLabel.swift */, + 91261FB22D42BDA2AACB1002 /* Manager */, + 512F0F2FA832B397FCF4C97F /* View */, + 112E8D882A5A6D20616A93E1 /* ViewModel */, ); - name = Moderations; + path = Customize; sourceTree = ""; }; 09EE339B4FBC8E25F465F18A /* CreateChannel */ = { @@ -1329,34 +1251,6 @@ path = CreateChannel; sourceTree = ""; }; - 0A18A9016C780E0639124C12 /* Sources */ = { - isa = PBXGroup; - children = ( - B598482660316B09C2FA1437 /* Configuration */, - 8E93EE20299517D0EC8C1A9B /* Constant */, - 3A5534963E7E9EB771559492 /* Deprecated */, - F88125DC9F5CB54EB7E54879 /* Enums */, - 5FA9D6F48112101A3D4D5761 /* Extension */, - 401AF0DFFF70896871C2D3AD /* Manager */, - 9676EE282CA2412A4BB6B3C8 /* MessageTemplate */, - DA22BF2AA267E908ED362C00 /* Model */, - 387F5B4A1125400C14917E24 /* Module */, - 56569FB15519EDD68ED03257 /* PrivacyInfo.xcprivacy */, - DEA443AB2088EB679B958223 /* Protocol */, - 78E174F5EE5510B4B44A2771 /* Resource */, - 56922E5BE0AEAF6E3581B756 /* SBUAvailable.swift */, - 8F1BF3E729261E2B6B93B279 /* SBUGlobalCustomParams.swift */, - 052DFE5F922B005DBD1C7CC3 /* SBUGlobals.swift */, - FA83A2B6632271A76FC5AC78 /* SendbirdUI.swift */, - 0AC56497B3B2BB2BEB4A0B35 /* SendbirdUIKit.h */, - E427549D769F41889E344F9D /* Theme */, - 0EC8F8579BC439AB86F87147 /* Util */, - 5521A07579973A5BFE1F9C9B /* View */, - 6EFF699FF49501F22FB7CEEB /* ViewModel */, - ); - name = Sources; - sourceTree = ""; - }; 0AFCD8420E77AE46E472F9B1 /* OpenChannel */ = { isa = PBXGroup; children = ( @@ -1374,20 +1268,48 @@ path = Common; sourceTree = ""; }; - 0CC7BA10EAF646818D83091A /* ChannelSettings */ = { + 0D0A56561C9C73211E694DFD /* MySettings */ = { isa = PBXGroup; children = ( - 8C55837A6B6EB88A6FEE1FD6 /* SBUBaseChannelSettingsViewController.Deprecated.swift */, + E27F72A0D096280795BF7D61 /* MyOpenChannelSettingsViewController.swift */, ); - name = ChannelSettings; + path = MySettings; sourceTree = ""; }; - 0D0A56561C9C73211E694DFD /* MySettings */ = { + 0D4AC142CF427E94EB941EBB /* Sources */ = { + isa = PBXGroup; + children = ( + 43A1EDA9F042758C9A8A9443 /* ViewModel */, + D2333C4158ED4335519818F7 /* Configuration */, + AA7E413E3D0A18D1AF768883 /* Extension */, + AFE850C5739F8F60F577E75F /* Util */, + 10D3423573BF6095B38CBAB7 /* SendbirdUI.swift */, + 9398026B4E2F0089B2EFF389 /* SBUAvailable.swift */, + 85D6E1544C692B8B761619BB /* Module */, + 512A764D7CD21464DF826BF9 /* Enums */, + 7E441E54DE6D65D626FE15D8 /* Template */, + BFC4CED6144C780947101E9D /* Protocol */, + 874B3A001684041E3399C28D /* Manager */, + A81AD21988ED6672CEFD7E07 /* SBUGlobalCustomParams.swift */, + 0774EC2A4133C47EB6EE392C /* Constant */, + F12C20F9F21EE3C558E4E4A9 /* Theme */, + E32D237341A8452D8A21B430 /* Model */, + 648068FD96A99201642600C7 /* PrivacyInfo.xcprivacy */, + ED6DC7C19C9AAE2891CEE67E /* View */, + 56F8FC4DB72D3E97BED16797 /* SendbirdUIKit.h */, + 71C8271A11BE982092DA07F9 /* SBUGlobals.swift */, + 0D797F9E4DE941E434680E47 /* Resource */, + 28D124443F82DDD6B6A510D0 /* Deprecated */, + ); + name = Sources; + sourceTree = ""; + }; + 0D797F9E4DE941E434680E47 /* Resource */ = { isa = PBXGroup; children = ( - E27F72A0D096280795BF7D61 /* MyOpenChannelSettingsViewController.swift */, + 8F81F37811DBBF0C6750F046 /* Assets.xcassets */, ); - path = MySettings; + name = Resource; sourceTree = ""; }; 0E523CD22BB5B6FB049F8C25 /* Module */ = { @@ -1406,38 +1328,6 @@ path = Module; sourceTree = ""; }; - 0E63354A062AD859343C8163 /* ChannelList */ = { - isa = PBXGroup; - children = ( - D3BDD1F1E1C54E7BBF7EF34B /* SBUBaseChannelListViewModel.swift */, - 1FFC715F2C57B702F024E1F2 /* SBUGroupChannelListViewModel.swift */, - DEB37194DEE2FBDFBCFC7F81 /* SBUOpenChannelListViewModel.swift */, - ); - name = ChannelList; - sourceTree = ""; - }; - 0EC8F8579BC439AB86F87147 /* Util */ = { - isa = PBXGroup; - children = ( - 794012A0EC901C1933678F7C /* BlockingOperation.swift */, - 62793278995373070FC56D80 /* SBUDebouncer.swift */, - F7BBFC3D2F7F703921EC560B /* SBULogger.swift */, - AE1B8A7DEC66855D188B1B3A /* SBUMentionManager.swift */, - 9E3F17D54D127F0810720DDA /* SBUPropertyWrapper.swift */, - 9EAE8B53101F00B23803E524 /* SBUUtils.swift */, - 3D114425A9DA1EF20A0A56E3 /* WeakDelegateStorage.swift */, - ); - name = Util; - sourceTree = ""; - }; - 0FB4179149226EC717F5ABF4 /* UserList */ = { - isa = PBXGroup; - children = ( - BCC42C303A5CE61E0137026B /* SBUUserListModule.Deprecated.swift */, - ); - name = UserList; - sourceTree = ""; - }; 0FB6D9A245FF3E91BC83A9E7 /* Media */ = { isa = PBXGroup; children = ( @@ -1452,18 +1342,6 @@ path = ChannelSettings; sourceTree = ""; }; - 103AF90A0B49F014BBBA32D5 /* OpenChannel */ = { - isa = PBXGroup; - children = ( - 0940CD38AE9564E89E92B498 /* SBUOpenChannelModule.Header.swift */, - D31BB5551F5B0C4B761B4D4A /* SBUOpenChannelModule.Input.swift */, - 4AF6D0E947D04AD2DF9B330C /* SBUOpenChannelModule.List.swift */, - DE8F09B00B590998A911E922 /* SBUOpenChannelModule.Media.swift */, - CB0A3CB6F711BD58217836B3 /* SBUOpenChannelModule.swift */, - ); - name = OpenChannel; - sourceTree = ""; - }; 112606B8CA57E7AADAECDD0C /* Notifications */ = { isa = PBXGroup; children = ( @@ -1501,23 +1379,6 @@ path = Toast; sourceTree = ""; }; - 11CE31CA655ECACA545D8C79 /* Module */ = { - isa = PBXGroup; - children = ( - DF48A7190776EBA065285901 /* Channel */, - BB6557E83E366FF03D87DAC2 /* ChannelList */, - DB27B9556F88F98241AC4774 /* ChannelSettings */, - A8262032A10B2C71B7434D3D /* MessageSearch */, - 4A3BABBE73EA71823728C678 /* MessageThread */, - EA2EB3F9C3A2B234DEA92B91 /* Moderations */, - 6B2DA69C7163A11B6D8F4EE4 /* NotificationSettings */, - 7F1173ECEC3916A870CF4BBE /* SBUModuleSet.Deprecated.swift */, - AC90E71B86CC6940969D2DAD /* SelectUser */, - 0FB4179149226EC717F5ABF4 /* UserList */, - ); - name = Module; - sourceTree = ""; - }; 12204696BB593F6280F91F7D /* MessageInput */ = { isa = PBXGroup; children = ( @@ -1526,21 +1387,12 @@ path = MessageInput; sourceTree = ""; }; - 12AE4BBF0666FF2962D4C3F8 /* Tester */ = { - isa = PBXGroup; - children = ( - 766315D52EBCAC0E94D256D2 /* MessageTemplateParserTest.swift */, - 003BB38A1D8B821A076D86F7 /* MessageTemplateTestViewController.swift */, - ); - name = Tester; - sourceTree = ""; - }; - 1349E18CFA7327252A93F8C0 /* Common */ = { + 1250EC3E0849DB6FA968512A /* ChannelSettings */ = { isa = PBXGroup; children = ( - AAFC011AF7306E36EB8FCC30 /* SBUCommonModule.swift */, + 4BA8979879F319E9210A9114 /* SBUBaseChannelSettingsViewController.Deprecated.swift */, ); - name = Common; + name = ChannelSettings; sourceTree = ""; }; 1547B67DBBA588A09A37D174 /* ViewModel */ = { @@ -1550,54 +1402,42 @@ path = ViewModel; sourceTree = ""; }; - 15AF8864C7CCD22178BE9ADC /* CellView */ = { - isa = PBXGroup; - children = ( - 1AA53823579A67AEF2491504 /* SBULinkClickableTextView.swift */, - 76BFE8E489A23629D2196FE3 /* SBUMarkdownTransfer.swift */, - BA9B3CA61FB46D5F57319572 /* SBUMessageDateView.swift */, - 09F018CDEF9EF6C9430886D5 /* SBUMessageProfileView.swift */, - 30FED8843DCE23EC513800DE /* SBUMessageStateView.swift */, - 6DE1F144DE16F62BC068620B /* SBUMessageWebView.swift */, - 7D1408922FF39794BCEBBD48 /* SBUNotificationTimelineView.swift */, - 417F229A4E0737E350CCCD76 /* SBUOpenChannelMessageWebView.swift */, - 5FF2724740780F1EE9EDE298 /* SBUSelectableStackView.swift */, - EE946BA3CE6D36E1809DE776 /* SBUUserMessageTextView.swift */, - C16EF2A21EB7BC1B7810BE0B /* SBUUserNameView.swift */, - ); - name = CellView; - sourceTree = ""; - }; - 16141086D839DF57965C01F3 /* CacheManager */ = { - isa = PBXGroup; - children = ( - 62FD0225D9064381240C54F6 /* SBUCacheManager.Config.swift */, - 8B966EB8AB52BEFCD3C0ECF9 /* SBUCacheManager.File.swift */, - 683DE6275052AED41B99BE1D /* SBUCacheManager.Image.swift */, - B16919409D2126B2391F13EC /* SBUCacheManager.NotificationSetting.swift */, - 713D526E6FA405E9A5B0E634 /* SBUCacheManager.Template.swift */, - C93B64D39C0831A604871F1A /* SBUCacheManager.Version.swift */, - C51D591DE56DE28D1141C067 /* SBUCacheManager.swift */, - ); - name = CacheManager; - sourceTree = ""; - }; - 1623F9D35D18176D7AAC9D91 /* Tester */ = { + 1625E229267E0AF65A37AE1B /* NotificationChannel */ = { isa = PBXGroup; children = ( + 47FE80A06D8B5616F7F63C05 /* Chat */, + CA0B97D0A2428F61872A5B8D /* Feed */, ); - path = Tester; + name = NotificationChannel; sourceTree = ""; }; - 167109B2722F25B4824EFB5A /* GroupChannel */ = { - isa = PBXGroup; - children = ( - 2558FBC469097A05B40DD8B9 /* SBUGroupChannelListModule.Common.swift */, - 69F42BD6AE2609C5128AEE18 /* SBUGroupChannelListModule.Header.swift */, - DD0E6B88CC7F9E80C8F6B305 /* SBUGroupChannelListModule.List.swift */, - 3E238435C5B02E7296851189 /* SBUGroupChannelListModule.swift */, + 16DEE933FB88D5CEB7CD318E /* MessageCell */ = { + isa = PBXGroup; + children = ( + D0EECFE4C75C6F4FBD143730 /* SBUMessageTemplateCell.swift */, + 6D59537C42075F2A9BCB0298 /* MessageCellParams */, + FF95A5440DFB1097E0DC090D /* SBUTypingIndicatorMessageCell.swift */, + DF5177554A10C9C5E2D7571D /* Forms */, + 5FB9B393AE4549C5CD25D079 /* FileMessageContentView */, + 347EA42656CD849E9250B236 /* SuggestedReply */, + C8BF1C72430A88C2900457FA /* NotificationChannel */, + 9A6018B2111FBBDD228A53FF /* Replies */, + 883E1264282F910BF0AA871A /* Feedback */, + 542E8CC398B51183F993A9D8 /* MultipleFilesMessage */, + E45AE258701D31182073F012 /* SBUBaseMessageCell.swift */, + 39D190FAF0D198E073222027 /* OpenChannel */, + 924DC6DE64F7D68922F0BD4A /* SBUMessageTemplateCell.MessageTemplateLayer.swift */, + 02F3C30880AF2997B9FCA459 /* MessageForm */, + 570DB233E9B5F6A2EAFBC568 /* CustomView */, + 3EDDD233D1B439D981ED8E09 /* SBUFileMessageCell.swift */, + B333ECB4F15E7DDDB30886AC /* SBUAdminMessageCell.swift */, + CB817CC8FF7C226396877617 /* SBUContentBaseMessageCell.swift */, + A870630AEBD66BEF9C6EA3FF /* SBUMessageTemplateCellLayout.swift */, + 11935D29CE3C16910683A970 /* SBUBaseMessageCell.Feedback.swift */, + 1CFBE0AFC194BC1EB64FA401 /* SBUUnknownMessageCell.swift */, + 05DB76C632A00715B25D2E5C /* SBUUserMessageCell.swift */, ); - name = GroupChannel; + name = MessageCell; sourceTree = ""; }; 17465F3004DCF3C0A1B1F6FB /* MessageThread */ = { @@ -1607,44 +1447,6 @@ path = MessageThread; sourceTree = ""; }; - 186DF9F4EDB89810A6FB0E14 /* ChannelSettings */ = { - isa = PBXGroup; - children = ( - 6C50DA2A421E474FF921089E /* ChannelSettingItem */, - FA4704D89BEC556F4E907BDC /* GroupChannel */, - 2FB801F8B13794A7F5D50A2A /* OpenChannel */, - 8E39C97839657F8471D6BDD6 /* SBUBaseChannelSettingsModule.Header.swift */, - 2BF3F7F5A6D16081EEAB5519 /* SBUBaseChannelSettingsModule.List.swift */, - 472BC164A96EFA762E22DCD4 /* SBUBaseChannelSettingsModule.swift */, - ); - name = ChannelSettings; - sourceTree = ""; - }; - 18BFB9E5984FE0105A3D3BEC /* Channel */ = { - isa = PBXGroup; - children = ( - FB8F2287117B61FA55437002 /* CategoryFilterCell */, - 15AF8864C7CCD22178BE9ADC /* CellView */, - 052BE3F28A22AB5ECE24AFE2 /* ChannelStateBanner */, - C8A6F27A52329DD44C3D03A8 /* FileViewer */, - 01251B2761FF6CA563F540EE /* Header */, - F19C096B53BAA45F83F0626F /* Media */, - 9EC64A3FD099A47927CEABEA /* MessageCell */, - EFD4232836828FC9BAB851B8 /* MessageInput */, - 7D66BCFD82370FFBC6D366A7 /* NewMessageInfo */, - 5CF32D7BF16A0C17746CC6DC /* Reaction */, - C11814B0E6E55BA5279B168D /* SBUBaseChannelViewController.Keyboard.swift */, - 92F377DEB112155C99CC552E /* SBUBaseChannelViewController.swift */, - 515C6843C390B95516B79D78 /* SBUChatNotificationChannelViewController.swift */, - 2106A5AFCD89A80F1D4218FF /* SBUFeedNotificationChannelViewController.swift */, - CE0631DE516FBCB87956BAC3 /* SBUGroupChannelViewController.swift */, - 301241FFA67BBA747853A153 /* SBUOpenChannelViewController.swift */, - 0164B16CC190160CB48818BB /* ScrollBottomView */, - DDA5B77C804BE2E100213499 /* ViewModel */, - ); - name = Channel; - sourceTree = ""; - }; 19CB97F6D6DD773362FB0D6C /* LiveStream */ = { isa = PBXGroup; children = ( @@ -1655,6 +1457,15 @@ path = LiveStream; sourceTree = ""; }; + 1A160F096B32CEC4952786B3 /* AlertView */ = { + isa = PBXGroup; + children = ( + 0260EF105B52AD7BD81D08D8 /* SBUAlertView.Item.swift */, + 5EED45B2BA19040E9E0D3345 /* SBUAlertView.swift */, + ); + name = AlertView; + sourceTree = ""; + }; 1AA584F8328026DE440DFFE3 /* Channel */ = { isa = PBXGroup; children = ( @@ -1673,17 +1484,20 @@ name = Products; sourceTree = ""; }; - 1ED7160D05CE48686F182C60 /* FileMessageContentView */ = { + 1D12519277A7BC6AA7A3A003 /* MemberList */ = { isa = PBXGroup; children = ( - CAB200A44A56BB6B4322FD77 /* SBUBaseFileContentView.swift */, - 8C20A075EE6772B0E0C79F30 /* SBUCommonContentView.swift */, - 2D1B3BEE36D30232B2CF92AD /* SBUImageContentView.swift */, - C2BCE6697D7354D59AB6D9BD /* SBUOpenChannelCommonContentView.swift */, - 5C88AB486291B68F04471DA6 /* SBUOpenChannelImageContentView.swift */, - 507FF12B8D66ACA7D7384F17 /* SBUVoiceContentView.swift */, + 28B2FDEA8FD5787F552C6612 /* SBUMemberListViewController.Deprecated.swift */, ); - name = FileMessageContentView; + name = MemberList; + sourceTree = ""; + }; + 1F478B0FF122AF3E8B269E8B /* UserList */ = { + isa = PBXGroup; + children = ( + 3263601D709F1BD13C3EA774 /* SBUUserListViewModel.swift */, + ); + name = UserList; sourceTree = ""; }; 20419FB470E8E62978C4075A /* Channel */ = { @@ -1703,6 +1517,29 @@ path = Common; sourceTree = ""; }; + 20B4F571C69B0EEF93B5B086 /* SelectUser */ = { + isa = PBXGroup; + children = ( + 055942829ACDEA773BDB2D41 /* SBURegisterOperatorViewController.swift */, + 94160588974EDDA4EBAADDF7 /* SBUBaseSelectUserViewController.swift */, + F37245E81F8A783F774D5638 /* SBUInviteUserViewController.swift */, + 8036AC8A1C188A7918D9AAAF /* CreateChannel */, + ); + name = SelectUser; + sourceTree = ""; + }; + 21803F74A5A28398E2334F27 /* ChannelSettings */ = { + isa = PBXGroup; + children = ( + D161DCF76A14D06BB55629B4 /* SBUBaseChannelSettingsViewController.swift */, + 2C236BF248681700FCD30B9C /* SBUOpenChannelSettingsViewController.swift */, + D7223C837D8D281ACF3E9EE7 /* Cell */, + 6B9D8E29C0856D81E5C4A6A9 /* View */, + F0DC64C9238395B420FB2F20 /* SBUGroupChannelSettingsViewController.swift */, + ); + name = ChannelSettings; + sourceTree = ""; + }; 21ED86D7782B987250EEF1B2 /* BusinessMessaging */ = { isa = PBXGroup; children = ( @@ -1745,6 +1582,31 @@ path = MessageSearch; sourceTree = ""; }; + 247A9700AA53911992C7650A /* OpenChannel */ = { + isa = PBXGroup; + children = ( + 21D78A65BE3591620DAA47EA /* SBUOpenChannelModule.List.swift */, + 947C7D3725CAABA7688DC140 /* SBUOpenChannelModule.Media.swift */, + 03C2B9D5C9ECC81437D1E4A8 /* SBUOpenChannelModule.Input.swift */, + 7A473C9986A872BAE8AC0A09 /* SBUOpenChannelModule.Header.swift */, + 48C102E1288E410BE67F35E5 /* SBUOpenChannelModule.swift */, + ); + name = OpenChannel; + sourceTree = ""; + }; + 24F4CDB32C83692CDBF90EAA /* ChannelSettings */ = { + isa = PBXGroup; + children = ( + 77D3B0857BDEFCCD9F0591FD /* SBUBaseChannelSettingsModule.Header.swift */, + 756255F28A991BA33C41A1D4 /* SBUBaseChannelSettingsModule.List.swift */, + 6A87F7D8FAC6E0436F1E8149 /* ChannelSettingItem */, + 6804A3DF4B9F941B5DBEEEE4 /* GroupChannel */, + 370581C6701AC5C3A7316F19 /* SBUBaseChannelSettingsModule.swift */, + 87B3FAA3CFC80D1ED6496D79 /* OpenChannel */, + ); + name = ChannelSettings; + sourceTree = ""; + }; 256B45ACD6A840ED0EED6294 /* Replies */ = { isa = PBXGroup; children = ( @@ -1752,20 +1614,21 @@ path = Replies; sourceTree = ""; }; - 264964F567A783E7A481A65F /* Params */ = { + 2570F8F6609140867EE4D255 /* MessageCell */ = { isa = PBXGroup; children = ( + 3C5A8CF3909F2EA39259B863 /* MessageCellParams */, + 7FBF019744E48DA505B5577A /* Replies */, + 57F4389A4E75EE2D1DED876A /* SBUContentBaseMessageCell.Deprecated.swift */, ); - path = Params; + name = MessageCell; sourceTree = ""; }; - 26641545D80A21EDF171165F /* AlertView */ = { + 264964F567A783E7A481A65F /* Params */ = { isa = PBXGroup; children = ( - 1545896B4D9FAFE6DD9D2399 /* SBUAlertView.Item.swift */, - 6A007375F446C0D971DE442F /* SBUAlertView.swift */, ); - name = AlertView; + path = Params; sourceTree = ""; }; 269500351A57E24646DC6549 /* ChannelList */ = { @@ -1801,25 +1664,33 @@ path = ChannelList; sourceTree = ""; }; - 2724E13DFD9E4EACABF2C1AF /* ChannelList */ = { - isa = PBXGroup; - children = ( - 167109B2722F25B4824EFB5A /* GroupChannel */, - 5356CF2C5A926E3EC2AD63FA /* OpenChannel */, - 621EF9178BA129EC840A562D /* SBUBaseChannelListModule.Header.swift */, - E8E80FD38269894222F55CD7 /* SBUBaseChannelListModule.List.swift */, - 63DA6C648BAD818E7843590E /* SBUBaseChannelListModule.swift */, - ); - name = ChannelList; - sourceTree = ""; - }; - 28F762C6167E363B865CCDF3 /* Mention */ = { - isa = PBXGroup; - children = ( - 04942C921F139EE779FF009A /* SBUMentionConfiguration.swift */, - B37BAAB79E1B626ED52E4839 /* SBUUserMentionConfiguration.swift */, + 28D124443F82DDD6B6A510D0 /* Deprecated */ = { + isa = PBXGroup; + children = ( + 6480215FBEB4249A56C7F89F /* SBUFormView.Deprecated.swift */, + 0429E448268C3E49060B5952 /* SBUFormFieldView.Deprecated.swift */, + 26EEA1E282900BB4466EEA33 /* SBUTableViewCell.Unavailable.swift */, + 947C228F35B28207F57BF864 /* SBUFormViewParams.Deprecated.swift */, + 441C5380E715D9DC021F6A2C /* SBUForm.Deprecated.swift */, + B917035432DE51B511A7D1D5 /* SendbirdUI.Deprecated.swift */, + 722E2E2CAE47C5C3C5F58520 /* Module */, + BB392E27BECF467FF0019C0E /* ChannelList */, + 46867F658F8CA10DEA8CF867 /* Channel */, + 1250EC3E0849DB6FA968512A /* ChannelSettings */, + 841AE3E528F833560F4E1D77 /* SBUBaseViewController.Unavailable.swift */, + 1D12519277A7BC6AA7A3A003 /* MemberList */, + BC7422FBA7985C066BAD18B4 /* UserList */, + E22E10A780845FE1864995B2 /* MessageSearch */, + E265D52B22E59716DA12D153 /* SBUView.Unavaliable.swift */, + DED6D07FA5FF12BE89365401 /* BaseMesssage+SBUIKit.Deprecated.swift */, + 5052D82AC78987F8E417FF9A /* SBUGlobals.Deprecated.swift */, + 57205339932D82EE186C0AF0 /* SBUCoverImageView.Deprecated.swift */, + 2D847795C7AE5D480E349A20 /* Moderations */, + CD3B2D6BB71315AE3EFA4F82 /* SBUTheme.Deprecated.swift */, + 38B3F27C2F20B6B52079740D /* CreateChannel */, + D584CA1792D8FC14CA8004D2 /* SBUEnums.Deprecated.swift */, ); - name = Mention; + name = Deprecated; sourceTree = ""; }; 29196F5FD4B0CC49E3C17AD6 /* MultipleFilesMessage */ = { @@ -1829,17 +1700,6 @@ path = MultipleFilesMessage; sourceTree = ""; }; - 29470B6D977E288D03394609 /* Toast */ = { - isa = PBXGroup; - children = ( - 8D3C4F194B98FEC243B2203D /* SBUToastType.swift */, - 9E5B1130755BC5BD8A5077F6 /* SBUToastView.Internal.swift */, - 815D4832D88AB11A6E9CC866 /* SBUToastView.Item.swift */, - 171790422D68B86FE1122193 /* SBUToastView.swift */, - ); - name = Toast; - sourceTree = ""; - }; 2A887B6C7177677BABF2BA66 /* ChannelSettings */ = { isa = PBXGroup; children = ( @@ -1847,51 +1707,41 @@ path = ChannelSettings; sourceTree = ""; }; - 2AA1BBB02AE5340EED8F235E /* ChannelCell */ = { - isa = PBXGroup; - children = ( - 88F0D1AD67B2A02DFD4A4DCA /* SBUBaseChannelCell.swift */, - 820597A15A4A1AF51171E99F /* SBUGroupChannelCell.swift */, - C550271EF998CCFDE576AE85 /* SBUOpenChannelCell.swift */, - ); - name = ChannelCell; - sourceTree = ""; - }; - 2D24B5BCD9B580F0834E2792 /* Renderer */ = { + 2B87D6CADD85A4C3FF7B9316 /* SelectUser */ = { isa = PBXGroup; children = ( + E665F93B614394907C4F7CA4 /* SBURegisterOperatorModule.Deprecated.swift */, + 6EB14B7E6ECC3FB7331A5638 /* SBUCreateOpenChannelModule.Deprecated.swift */, + 3B10793E1040C827B3124D46 /* SBUCreateChannelModule.Deprecated.swift */, + 203C076985EA8D760D6221BA /* SBUInviteUserModule.Deprecated.swift */, ); - path = Renderer; + name = SelectUser; sourceTree = ""; }; - 2FB801F8B13794A7F5D50A2A /* OpenChannel */ = { + 2D1937B6C40D03145B8F4C34 /* CreateChannel */ = { isa = PBXGroup; children = ( - E3C492FACFF8132FD24B3692 /* SBUOpenChannelSettingsModule.Header.swift */, - B8FBFA88F380C0DB3B7952DF /* SBUOpenChannelSettingsModule.List.swift */, - 7ACBB25153EFF189E0608A11 /* SBUOpenChannelSettingsModule.swift */, + 1579C847E96A96951C1DD122 /* SBUCreateChannelViewModel.swift */, + 06072EEA79444B09D16E7020 /* SBUCreateOpenChannelViewModel.swift */, ); - name = OpenChannel; + name = CreateChannel; sourceTree = ""; }; - 2FED359D72696181EC454972 /* ChannelSettings */ = { + 2D66B7D04791D7091D56A4CF /* MessageCell */ = { isa = PBXGroup; children = ( - 868D3D5E2ACBA2EC8EA8372E /* Cell */, - C143F7A0A06B7DE4AC97C363 /* SBUBaseChannelSettingsViewController.swift */, - 91BFD3F9C6F6D851B14E39E9 /* SBUGroupChannelSettingsViewController.swift */, - 79E77CDB516F249D7A030C67 /* SBUOpenChannelSettingsViewController.swift */, - ADACE307726F0DB27B8C7F1B /* View */, + 40A0E8F60DD81F09F14E4741 /* SBUMessageCellConfiguration.swift */, ); - name = ChannelSettings; + name = MessageCell; sourceTree = ""; }; - 301240D747034026D815941B /* CreateChannel */ = { + 2D847795C7AE5D480E349A20 /* Moderations */ = { isa = PBXGroup; children = ( - DE9AD43339DF3FFAFF9E9621 /* SBUCreateChannelViewController.Deprecated.swift */, + 8BB7D9DAF81AA000BEB6F000 /* SBUModerationsViewModel.Deprecated.swift */, + FF8BCC6C91BC5B68C14BD636 /* SBUModerationsViewController.Deprecated.swift */, ); - name = CreateChannel; + name = Moderations; sourceTree = ""; }; 3037F66EF550C725538C935A /* Reaction */ = { @@ -1927,27 +1777,30 @@ path = Feed; sourceTree = ""; }; - 34ECB469ED778E8486260BD4 /* Replies */ = { + 3473ABDBEB6B34B710233D5C /* Moderations */ = { isa = PBXGroup; children = ( - 5A615628DBAB1A2C5BCF6CBD /* SBUReplyConfiguration.swift */, + 367949391DA1D08EE2DB2DB6 /* SBUModerationsModule.List.swift */, + 11689D32EA0D186E25C95746 /* SBUModerationsModule.swift */, + A61FC21BCE19CCA459FCD403 /* SBUModerationsModule.Header.swift */, ); - name = Replies; + name = Moderations; sourceTree = ""; }; - 3503B8556E4EC590756E592F /* ChannelStateBanner */ = { + 347EA42656CD849E9250B236 /* SuggestedReply */ = { isa = PBXGroup; children = ( + CCD74A8AD570E7929071DB31 /* ViewParams */, + 792AD7FD38296769E4702D52 /* Views */, ); - path = ChannelStateBanner; + name = SuggestedReply; sourceTree = ""; }; - 35E55160CC0CF031DED68A51 /* Params */ = { + 3503B8556E4EC590756E592F /* ChannelStateBanner */ = { isa = PBXGroup; children = ( - 04B6D4605DE3785CF7BC755C /* SBUFeedNotificationChannelViewParams.swift */, ); - name = Params; + path = ChannelStateBanner; sourceTree = ""; }; 36D8B7EEFC84ABB846CA20F7 /* CategoryFilterCell */ = { @@ -1964,51 +1817,25 @@ path = "Life cycles"; sourceTree = ""; }; - 387F5B4A1125400C14917E24 /* Module */ = { + 38B3F27C2F20B6B52079740D /* CreateChannel */ = { isa = PBXGroup; children = ( - 95E3CA39A98C37100A308668 /* Channel */, - 2724E13DFD9E4EACABF2C1AF /* ChannelList */, - 186DF9F4EDB89810A6FB0E14 /* ChannelSettings */, - 1349E18CFA7327252A93F8C0 /* Common */, - 572728477BA1F260720176CB /* MessageSearch */, - 791AAE4776A8179D9EF57052 /* MessageThread */, - 09E8F6B04E131672BA37D8D5 /* Moderations */, - 9FE3DB1A21E0E4A00733A328 /* NotificationSettings */, - 712395536ABEF68B35D2A5AE /* SBUModuleSet.swift */, - 09A3C5E20A48BF3ACA8ED195 /* SelectUser */, - 998AF616D68D5A5CC925D6DE /* UserList */, + DB0B8614A86D475EFD2FFB4D /* SBUCreateChannelViewController.Deprecated.swift */, ); - name = Module; + name = CreateChannel; sourceTree = ""; }; - 3A5534963E7E9EB771559492 /* Deprecated */ = { - isa = PBXGroup; - children = ( - 89A7FB5F83E297EF2F0699B7 /* BaseMesssage+SBUIKit.Deprecated.swift */, - F6577603F597E5BAE53C337C /* Channel */, - 0971D86A836127B4F6DC8476 /* ChannelList */, - 0CC7BA10EAF646818D83091A /* ChannelSettings */, - 301240D747034026D815941B /* CreateChannel */, - 79C436C5F79F107B0AF6C831 /* MemberList */, - 73D9AA7BCAEE628F4F8AA74C /* MessageSearch */, - ADD60F9975FAF3F6A307F764 /* Moderations */, - 11CE31CA655ECACA545D8C79 /* Module */, - 468FC9277A0D8D397BC75FEB /* SBUBaseViewController.Unavailable.swift */, - 0228B7F8CB3C9255317E99E5 /* SBUCoverImageView.Deprecated.swift */, - B3FFD5E66EA2EC7853D25F7A /* SBUEnums.Deprecated.swift */, - F5A71462A25A4CA253308676 /* SBUForm.Deprecated.swift */, - A79AED1DD2EC37D026D96331 /* SBUFormFieldView.Deprecated.swift */, - B721F21C9C029F3427A0711F /* SBUFormView.Deprecated.swift */, - D2DDED6713E40ABD4BD1DBE1 /* SBUFormViewParams.Deprecated.swift */, - 0B566847DCDB97F47E3C3AFF /* SBUGlobals.Deprecated.swift */, - 34F465DBE537C3922DCF8B5A /* SBUTableViewCell.Unavailable.swift */, - 1A618D2C77EE9DE59F28522B /* SBUTheme.Deprecated.swift */, - 36707C3537ECA9B171E2C286 /* SBUView.Unavaliable.swift */, - 2C09C396BCBF26C81585EF79 /* SendbirdUI.Deprecated.swift */, - 7D6677867E4A04253150EA18 /* UserList */, + 39D190FAF0D198E073222027 /* OpenChannel */ = { + isa = PBXGroup; + children = ( + E8C640E0B8A35BEDA6E68F74 /* SBUOpenChannelFileMessageCell.swift */, + E1DA648665C3CFF87923A429 /* SBUOpenChannelAdminMessageCell.swift */, + D675CC2000A8677CD0C1991E /* SBUOpenChannelContentBaseMessageCell.swift */, + 662718DF0E9EF2709818FB6C /* SBUOpenChannelUserMessageCell.swift */, + 877084DBA5955D3BF90AABAE /* SBUOpenChannelUnknownMessageCell.swift */, + 48E1632E1278015CB685BF98 /* SBUOpenChannelBaseMessageCell.swift */, ); - name = Deprecated; + name = OpenChannel; sourceTree = ""; }; 3A83BE91ACB75128FFB50481 /* MessageSearch */ = { @@ -2046,6 +1873,16 @@ path = NotificationChannel; sourceTree = ""; }; + 3BE504CCCB1ABD4EC146966D /* NotificationSettings */ = { + isa = PBXGroup; + children = ( + 2F7524EEC19FD2161959072A /* SBUGroupChannelPushSettingsModule.List.swift */, + 8E6A4FDA788BC9DD9B880AFA /* SBUGroupChannelPushSettingsModule.swift */, + B59A9F2CE3947A76617E76D8 /* SBUGroupChannelPushSettingsModule.Header.swift */, + ); + name = NotificationSettings; + sourceTree = ""; + }; 3C1959786D4991745670E1C9 /* Header */ = { isa = PBXGroup; children = ( @@ -2053,6 +1890,14 @@ path = Header; sourceTree = ""; }; + 3C5A8CF3909F2EA39259B863 /* MessageCellParams */ = { + isa = PBXGroup; + children = ( + DE80157439A29278502A4508 /* SBUBaseMessageCellParams.Deprecated.swift */, + ); + name = MessageCellParams; + sourceTree = ""; + }; 3D7313F9E766FC108A0E0E3C /* ChannelList */ = { isa = PBXGroup; children = ( @@ -2060,6 +1905,14 @@ path = ChannelList; sourceTree = ""; }; + 3D8B56ECC77E5973434A5F76 /* Replies */ = { + isa = PBXGroup; + children = ( + 5AD600FF515CB38A6D762194 /* SBUReplyConfiguration.swift */, + ); + name = Replies; + sourceTree = ""; + }; 3DCEC74A25D3F3145204CD16 /* MessageForm */ = { isa = PBXGroup; children = ( @@ -2069,44 +1922,44 @@ path = MessageForm; sourceTree = ""; }; - 3EB32C2881C208F9731B8A2F /* ViewParams */ = { + 3FEF4EDFAE1A5B42BBCDA028 /* OpenChannel */ = { isa = PBXGroup; children = ( - F61FBE9899FDCE7D66E99D9C /* SBUSuggestedReplyViewParams.swift */, ); - name = ViewParams; + path = OpenChannel; sourceTree = ""; }; - 3FEF4EDFAE1A5B42BBCDA028 /* OpenChannel */ = { + 3FFE70025147D3B2F3DF938F /* OpenChannel */ = { isa = PBXGroup; children = ( ); path = OpenChannel; sourceTree = ""; }; - 3FFE70025147D3B2F3DF938F /* OpenChannel */ = { + 40150E48D6C6440C91F1B218 /* MessageThread */ = { isa = PBXGroup; children = ( + 386A9AF0AFD4A482BC38A3D1 /* SBUMessageThreadModule.Deprecated.swift */, ); - path = OpenChannel; + name = MessageThread; sourceTree = ""; }; - 401AF0DFFF70896871C2D3AD /* Manager */ = { + 41577B3040AA5084B4AA12B8 /* ChannelCell */ = { isa = PBXGroup; children = ( - 16141086D839DF57965C01F3 /* CacheManager */, - 5D6175D0E27503A2FAED1ACF /* SBUDownloadManager.swift */, - DAF1B4C2E5F8F0D0D15A31E7 /* SBUEmojiManager.swift */, - 6544A8D91C7E66D9706B0D86 /* SBUMessageTemplateManager.swift */, - E1F0CC82C0AC905923C25117 /* SBUNotificationChannelManager.swift */, - DE6C860D49E72966CE515EB5 /* SBUPendingMessageManager.swift */, - 891A746F3838DAC98E12433E /* SBUPermissionManager.swift */, - 840025E10C4D2DDD5EE017D8 /* SBUTemplateType.swift */, - 1633D800A421312B3980F3A1 /* SBUTypingIndicatorMessageManager.swift */, - 1AFF065AB6B0A162B6E0573A /* SBUVoicePlayer.swift */, - 4BCE2663136F68F00AF004AD /* SBUVoiceRecorder.swift */, + D21040A4827EEF5E2BD7EAC1 /* SBUOpenChannelCell.swift */, + 8797B8947A05E6961559FC70 /* SBUGroupChannelCell.swift */, + AEBF6CAB375E4C0A98B3703F /* SBUBaseChannelCell.swift */, ); - name = Manager; + name = ChannelCell; + sourceTree = ""; + }; + 41E1C8CA0690092297CC5C2A /* Common */ = { + isa = PBXGroup; + children = ( + 09FBF75480C4B97D8899C057 /* SBUCommonDelegate.swift */, + ); + name = Common; sourceTree = ""; }; 43996DB94712B42B4F8D856B /* Common */ = { @@ -2120,45 +1973,78 @@ path = Common; sourceTree = ""; }; - 45BA482E5EE13EC32B910904 /* Moderations */ = { + 43A1EDA9F042758C9A8A9443 /* ViewModel */ = { isa = PBXGroup; children = ( + D9692FF050F42210BFCF6B3C /* SBUViewModelDelegate.swift */, + 04EA12CBCAF17CE01704A942 /* ChannelList */, + D2B2610D6F9B849AB4D31483 /* NotificationSettings */, + A412081C3479CE09ED8D7E10 /* Channel */, + 9C9DE3DE0D7DDAC54C158F12 /* ChannelSettings */, + 41E1C8CA0690092297CC5C2A /* Common */, + 1F478B0FF122AF3E8B269E8B /* UserList */, + 509BDF28770A3BB2C912CDD1 /* MessageSearch */, + 9A2AAE35714744166FC225BF /* MessageThread */, + 922BAE0DC363068F26D97C7B /* SelectUser */, + E8179684119E32E863E37C29 /* SBUViewModelSet.swift */, ); - path = Moderations; + name = ViewModel; sourceTree = ""; }; - 4636FF5577D9E1A2ECD87C87 /* Life cycles */ = { + 43CD9AF5C1DE009F333A1A0B /* VoiceMessage */ = { isa = PBXGroup; children = ( - 773CBC0C8D8547AA443453C9 /* SBUCollectionViewCell.swift */, - 83D1437997DEB6968F2EC2FB /* SBULabel.swift */, - 6CF00F8A7932FF7D21A97A52 /* SBUMessageCellProtocol.swift */, - E74ED44885947815D317C147 /* SBUQuoteMessageInputViewProtocol.swift */, - A2686E8D69FDB24F9DCCCB4C /* SBUQuotedMessageViewProtocol.swift */, - 3ED26C2B108FA667F4A2B97F /* SBUTableViewCell.swift */, - FB6B3ADC98B9C071ABAB009D /* SBUTextView.swift */, - 7ADFE528E3F7FAD8397BB167 /* SBUView.swift */, - 965CDE99D3CE7B2C8878BF20 /* SBUViewLifeCycle.swift */, + 795AD469E503419F2F03D44B /* SBUVoiceMessageConfiguration.swift */, ); - name = "Life cycles"; + name = VoiceMessage; sourceTree = ""; }; - 46646E6600F483D1AC615A49 /* Renderer */ = { + 45BA482E5EE13EC32B910904 /* Moderations */ = { isa = PBXGroup; children = ( - 004B588C26D26E9E4F2B863C /* SBUMessageTemplate.Renderer+Events.swift */, - F146389B9310D3B2A12C036F /* SBUMessageTemplate.Renderer+RenderItems.swift */, - 28A4719021E78C4959DDBBC9 /* SBUMessageTemplate.Renderer+RenderStyles.swift */, - E8563AAF96E2695F5C8E6149 /* SBUMessageTemplate.Renderer+Utils.swift */, - 29E31D84BF02E170C477B60E /* SBUMessageTemplate.Renderer.Image.swift */, - 6BA9E7DB55FE0615E1E310E0 /* SBUMessageTemplate.Renderer.RendererType.swift */, - 17275291DAC0564917272496 /* SBUMessageTemplate.Renderer.Views.swift */, - BBDDDF4C45F5BFA4AA239DFE /* SBUMessageTemplate.Renderer.swift */, ); - name = Renderer; + path = Moderations; sourceTree = ""; }; - 47D4E822E2807FDF6CEDFA71 /* GroupChannel */ = { + 4642952A42E12A9D0B662070 /* Cell */ = { + isa = PBXGroup; + children = ( + A02BD5E7F272E509F0000D86 /* SBUMessageSearchResultCell.swift */, + ); + name = Cell; + sourceTree = ""; + }; + 466609DF5A09E4F5D06E5E0A /* VoiceNote */ = { + isa = PBXGroup; + children = ( + 27ADA51C845387A916A0DFD0 /* SBUVoiceMessageInputView.swift */, + ); + name = VoiceNote; + sourceTree = ""; + }; + 46867F658F8CA10DEA8CF867 /* Channel */ = { + isa = PBXGroup; + children = ( + 2570F8F6609140867EE4D255 /* MessageCell */, + 0403C3912C3689CD98DD86C0 /* SBUBaseChannelViewController.Deprecated.swift */, + 8906F1A56ED44007FBDF7CFD /* SBUGroupChannelViewController.Unavailable.swift */, + 7F715B477D4B9CF28A20C45C /* SBUOpenChannelViewController.Deprecated.swift */, + 99BE0F27C266AB6A9FC75B09 /* SBUOpenChannelViewController.Unavailable.swift */, + 4D48FDCD85AD0971FC3BF896 /* SBUGroupChannelViewController.Deprecated.swift */, + B80713CB5871E2BC5C1F647E /* SBUBaseChannelViewController.Unavailable.swift */, + ); + name = Channel; + sourceTree = ""; + }; + 474471F7E2FD68DB49558F9A /* Moderations */ = { + isa = PBXGroup; + children = ( + 56E0778A68BA0E40CFAD16CD /* SBUModerationsModule.Deprecated.swift */, + ); + name = Moderations; + sourceTree = ""; + }; + 47D4E822E2807FDF6CEDFA71 /* GroupChannel */ = { isa = PBXGroup; children = ( A70A4957E68614935FB923A6 /* MainChannelTabbarController.swift */, @@ -2168,20 +2054,22 @@ path = GroupChannel; sourceTree = ""; }; - 4908FBA6A144E1785216A9E1 /* ViewParams */ = { + 47FE80A06D8B5616F7F63C05 /* Chat */ = { isa = PBXGroup; children = ( - B2F8D1EB1D894DD952339175 /* SBUQuoteMessageInputViewParams.swift */, + AE8FBBBE3C12F5EE9E7BAAD0 /* SBUChatNotificationChannelModule.swift */, + 5E59E3DE583E4F9F8E75D0E4 /* SBUChatNotificationChannelModule.List.swift */, + DC16BFD1AC1191A41EA6C132 /* SBUChatNotificationChannelModule.Header.swift */, ); - name = ViewParams; + name = Chat; sourceTree = ""; }; - 4A3BABBE73EA71823728C678 /* MessageThread */ = { + 490927F468767D48D7D9FA18 /* Cell */ = { isa = PBXGroup; children = ( - 7F3DC79E0E7967AAE716E8C9 /* SBUMessageThreadModule.Deprecated.swift */, + 56BEE659A0A918AA173C99B4 /* SBUChannelPushSettingCell.swift */, ); - name = MessageThread; + name = Cell; sourceTree = ""; }; 4ADA3E3BDAC1D434A1700482 /* SubView */ = { @@ -2192,134 +2080,143 @@ path = SubView; sourceTree = ""; }; - 4D131CA77D409FB498091E8D /* ActionSheet */ = { + 4CD53927DA2B18E4805105FB /* ScrollPostion */ = { isa = PBXGroup; children = ( - 433BCD13FDDDABF5F518EAF1 /* SBUActionSheet.Item.swift */, - 5564F9C50888E26CD11E0454 /* SBUActionSheet.swift */, + CF2C540E9A67901DAF734467 /* SBUScrollPostionConfiguration.swift */, ); - name = ActionSheet; + name = ScrollPostion; sourceTree = ""; }; - 4D4C9290B70DC72B6FD8BCC2 /* VoiceNote */ = { + 4D235E5C9B61BAC58FD38456 /* CellView */ = { isa = PBXGroup; children = ( - 3F98605B0DD442AD06325B5F /* SBUVoiceMessageInputView.swift */, + 26DE9F3CDEEC51F45434B9D3 /* SBUMarkdownTransfer.swift */, + 7F963307DB6D64936A82369A /* SBUMessageStateView.swift */, + 7D1E8970B46D7627FE122009 /* SBUMessageProfileView.swift */, + 1C63F463A8F116869B93914B /* SBUUserMessageTextView.swift */, + BD886E49DD2C00DC3173F7D6 /* SBUUserNameView.swift */, + 68407D7FEF5E7BB5D583C8DD /* SBUMessageWebView.swift */, + 87C2270A9B32D59276A9A61C /* SBUMessageDateView.swift */, + 9AEDE1414A1D7988C5CF8C11 /* SBULinkClickableTextView.swift */, + 254D450D9EEED391B877B507 /* SBUOpenChannelMessageWebView.swift */, + 5E56AB990ACF1FFA47AE0A60 /* SBUSelectableStackView.swift */, + 59B27D8BBB23A60FE74CEE82 /* SBUNotificationTimelineView.swift */, ); - name = VoiceNote; + name = CellView; sourceTree = ""; }; - 512F0F2FA832B397FCF4C97F /* View */ = { + 4FBB01C21052D973E45DD4BF /* Reaction */ = { isa = PBXGroup; children = ( - 999641C66EC0AAC6FE3C2FAD /* Channel */, - 27095BA6B925985E96900591 /* ChannelList */, - 7468652423E5450E19C0A00F /* ChannelSettings */, - 43996DB94712B42B4F8D856B /* Common */, - D898EFF22FEDF72873F1E306 /* CreateChannel */, - 06A0BE0BB1FB4F360900DF15 /* InviteUser */, - 7A53E5FDF20587C7B444214D /* MemberList */, - 59833FEDA2EC7AE9D7251789 /* OpenChannel */, - 9761570D537237ABF97399C7 /* Others */, + 779F7EEC56669BD6E766492C /* SBUParentMessageInfoReactionView.swift */, + E321314C869482D4596032AB /* SBUReactionCollectionViewCell.swift */, + F0F2D09151D1CCABD46BF3A6 /* SBUReactionsViewController.swift */, + 8697D802A32FDDFE7CA0E53F /* SBUMessageReactionView.swift */, + 53E13940CB4B33B22925AE6C /* SBUEmojiListViewController.swift */, ); - path = View; + name = Reaction; sourceTree = ""; }; - 519FCF21C7B6C9BCA589BFF2 /* ViewParams */ = { + 50266A482A990A1FFDAF7501 /* Toast */ = { isa = PBXGroup; children = ( - CDDF8D72848C64E37CB61015 /* SBUQuotedBaseMessageViewParams.swift */, + 2942B18E2F4E33DCC2141C06 /* SBUToastType.swift */, + 875ED58CFDDA04F2E44E2C27 /* SBUToastView.swift */, + D5769F55C182E1257D255DF6 /* SBUToastView.Item.swift */, + 450B2CBD60BB544A030CA079 /* SBUToastView.Internal.swift */, ); - name = ViewParams; + name = Toast; sourceTree = ""; }; - 528836574DA5873A8F03FCAC /* SuggestedReply */ = { + 509BDF28770A3BB2C912CDD1 /* MessageSearch */ = { isa = PBXGroup; children = ( - D8AC30003FB15D1719B37DD4 /* ViewParams */, - 3AB6DFB3B99F67DAE2024005 /* Views */, + 6924D235AA92673E6EC803F9 /* SBUMessageSearchViewModel.swift */, ); - path = SuggestedReply; + name = MessageSearch; sourceTree = ""; }; - 531392467821DEF4716B9BA2 /* SelectUser */ = { + 512A764D7CD21464DF826BF9 /* Enums */ = { isa = PBXGroup; children = ( + 3F37C738B0DF21E04D5F643D /* VoiceMessageStatus.swift */, + 3D2D13198CD475B3BFE7CF75 /* SBUIconSetType.swift */, + 15AF7EF71D958D849882CF0A /* SBUEnums.swift */, ); - path = SelectUser; + name = Enums; sourceTree = ""; }; - 5327A6D4305E365002AC1608 /* Moderations */ = { + 512F0F2FA832B397FCF4C97F /* View */ = { isa = PBXGroup; children = ( - 6B575CA3A534C9F671A54E3C /* SBUModerationsViewController.swift */, + 999641C66EC0AAC6FE3C2FAD /* Channel */, + 27095BA6B925985E96900591 /* ChannelList */, + 7468652423E5450E19C0A00F /* ChannelSettings */, + 43996DB94712B42B4F8D856B /* Common */, + D898EFF22FEDF72873F1E306 /* CreateChannel */, + 06A0BE0BB1FB4F360900DF15 /* InviteUser */, + 7A53E5FDF20587C7B444214D /* MemberList */, + 59833FEDA2EC7AE9D7251789 /* OpenChannel */, + 9761570D537237ABF97399C7 /* Others */, ); - name = Moderations; + path = View; sourceTree = ""; }; - 5356CF2C5A926E3EC2AD63FA /* OpenChannel */ = { + 528836574DA5873A8F03FCAC /* SuggestedReply */ = { isa = PBXGroup; children = ( - 31EF2A01C5FBAE453CB2B6F6 /* SBUOpenChannelListModule.Header.swift */, - 3C5B5ABC746F6AAC7FC3BB90 /* SBUOpenChannelListModule.List.swift */, - 3718D19B8262FD4FE55D45E3 /* SBUOpenChannelListModule.swift */, + D8AC30003FB15D1719B37DD4 /* ViewParams */, + 3AB6DFB3B99F67DAE2024005 /* Views */, ); - name = OpenChannel; + path = SuggestedReply; sourceTree = ""; }; - 544992670602E44BE8FA7FA4 /* View */ = { + 531392467821DEF4716B9BA2 /* SelectUser */ = { isa = PBXGroup; children = ( - 5F9E329C5656BE3F04A553F3 /* SBUCreateChannelTypeSelector.swift */, ); - name = View; + path = SelectUser; sourceTree = ""; }; - 548D537083C683C3AED0C530 /* UserList */ = { + 542E8CC398B51183F993A9D8 /* MultipleFilesMessage */ = { isa = PBXGroup; children = ( - FCB5700F5D0D4B10B740AEF4 /* SBUUserListViewController.swift */, + 969014C3CE65DBB59C133FF1 /* SBUMultipleFilesMessageCollectionViewCell.swift */, + 76A196C6443AE18D9B184506 /* SBUMultipleFilesMessageCollectionView.swift */, + 295EECE198D5BAEB03EF0398 /* SBUMultipleFilesMessageCell.swift */, ); - name = UserList; + name = MultipleFilesMessage; sourceTree = ""; }; - 5521A07579973A5BFE1F9C9B /* View */ = { + 56637249F60ABAB940AC8E38 /* MessageView */ = { isa = PBXGroup; children = ( - 18BFB9E5984FE0105A3D3BEC /* Channel */, - F6D9D0271CE544F8AA4DC369 /* ChannelList */, - 2FED359D72696181EC454972 /* ChannelSettings */, - 5D47777CA0078D2AA225A2C2 /* Common */, - 4636FF5577D9E1A2ECD87C87 /* Life cycles */, - 8D64C6EE9FAD7E42C344D348 /* MessageSearch */, - BB1D3C06FB26FE54E12B3933 /* MessageThread */, - 5327A6D4305E365002AC1608 /* Moderations */, - 63DAE880B28EA085BAA95D75 /* NotificationSettings */, - 3B062DEC7647CC0D2D962C3F /* SBUBaseViewController.swift */, - A321BEB3FBBF14905C29AA97 /* SBUViewControllerSet.swift */, - 5DDAC4B2B004A0885B96CE45 /* SelectUser */, - 548D537083C683C3AED0C530 /* UserList */, - 4D4C9290B70DC72B6FD8BCC2 /* VoiceNote */, + 13A78E70F1638CB818B9F747 /* QuotedFileCommonContentView.swift */, + 94DBF4C540EFF4387E7269B0 /* SBUQuotedBaseMessageView.swift */, + 018C80E9E0766DABE70434EA /* SBUThreadInfoView.swift */, + FD7D1E866BB8BE34190CEB17 /* QuotedFileImageContentView.swift */, + 28FA6BB11398877A1D04EC65 /* SBUQuotedFileMessageView.swift */, + E70E63DB609903DF2E27357D /* SBUQuotedUserMessageView.swift */, ); - name = View; + name = MessageView; sourceTree = ""; }; - 55613213D02448DE4B21F127 /* CarouselView */ = { + 570DB233E9B5F6A2EAFBC568 /* CustomView */ = { isa = PBXGroup; children = ( - 060F8041E96B5586F59E01D0 /* SBUBaseCarouselView.swift */, + 17CCF10C147D01EA08E472AA /* SBUExtendedMessagePayloadCustomViewFactory.swift */, ); - name = CarouselView; + name = CustomView; sourceTree = ""; }; - 572728477BA1F260720176CB /* MessageSearch */ = { + 58DC4A41C7679B62698E4991 /* ChannelList */ = { isa = PBXGroup; children = ( - 9829D64688D3B09D3D150D9C /* SBUMessageSearchModule.Header.swift */, - 4ED1D13AC1F6F2291A9717D8 /* SBUMessageSearchModule.List.swift */, - 93F0796E438A3E19F039537B /* SBUMessageSearchModule.swift */, + 9253D190106102D9D927B1B8 /* SBUGroupChannelListModule.Deprecated.swift */, + 1CBED77C804D79D3429197D4 /* SBUOpenChannelListModule.Deprecated.swift */, ); - name = MessageSearch; + name = ChannelList; sourceTree = ""; }; 59833FEDA2EC7AE9D7251789 /* OpenChannel */ = { @@ -2330,60 +2227,29 @@ path = OpenChannel; sourceTree = ""; }; - 5CF32D7BF16A0C17746CC6DC /* Reaction */ = { + 5ADC790E3C98F794AE92241D /* ChatSDK */ = { isa = PBXGroup; children = ( - B2A0491AA6BA0E7CD100BE3A /* SBUEmojiListViewController.swift */, - 8FD7BB24F69EE0C3973B92C3 /* SBUMessageReactionView.swift */, - 765BF37122CC61258578D0F1 /* SBUParentMessageInfoReactionView.swift */, - A7273381A16F8119BC363616 /* SBUReactionCollectionViewCell.swift */, - A48BA23BAC1C688AE03630C9 /* SBUReactionsViewController.swift */, - ); - name = Reaction; - sourceTree = ""; - }; - 5D47777CA0078D2AA225A2C2 /* Common */ = { - isa = PBXGroup; - children = ( - 4D131CA77D409FB498091E8D /* ActionSheet */, - 26641545D80A21EDF171165F /* AlertView */, - 82D3457075BBE755A54B899F /* Menu */, - DCAC0E8A37AD46FEAD4E95CD /* PhotoLibrary */, - 7861BB13B20D6858309BF60A /* SBUAnimation.swift */, - 4FDA8031558C550C5DC613F4 /* SBUBarButtonItem.swift */, - 18F0D9753CF2825B748B02DD /* SBUCollectionViewFlowLayout.swift */, - 8527B5D24C2029F5E477847C /* SBUCommonItem.swift */, - 9D0E23C23196DDA9D880BDB6 /* SBUCommonViewControllerSet.swift */, - FD0BC8DC212FB085843FDCF5 /* SBUCoverImageView.swift */, - E737652B7CC0957AD9113F9F /* SBUEmptyView.swift */, - AC42BC4023ED4C214280A980 /* SBULayoutableButton.swift */, - 43EA07BFE9725B76DDCC82D8 /* SBULoading.swift */, - 22EF4EBB5E024E3278931826 /* SBUMarginView.swift */, - E9AC601B0DF0FE1F84D85F02 /* SBUNavigationTitleView.swift */, - FF6AE8EC96A46BEC3415399C /* SBUNotificationEmptyView.swift */, - 331376C1A9EA4A911F7EC5F4 /* SBUNotificationNavigationTitleView.swift */, - B32083ACA8AD24B96C195022 /* SBUPaddingLabel.swift */, - 708B69B5FD94D3F36A73D95B /* SBUSearchBar.swift */, - DA884B9C05518C89428F530D /* SBUStackView.swift */, - 68F7DD03795E7F72E2E3D7A5 /* SBUTemplateLabel.swift */, - D1063EB35331F4506C4F0B8F /* SBUTypingIndicatorBubbleView.swift */, - 964EF76CD4B76CCB680AD5EC /* SBUUnderLineTextField.swift */, - 29470B6D977E288D03394609 /* Toast */, - 62E1A5606B4BAA6757985297 /* User */, - AA257B196A59B09D89E3A209 /* UserCell */, + 5638EBB5B0EC531033CB218E /* BaseMessage+SBUIKit.swift */, + CD0E13A9E896E2DC26D38FC8 /* MultipleFilesMessage+SBUIKit.swift */, + E7F91A991F92C4F68FFFD482 /* SendbirdChat+SBUIKit.swift */, + 553C09FE57F5CD972A0DDE30 /* BaseMessage+SBUIKit.MessageTemplate.swift */, + E232CCC55C6F5328E2A00785 /* MessageForm+SBUIKit.swift */, ); - name = Common; + name = ChatSDK; sourceTree = ""; }; - 5DDAC4B2B004A0885B96CE45 /* SelectUser */ = { + 5B1CA421E5A85017ED705807 /* MessageInput */ = { isa = PBXGroup; children = ( - 978A322C353310221328ED72 /* CreateChannel */, - 1D6C7D252AAE674B0E29A7CA /* SBUBaseSelectUserViewController.swift */, - 0E50812E1BE59E25B6A6369D /* SBUInviteUserViewController.swift */, - 9FCA7D97C1CF24D51B41510C /* SBURegisterOperatorViewController.swift */, + B6DA5302A886FEF8E44B9CF8 /* SBUMentionLimitGuideCell.swift */, + 9BA1D1E52A87BE51627AEB53 /* SBUSuggestedMentionList.swift */, + 78C033ED3B5FC4D3566D4CC9 /* SBUQuoteMessageInputView.swift */, + 2A2A275D999F50B4A00D575A /* SBUMessageInputMode.swift */, + 9F2D74910270E61F951FB5A2 /* ViewParams */, + CA7A34D778672B5428681438 /* SBUMessageInputView.swift */, ); - name = SelectUser; + name = MessageInput; sourceTree = ""; }; 5DF9CFE6AA8F9F096DE198AB /* MessageThread */ = { @@ -2393,53 +2259,26 @@ path = MessageThread; sourceTree = ""; }; - 5EBC021FBE881CF264F7D470 /* Views */ = { + 5F1BE73F390AAB66A1E4270E /* MessageSearch */ = { isa = PBXGroup; children = ( - C1DBEACF53A1FEE32AEA88EE /* SBUMessageFormChipsItemView.swift */, - 984899098C13FC5DC9C03E99 /* SBUMessageFormFallbackView.swift */, - D0C29B5B55241C104AB00977 /* SBUMessageFormItemView.swift */, - D010876D601B1A3E11B87018 /* SBUMessageFormMultiTextItemView.swift */, - C8B19DA6FA7D4FD35CD58F44 /* SBUMessageFormSingleTextItemView.swift */, - EE43DB444DF9960D183A301D /* SBUMessageFormView.swift */, - D55F110022C53ED1873E0042 /* SubViews */, + E4EAA80940C2F0E0B4F55369 /* SBUMessageSearchViewController.swift */, + 4642952A42E12A9D0B662070 /* Cell */, ); - name = Views; + name = MessageSearch; sourceTree = ""; }; - 5FA9D6F48112101A3D4D5761 /* Extension */ = { - isa = PBXGroup; - children = ( - B8CF9CD6B1B63416319E375C /* Array+SBUIKit.swift */, - 97688B2278AFD93CCAF21CE8 /* CGSize+SBUIKit.swift */, - F95B9E20A3C03F181B5E924F /* ChatSDK */, - 977B30FD3D3695ACF7EA24E1 /* Collection+SBUIKit.swift */, - DF6345F69FDF5A157D241BC9 /* Data+SBUIKit.swift */, - 52A8DA18B596725EA66D7623 /* Date+SBUIKit.swift */, - 6E0E9B50C527EAEC31E714DE /* Float+SBUIKit.swift */, - BFA99DB33C37D0282FDD6ACB /* Formatter+SBUIKit.swift */, - 76E7B76170E32DBEA8298098 /* NSLayoutConstraint+SBUIKit.swift */, - 14C33A3E985A6F3433E2CD80 /* NSObject+SBUIKit.swift */, - DE65E9F31BA0AC98929110F3 /* Sequence+SBUIKit.swift */, - 98B2C88EF2BFC124EE8E9E82 /* String+SBUIKit.swift */, - D57C491CE4E8339CF2EB880A /* StringProtocol+SBUIKit.swift */, - 59C7116D15D65A6EB152DDAB /* Thread+SBUIKit.swift */, - D4BD0DF774EA634A2B89AF8F /* UIApplication+SBUIKit.swift */, - C7F59295553F372937A267AE /* UIButton+SBUIKit.swift */, - ECBD3BF61C51B2693FDABF96 /* UICollectionView+SBUIKit.swift */, - D915E9E6C658C2A6B320B54C /* UIColor+SBUIKit.swift */, - C97CC7AA39F3DEE6663FB116 /* UIImage+SBUIKit.swift */, - A8480353864F682CD4B6BBF9 /* UIImageView+SBUIKit.swift */, - 81C11108DC261338213DD256 /* UINavigationController+SBUIKit.swift */, - CDE8456A5754CEB8284EA838 /* UIScrollView+SBUIKit.swift */, - FCC5581F9677458AF778F7F4 /* UIStackView.SBUIKit.swift */, - C117838EC1C4DBB199BC3F12 /* UITableView+SBUIKit.swift */, - 00B6560E812A93A38C1E7FFB /* UITextField+SBUIKit.swift */, - 0274A314CF90AC819BB67606 /* UIView+SBUIKit.swift */, - E63214C27114B413C99BC200 /* UIViewController+SBUIKit.swift */, - B4537DE89EF4104AB5A7C665 /* URL+SBUIKit.swift */, + 5FB9B393AE4549C5CD25D079 /* FileMessageContentView */ = { + isa = PBXGroup; + children = ( + 0776A5FE380B8F0B9AF78774 /* SBUBaseFileContentView.swift */, + 829D5FC15D41DA1A55633BCC /* SBUOpenChannelCommonContentView.swift */, + A001243167C67B9CE3B7C2E4 /* SBUVoiceContentView.swift */, + 2DA9C0BFBB42D524F16CA6F4 /* SBUImageContentView.swift */, + 9A29388DC75BF0C2E8DB98BB /* SBUCommonContentView.swift */, + CAFEA35277DDBD7BD1D23617 /* SBUOpenChannelImageContentView.swift */, ); - name = Extension; + name = FileMessageContentView; sourceTree = ""; }; 60242231F5D8DAEFB824E8B5 /* ChannelList */ = { @@ -2457,28 +2296,30 @@ path = FileViewer; sourceTree = ""; }; - 62E1A5606B4BAA6757985297 /* User */ = { - isa = PBXGroup; - children = ( - 1F1705ECF2EFDD64ADA42CF1 /* SBUUserProfileView.swift */, - ); - name = User; - sourceTree = ""; - }; - 63DAE880B28EA085BAA95D75 /* NotificationSettings */ = { + 645C2CEEF66984962F370726 /* Cell */ = { isa = PBXGroup; children = ( - AA74571F2D712E2A6C3C163B /* Cell */, - D055E1C7D8FB4A8F3552F98E /* SBUGroupChannelPushSettingsViewController.swift */, ); - name = NotificationSettings; + path = Cell; sourceTree = ""; }; - 645C2CEEF66984962F370726 /* Cell */ = { + 66E8919EC9613C9098CC536A /* Shared */ = { isa = PBXGroup; children = ( + 2B4C8408CF8FA2EF38D2A69A /* Thread+SBUIKit.swift */, + AA96EB90B623A2FBD7CCE9DC /* UIColor+SBUIKit.swift */, + 08A04237D86F2725D65C2702 /* UIImage+SBUIKit.swift */, + A934950C52F32BCFB343DC02 /* NSLayoutConstraint+SBUIKit.swift */, + 247E246A7F9CE24C355FC901 /* Float+SBUIKit.swift */, + 094E070E26A56309ACF7EDB2 /* UILabel+SBUIKit.swift */, + 6BB0DDCBBCD37656EE67BF01 /* String+SBUIKit.swift */, + 4FEAEB09E73D10EA062EB110 /* Data+SBUIKit.swift */, + E66DFF02F9BC48A669A1FABE /* Collection+SBUIKit.swift */, + 554E88B94EABB3AFE34858E6 /* UIApplication+SBUIKit.swift */, + 16151D86B2C9CE9C4A88E659 /* UIView+SBUIKit.swift */, + 597875139B52BA61E56C4664 /* UIImageView+SBUIKit.swift */, ); - path = Cell; + name = Shared; sourceTree = ""; }; 6706FA635E64B8742A7073C9 /* MainViews */ = { @@ -2490,19 +2331,6 @@ path = MainViews; sourceTree = ""; }; - 670A9BAB5603096590685860 /* Processor */ = { - isa = PBXGroup; - children = ( - 438EBCABB91C84B18C5ECA30 /* SBUMessageTemplate.Binder.swift */, - 261C819AB2BB5F03295C09F2 /* SBUMessageTemplate.Container.swift */, - 37DFF0F24B9E826B1F6713EF /* SBUMessageTemplate.Coordinator.swift */, - 68A392D80685B111FD18F3C8 /* SBUMessageTemplate.Payload.swift */, - 01B32F68AD76DC2D2D5C2378 /* SBUMessageTemplate.PayloadType.swift */, - 0190755CC824BA406D56F8C3 /* SBUMessageTemplate.TemplateList.swift */, - ); - name = Processor; - sourceTree = ""; - }; 67852089506478566285B82D /* NotificationService */ = { isa = PBXGroup; children = ( @@ -2513,6 +2341,16 @@ path = NotificationService; sourceTree = ""; }; + 6804A3DF4B9F941B5DBEEEE4 /* GroupChannel */ = { + isa = PBXGroup; + children = ( + 255681C53CE8C6A0AADBEDBF /* SBUGroupChannelSettingsModule.swift */, + 5EFE9C0D2F680E8AD1E577DA /* SBUGroupChannelSettingsModule.Header.swift */, + 0A122472694CAAFA77CE6344 /* SBUGroupChannelSettingsModule.List.swift */, + ); + name = GroupChannel; + sourceTree = ""; + }; 685589CFF98965D5241F4149 /* MessageThread */ = { isa = PBXGroup; children = ( @@ -2520,15 +2358,12 @@ path = MessageThread; sourceTree = ""; }; - 694BEA543EF225C2683AB331 /* ChannelSettings */ = { + 6956CA9E691863B453C1FB01 /* ScrollBottomView */ = { isa = PBXGroup; children = ( - A7B8F94D8EE3FB46EBA10783 /* SBUBaseChannelSettingsViewModel.swift */, - 5E90A0C200855E3C6BB11C5B /* SBUGroupChannelSettingsViewModel.swift */, - C3842E8286E51A6EA5E72371 /* SBUModerationsViewModel.swift */, - A947D08810EFFB1B6B004BB1 /* SBUOpenChannelSettingsViewModel.swift */, + 3FAF480DC85E05894E9B9A97 /* SBUScrollBottomView.swift */, ); - name = ChannelSettings; + name = ScrollBottomView; sourceTree = ""; }; 69674F6FF6F6FBDD4E15E15B /* MessageSearch */ = { @@ -2545,6 +2380,22 @@ path = ChatSDK; sourceTree = ""; }; + 6A87F7D8FAC6E0436F1E8149 /* ChannelSettingItem */ = { + isa = PBXGroup; + children = ( + 4BF729A9FEEDC7C1C5748A8D /* SBUChannelSettingItem.swift */, + ); + name = ChannelSettingItem; + sourceTree = ""; + }; + 6A881B4B30E4BA0DB0F7AD9A /* User */ = { + isa = PBXGroup; + children = ( + F9BA7B959F6864DF50326000 /* SBUUserProfileView.swift */, + ); + name = User; + sourceTree = ""; + }; 6A98B28468D97FC974B6EB9D /* Mention */ = { isa = PBXGroup; children = ( @@ -2560,27 +2411,59 @@ path = ChannelList; sourceTree = ""; }; - 6B2DA69C7163A11B6D8F4EE4 /* NotificationSettings */ = { + 6B9D8E29C0856D81E5C4A6A9 /* View */ = { isa = PBXGroup; children = ( - 757A554AF91A46AF49BDB886 /* SBUGroupChannelPushSettingsModule.Deprecated.swift */, + DD7CF787DB2966C05452D6A6 /* SBUChannelSettingsChannelInfoView.swift */, ); - name = NotificationSettings; + name = View; sourceTree = ""; }; - 6C1CFDCE69A77784B55B81C5 /* Syntax */ = { + 6C13C9796B0C365647EDAA18 /* Channel */ = { isa = PBXGroup; children = ( + AD36C5DFBB79648CB6C4726F /* GroupChannel */, + 1625E229267E0AF65A37AE1B /* NotificationChannel */, + 171266FF2A7A626668E63063 /* SBUBaseChannelModule.Input.swift */, + E1B31519149586518A897715 /* SBUBaseChannelModule.swift */, + 479DAD6BC69CDC717FDE6A1A /* SBUBaseChannelModule.Header.swift */, + 247A9700AA53911992C7650A /* OpenChannel */, + 3F83154FFF362124CA0A80AA /* SBUBaseChannelModule.List.swift */, ); - path = Syntax; + name = Channel; sourceTree = ""; }; - 6C50DA2A421E474FF921089E /* ChannelSettingItem */ = { + 6D59537C42075F2A9BCB0298 /* MessageCellParams */ = { isa = PBXGroup; children = ( - 748E749BEDE5F43C9746B194 /* SBUChannelSettingItem.swift */, + 1FCE4259320B5D0A3DA298DC /* SBUMultipleFilesMessageCellParams.swift */, + AFEF2B7C6374DF55580D0732 /* SBUTypingMessageCellParams.swift */, + BA98EA0CCF6A7271C73BD7DE /* SBUUserMessageCellParams.swift */, + 679EE5A260FFAEE98382A95D /* SBUMessageTemplateCellParams.swift */, + 57E54FFC45003C2B9C6B0182 /* SBUUnknownMessageCellParams.swift */, + E51843B00A50F6A7E9C974F8 /* SBUFeedNotificationCellParams.swift */, + 92B078B3E4C8CB5D02351FDE /* SBUAdminMessageCellParams.swift */, + C55AB72C32B0B260DB39E839 /* SBUBaseMessageCellParams.swift */, + A3D2D8042865F9BE60419797 /* SBUFileMessageCellParams.swift */, ); - name = ChannelSettingItem; + name = MessageCellParams; + sourceTree = ""; + }; + 6D5F15D59094E790E16EC48E /* ChannelSettings */ = { + isa = PBXGroup; + children = ( + 19F07A30DB1A96BBFE300649 /* SBUGroupChannelSettingsModule.Deprecated.swift */, + 7037CB3811EC6F2827C135E4 /* SBUOpenChannelSettingsModule.Deprecated.swift */, + ); + name = ChannelSettings; + sourceTree = ""; + }; + 6D731BDE00C845D7C4E78CA2 /* View */ = { + isa = PBXGroup; + children = ( + BDCF3CBBEA1829842B656868 /* SBUCreateChannelTypeSelector.swift */, + ); + name = View; sourceTree = ""; }; 6DEFFA4A2B39E5F871716119 /* CreateChannel */ = { @@ -2590,22 +2473,20 @@ path = CreateChannel; sourceTree = ""; }; - 6EFF699FF49501F22FB7CEEB /* ViewModel */ = { + 6EF9DE444F3EBE41277B6402 /* CacheManager */ = { isa = PBXGroup; children = ( - EC2FFAF4278506F8D0CC967C /* Channel */, - 0E63354A062AD859343C8163 /* ChannelList */, - 694BEA543EF225C2683AB331 /* ChannelSettings */, - 96296D5F37A8DF7A70B41360 /* Common */, - D3E6C654D78DBD93BD0C6565 /* MessageSearch */, - CE451A9AE04F7A172F7BC1F8 /* MessageThread */, - B1AC4703E0A5D5A2BAF2B820 /* NotificationSettings */, - 20233A168B917F3A17855F2C /* SBUViewModelDelegate.swift */, - C4A334AF18EE7A1524DDAA02 /* SBUViewModelSet.swift */, - C2969BA92FCA955824CBF4B7 /* SelectUser */, - DC9A16CC55840EBA8F1619E6 /* UserList */, + A9645E038A02078E94025F0D /* SBUCacheManager.Config.swift */, + A2D36BCF6C98D072930D2FA7 /* SBUCacheManager.MemoryCache.swift */, + 1116F0B86B59593F177F5355 /* SBUCacheManager.Version.swift */, + 85C0714BFA668EDB85894F9D /* SBUCacheManager.PathType.swift */, + 71698090C79041033F6984DA /* SBUCacheManager.File.swift */, + D345015DF5D696480ECF7436 /* SBUCacheManager.Image+FileMessage.swift */, + E3F2B4D4DEE6B7025D7BD9C3 /* SBUCacheManager.Image.swift */, + DBEDD4886F43FE0CC69A1037 /* SBUCacheManager.swift */, + FB71A8A5F46DAE8A39F9DD72 /* SBUCacheManager.DiskCache.swift */, ); - name = ViewModel; + name = CacheManager; sourceTree = ""; }; 6F88AFB356527993F1A697BA /* Features */ = { @@ -2632,23 +2513,19 @@ path = CreateChannel; sourceTree = ""; }; - 700B1120CCF3FCA339FDAD75 /* GroupChannel */ = { + 6FED830B35F1EC975093CC95 /* UserList */ = { isa = PBXGroup; children = ( + 3CFBBF1707E6C855B0FD690E /* SBUUserListViewController.swift */, ); - path = GroupChannel; + name = UserList; sourceTree = ""; }; - 70AEC51ABDA1422CB6888113 /* Feed */ = { + 700B1120CCF3FCA339FDAD75 /* GroupChannel */ = { isa = PBXGroup; children = ( - 35E55160CC0CF031DED68A51 /* Params */, - BB4928B600EA46E7FC79D7AB /* SBUFeedNotificationChannelModule.CategoryFilter.swift */, - 62DD1C6EBB30609466FDEE62 /* SBUFeedNotificationChannelModule.Header.swift */, - 3C79C6C925FC164D7A744849 /* SBUFeedNotificationChannelModule.List.swift */, - 195D69A9AA7F2ADED2E52755 /* SBUFeedNotificationChannelModule.swift */, ); - name = Feed; + path = GroupChannel; sourceTree = ""; }; 719E523D333BC85B94259616 /* MessageCellParams */ = { @@ -2658,19 +2535,6 @@ path = MessageCellParams; sourceTree = ""; }; - 71B84E1C2F9774B338CE0C0B /* OpenChannel */ = { - isa = PBXGroup; - children = ( - 6F798358616E15E2552DCC9F /* SBUOpenChannelAdminMessageCell.swift */, - 1AAA09139558B87179AA7ED7 /* SBUOpenChannelBaseMessageCell.swift */, - B4BC41F11085BDC53B4A3BA6 /* SBUOpenChannelContentBaseMessageCell.swift */, - 1BD7FBB468AAE322B76088BA /* SBUOpenChannelFileMessageCell.swift */, - FE33118AFAADE5A66A92ED8F /* SBUOpenChannelUnknownMessageCell.swift */, - A1AE141723D04C84A99407C4 /* SBUOpenChannelUserMessageCell.swift */, - ); - name = OpenChannel; - sourceTree = ""; - }; 71DA834FD2F802CB46B90171 /* CreateChannel */ = { isa = PBXGroup; children = ( @@ -2679,17 +2543,21 @@ path = CreateChannel; sourceTree = ""; }; - 72688E383B2A36C10F88E28A /* CreateChannel */ = { + 722E2E2CAE47C5C3C5F58520 /* Module */ = { isa = PBXGroup; children = ( - 91B75E60CD5359A041DB6DE2 /* SBUCreateChannelModule.Header.swift */, - 876E7F8C4C488F8438196674 /* SBUCreateChannelModule.List.swift */, - 004B59BEFA679B50DC596FE9 /* SBUCreateChannelModule.swift */, - 123580C191BBF7D8C9AF1116 /* SBUCreateOpenChannelModule.Header.swift */, - E3F8FA2679A556B5B6170572 /* SBUCreateOpenChannelModule.ProfileInput.swift */, - 2DC133317F2BEECBAE470888 /* SBUCreateOpenChannelModule.swift */, + 58DC4A41C7679B62698E4991 /* ChannelList */, + F0E266115D4D89B76E0DC71E /* NotificationSettings */, + D79778B99CC6429924205C88 /* Channel */, + 6D5F15D59094E790E16EC48E /* ChannelSettings */, + 973A5A3A47444BF0ABE09B93 /* UserList */, + B5B60D1A9E54841E828591BF /* MessageSearch */, + 40150E48D6C6440C91F1B218 /* MessageThread */, + 474471F7E2FD68DB49558F9A /* Moderations */, + 075A80DE3508756C5C94299C /* SBUModuleSet.Deprecated.swift */, + 2B87D6CADD85A4C3FF7B9316 /* SelectUser */, ); - name = CreateChannel; + name = Module; sourceTree = ""; }; 7282FAD410ECD8348AA61110 /* InviteUser */ = { @@ -2699,21 +2567,12 @@ path = InviteUser; sourceTree = ""; }; - 73D9AA7BCAEE628F4F8AA74C /* MessageSearch */ = { - isa = PBXGroup; - children = ( - FDEBD429C35EA9038A2DC6C5 /* SBUMessageSearchViewController.Deprecated.swift */, - ); - name = MessageSearch; - sourceTree = ""; - }; - 73E62A854BD7CD3FDE50B5E9 /* Notifications */ = { + 73008754C9269339728BC5F5 /* ViewParams */ = { isa = PBXGroup; children = ( - 890E8C4360AAE2F581975028 /* SBUChatNotificationChannelModule.Deprecated.swift */, - 1C681ED2007956EEE9D894BA /* SBUFeedNotificationChannelModule.Deprecated.swift */, + 6A03A8248CE86564CA9E065E /* SBUMessageFormViewParams.swift */, ); - name = Notifications; + name = ViewParams; sourceTree = ""; }; 7468652423E5450E19C0A00F /* ChannelSettings */ = { @@ -2743,13 +2602,6 @@ path = Channel; sourceTree = ""; }; - 7563A583E8EC0EDAE51096C6 /* Processor */ = { - isa = PBXGroup; - children = ( - ); - path = Processor; - sourceTree = ""; - }; 758A754FDE39CF46B229F3C0 /* AIChatBot */ = { isa = PBXGroup; children = ( @@ -2794,31 +2646,17 @@ path = QuickStart; sourceTree = ""; }; - 78E174F5EE5510B4B44A2771 /* Resource */ = { - isa = PBXGroup; - children = ( - A2E86EB1B0B880489D4987EB /* Assets.xcassets */, - ); - name = Resource; - sourceTree = ""; - }; - 791AAE4776A8179D9EF57052 /* MessageThread */ = { + 792AD7FD38296769E4702D52 /* Views */ = { isa = PBXGroup; children = ( - 40B95798B85C67C48C1E8AD8 /* SBUMessageThreadModule.Header.swift */, - 272EF898BCF0CC28EE039480 /* SBUMessageThreadModule.Input.swift */, - 329E5F3C157C0310EFBE73F1 /* SBUMessageThreadModule.List.swift */, - E67D8C702401812614027E07 /* SBUMessageThreadModule.swift */, + 43AD885BB96E99D59FA2D278 /* SBUSuggestedReplyView.swift */, + EA76BB388D71729F63EB35D3 /* SBUHorizontalSuggestedReplyView.swift */, + 291F7BDA0D6969322D600F2F /* SBUVerticalSuggestedReplyView.swift */, + 87D21FD81BE3D86B64E101A5 /* SBUHorizontalSuggestedReplyOptionView.swift */, + 9EEDE106154195F0E068E508 /* SBUSuggestedReplyOptionView.swift */, + 71FBCD49AF26DED2E6B5CF58 /* SBUSimpleSuggestedReplyOptionView.swift */, ); - name = MessageThread; - sourceTree = ""; - }; - 79C436C5F79F107B0AF6C831 /* MemberList */ = { - isa = PBXGroup; - children = ( - 50D10A03102A00F0EAD050D7 /* SBUMemberListViewController.Deprecated.swift */, - ); - name = MemberList; + name = Views; sourceTree = ""; }; 79C9DF640DACEC9E90D965F5 /* View */ = { @@ -2837,6 +2675,16 @@ path = MemberList; sourceTree = ""; }; + 7B3B29DD56A96DE04D9B6B26 /* RegisterOperator */ = { + isa = PBXGroup; + children = ( + BF5E8919EDF3DFE91A6EAF7D /* SBURegisterOperatorModule.List.swift */, + 62AA388B840F11B3D6DE3BB6 /* SBURegisterOperatorModule.Header.swift */, + 06ACE85207F1E07FA12465D3 /* SBURegisterOperatorModule.swift */, + ); + name = RegisterOperator; + sourceTree = ""; + }; 7B7F8B8B2B7E9619FF8A22D1 /* BusinessMessaging */ = { isa = PBXGroup; children = ( @@ -2869,21 +2717,32 @@ path = ScrollPostion; sourceTree = ""; }; - 7D6677867E4A04253150EA18 /* UserList */ = { + 7E441E54DE6D65D626FE15D8 /* Template */ = { isa = PBXGroup; children = ( - EF993CB5C1201F1DD90E95C8 /* SBUBaseSelectUserViewController.Deprecated.swift */, + F6909E89034096C6D2898E3B /* SBUMessageTemplate.Coordinator.swift */, + 56E0C1C535623CC2D43B3627 /* SBUMessageTemplate.TemplateCacheState.swift */, + 93F18D0A20AD4E2528411D7E /* SBUTheme+MessageTemplate.swift */, + C78A7319F85E70BFC808F143 /* SBUMessageTemplate.Action.swift */, + CE9165E981E2142D92EF4844 /* SBUMessageTemplate.Container.swift */, + 15554F1B6FC6160B44958857 /* SBUMessageTemplateManager.swift */, + 508F6B2ABF51B19A0FE67651 /* SBUMessageTemplate.ErrorMessages.swift */, + 5A234C4E9C841FA02395BA20 /* SBUCacheManager.Template.swift */, + DE5133204741EA232A84D9AC /* SBUMessageTemplate.TemplateType.swift */, + ABFA71E5A451DB78DF62B5F0 /* SBUMessageTemplate.RendererType.swift */, + 6EA0C05DFEE707F582F5F0ED /* SBUCacheManager.NotificationSetting.swift */, ); - name = UserList; + name = Template; sourceTree = ""; }; - 7D66BCFD82370FFBC6D366A7 /* NewMessageInfo */ = { + 7EC31F1E6119DD2A13AF6FDF /* PhotoLibrary */ = { isa = PBXGroup; children = ( - 3E4CB7E50D35A8458B5AC457 /* SBUNewMessageInfo.swift */, - 64A2652A8AAC5E0A13CD59F6 /* SBUNewNotificationInfo.swift */, + 2A4074EAFBED0F6EE67A062F /* SBUPhotoAccess.swift */, + 352D910607F70A45FDCB16C5 /* SBUPhotoCollectionViewCell.swift */, + 16F13951208DB1C7B9C198D0 /* SBUSelectablePhotoViewController.swift */, ); - name = NewMessageInfo; + name = PhotoLibrary; sourceTree = ""; }; 7F7CF21EB6515046D2ACF214 /* RegisterOperator */ = { @@ -2893,22 +2752,29 @@ path = RegisterOperator; sourceTree = ""; }; - 80BF2508F233113A2E43C31D /* NotificationSettings */ = { + 7FBF019744E48DA505B5577A /* Replies */ = { isa = PBXGroup; children = ( + BA1939BC6F004959CE98D410 /* SBUQuotedBaseMessageViewParams.Deprecated.swift */, ); - path = NotificationSettings; + name = Replies; sourceTree = ""; }; - 82D3457075BBE755A54B899F /* Menu */ = { + 8036AC8A1C188A7918D9AAAF /* CreateChannel */ = { isa = PBXGroup; children = ( - D69A3D78ED90E4089D3C07CD /* SBUBottomSheetController.swift */, - F2890510DC6B33C2BB2943CE /* SBUMenuCell.swift */, - FCC8C31980DC15ADA27BAC64 /* SBUMenuSheetViewController.swift */, - B2623C0CBE46E87C8667F172 /* SBUMenuView.swift */, + 6D731BDE00C845D7C4E78CA2 /* View */, + 1FC3282910C2FD4EEC1F1B5E /* SBUCreateChannelViewController.swift */, + 231E4F4EEB05790DF24DDFA6 /* SBUCreateOpenChannelViewController.swift */, ); - name = Menu; + name = CreateChannel; + sourceTree = ""; + }; + 80BF2508F233113A2E43C31D /* NotificationSettings */ = { + isa = PBXGroup; + children = ( + ); + path = NotificationSettings; sourceTree = ""; }; 83B65538C9A6C528BB595899 /* Views */ = { @@ -2928,15 +2794,22 @@ path = Common; sourceTree = ""; }; - 868D3D5E2ACBA2EC8EA8372E /* Cell */ = { + 85D6E1544C692B8B761619BB /* Module */ = { isa = PBXGroup; children = ( - 3932D029F3549E9C2C2EEE8E /* SBUBaseChannelSettingCell.swift */, - 8CE127AC25B1E03735523FE7 /* SBUGroupChannelSettingCell.swift */, - BF820D8BAB863E12FE3420E5 /* SBUModerationCell.swift */, - 4D3301A6BAEAEA0CB68D850F /* SBUOpenChannelSettingCell.swift */, + 903771642F76AAFF4D7F3D95 /* ChannelList */, + 3BE504CCCB1ABD4EC146966D /* NotificationSettings */, + 6C13C9796B0C365647EDAA18 /* Channel */, + 24F4CDB32C83692CDBF90EAA /* ChannelSettings */, + DEECFF664A4C39BD832CB05D /* Common */, + B0EE2515886E4BDB2098DE5F /* UserList */, + 1E46B7345AA987A0E840CCA3 /* SBUModuleSet.swift */, + D4A8C776F2DA85434B1B4EBD /* MessageSearch */, + 93B60EDC994F8871DD9B8C93 /* MessageThread */, + 3473ABDBEB6B34B710233D5C /* Moderations */, + 9E24CDDE56701B97634CDCEC /* SelectUser */, ); - name = Cell; + name = Module; sourceTree = ""; }; 86E9DB2BC87548932C9BBC74 /* NotificationSettings */ = { @@ -2954,6 +2827,41 @@ path = CustomView; sourceTree = ""; }; + 874B3A001684041E3399C28D /* Manager */ = { + isa = PBXGroup; + children = ( + 331BD4D2293D4C13964CDEA4 /* SBUEmojiManager.swift */, + 6EF9DE444F3EBE41277B6402 /* CacheManager */, + EA418D56B8B7C4F4E3670E57 /* SBUVoicePlayer.swift */, + 544DDF9B4A8EF42E9EEC62C5 /* SBUNotificationChannelManager.swift */, + 3F70F42A31C241A9DFA53850 /* SBUTypingIndicatorMessageManager.swift */, + 3F9BCFDC9EF5BD23AA4B2584 /* SBUPendingMessageManager.swift */, + 407B36E295240B492E765329 /* SBUDownloadManager.swift */, + D121E96E959189C97D6DB359 /* SBUVoiceRecorder.swift */, + E68D00C7E474B6BDA0F2110C /* SBUPermissionManager.swift */, + ); + name = Manager; + sourceTree = ""; + }; + 87B3FAA3CFC80D1ED6496D79 /* OpenChannel */ = { + isa = PBXGroup; + children = ( + B448B1F464716E77062E6426 /* SBUOpenChannelSettingsModule.List.swift */, + A1A00A8435BCB02C95EA2EFD /* SBUOpenChannelSettingsModule.swift */, + 8117FE1B7B4550219C1A8C5A /* SBUOpenChannelSettingsModule.Header.swift */, + ); + name = OpenChannel; + sourceTree = ""; + }; + 883E1264282F910BF0AA871A /* Feedback */ = { + isa = PBXGroup; + children = ( + 13C813D8CD1E5824BC6079D0 /* SBUFeedbackView.swift */, + 94B1F00704771FF3281A9EE4 /* SBUFeedbackViewParams.swift */, + ); + name = Feedback; + sourceTree = ""; + }; 88617829E70495E77827DD59 /* ChannelSettingItem */ = { isa = PBXGroup; children = ( @@ -2961,6 +2869,30 @@ path = ChannelSettingItem; sourceTree = ""; }; + 88FE9B62C55BD593E7DA6372 /* Media */ = { + isa = PBXGroup; + children = ( + 19E289D89AD764DC1511EBA5 /* SBUMediaView.swift */, + ); + name = Media; + sourceTree = ""; + }; + 892E588EA43282381B1332A9 /* Life cycles */ = { + isa = PBXGroup; + children = ( + 3775EEC122A3F8EB8A002A7E /* SBUTableViewCell.swift */, + E7E42CE447C8C5F2F135BA53 /* SBUTextView.swift */, + D38C2A58A5023E3E86F48A24 /* SBUCollectionViewCell.swift */, + F9428676B5E783417ADBB503 /* SBUQuoteMessageInputViewProtocol.swift */, + 862EF4C61A83BEEE967F9628 /* SBUMessageCellProtocol.swift */, + 9920BEC6AC62524318D65C4E /* SBULabel.swift */, + 675C40A04B393401D57CA4CE /* SBUViewLifeCycle.swift */, + DFAE10ED574FAD7F9ED55DD9 /* SBUQuotedMessageViewProtocol.swift */, + F03942D4AC85136F312BA954 /* SBUView.swift */, + ); + name = "Life cycles"; + sourceTree = ""; + }; 8A93B92DD752191311686B40 /* Moderations */ = { isa = PBXGroup; children = ( @@ -2975,13 +2907,14 @@ path = MemberList; sourceTree = ""; }; - 8D64C6EE9FAD7E42C344D348 /* MessageSearch */ = { + 8CD5EDE208BF277D52A6A2EE /* OpenChannel */ = { isa = PBXGroup; children = ( - 99C01B8B024B1987DC4CE0F9 /* Cell */, - AA565082C3C3A3C9CAFA572D /* SBUMessageSearchViewController.swift */, + D1E2BF47235135F0995B3D64 /* SBUOpenChannelListModule.swift */, + 28DA61B394B90A15CE024663 /* SBUOpenChannelListModule.List.swift */, + 97154C63DB7911FEA3C7D5BB /* SBUOpenChannelListModule.Header.swift */, ); - name = MessageSearch; + name = OpenChannel; sourceTree = ""; }; 8D9F4DD795C1C923CB15CF48 = { @@ -2991,27 +2924,24 @@ 78CF1B79B64228A7F0DEAEBB /* QuickStart */, 32416E08674EA616F09E9EAC /* Frameworks */, 1B0653278AD1D8CFF0B5B8F6 /* Products */, - 0A18A9016C780E0639124C12 /* Sources */, + 0D4AC142CF427E94EB941EBB /* Sources */, ); sourceTree = ""; }; - 8E0853FD40930259A2BFB4EE /* Channel */ = { + 8DB249D251B45812D7C3ECDA /* SubViews */ = { isa = PBXGroup; children = ( - 112606B8CA57E7AADAECDD0C /* Notifications */, + 55C4BAFAC38A50BF76B1E271 /* SBUMessageFormChipView.swift */, ); - path = Channel; + name = SubViews; sourceTree = ""; }; - 8E93EE20299517D0EC8C1A9B /* Constant */ = { + 8E0853FD40930259A2BFB4EE /* Channel */ = { isa = PBXGroup; children = ( - CEECB941A8FBD37EFEFC553F /* SBUConstant.swift */, - 5E2FEFC59E1B00C8E8BBBC7A /* SBUDateFormatSet.swift */, - F9281572105138A1113C06F0 /* SBUStringSet.Deprecated.swift */, - 58750E2B95FA53D5A3EE1A3A /* SBUStringSet.swift */, + 112606B8CA57E7AADAECDD0C /* Notifications */, ); - name = Constant; + path = Channel; sourceTree = ""; }; 8E94CA35BD74F32407700D11 /* Feedback */ = { @@ -3021,7 +2951,19 @@ path = Feedback; sourceTree = ""; }; - 91261FB22D42BDA2AACB1002 /* Manager */ = { + 903771642F76AAFF4D7F3D95 /* ChannelList */ = { + isa = PBXGroup; + children = ( + F7B5A0380301B657A2D7D80F /* SBUBaseChannelListModule.swift */, + AC75DB1CE2F4EB6655F59FD2 /* GroupChannel */, + 58CE707E7CF1AEEA33868A3F /* SBUBaseChannelListModule.Header.swift */, + 0FE81425E037F54AB03482EB /* SBUBaseChannelListModule.List.swift */, + 8CD5EDE208BF277D52A6A2EE /* OpenChannel */, + ); + name = ChannelList; + sourceTree = ""; + }; + 91261FB22D42BDA2AACB1002 /* Manager */ = { isa = PBXGroup; children = ( 0C98B90C7B1C0C82787FD4D0 /* Common */, @@ -3039,47 +2981,60 @@ path = ChannelList; sourceTree = ""; }; - 92481CBE7158DDE14C5CFF19 /* Replies */ = { + 922BAE0DC363068F26D97C7B /* SelectUser */ = { isa = PBXGroup; children = ( - D192F825C0C3E201CE3CE747 /* MessageView */, - A25486828E4F95F978CE6D3F /* ViewParams */, + 4185895F77850C4C00604065 /* SBUBaseSelectUserViewModel.swift */, + 1A30BFAC81CD038889AB58A4 /* SBURegisterOperatorViewModel.swift */, + 2D1937B6C40D03145B8F4C34 /* CreateChannel */, + DE2DC902897DA8C9B706D138 /* SBUInviteUserViewModel.swift */, ); - path = Replies; + name = SelectUser; sourceTree = ""; }; - 95E3CA39A98C37100A308668 /* Channel */ = { + 92481CBE7158DDE14C5CFF19 /* Replies */ = { isa = PBXGroup; children = ( - F87827843C0AF64D6E9EF402 /* GroupChannel */, - FA8012D0F1E9B3048AA76092 /* NotificationChannel */, - 103AF90A0B49F014BBBA32D5 /* OpenChannel */, - 9AD3DBE7340A752112C57014 /* SBUBaseChannelModule.Header.swift */, - 66A6C69E56F2F195D47753BA /* SBUBaseChannelModule.Input.swift */, - AFB7154FE781C99D4007E411 /* SBUBaseChannelModule.List.swift */, - 494AACC2369B97D7A129A6E9 /* SBUBaseChannelModule.swift */, + D192F825C0C3E201CE3CE747 /* MessageView */, + A25486828E4F95F978CE6D3F /* ViewParams */, ); - name = Channel; + path = Replies; sourceTree = ""; }; - 96296D5F37A8DF7A70B41360 /* Common */ = { + 93B60EDC994F8871DD9B8C93 /* MessageThread */ = { isa = PBXGroup; children = ( - 4DE486B818026C5891E199C1 /* SBUCommonDelegate.swift */, + B2E6F24CC3DECE07E0C46F0A /* SBUMessageThreadModule.List.swift */, + E1F2A59CCD24B316A1AA0BB7 /* SBUMessageThreadModule.swift */, + 675D505622AB2A639B404288 /* SBUMessageThreadModule.Input.swift */, + DE26AE551C60094EC9811A23 /* SBUMessageThreadModule.Header.swift */, ); - name = Common; + name = MessageThread; sourceTree = ""; }; - 9676EE282CA2412A4BB6B3C8 /* MessageTemplate */ = { - isa = PBXGroup; - children = ( - 670A9BAB5603096590685860 /* Processor */, - 46646E6600F483D1AC615A49 /* Renderer */, - C845B62CD493FD6875E9C3D9 /* SBUMessageTemplate.swift */, - 08B71F343E56302FC2E7983B /* Syntax */, - 12AE4BBF0666FF2962D4C3F8 /* Tester */, + 953740B654B5F6EC626B52C9 /* Channel */ = { + isa = PBXGroup; + children = ( + FA84DF4F1B95BD1AB0972598 /* ViewModel */, + 4FBB01C21052D973E45DD4BF /* Reaction */, + C796BD143FCD81CEF30E13CE /* SBUFeedNotificationChannelViewController.swift */, + 7448C79501C8F7C0E6833411 /* SBUBaseChannelViewController.swift */, + 6956CA9E691863B453C1FB01 /* ScrollBottomView */, + 16DEE933FB88D5CEB7CD318E /* MessageCell */, + 72408773056E8FF32BA7504F /* SBUGroupChannelViewController.swift */, + 5B1CA421E5A85017ED705807 /* MessageInput */, + C55E22A44C1AA1179123D389 /* CategoryFilterCell */, + 4D235E5C9B61BAC58FD38456 /* CellView */, + FD1786CF22AC161804837EC6 /* FileViewer */, + E3255B2074BCFD6D08DD5BDB /* SBUBaseChannelViewController.Keyboard.swift */, + F87D7CC2699AF1D033F9CEDD /* SBUChatNotificationChannelViewController.swift */, + A62E1BE8914309F94C941A07 /* ChannelStateBanner */, + 08508EDD59945AE752CF82AD /* NewMessageInfo */, + BE86374D9622697D836E37EC /* SBUOpenChannelViewController.swift */, + F8B0B383B1405A8EDD0FEF1C /* Header */, + 88FE9B62C55BD593E7DA6372 /* Media */, ); - name = MessageTemplate; + name = Channel; sourceTree = ""; }; 96864A9B3CF43786EB818E2C /* UserCell */ = { @@ -3089,23 +3044,12 @@ path = UserCell; sourceTree = ""; }; - 9719F1254CECB3FED1351F5F /* RegisterOperator */ = { + 973A5A3A47444BF0ABE09B93 /* UserList */ = { isa = PBXGroup; children = ( - DADE9978AD80649A5C0DF233 /* SBURegisterOperatorModule.Header.swift */, - 373D91F9E7B3D32297E6776E /* SBURegisterOperatorModule.List.swift */, - A05F9C923BF28E9445A1B437 /* SBURegisterOperatorModule.swift */, + 0AE3B8DCB7406F0C1C1C20C8 /* SBUUserListModule.Deprecated.swift */, ); - name = RegisterOperator; - sourceTree = ""; - }; - 974CA14AF009E192EDBFC67C /* MessageForm */ = { - isa = PBXGroup; - children = ( - E5FD023ACD08877EB34F9051 /* ViewParams */, - 5EBC021FBE881CF264F7D470 /* Views */, - ); - name = MessageForm; + name = UserList; sourceTree = ""; }; 9761570D537237ABF97399C7 /* Others */ = { @@ -3117,26 +3061,6 @@ path = Others; sourceTree = ""; }; - 978A322C353310221328ED72 /* CreateChannel */ = { - isa = PBXGroup; - children = ( - 79E05EC2053A3F33A4D72CAA /* SBUCreateChannelViewController.swift */, - 39B2512D4E9513712EDC507C /* SBUCreateOpenChannelViewController.swift */, - 544992670602E44BE8FA7FA4 /* View */, - ); - name = CreateChannel; - sourceTree = ""; - }; - 998AF616D68D5A5CC925D6DE /* UserList */ = { - isa = PBXGroup; - children = ( - D22CAD48F00CAF7563928667 /* SBUUserListModule.Header.swift */, - 7D8EABEB1992CD5141939413 /* SBUUserListModule.List.swift */, - E52352941A448E4E062B5441 /* SBUUserListModule.swift */, - ); - name = UserList; - sourceTree = ""; - }; 999641C66EC0AAC6FE3C2FAD /* Channel */ = { isa = PBXGroup; children = ( @@ -3152,19 +3076,28 @@ path = Channel; sourceTree = ""; }; - 99C01B8B024B1987DC4CE0F9 /* Cell */ = { + 9A047CB04067196B7C533AB2 /* UserList */ = { + isa = PBXGroup; + children = ( + ); + path = UserList; + sourceTree = ""; + }; + 9A2AAE35714744166FC225BF /* MessageThread */ = { isa = PBXGroup; children = ( - B37FD61195950E1CA39327EC /* SBUMessageSearchResultCell.swift */, + 2A8C7146E20C14178D218D0F /* SBUMessageThreadViewModel.swift */, ); - name = Cell; + name = MessageThread; sourceTree = ""; }; - 9A047CB04067196B7C533AB2 /* UserList */ = { + 9A6018B2111FBBDD228A53FF /* Replies */ = { isa = PBXGroup; children = ( + 56637249F60ABAB940AC8E38 /* MessageView */, + E901CB79F6EEED884E9BE1BA /* ViewParams */, ); - path = UserList; + name = Replies; sourceTree = ""; }; 9AA2C272B97105D9F036807C /* NotificationSettings */ = { @@ -3174,12 +3107,28 @@ path = NotificationSettings; sourceTree = ""; }; - 9C130EC341A014560DBECFD3 /* MessageCell */ = { + 9C9DE3DE0D7DDAC54C158F12 /* ChannelSettings */ = { isa = PBXGroup; children = ( - 7FED9F88AA80383C0B890598 /* SBUMessageCellConfiguration.swift */, + FA8BDA2D985782A35F57D0AF /* SBUBaseChannelSettingsViewModel.swift */, + 6518B49C84627DAC33B5CFEB /* SBUModerationsViewModel.swift */, + F722A51B390124CD1A8B8C7A /* SBUGroupChannelSettingsViewModel.swift */, + 341EE2BEF0AB66334E9F72D6 /* SBUOpenChannelSettingsViewModel.swift */, ); - name = MessageCell; + name = ChannelSettings; + sourceTree = ""; + }; + 9E24CDDE56701B97634CDCEC /* SelectUser */ = { + isa = PBXGroup; + children = ( + 7B3B29DD56A96DE04D9B6B26 /* RegisterOperator */, + A63B9FE0DFB5A9C9DE5BE683 /* InviteUser */, + 2FF68CC8A2AE5A73C0998A61 /* SBUBaseSelectUserModule.Header.swift */, + 1CE34F566F014D5F0326AEE9 /* SBUBaseSelectUserModule.swift */, + C7F0F7469C726F086F7FA046 /* CreateChannel */, + B0CF33E9AF61E3D65FEE0C31 /* SBUBaseSelectUserModule.List.swift */, + ); + name = SelectUser; sourceTree = ""; }; 9E2CAC0B3FD84CEA9494CEAD /* NotificationSettings */ = { @@ -3189,33 +3138,12 @@ path = NotificationSettings; sourceTree = ""; }; - 9EC64A3FD099A47927CEABEA /* MessageCell */ = { - isa = PBXGroup; - children = ( - 55613213D02448DE4B21F127 /* CarouselView */, - B75C8122B4C5CE9F34B78243 /* CustomView */, - B8B0B222F3FF654B93E14AF2 /* Feedback */, - 1ED7160D05CE48686F182C60 /* FileMessageContentView */, - B6A2105888A935A1D7B110D3 /* MessageCellParams */, - 974CA14AF009E192EDBFC67C /* MessageForm */, - BB7420B22637FE070079C9D2 /* MultipleFilesMessage */, - 05021E801F5319038E6B7699 /* NotificationChannel */, - 71B84E1C2F9774B338CE0C0B /* OpenChannel */, - C621EDB5E67290FF54142EB2 /* Replies */, - 4063A03A01AE9C1D9ED96FC0 /* SBUAdminMessageCell.swift */, - 5537A23D62065A51C3AF9E9D /* SBUBaseMessageCell.Feedback.swift */, - D1AF51D7CE8D04E799D606E9 /* SBUBaseMessageCell.swift */, - B98CEE0D6FB455F9CAC7090F /* SBUContentBaseMessageCell.swift */, - 78630440AA9047A3C000DDA0 /* SBUFileMessageCell.swift */, - FED6FDF8D412E93F70FD9C9C /* SBUMessageTemplateCell.MessageTemplateLayer.swift */, - EFAEEEFE5278165149ED3E44 /* SBUMessageTemplateCell.swift */, - C3690DECFBFEF36D5E20F7DC /* SBUMessageTemplateCellLayout.swift */, - A8741AB0AF5C9267260E074F /* SBUTypingIndicatorMessageCell.swift */, - 06DE35DF7542F2D044B98020 /* SBUUnknownMessageCell.swift */, - 66FE3FFCF4A356A0C78D1029 /* SBUUserMessageCell.swift */, - DFCA4E62F527C72ED1C94596 /* SuggestedReply */, + 9F2D74910270E61F951FB5A2 /* ViewParams */ = { + isa = PBXGroup; + children = ( + 5207F3F120CE694715C475D6 /* SBUQuoteMessageInputViewParams.swift */, ); - name = MessageCell; + name = ViewParams; sourceTree = ""; }; 9FA67BC7CF7CA16088AD7D56 /* Base */ = { @@ -3227,16 +3155,6 @@ path = Base; sourceTree = ""; }; - 9FE3DB1A21E0E4A00733A328 /* NotificationSettings */ = { - isa = PBXGroup; - children = ( - E63C644AE0DACDB608F39C48 /* SBUGroupChannelPushSettingsModule.Header.swift */, - 7E86C809A6133718AE7762D7 /* SBUGroupChannelPushSettingsModule.List.swift */, - E1794FBF051FD2A95FFF1432 /* SBUGroupChannelPushSettingsModule.swift */, - ); - name = NotificationSettings; - sourceTree = ""; - }; A25486828E4F95F978CE6D3F /* ViewParams */ = { isa = PBXGroup; children = ( @@ -3247,7 +3165,6 @@ A39E7546952DA8EB035B197A /* MessageCell */ = { isa = PBXGroup; children = ( - A3F1AF5F42CD7970F6A03A95 /* CarouselView */, 8733C95878F704A1A66909EC /* CustomView */, 8E94CA35BD74F32407700D11 /* Feedback */, F5F1520817A1F0A09EEF84AA /* FileMessageContentView */, @@ -3262,11 +3179,25 @@ path = MessageCell; sourceTree = ""; }; - A3F1AF5F42CD7970F6A03A95 /* CarouselView */ = { + A3DA6329DD565FE7A29F75C7 /* ActionSheet */ = { isa = PBXGroup; children = ( + CA91BE839D9DE47DE817D68B /* SBUActionSheet.Item.swift */, + 52D7A37D081E801C937A0251 /* SBUActionSheet.swift */, ); - path = CarouselView; + name = ActionSheet; + sourceTree = ""; + }; + A412081C3479CE09ED8D7E10 /* Channel */ = { + isa = PBXGroup; + children = ( + 5121F2BD2ADCD981402F504F /* SBUFeedNotificationChannelViewModel.swift */, + 6DB6EB01052825063F888E1C /* SBUOpenChannelViewModel.swift */, + DCD4B760FD91A460F7D3558E /* SBUBaseChannelViewModel.swift */, + 26A4D6C92A8CAF4D0387B6AE /* SBUChatNotificationChannelViewModel.swift */, + C8AF2A3C52D2591C7C41208A /* SBUGroupChannelViewModel.swift */, + ); + name = Channel; sourceTree = ""; }; A45563CB10397B82FD7C0FE4 /* MessageSearch */ = { @@ -3277,24 +3208,29 @@ path = MessageSearch; sourceTree = ""; }; - A49219030A96C69E83B9698F /* MessageView */ = { + A54B8290D62DD1BAA1DCC769 /* MessageCellParams */ = { isa = PBXGroup; children = ( - ACA0413BCD82C337FEB653FB /* QuotedFileCommonContentView.swift */, - 78B190D204180159C3D70E5F /* QuotedFileImageContentView.swift */, - E0DF16EFEDABAEFA74F71CD9 /* SBUQuotedBaseMessageView.swift */, - 02F7303EC4ED56FB94F77A75 /* SBUQuotedFileMessageView.swift */, - 14F4761B430C339CB959BDF8 /* SBUQuotedUserMessageView.swift */, - 5B07532AD08A24CAD78C92A3 /* SBUThreadInfoView.swift */, ); - name = MessageView; + path = MessageCellParams; sourceTree = ""; }; - A54B8290D62DD1BAA1DCC769 /* MessageCellParams */ = { + A62E1BE8914309F94C941A07 /* ChannelStateBanner */ = { isa = PBXGroup; children = ( + 6D9CFF321A0335FFDF4798BC /* SBUChannelStateBanner.swift */, ); - path = MessageCellParams; + name = ChannelStateBanner; + sourceTree = ""; + }; + A63B9FE0DFB5A9C9DE5BE683 /* InviteUser */ = { + isa = PBXGroup; + children = ( + 0420C9D7152FFC4D1E693316 /* SBUInviteUserModule.List.swift */, + A0326EBEF25364538B353DD0 /* SBUInviteUserModule.swift */, + CA8609A278195715CFD10191 /* SBUInviteUserModule.Header.swift */, + ); + name = InviteUser; sourceTree = ""; }; A75A20AEB7F9849E0D76E4C2 /* CreateChannel */ = { @@ -3311,12 +3247,11 @@ path = ChannelCell; sourceTree = ""; }; - A8262032A10B2C71B7434D3D /* MessageSearch */ = { + A88DE179B2DDF42F66CAEEFE /* Shared */ = { isa = PBXGroup; children = ( - CBA7B36A02323800A3015055 /* SBUMessageSearchModule.Deprecated.swift */, ); - name = MessageSearch; + path = Shared; sourceTree = ""; }; A94E7FF60A0523E9BA5573FF /* Views */ = { @@ -3327,20 +3262,29 @@ path = Views; sourceTree = ""; }; - AA257B196A59B09D89E3A209 /* UserCell */ = { - isa = PBXGroup; - children = ( - F2332CF954CF8CD146C176C2 /* SBUUserCell.swift */, - ); - name = UserCell; - sourceTree = ""; - }; - AA74571F2D712E2A6C3C163B /* Cell */ = { - isa = PBXGroup; - children = ( - E9664EC97EABA449ECD33D44 /* SBUChannelPushSettingCell.swift */, + AA7E413E3D0A18D1AF768883 /* Extension */ = { + isa = PBXGroup; + children = ( + 1570A6622C7EAF31A2AC4D05 /* UIStackView.SBUIKit.swift */, + BDFE0937BADAE1A6B4BF3DB0 /* UITableView+SBUIKit.swift */, + 732FEE47DEE21F0B9D10A928 /* Array+SBUIKit.swift */, + 160407074FE87FA4C356A225 /* Formatter+SBUIKit.swift */, + C38D0D322E0898F77B513394 /* UIButton+SBUIKit.swift */, + 916F05CC3FD62B1EFF69F984 /* URL+SBUIKit.swift */, + 043F0FE4FD1A702067F84F61 /* UINavigationController+SBUIKit.swift */, + 5ADC790E3C98F794AE92241D /* ChatSDK */, + A183ED99993473DC9210E0A5 /* CGSize+SBUIKit.swift */, + 66E8919EC9613C9098CC536A /* Shared */, + 5A8D44EC4A943B5EDBA0F92E /* UICollectionView+SBUIKit.swift */, + A5BE03F2141B70169EB47BCC /* UIScrollView+SBUIKit.swift */, + E07C67CF5B53FDCBBCE857FC /* UIViewController+SBUIKit.swift */, + 0D38295C7C36E41525211F92 /* Date+SBUIKit.swift */, + 4E778A81E98B870B620BBE30 /* StringProtocol+SBUIKit.swift */, + 45154CBDED471591E1058E18 /* Sequence+SBUIKit.swift */, + F3D4BE2AEC2D977E48B78628 /* NSObject+SBUIKit.swift */, + 21728A585D06CEBECD786C47 /* UITextField+SBUIKit.swift */, ); - name = Cell; + name = Extension; sourceTree = ""; }; ABF01CC44CD483A82E474101 /* CacheManager */ = { @@ -3350,32 +3294,40 @@ path = CacheManager; sourceTree = ""; }; - AC90E71B86CC6940969D2DAD /* SelectUser */ = { + AC75DB1CE2F4EB6655F59FD2 /* GroupChannel */ = { isa = PBXGroup; children = ( - D44C845D173AE5DDD1F4C86F /* SBUCreateChannelModule.Deprecated.swift */, - D09DBF0EC83E4E1209BF7031 /* SBUCreateOpenChannelModule.Deprecated.swift */, - 4DF0D45750E5BD5CD2BBF62C /* SBUInviteUserModule.Deprecated.swift */, - 040FE131B697E17C13A1C4B2 /* SBURegisterOperatorModule.Deprecated.swift */, + A02B34286008BA45A18CB10D /* SBUGroupChannelListModule.List.swift */, + B0301C9D577F51D4A4331FAE /* SBUGroupChannelListModule.Common.swift */, + 8574ED84A64B555EBC412662 /* SBUGroupChannelListModule.swift */, + 6E37BCE397F72E8FD87AB536 /* SBUGroupChannelListModule.Header.swift */, ); - name = SelectUser; + name = GroupChannel; sourceTree = ""; }; - ADACE307726F0DB27B8C7F1B /* View */ = { + AD36C5DFBB79648CB6C4726F /* GroupChannel */ = { isa = PBXGroup; children = ( - EA9323D6D646C3B960120113 /* SBUChannelSettingsChannelInfoView.swift */, + DE727C8AA7A172CFD8709F1D /* SBUGroupChannelModule.Input.swift */, + E0105109D19EF199B812A642 /* SBUGroupChannelModule.List.swift */, + 3444A0B80EACB198221A55A7 /* SBUGroupChannelModule.Header.swift */, + 99BE2AE129A67EB04D94E44D /* SBUGroupChannelModule.swift */, ); - name = View; + name = GroupChannel; sourceTree = ""; }; - ADD60F9975FAF3F6A307F764 /* Moderations */ = { + AFE850C5739F8F60F577E75F /* Util */ = { isa = PBXGroup; children = ( - B9EA14FFC7C4F584FBF37935 /* SBUModerationsViewController.Deprecated.swift */, - 650B4410DADB57E741DC71E9 /* SBUModerationsViewModel.Deprecated.swift */, + 1063DC1B3EC17EC82DC2827C /* SBUPropertyWrapper.swift */, + 16B1F3F1E3C65FDDE35B7FB4 /* BlockingOperation.swift */, + B6AA96123433E0E7D8AEAA80 /* SBUUtils.swift */, + 44FC391CDE2C92F3F9F798C7 /* SBULogger.swift */, + 26C689CAA86B9C23FD48BDA7 /* SBUMentionManager.swift */, + CD2C7149B8560A6F2FA73439 /* WeakDelegateStorage.swift */, + 4880F4499928C03FE04EFD18 /* SBUDebouncer.swift */, ); - name = Moderations; + name = Util; sourceTree = ""; }; B002AFCC975B187577ABBF28 /* Community */ = { @@ -3387,63 +3339,38 @@ path = Community; sourceTree = ""; }; - B1AC4703E0A5D5A2BAF2B820 /* NotificationSettings */ = { + B0EE2515886E4BDB2098DE5F /* UserList */ = { isa = PBXGroup; children = ( - 5652136A37B967878B06BAEF /* SBUGroupChannelPushSettingsViewModel.swift */, + 15D8B0E56DC7B2989C82ACF1 /* SBUUserListModule.swift */, + 4BC73EA508B5842EE69BF80C /* SBUUserListModule.List.swift */, + 2658CFC7A952537FA514B929 /* SBUUserListModule.Header.swift */, ); - name = NotificationSettings; - sourceTree = ""; - }; - B4A167357F91E801B9968293 /* MessageCell */ = { - isa = PBXGroup; - children = ( - ); - path = MessageCell; + name = UserList; sourceTree = ""; }; - B598482660316B09C2FA1437 /* Configuration */ = { + B431B35158DCCB5ED1A2230E /* NotificationSettings */ = { isa = PBXGroup; children = ( - 28F762C6167E363B865CCDF3 /* Mention */, - 9C130EC341A014560DBECFD3 /* MessageCell */, - 34ECB469ED778E8486260BD4 /* Replies */, - AA98D7A26F90ED5D3C8D0552 /* SBUConfig.Base.swift */, - 746BF7AF2CE5240E622426E7 /* SBUConfig.CodingKeys.swift */, - 9B5DBB1A9678F7DC7418F9F7 /* SBUConfig.Common.swift */, - D0A86F2DF4A2A187EDEA0FB8 /* SBUConfig.GroupChannel.swift */, - 72ADC3A02610A1FECB17939B /* SBUConfig.OpenChannel.swift */, - 7683E59F45AB08C01149C787 /* SBUConfig.swift */, - 62B80927EA163A99A9AB0F9C /* SBUConfigManager.swift */, - 33DEB4A5F180E4FCF222F510 /* SBUDashboardConfig.swift */, - E9F20FDE37ECF964143F7CDD /* ScrollPostion */, - D0276A5FD4E8F746726960F6 /* VoiceMessage */, + 490927F468767D48D7D9FA18 /* Cell */, + 870A7BFC025E57EC8BA10FA5 /* SBUGroupChannelPushSettingsViewController.swift */, ); - name = Configuration; + name = NotificationSettings; sourceTree = ""; }; - B6A2105888A935A1D7B110D3 /* MessageCellParams */ = { + B4A167357F91E801B9968293 /* MessageCell */ = { isa = PBXGroup; children = ( - A2F2EF8119C41C81BB2C99C9 /* SBUAdminMessageCellParams.swift */, - CFFE0FADB7DF38D0A9529A96 /* SBUBaseMessageCellParams.swift */, - CC924A6238617EECFFEF6F60 /* SBUFeedNotificationCellParams.swift */, - E751C7C8B6E94111A95CD998 /* SBUFileMessageCellParams.swift */, - 9E1D18D025A5A7F0D7EA79FC /* SBUMessageTemplateCellParams.swift */, - 5892E1E3573D45B170CA1657 /* SBUMultipleFilesMessageCellParams.swift */, - 243147D65D160EDDABF07E7E /* SBUTypingMessageCellParams.swift */, - 0085E75416FEEE609AD7CFD0 /* SBUUnknownMessageCellParams.swift */, - 84B88FE3F8E3336F59441204 /* SBUUserMessageCellParams.swift */, ); - name = MessageCellParams; + path = MessageCell; sourceTree = ""; }; - B75C8122B4C5CE9F34B78243 /* CustomView */ = { + B5B60D1A9E54841E828591BF /* MessageSearch */ = { isa = PBXGroup; children = ( - 958E583E5420CED500AE56CB /* SBUExtendedMessagePayloadCustomViewFactory.swift */, + 7E3230A2EB4D40A6182F2A7C /* SBUMessageSearchModule.Deprecated.swift */, ); - name = CustomView; + name = MessageSearch; sourceTree = ""; }; B773427CFB2CD84EE1572BCF /* Channels */ = { @@ -3455,15 +3382,6 @@ path = Channels; sourceTree = ""; }; - B8B0B222F3FF654B93E14AF2 /* Feedback */ = { - isa = PBXGroup; - children = ( - 12C7E05BDFB700749617933C /* SBUFeedbackView.swift */, - 351800BCBED343863F88C6F5 /* SBUFeedbackViewParams.swift */, - ); - name = Feedback; - sourceTree = ""; - }; B8DCA2C01A9742A412DAEE66 /* BasicUsages */ = { isa = PBXGroup; children = ( @@ -3482,33 +3400,20 @@ path = AlertView; sourceTree = ""; }; - BB1D3C06FB26FE54E12B3933 /* MessageThread */ = { + BB392E27BECF467FF0019C0E /* ChannelList */ = { isa = PBXGroup; children = ( - 1F3BC6F13906B366FA51B6AD /* SBUMessageThreadTitleView.swift */, - B02CD640F8C25F84FAEC732E /* SBUMessageThreadViewController.swift */, - 0036DC96E92E8838D13981BA /* SBUParentMessageInfoView.swift */, - ); - name = MessageThread; - sourceTree = ""; - }; - BB6557E83E366FF03D87DAC2 /* ChannelList */ = { - isa = PBXGroup; - children = ( - DEE2B4EFD32A67B6176A299A /* SBUGroupChannelListModule.Deprecated.swift */, - 1E132C5991C1524B53625974 /* SBUOpenChannelListModule.Deprecated.swift */, + 6A04392DE6277152E8015EC0 /* SBUChannelListViewController.Deprecated.swift */, ); name = ChannelList; sourceTree = ""; }; - BB7420B22637FE070079C9D2 /* MultipleFilesMessage */ = { + BC7422FBA7985C066BAD18B4 /* UserList */ = { isa = PBXGroup; children = ( - 71A027C49ABEAAB520F25148 /* SBUMultipleFilesMessageCell.swift */, - D7FC723CA3B3F942FFBF10FD /* SBUMultipleFilesMessageCollectionView.swift */, - 3195D6331AC1721504D82F43 /* SBUMultipleFilesMessageCollectionViewCell.swift */, + 8247167CB37263AD5C5C4B38 /* SBUBaseSelectUserViewController.Deprecated.swift */, ); - name = MultipleFilesMessage; + name = UserList; sourceTree = ""; }; BE11314ACF43F336389268D6 /* OpenChannel */ = { @@ -3521,36 +3426,29 @@ path = OpenChannel; sourceTree = ""; }; - C0C4BAC5642656110F8F844D /* MessageCellParams */ = { + BFC4CED6144C780947101E9D /* Protocol */ = { isa = PBXGroup; children = ( - FC378827B5740067C0447146 /* SBUBaseMessageCellParams.Deprecated.swift */, + 06DD68EE074C2AEB36D0D3D8 /* CommonProtocols.swift */, ); - name = MessageCellParams; + name = Protocol; sourceTree = ""; }; - C2969BA92FCA955824CBF4B7 /* SelectUser */ = { + C0F35F371C5534395429ECF1 /* UserCell */ = { isa = PBXGroup; children = ( - C5D52682C13D0819F2E13AA0 /* CreateChannel */, - 98CD0CD854A6E398B24F4ABA /* SBUBaseSelectUserViewModel.swift */, - CBEF8CB410B525E4FBDE9C59 /* SBUInviteUserViewModel.swift */, - 3758C48483D58ED5C97113F4 /* SBURegisterOperatorViewModel.swift */, + 1876C227E6BEDB05D39C1B42 /* SBUUserCell.swift */, ); - name = SelectUser; + name = UserCell; sourceTree = ""; }; - C2BC98A8A87CA8FF82880EE3 /* Views */ = { + C19300AE33EEDCF789656F5B /* Mention */ = { isa = PBXGroup; children = ( - 1B22F7428FDC86B6CE10840E /* SBUHorizontalSuggestedReplyOptionView.swift */, - A9F2076E63837BFBB449A82C /* SBUHorizontalSuggestedReplyView.swift */, - 6A9B1B098246B901D124B136 /* SBUSimpleSuggestedReplyOptionView.swift */, - 889F7678C691B2C87260BECF /* SBUSuggestedReplyOptionView.swift */, - FEC26E9D6CA4DAB0FFD3991F /* SBUSuggestedReplyView.swift */, - B991AD06D53B6F51F10B1FED /* SBUVerticalSuggestedReplyView.swift */, + 1A6ECC2F132D72ED6195C5FD /* SBUMentionConfiguration.swift */, + 42E8A1256BAD8D2C34D66021 /* SBUUserMentionConfiguration.swift */, ); - name = Views; + name = Mention; sourceTree = ""; }; C42724CC6DF9DE991CCFCEC8 /* ViewParams */ = { @@ -3567,30 +3465,35 @@ path = Replies; sourceTree = ""; }; - C5D52682C13D0819F2E13AA0 /* CreateChannel */ = { + C55E22A44C1AA1179123D389 /* CategoryFilterCell */ = { isa = PBXGroup; children = ( - 561A231FF2067422D2DA5971 /* SBUCreateChannelViewModel.swift */, - 70519D8FB40DB45F829EF9FF /* SBUCreateOpenChannelViewModel.swift */, + C813B96E07AD8AF029EF524B /* SBUCategoryFilterCell.swift */, ); - name = CreateChannel; + name = CategoryFilterCell; sourceTree = ""; }; - C621EDB5E67290FF54142EB2 /* Replies */ = { + C7F0F7469C726F086F7FA046 /* CreateChannel */ = { isa = PBXGroup; children = ( - A49219030A96C69E83B9698F /* MessageView */, - 519FCF21C7B6C9BCA589BFF2 /* ViewParams */, + A98D0571FF12C2682337FF1D /* SBUCreateOpenChannelModule.ProfileInput.swift */, + 3D15355333E36E3A3332D4DB /* SBUCreateChannelModule.swift */, + 805C16C6977AB2E9F1865F31 /* SBUCreateOpenChannelModule.swift */, + 95C535404C3F77E48A02987C /* SBUCreateOpenChannelModule.Header.swift */, + 47B38FB8FE54D75786DB993A /* SBUCreateChannelModule.Header.swift */, + DC90403A35689CAF4FC0F495 /* SBUCreateChannelModule.List.swift */, ); - name = Replies; + name = CreateChannel; sourceTree = ""; }; - C8A6F27A52329DD44C3D03A8 /* FileViewer */ = { + C8BF1C72430A88C2900457FA /* NotificationChannel */ = { isa = PBXGroup; children = ( - 7AEDFE0D309842977DE7E7C9 /* SBUFileViewController.swift */, + DDAF6D1095CA8005959E7B71 /* SBUNotificationCell.swift */, + 6692C7DC98D5A0ED508B2E65 /* SBUFeedNotificationCell.swift */, + 302ED9F9A0AD14D1C3405AAB /* SBUChatNotificationCell.swift */, ); - name = FileViewer; + name = NotificationChannel; sourceTree = ""; }; C8CCEEFF47CBB58CF008480C /* UserList */ = { @@ -3600,6 +3503,51 @@ path = UserList; sourceTree = ""; }; + C9D205FC1FFDE066BCEAAFFC /* Views */ = { + isa = PBXGroup; + children = ( + 27E9CC24044618969EC46F63 /* SBUMessageFormItemView.swift */, + 7D4ACC7708281A52BB86BBF6 /* SBUMessageFormSingleTextItemView.swift */, + 8DB249D251B45812D7C3ECDA /* SubViews */, + D0D2817787289EFF0DAFBC54 /* SBUMessageFormMultiTextItemView.swift */, + 54B0A14CDD13B14978F30042 /* SBUMessageFormFallbackView.swift */, + 3862095750B6D557CBC5C209 /* SBUMessageFormView.swift */, + A84C2F13525D60CF3896D4AD /* SBUMessageFormChipsItemView.swift */, + ); + name = Views; + sourceTree = ""; + }; + CA0B97D0A2428F61872A5B8D /* Feed */ = { + isa = PBXGroup; + children = ( + 399F6E43419452C48B685175 /* SBUFeedNotificationChannelModule.Header.swift */, + 139EAB8860A7F325F77B9C3F /* SBUFeedNotificationChannelModule.List.swift */, + BEB459518675E36121D8503F /* SBUFeedNotificationChannelModule.CategoryFilter.swift */, + 8329F074DD38B41DFA67FC16 /* SBUFeedNotificationChannelModule.swift */, + D466874370A873BD7B829B52 /* Params */, + ); + name = Feed; + sourceTree = ""; + }; + CCD74A8AD570E7929071DB31 /* ViewParams */ = { + isa = PBXGroup; + children = ( + C1B987C3F4B8C128AC650DF5 /* SBUSuggestedReplyViewParams.swift */, + ); + name = ViewParams; + sourceTree = ""; + }; + CE2F467F9134B064CE5D981F /* ChannelList */ = { + isa = PBXGroup; + children = ( + 41577B3040AA5084B4AA12B8 /* ChannelCell */, + 3BE48F8B0754D16FBBEDE3D5 /* SBUBaseChannelListViewController.swift */, + FAFDCE58C837943EDDD9BC0A /* SBUGroupChannelListViewController.swift */, + 2E7D681F8315DC6881561AEA /* SBUOpenChannelListViewController.swift */, + ); + name = ChannelList; + sourceTree = ""; + }; CE310908373D009C994480D2 /* Common */ = { isa = PBXGroup; children = ( @@ -3614,14 +3562,6 @@ path = Common; sourceTree = ""; }; - CE451A9AE04F7A172F7BC1F8 /* MessageThread */ = { - isa = PBXGroup; - children = ( - 9A3813E4ACFA04D7DD217CF7 /* SBUMessageThreadViewModel.swift */, - ); - name = MessageThread; - sourceTree = ""; - }; CE7C8B530E0E0F885BC2619A /* MessageSearch */ = { isa = PBXGroup; children = ( @@ -3636,14 +3576,6 @@ path = GroupChannel; sourceTree = ""; }; - D0276A5FD4E8F746726960F6 /* VoiceMessage */ = { - isa = PBXGroup; - children = ( - B8143A7D6E5428869072F8F3 /* SBUVoiceMessageConfiguration.swift */, - ); - name = VoiceMessage; - sourceTree = ""; - }; D192F825C0C3E201CE3CE747 /* MessageView */ = { isa = PBXGroup; children = ( @@ -3651,175 +3583,198 @@ path = MessageView; sourceTree = ""; }; - D3AA9447E4B19900862E22B7 /* NewMessageInfo */ = { + D2333C4158ED4335519818F7 /* Configuration */ = { isa = PBXGroup; children = ( + 4CD53927DA2B18E4805105FB /* ScrollPostion */, + 2D66B7D04791D7091D56A4CF /* MessageCell */, + 3D8B56ECC77E5973434A5F76 /* Replies */, + 07EC7BDBCC05A5A80D84645D /* SBUConfigManager.swift */, + C1A08081453CA8144B2347FF /* SBUConfig.OpenChannel.swift */, + 1CC476031F13EE7B380C4A52 /* SBUConfig.swift */, + 43CD9AF5C1DE009F333A1A0B /* VoiceMessage */, + 1F8A0046F71984D9AA0F483C /* SBUConfig.Base.swift */, + 3D02E7A8929FB82316556ADD /* SBUConfig.GroupChannel.swift */, + C19300AE33EEDCF789656F5B /* Mention */, + 87EF2A05B984D8F621163298 /* SBUConfig.Common.swift */, + A56D56DB9C54E9FCE376D245 /* SBUDashboardConfig.swift */, + 74E165FE8B985EC72B3F5760 /* SBUConfig.CodingKeys.swift */, ); - path = NewMessageInfo; + name = Configuration; sourceTree = ""; }; - D3E6C654D78DBD93BD0C6565 /* MessageSearch */ = { + D2B2610D6F9B849AB4D31483 /* NotificationSettings */ = { isa = PBXGroup; children = ( - 0B1C521FA40B1BCE57E17268 /* SBUMessageSearchViewModel.swift */, + 48FFBB2C5CC0396BB8A42D1C /* SBUGroupChannelPushSettingsViewModel.swift */, ); - name = MessageSearch; + name = NotificationSettings; sourceTree = ""; }; - D4E9EC2D88BDD99E73A61DCB /* ChannelSettings */ = { + D3AA9447E4B19900862E22B7 /* NewMessageInfo */ = { isa = PBXGroup; children = ( - 88617829E70495E77827DD59 /* ChannelSettingItem */, - 700B1120CCF3FCA339FDAD75 /* GroupChannel */, - 3FEF4EDFAE1A5B42BBCDA028 /* OpenChannel */, ); - path = ChannelSettings; + path = NewMessageInfo; sourceTree = ""; }; - D55F110022C53ED1873E0042 /* SubViews */ = { + D42CC150CBAD6E6433E4A91C /* Moderations */ = { isa = PBXGroup; children = ( - 6D55D5D043B46684415DB672 /* SBUMessageFormChipView.swift */, + 738D0A47D21D12AAC961B689 /* SBUModerationsViewController.swift */, ); - name = SubViews; + name = Moderations; sourceTree = ""; }; - D5C996CC3B78CF8D6533F6DC /* BasicUsages */ = { + D466874370A873BD7B829B52 /* Params */ = { isa = PBXGroup; children = ( - 651464849625AF16BC16BFD3 /* BasicUsagesViewController.swift */, - 8400C45D0E11FBE37587B089 /* BasicUsagesViewController.xib */, - B943C8F50DD6CA3985E33CF6 /* GeneralSignInViewController.swift */, - A8BCEC00EED3979EA4524D08 /* GeneralSignInViewController.xib */, + 731BBF448AC6D1BF0DC87F3A /* SBUFeedNotificationChannelViewParams.swift */, ); - path = BasicUsages; + name = Params; sourceTree = ""; }; - D898EFF22FEDF72873F1E306 /* CreateChannel */ = { + D4A8C776F2DA85434B1B4EBD /* MessageSearch */ = { isa = PBXGroup; children = ( - 46527008E40B16B24514AD1E /* CreateChannelVC_Cell.swift */, - B11815F7B056DAADAE9AA1DB /* CreateChannelVC_UserList.swift */, + 9B6A5EA6AB1BD482B56E9D15 /* SBUMessageSearchModule.Header.swift */, + A744CC744FFB1405AF8AA00A /* SBUMessageSearchModule.List.swift */, + 1053284DDA7205A0DB124298 /* SBUMessageSearchModule.swift */, ); - path = CreateChannel; + name = MessageSearch; sourceTree = ""; }; - D8AC30003FB15D1719B37DD4 /* ViewParams */ = { + D4E9EC2D88BDD99E73A61DCB /* ChannelSettings */ = { isa = PBXGroup; children = ( + 88617829E70495E77827DD59 /* ChannelSettingItem */, + 700B1120CCF3FCA339FDAD75 /* GroupChannel */, + 3FEF4EDFAE1A5B42BBCDA028 /* OpenChannel */, ); - path = ViewParams; + path = ChannelSettings; sourceTree = ""; }; - DA22BF2AA267E908ED362C00 /* Model */ = { + D5C996CC3B78CF8D6533F6DC /* BasicUsages */ = { isa = PBXGroup; children = ( - 05617EB655FE8DFC8C4D874E /* SBUError.swift */, - 05318C3A623C0EDA38676EFE /* SBUExtendedMessagePayload.swift */, - 2A73E337872DEE7F4B811560 /* SBUExtendedMessagePayloadForUI.swift */, - C5A8B4E3319F47AE4AF2136F /* SBUFeedbackAction.swift */, - 5E0697520CC7B478CCF34160 /* SBUHighlightMessageInfo.swift */, - BAC9F6BE599CBC05780C6B5E /* SBUMention.swift */, - A0E5E6F1298AF3CA7A26F6FC /* SBUMessageCache.swift */, - 2A51ADBDB378FA6499ED320F /* SBUScrollOptions.swift */, - FDE4BE315EA68C5AB211C7C0 /* SBUTypingIndicatorInfo.swift */, - 79DE5898F2F988FDDBBE2FE3 /* SBUTypingIndicatorMessage.swift */, - F95EE58925E458E93D7FDCE6 /* SBUUser.swift */, - EC1B3CDBEF376A20747208A9 /* SBUVoiceFileInfo.swift */, + 651464849625AF16BC16BFD3 /* BasicUsagesViewController.swift */, + 8400C45D0E11FBE37587B089 /* BasicUsagesViewController.xib */, + B943C8F50DD6CA3985E33CF6 /* GeneralSignInViewController.swift */, + A8BCEC00EED3979EA4524D08 /* GeneralSignInViewController.xib */, ); - name = Model; + path = BasicUsages; sourceTree = ""; }; - DB1AF435182EB53985DC0F63 /* SelectUser */ = { - isa = PBXGroup; - children = ( - 6DEFFA4A2B39E5F871716119 /* CreateChannel */, + D64FE82D40635BC7D037F483 /* Common */ = { + isa = PBXGroup; + children = ( + 1EDBEE7CE1D348D227F6510E /* SBUStackView.swift */, + 23AE4104792D75CA431666D3 /* SBUAnimation.swift */, + 6924D84F0B598828DF1C74D6 /* SBUEmptyView.swift */, + A3DA6329DD565FE7A29F75C7 /* ActionSheet */, + D02F80CCE36A240909668D82 /* SBUCoverImageView.swift */, + 7EC31F1E6119DD2A13AF6FDF /* PhotoLibrary */, + 72BAA589EB7899C0543E88A8 /* SBUSearchBar.swift */, + 9BE660373834E053B02FD109 /* SBUPaddingLabel.swift */, + 50266A482A990A1FFDAF7501 /* Toast */, + FB4E609F0F56A3A6785D70A2 /* SBUCommonItem.swift */, + EC96D93AB851F99AD829A2D9 /* SBULayoutableButton.swift */, + 6A881B4B30E4BA0DB0F7AD9A /* User */, + 6552B9E340734C47C91257BE /* SBUNavigationTitleView.swift */, + 3B98C6D21843D388F6AB9CB9 /* SBUNotificationNavigationTitleView.swift */, + 511330D36A5E47DAEAA11080 /* SBUBarButtonItem.swift */, + 0C9412FC79CA00FB3846A53F /* SBUNotificationEmptyView.swift */, + EAE980C544B8131EC5524CB0 /* Menu */, + E43110898387DC349478B6F4 /* SBUUnderLineTextField.swift */, + 1A160F096B32CEC4952786B3 /* AlertView */, + C0F35F371C5534395429ECF1 /* UserCell */, + 45310F1A62F1B4E5F9FACF45 /* SBUTemplateLabel.swift */, + 1434E50458E03A6FDDBD602F /* SBUMarginView.swift */, + 0ED3A22444BA1F9C60D05FDA /* SBUTypingIndicatorBubbleView.swift */, + 6EE5A4AA2EF847A68E27C1E9 /* SBUCommonViewControllerSet.swift */, + B310291234962FDCD219CA29 /* SBULoading.swift */, + F6B1F9002A6FC6B2585D425F /* SBUCollectionViewFlowLayout.swift */, ); - path = SelectUser; + name = Common; sourceTree = ""; }; - DB27B9556F88F98241AC4774 /* ChannelSettings */ = { + D7223C837D8D281ACF3E9EE7 /* Cell */ = { isa = PBXGroup; children = ( - 23F0504A612CDADFC88C9BBB /* SBUGroupChannelSettingsModule.Deprecated.swift */, - DD9F293CB1BA36B9D8D335A8 /* SBUOpenChannelSettingsModule.Deprecated.swift */, + 1BED4AD675E4F406DB4F49EA /* SBUOpenChannelSettingCell.swift */, + C4C2524E1433BAF65CDB5CF8 /* SBUBaseChannelSettingCell.swift */, + C1404FA36259746705B6E2A3 /* SBUModerationCell.swift */, + 27BF2569429CEBC39031F66C /* SBUGroupChannelSettingCell.swift */, ); - name = ChannelSettings; + name = Cell; sourceTree = ""; }; - DB918B4B2B0477E5FEC1895D /* SelectUser */ = { + D79778B99CC6429924205C88 /* Channel */ = { isa = PBXGroup; children = ( - A75A20AEB7F9849E0D76E4C2 /* CreateChannel */, - 7282FAD410ECD8348AA61110 /* InviteUser */, - 7F7CF21EB6515046D2ACF214 /* RegisterOperator */, + FD015BF00D81AEB2A1CA3C94 /* SBUBaseChannelModule.Deprecated.swift */, + 065623B584B000C295F9405D /* SBUGroupChannelModule.Deprecated.swift */, + 006892806DB9C7DC09CAA142 /* SBUOpenChannelModule.Deprecated.swift */, + 07666CE7914B1F4A0918B211 /* Notifications */, ); - path = SelectUser; + name = Channel; sourceTree = ""; }; - DC9A16CC55840EBA8F1619E6 /* UserList */ = { + D898EFF22FEDF72873F1E306 /* CreateChannel */ = { isa = PBXGroup; children = ( - 70C07E04365AFE0A517A7BE8 /* SBUUserListViewModel.swift */, + 46527008E40B16B24514AD1E /* CreateChannelVC_Cell.swift */, + B11815F7B056DAADAE9AA1DB /* CreateChannelVC_UserList.swift */, ); - name = UserList; + path = CreateChannel; sourceTree = ""; }; - DCA7427E20468C03218C4761 /* InviteUser */ = { + D8AC30003FB15D1719B37DD4 /* ViewParams */ = { isa = PBXGroup; children = ( - 96C73D47D58841602582626D /* SBUInviteUserModule.Header.swift */, - DCD1091E08A9D9F154CDC2C0 /* SBUInviteUserModule.List.swift */, - 04DE97EEAD63BBA59E0FB656 /* SBUInviteUserModule.swift */, ); - name = InviteUser; + path = ViewParams; sourceTree = ""; }; - DCAC0E8A37AD46FEAD4E95CD /* PhotoLibrary */ = { + DB1AF435182EB53985DC0F63 /* SelectUser */ = { isa = PBXGroup; children = ( - 5D313F2DDAFBB50136DD7DAC /* SBUPhotoAccess.swift */, - B643397F995A39D749A46298 /* SBUPhotoCollectionViewCell.swift */, - 89338A5AE3FF6CB0FEBCF032 /* SBUSelectablePhotoViewController.swift */, + 6DEFFA4A2B39E5F871716119 /* CreateChannel */, ); - name = PhotoLibrary; + path = SelectUser; sourceTree = ""; }; - DDA5B77C804BE2E100213499 /* ViewModel */ = { + DB918B4B2B0477E5FEC1895D /* SelectUser */ = { isa = PBXGroup; children = ( - 7423908DEA4CAD97D811D06F /* SBUMessageWebViewModel.swift */, - 18199E460A717BAF37F51353 /* SBUUserMessageTextViewModel.swift */, + A75A20AEB7F9849E0D76E4C2 /* CreateChannel */, + 7282FAD410ECD8348AA61110 /* InviteUser */, + 7F7CF21EB6515046D2ACF214 /* RegisterOperator */, ); - name = ViewModel; + path = SelectUser; sourceTree = ""; }; - DEA443AB2088EB679B958223 /* Protocol */ = { + DEECFF664A4C39BD832CB05D /* Common */ = { isa = PBXGroup; children = ( - 359A8F95710D091998A5DA79 /* CommonProtocols.swift */, + 23B22ADEC5DEA48C89785025 /* SBUCommonModule.swift */, ); - name = Protocol; + name = Common; sourceTree = ""; }; - DF48A7190776EBA065285901 /* Channel */ = { + DF5177554A10C9C5E2D7571D /* Forms */ = { isa = PBXGroup; children = ( - 73E62A854BD7CD3FDE50B5E9 /* Notifications */, - 17A665256F14DCE575A7FDCA /* SBUBaseChannelModule.Deprecated.swift */, - EEBFB762A374274391B75D59 /* SBUGroupChannelModule.Deprecated.swift */, - 54A9A8933A162614D63D0DC6 /* SBUOpenChannelModule.Deprecated.swift */, ); - name = Channel; + name = Forms; sourceTree = ""; }; - DFCA4E62F527C72ED1C94596 /* SuggestedReply */ = { + E22E10A780845FE1864995B2 /* MessageSearch */ = { isa = PBXGroup; children = ( - 3EB32C2881C208F9731B8A2F /* ViewParams */, - C2BC98A8A87CA8FF82880EE3 /* Views */, + FED362612990C863472EC0C1 /* SBUMessageSearchViewController.Deprecated.swift */, ); - name = SuggestedReply; + name = MessageSearch; sourceTree = ""; }; E2715599E56D45D12B0796EF /* Moderations */ = { @@ -3829,16 +3784,23 @@ path = Moderations; sourceTree = ""; }; - E427549D769F41889E344F9D /* Theme */ = { + E32D237341A8452D8A21B430 /* Model */ = { isa = PBXGroup; children = ( - 969E0A8ADC1B8381ACBA1B1F /* SBUColorSet.swift */, - B851C2061AD8CF9384B327AB /* SBUFontSet.swift */, - 21F7684A21E11019D651003F /* SBUIconSet.swift */, - 8A2E136580924E1911C1BDFF /* SBUTheme+Type.swift */, - 9E2F629F9B7B99E3AA7B60AE /* SBUTheme.swift */, + 5322419D7DC948E4C59CBE3C /* SBUTypingIndicatorMessage.swift */, + 01C800B2B494C239581740B7 /* SBUMention.swift */, + 10081ABF448755F6ABE0B3CD /* SBUMessageCache.swift */, + 607B42FE473E8A6E170EA74E /* SBUUser.swift */, + DD96F2547917952DFB51AB65 /* SBUError.swift */, + 250DE586B2E8ED7C913DEFC0 /* SBUVoiceFileInfo.swift */, + CC3D4969A0B940A716B6606A /* SBUTypingIndicatorInfo.swift */, + BDF03593AAF01AB7403D97DC /* SBUFeedbackAction.swift */, + 445E5B82F8E01824006A0945 /* SBUHighlightMessageInfo.swift */, + 53751B7045EA78E02FBB7B25 /* SBUScrollOptions.swift */, + A3B3D201883F1491F8342F21 /* SBUExtendedMessagePayload.swift */, + A7FA6407241634DBD62B76F9 /* SBUExtendedMessagePayloadForUI.swift */, ); - name = Theme; + name = Model; sourceTree = ""; }; E47876125C52BEC8A3747DCC /* Menu */ = { @@ -3862,10 +3824,10 @@ path = SubViews; sourceTree = ""; }; - E5FD023ACD08877EB34F9051 /* ViewParams */ = { + E901CB79F6EEED884E9BE1BA /* ViewParams */ = { isa = PBXGroup; children = ( - 285D3B5D6B90E85834D424B7 /* SBUMessageFormViewParams.swift */, + 1045A1E37FDB19F6E2B4B051 /* SBUQuotedBaseMessageViewParams.swift */, ); name = ViewParams; sourceTree = ""; @@ -3877,22 +3839,6 @@ path = MessageThread; sourceTree = ""; }; - E9F20FDE37ECF964143F7CDD /* ScrollPostion */ = { - isa = PBXGroup; - children = ( - C2EB356C521D5C78FEA38B03 /* SBUScrollPostionConfiguration.swift */, - ); - name = ScrollPostion; - sourceTree = ""; - }; - EA2EB3F9C3A2B234DEA92B91 /* Moderations */ = { - isa = PBXGroup; - children = ( - D3FA63D9B60F878938D7C620 /* SBUModerationsModule.Deprecated.swift */, - ); - name = Moderations; - sourceTree = ""; - }; EA4EFC3F203B1A2BE1A5B1F9 /* Channel */ = { isa = PBXGroup; children = ( @@ -3900,21 +3846,22 @@ path = Channel; sourceTree = ""; }; - EABA9CEE33EE8DDC6063D021 /* MessageCell */ = { + EAD59F669C004A93D23DCF20 /* NotificationChannel */ = { isa = PBXGroup; children = ( - C0C4BAC5642656110F8F844D /* MessageCellParams */, - 049B1136F3EDE8CCD4A35675 /* Replies */, - 06653308AECB127005256632 /* SBUContentBaseMessageCell.Deprecated.swift */, ); - name = MessageCell; + path = NotificationChannel; sourceTree = ""; }; - EAD59F669C004A93D23DCF20 /* NotificationChannel */ = { + EAE980C544B8131EC5524CB0 /* Menu */ = { isa = PBXGroup; children = ( + 9F45838C7174CC45916A778F /* SBUMenuSheetViewController.swift */, + DE1AE659DF5214E274DFDEDD /* SBUMenuCell.swift */, + 7B9C5DC79836381B4EBB75F2 /* SBUMenuView.swift */, + 3D55146E9657B5320577D2C3 /* SBUBottomSheetController.swift */, ); - path = NotificationChannel; + name = Menu; sourceTree = ""; }; EBC8BA41F3374EC0FB856A43 /* VoiceMessage */ = { @@ -3940,29 +3887,45 @@ path = SubView; sourceTree = ""; }; - EC2FFAF4278506F8D0CC967C /* Channel */ = { + ED6DC7C19C9AAE2891CEE67E /* View */ = { isa = PBXGroup; children = ( - 42D3B9EF3C2445FE1C52CD30 /* SBUBaseChannelViewModel.swift */, - 95A6A22BFC57DD8576BA395B /* SBUChatNotificationChannelViewModel.swift */, - CC925CC682F157053C6991C4 /* SBUFeedNotificationChannelViewModel.swift */, - 2B8A0BD43E64B98BE0A3E2B4 /* SBUGroupChannelViewModel.swift */, - 90835C2299445B0E4408124B /* SBUOpenChannelViewModel.swift */, + 4A7E4BC2B941C753B4D1A8A8 /* SBUBaseViewController.swift */, + CE2F467F9134B064CE5D981F /* ChannelList */, + B431B35158DCCB5ED1A2230E /* NotificationSettings */, + 953740B654B5F6EC626B52C9 /* Channel */, + 21803F74A5A28398E2334F27 /* ChannelSettings */, + 466609DF5A09E4F5D06E5E0A /* VoiceNote */, + D64FE82D40635BC7D037F483 /* Common */, + 6FED830B35F1EC975093CC95 /* UserList */, + 89AA3B80AA07FD6AA83067C9 /* SBUViewControllerSet.swift */, + 5F1BE73F390AAB66A1E4270E /* MessageSearch */, + 892E588EA43282381B1332A9 /* Life cycles */, + F6DC7037DC30872F73D378E1 /* MessageThread */, + D42CC150CBAD6E6433E4A91C /* Moderations */, + 20B4F571C69B0EEF93B5B086 /* SelectUser */, ); - name = Channel; + name = View; sourceTree = ""; }; - EFD4232836828FC9BAB851B8 /* MessageInput */ = { + F0E266115D4D89B76E0DC71E /* NotificationSettings */ = { isa = PBXGroup; children = ( - 338726E7B1F43DC2AEA22230 /* SBUMentionLimitGuideCell.swift */, - A71B3F2FD57DFBE297702E05 /* SBUMessageInputMode.swift */, - 59857C7D2CC2649D6D9B4588 /* SBUMessageInputView.swift */, - 121FECC4AF40731A583783BE /* SBUQuoteMessageInputView.swift */, - AD7228CF5F19E467365AAB04 /* SBUSuggestedMentionList.swift */, - 4908FBA6A144E1785216A9E1 /* ViewParams */, + 44ABD98D4565D23E2F60FB33 /* SBUGroupChannelPushSettingsModule.Deprecated.swift */, ); - name = MessageInput; + name = NotificationSettings; + sourceTree = ""; + }; + F12C20F9F21EE3C558E4E4A9 /* Theme */ = { + isa = PBXGroup; + children = ( + 091765502ECC694C6C1232FF /* SBUIconSet.swift */, + 33287F292240B14F1F4F8743 /* SBUColorSet.swift */, + 6D397650F90F2674F715403C /* SBUTheme+Type.swift */, + 2F2EEC9F62E8C45DB2270994 /* SBUFontSet.swift */, + 905EA788F69B2FB8D289270B /* SBUTheme.swift */, + ); + name = Theme; sourceTree = ""; }; F18E199E7EF4258AD9D332E1 /* GroupChannel */ = { @@ -3982,24 +3945,6 @@ path = MySettings; sourceTree = ""; }; - F19C096B53BAA45F83F0626F /* Media */ = { - isa = PBXGroup; - children = ( - FD1958ABF18FC7814345A68C /* SBUMediaView.swift */, - ); - name = Media; - sourceTree = ""; - }; - F32E22EC5C1DFAC6B48CB5B5 /* Chat */ = { - isa = PBXGroup; - children = ( - 9B72B84D8197B89255974E36 /* SBUChatNotificationChannelModule.Header.swift */, - FB69A7EAA719CEEC2CDD571A /* SBUChatNotificationChannelModule.List.swift */, - 770EA711778A5B8EF1E79631 /* SBUChatNotificationChannelModule.swift */, - ); - name = Chat; - sourceTree = ""; - }; F3501B68357880B906EDD2F2 /* ChannelSettings */ = { isa = PBXGroup; children = ( @@ -4028,20 +3973,6 @@ path = OpenChannel; sourceTree = ""; }; - F6577603F597E5BAE53C337C /* Channel */ = { - isa = PBXGroup; - children = ( - EABA9CEE33EE8DDC6063D021 /* MessageCell */, - 3DA4DFE6F962C791023523F6 /* SBUBaseChannelViewController.Deprecated.swift */, - E650103D74D3096368D9F8BE /* SBUBaseChannelViewController.Unavailable.swift */, - C2EFAAD40957BEB30ADC9532 /* SBUGroupChannelViewController.Deprecated.swift */, - CFBFB5FD5BBC6FBBF82545AD /* SBUGroupChannelViewController.Unavailable.swift */, - 318FFA50D14FA7DBF2D42D6A /* SBUOpenChannelViewController.Deprecated.swift */, - BF651C402E1392F0FB82A70F /* SBUOpenChannelViewController.Unavailable.swift */, - ); - name = Channel; - sourceTree = ""; - }; F6A2B47024791D1A905C9424 /* MessageCell */ = { isa = PBXGroup; children = ( @@ -4051,15 +3982,14 @@ path = MessageCell; sourceTree = ""; }; - F6D9D0271CE544F8AA4DC369 /* ChannelList */ = { + F6DC7037DC30872F73D378E1 /* MessageThread */ = { isa = PBXGroup; children = ( - 2AA1BBB02AE5340EED8F235E /* ChannelCell */, - B79C9122DCF777C65D083D28 /* SBUBaseChannelListViewController.swift */, - DDBE78CDC2C84B8A02219C0A /* SBUGroupChannelListViewController.swift */, - A4C8248B1D3DF0BF523A3C2B /* SBUOpenChannelListViewController.swift */, + 05ADC08876C839B4E4F10C89 /* SBUMessageThreadViewController.swift */, + 1384AB05BC3D019EF0010C0A /* SBUMessageThreadTitleView.swift */, + 863FEC0F9119AB3B46EF8EA4 /* SBUParentMessageInfoView.swift */, ); - name = ChannelList; + name = MessageThread; sourceTree = ""; }; F813A0E37C4102CBDE5DE433 /* View */ = { @@ -4069,25 +3999,13 @@ path = View; sourceTree = ""; }; - F87827843C0AF64D6E9EF402 /* GroupChannel */ = { - isa = PBXGroup; - children = ( - AD6EBB6238C0E6B3288EFB7A /* SBUGroupChannelModule.Header.swift */, - 428B326E33CBBA89207D59DA /* SBUGroupChannelModule.Input.swift */, - E6F47F9078584B2213E6A852 /* SBUGroupChannelModule.List.swift */, - 83EBCC4EE4DD8257F4CA32B1 /* SBUGroupChannelModule.swift */, - ); - name = GroupChannel; - sourceTree = ""; - }; - F88125DC9F5CB54EB7E54879 /* Enums */ = { + F8B0B383B1405A8EDD0FEF1C /* Header */ = { isa = PBXGroup; children = ( - B78CAA75DD967758186FF283 /* SBUEnums.swift */, - 511CF243955D25BEAF1552DE /* SBUIconSetType.swift */, - 0CA0A3C97568158FCA60B1A0 /* VoiceMessageStatus.swift */, + 3DCCF2A299D66BBEB908AFCA /* SBUChannelInfoHeaderView.swift */, + 509771838EA18AA17B4179FB /* SBUChannelTitleView.swift */, ); - name = Enums; + name = Header; sourceTree = ""; }; F955BDD4C090A07E734FE94E /* Chat */ = { @@ -4097,35 +4015,13 @@ path = Chat; sourceTree = ""; }; - F95B9E20A3C03F181B5E924F /* ChatSDK */ = { - isa = PBXGroup; - children = ( - 31AD44B06FF0438622D51196 /* BaseMessage+SBUIKit.MessageTemplate.swift */, - F43A5FC7EB56EB0E85482B5A /* BaseMessage+SBUIKit.swift */, - BE1E93B8FCF62DE1F85F506E /* MessageForm+SBUIKit.swift */, - 65BD601D9C94A1360C6B358F /* MultipleFilesMessage+SBUIKit.swift */, - 9AC0696DB83EED0C73CDED13 /* SendbirdChat+SBUIKit.swift */, - ); - name = ChatSDK; - sourceTree = ""; - }; - FA4704D89BEC556F4E907BDC /* GroupChannel */ = { - isa = PBXGroup; - children = ( - 2D826F745DAE2521F5F82AC5 /* SBUGroupChannelSettingsModule.Header.swift */, - 77AC383BB93F275948CDD7C0 /* SBUGroupChannelSettingsModule.List.swift */, - 39305DCC7521E039CAA011B0 /* SBUGroupChannelSettingsModule.swift */, - ); - name = GroupChannel; - sourceTree = ""; - }; - FA8012D0F1E9B3048AA76092 /* NotificationChannel */ = { + FA84DF4F1B95BD1AB0972598 /* ViewModel */ = { isa = PBXGroup; children = ( - F32E22EC5C1DFAC6B48CB5B5 /* Chat */, - 70AEC51ABDA1422CB6888113 /* Feed */, + 0D4F9A671E44FB87B56071B4 /* SBUUserMessageTextViewModel.swift */, + D9A35E681FAA4974C97BB08B /* SBUMessageWebViewModel.swift */, ); - name = NotificationChannel; + name = ViewModel; sourceTree = ""; }; FB25C845D2FA13B674EBAFEB /* Cell */ = { @@ -4135,20 +4031,20 @@ path = Cell; sourceTree = ""; }; - FB8F2287117B61FA55437002 /* CategoryFilterCell */ = { + FBC9EE32309D48B0375B9F83 /* Channel */ = { isa = PBXGroup; children = ( - 88B9B3E2144119A6083D7E6A /* SBUCategoryFilterCell.swift */, + F6A2B47024791D1A905C9424 /* MessageCell */, ); - name = CategoryFilterCell; + path = Channel; sourceTree = ""; }; - FBC9EE32309D48B0375B9F83 /* Channel */ = { + FD1786CF22AC161804837EC6 /* FileViewer */ = { isa = PBXGroup; children = ( - F6A2B47024791D1A905C9424 /* MessageCell */, + DC9B433DC2BC0714581C7B95 /* SBUFileViewController.swift */, ); - path = Channel; + name = FileViewer; sourceTree = ""; }; FE861A8F1548B95C04F4DD69 /* SelectUser */ = { @@ -4269,7 +4165,7 @@ EA65CC9A04FD4D786ACC0F50 /* Main.storyboard in Resources */, C12184EC9A09DE75AC01149E /* MainItemView.xib in Resources */, 952CABAB72144676A0E7E404 /* MainView.xib in Resources */, - 21CEF9D4507F81FCBEF5E51C /* Assets.xcassets in Resources */, + 0188B0A197B55B74C9219549 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4373,460 +4269,443 @@ E022C39DAE8F104CB09DD281 /* UserDefaults+Ext.swift in Sources */, BA6D6556E19151D810E62156 /* UserInfoTitleView.swift in Sources */, 18E798E65CBA3F331117FD2C /* ViewController.swift in Sources */, - CF69118A6D31FEDDDD533440 /* SBUMentionConfiguration.swift in Sources */, - 3FB86A394E6E22C557970714 /* SBUUserMentionConfiguration.swift in Sources */, - D3ADDB24529159F7E88DAE58 /* SBUMessageCellConfiguration.swift in Sources */, - FC50217901E1B98B3348ACD6 /* SBUReplyConfiguration.swift in Sources */, - 18F6E927A590FE2D08A0674E /* SBUConfig.Base.swift in Sources */, - C9623A4CB087EF8899C96BAC /* SBUConfig.CodingKeys.swift in Sources */, - ECBFC5D1B74329709E3065D1 /* SBUConfig.Common.swift in Sources */, - C84AA53221AF5CF2A45A7E32 /* SBUConfig.GroupChannel.swift in Sources */, - 2DA4B01F855397D580803AF4 /* SBUConfig.OpenChannel.swift in Sources */, - 71B45698FAA92EAE0FE3092F /* SBUConfig.swift in Sources */, - 09A8AB24BB34EFADF7986C62 /* SBUConfigManager.swift in Sources */, - 336D364A7E530FFEA4A93B50 /* SBUDashboardConfig.swift in Sources */, - B7096284D2BB211EEA838060 /* SBUScrollPostionConfiguration.swift in Sources */, - 4FA20DDBD46B76441F7E9560 /* SBUVoiceMessageConfiguration.swift in Sources */, - E4F55222D897C3B752F111B3 /* SBUConstant.swift in Sources */, - 6A468C98C796A2C8BFCBBC75 /* SBUDateFormatSet.swift in Sources */, - BFE495817133713067AA3B87 /* SBUStringSet.Deprecated.swift in Sources */, - E92A52CA194A8FE62C19A242 /* SBUStringSet.swift in Sources */, - FEDA1FF0777EA897FD1A8215 /* BaseMesssage+SBUIKit.Deprecated.swift in Sources */, - B94A466C2A59C21FD4112DB8 /* SBUBaseMessageCellParams.Deprecated.swift in Sources */, - 32235F35EB71146C090C8C22 /* SBUQuotedBaseMessageViewParams.Deprecated.swift in Sources */, - C81C9315743145DB23ADACFE /* SBUContentBaseMessageCell.Deprecated.swift in Sources */, - 80B874AF2960A59349130FC3 /* SBUBaseChannelViewController.Deprecated.swift in Sources */, - EA56B0BA1DDC0B70CCABC0FE /* SBUBaseChannelViewController.Unavailable.swift in Sources */, - 18184CDC18D44DA9E249A3E5 /* SBUGroupChannelViewController.Deprecated.swift in Sources */, - 25155CF285997C8E21408FBA /* SBUGroupChannelViewController.Unavailable.swift in Sources */, - 0FCE832C2258FBE9E4C5DF27 /* SBUOpenChannelViewController.Deprecated.swift in Sources */, - D45CCAF1581097C1C86DF023 /* SBUOpenChannelViewController.Unavailable.swift in Sources */, - E992AD1DF399FAF49D150217 /* SBUChannelListViewController.Deprecated.swift in Sources */, - B4514F530F2C859A3C09CEA7 /* SBUBaseChannelSettingsViewController.Deprecated.swift in Sources */, - 84E1F272D806AA6DF2BE44F6 /* SBUCreateChannelViewController.Deprecated.swift in Sources */, - EF0FD384D93120D67E8A61FE /* SBUMemberListViewController.Deprecated.swift in Sources */, - 7C747E0B460BB7A426757559 /* SBUMessageSearchViewController.Deprecated.swift in Sources */, - B29E5998D30089EEBAB243E6 /* SBUModerationsViewController.Deprecated.swift in Sources */, - DB47E162F5F43E3FD949ACAE /* SBUModerationsViewModel.Deprecated.swift in Sources */, - 44EB8EAEA5F214EE1B7B4798 /* SBUChatNotificationChannelModule.Deprecated.swift in Sources */, - 4B1CEEF0A2DAD54D7F5FE022 /* SBUFeedNotificationChannelModule.Deprecated.swift in Sources */, - 43A77D98E193F222ED6580DC /* SBUBaseChannelModule.Deprecated.swift in Sources */, - DF4C92B9A10F40A3D320640F /* SBUGroupChannelModule.Deprecated.swift in Sources */, - 338811107C04EBB0352A6464 /* SBUOpenChannelModule.Deprecated.swift in Sources */, - 0FBAAF7DAFFCE0E99FD5BEE1 /* SBUGroupChannelListModule.Deprecated.swift in Sources */, - A2A28C9F00E2DEBCBFF0DCBB /* SBUOpenChannelListModule.Deprecated.swift in Sources */, - FB25B140D542ADF1AA1ABA5D /* SBUGroupChannelSettingsModule.Deprecated.swift in Sources */, - 80AF4BF0E3336AAA33FB3DED /* SBUOpenChannelSettingsModule.Deprecated.swift in Sources */, - 606C6CC05EC78D73F691B04F /* SBUMessageSearchModule.Deprecated.swift in Sources */, - E858E347BE23BD824DAFC45C /* SBUMessageThreadModule.Deprecated.swift in Sources */, - 94BEA30D5B285FEFB153A28E /* SBUModerationsModule.Deprecated.swift in Sources */, - 5BAD1DB6D2ED01E617CB30E0 /* SBUGroupChannelPushSettingsModule.Deprecated.swift in Sources */, - FAC8EADE60D7DDC662CF4D12 /* SBUModuleSet.Deprecated.swift in Sources */, - ADD247C32FD964E642436B36 /* SBUCreateChannelModule.Deprecated.swift in Sources */, - 1682BB9363F3F7CC8E73F37F /* SBUCreateOpenChannelModule.Deprecated.swift in Sources */, - A7B76CD20A0BAC495019D727 /* SBUInviteUserModule.Deprecated.swift in Sources */, - 428E2E6929383107F93DD392 /* SBURegisterOperatorModule.Deprecated.swift in Sources */, - B83BE0C70901516CF4F82C30 /* SBUUserListModule.Deprecated.swift in Sources */, - C853A43750DECBF56762F53F /* SBUBaseViewController.Unavailable.swift in Sources */, - 71F16FEF542252BE4830E8C4 /* SBUCoverImageView.Deprecated.swift in Sources */, - 69246EF1C49EC6C7DC8305FA /* SBUEnums.Deprecated.swift in Sources */, - 163E6B7D21930E62190874FD /* SBUForm.Deprecated.swift in Sources */, - 592B48AEE32EA2C385764767 /* SBUFormFieldView.Deprecated.swift in Sources */, - 2D76A3FC4C0D45B70BB4E5AF /* SBUFormView.Deprecated.swift in Sources */, - 123D975099FD4D51C7712B7C /* SBUFormViewParams.Deprecated.swift in Sources */, - F5E142003F4648009E7156F0 /* SBUGlobals.Deprecated.swift in Sources */, - 8AA14DC1A4E1F4C308F431F1 /* SBUTableViewCell.Unavailable.swift in Sources */, - 5C56F090EA045C55A83513E2 /* SBUTheme.Deprecated.swift in Sources */, - 04B86FE3F62BB267F87D14B4 /* SBUView.Unavaliable.swift in Sources */, - 3F0A63E14C70A57957F87034 /* SendbirdUI.Deprecated.swift in Sources */, - 81712053ED0CB017663A2539 /* SBUBaseSelectUserViewController.Deprecated.swift in Sources */, - 42FD4DF4EFA8A7704BFE52C3 /* SBUEnums.swift in Sources */, - D7848CB8AAF0FF0636E95452 /* SBUIconSetType.swift in Sources */, - 4AE62F63E6043A0489DA11CE /* VoiceMessageStatus.swift in Sources */, - EEA61FD9E6C4E192BEE1F1DA /* Array+SBUIKit.swift in Sources */, - FCD48C139CA39D8D14CC04A1 /* CGSize+SBUIKit.swift in Sources */, - 61997FDF4B378F942A4633BE /* BaseMessage+SBUIKit.MessageTemplate.swift in Sources */, - 4984013C813737D40F831B51 /* BaseMessage+SBUIKit.swift in Sources */, - 4A0193DB4E3F0B610694D07D /* MessageForm+SBUIKit.swift in Sources */, - E6808EF7297B7CF5F6DC9C75 /* MultipleFilesMessage+SBUIKit.swift in Sources */, - E4DBD6A9E84A27353852737C /* SendbirdChat+SBUIKit.swift in Sources */, - E7197523D100C8B3BD629E6F /* Collection+SBUIKit.swift in Sources */, - 6A7A6F182316B4045AE16287 /* Data+SBUIKit.swift in Sources */, - A14C5BF7F778C57FB6BAFB66 /* Date+SBUIKit.swift in Sources */, - 724CA1381B3D03E3BDCDD556 /* Float+SBUIKit.swift in Sources */, - EF354F8C47910B8A75342488 /* Formatter+SBUIKit.swift in Sources */, - 0CD56E2F5A0655BE99206CB3 /* NSLayoutConstraint+SBUIKit.swift in Sources */, - 5FD2C344485C6EACC1AC2997 /* NSObject+SBUIKit.swift in Sources */, - 524B43C45A8D717126479195 /* Sequence+SBUIKit.swift in Sources */, - D86343978C89F7C95798CB4D /* String+SBUIKit.swift in Sources */, - 213AC350F367EBB96C3BBC78 /* StringProtocol+SBUIKit.swift in Sources */, - EE668D6E55BAC355CCA7D4AB /* Thread+SBUIKit.swift in Sources */, - 914B37A8A8BBA4E3DE10759B /* UIApplication+SBUIKit.swift in Sources */, - 059D977BA41CDC4C1DEAB21C /* UIButton+SBUIKit.swift in Sources */, - F1F9C59D41EE7B043C50A19C /* UICollectionView+SBUIKit.swift in Sources */, - B2B65812D3375E3A7185CA98 /* UIColor+SBUIKit.swift in Sources */, - F35744669272393899FC67F9 /* UIImage+SBUIKit.swift in Sources */, - 9C3D9BF77424E28173AE5594 /* UIImageView+SBUIKit.swift in Sources */, - 66480FDAEA8109835A308D99 /* UINavigationController+SBUIKit.swift in Sources */, - 3AAE7FE059796653DACDF1A5 /* UIScrollView+SBUIKit.swift in Sources */, - FB23B736C23A29ED8DB618DD /* UIStackView.SBUIKit.swift in Sources */, - 8438D731A1E5DF5D032ED1E2 /* UITableView+SBUIKit.swift in Sources */, - 7794F8100C24A4CD99C86DC2 /* UITextField+SBUIKit.swift in Sources */, - 5D005BF3397F68DBF1B31A8D /* UIView+SBUIKit.swift in Sources */, - 518AF77DD3CA64A998C8F2DB /* UIViewController+SBUIKit.swift in Sources */, - 80F25CBE6ABDFD744533BA90 /* URL+SBUIKit.swift in Sources */, - 48856F1E8BE26CE478900CC5 /* SBUCacheManager.Config.swift in Sources */, - 766AAD8609B8CC8CBBB9E716 /* SBUCacheManager.File.swift in Sources */, - D3F0BE727BD5D2068BA4A560 /* SBUCacheManager.Image.swift in Sources */, - 54D853D05FDB21B4FA4BA92E /* SBUCacheManager.NotificationSetting.swift in Sources */, - 409FF74804C48D8FFCD5858D /* SBUCacheManager.Template.swift in Sources */, - D82E542604F642AF8F1739B9 /* SBUCacheManager.Version.swift in Sources */, - D34DD66BB4694BC58949CCFD /* SBUCacheManager.swift in Sources */, - 5E94D74A3C8B11428ED93D42 /* SBUDownloadManager.swift in Sources */, - 9998BEFC501F4AF7B7B34C1A /* SBUEmojiManager.swift in Sources */, - 3B5F893CC427EF30536F85CF /* SBUMessageTemplateManager.swift in Sources */, - 4F7162A9565FF6D875C757D2 /* SBUNotificationChannelManager.swift in Sources */, - 277F9CEA0C149A3CA146504B /* SBUPendingMessageManager.swift in Sources */, - D36403502DA4F027E83C9236 /* SBUPermissionManager.swift in Sources */, - 31D2E7C68C01E021A0756FA8 /* SBUTemplateType.swift in Sources */, - 449B90AD7FE3F048D7ABE73D /* SBUTypingIndicatorMessageManager.swift in Sources */, - 774DEC9605EB17F3B4D2AD8B /* SBUVoicePlayer.swift in Sources */, - 93C1BFB8E003D8EF2D0601D1 /* SBUVoiceRecorder.swift in Sources */, - DA4B12A222DA14149DC86718 /* SBUMessageTemplate.Binder.swift in Sources */, - DD8DDDE578A5500A682C086F /* SBUMessageTemplate.Container.swift in Sources */, - 99CCE36011AFFD3A03EDA812 /* SBUMessageTemplate.Coordinator.swift in Sources */, - 6D872B8D0ED6065BD6EA7958 /* SBUMessageTemplate.Payload.swift in Sources */, - 799769873147B19E77527E05 /* SBUMessageTemplate.PayloadType.swift in Sources */, - BA8120C278F84EF7247DFF9A /* SBUMessageTemplate.TemplateList.swift in Sources */, - 908D6E65C10AAE1EDD05CDD9 /* SBUMessageTemplate.Renderer+Events.swift in Sources */, - 6E92D40CD5656E20B88F4893 /* SBUMessageTemplate.Renderer+RenderItems.swift in Sources */, - AC512D9109047939BF3257A9 /* SBUMessageTemplate.Renderer+RenderStyles.swift in Sources */, - 9128D89E4C547238ED2CD414 /* SBUMessageTemplate.Renderer+Utils.swift in Sources */, - FACB0A9410DF19C31A04D4C1 /* SBUMessageTemplate.Renderer.Image.swift in Sources */, - E45D7858FB56A47BC0A933FB /* SBUMessageTemplate.Renderer.RendererType.swift in Sources */, - 68C75D9663E71B2812232FC3 /* SBUMessageTemplate.Renderer.Views.swift in Sources */, - 7381B6798BBBF3B8CFD8C999 /* SBUMessageTemplate.Renderer.swift in Sources */, - 490B588A0A64CE928DAE6705 /* SBUMessageTemplate.swift in Sources */, - 2B1A1555983F3341970E3ECA /* SBUMessageTemplate.Action.swift in Sources */, - 02131B71B4E7B0CC5B743489 /* SBUMessageTemplate.Decoders.swift in Sources */, - 3AFFE8913450F54115A1536E /* SBUMessageTemplate.ErrorMessages.swift in Sources */, - D0349252880DBE87D2606FE4 /* SBUMessageTemplate.ImageRatioType.swift in Sources */, - FEEA132C5DB0C1AF2FA8A8F0 /* SBUMessageTemplate.Syntax.Aligns.swift in Sources */, - 786BA721134163C82FC5DB5D /* SBUMessageTemplate.Syntax.Identifier.swift in Sources */, - 6C589E441C251424FF58A194 /* SBUMessageTemplate.Syntax.Item.swift in Sources */, - 711C518B6620C2D299564736 /* SBUMessageTemplate.Syntax.Sizes.swift in Sources */, - F88664F238A4F9353B561600 /* SBUMessageTemplate.Syntax.Styles.swift in Sources */, - 7F23CCD58F661E86EC6245A2 /* SBUMessageTemplate.Syntax.Types.swift in Sources */, - E34CBAF90FF2C1CAE9BCD8AA /* SBUMessageTemplate.Syntax.Views.swift in Sources */, - 9AA0C46EFD620ECC88C55D90 /* MessageTemplateParserTest.swift in Sources */, - 640582D63F08F5FCACF2846E /* MessageTemplateTestViewController.swift in Sources */, - 4FF20B0AD29F08D70697C639 /* SBUError.swift in Sources */, - AA9C47F4C89934DD140E9F08 /* SBUExtendedMessagePayload.swift in Sources */, - 5D949A0186099BEE1929DBF8 /* SBUExtendedMessagePayloadForUI.swift in Sources */, - F5E61A71FF478D20A21B4667 /* SBUFeedbackAction.swift in Sources */, - A7300555684C3ECC83E551C2 /* SBUHighlightMessageInfo.swift in Sources */, - A5B2158118F346AA2611EDF5 /* SBUMention.swift in Sources */, - 646B09634C7C2143DCE2611D /* SBUMessageCache.swift in Sources */, - ECD44CA80EE0EF4D719BC2E2 /* SBUScrollOptions.swift in Sources */, - 4E65E47A38F272B4E83EC3A0 /* SBUTypingIndicatorInfo.swift in Sources */, - 3697838314334A007BF415E0 /* SBUTypingIndicatorMessage.swift in Sources */, - D2F3D4A7DFC501CAC7E2DB89 /* SBUUser.swift in Sources */, - B6B76EEEBB8D986E65EC9797 /* SBUVoiceFileInfo.swift in Sources */, - 4E0BA02B072A2D8DFA4B6F3D /* SBUGroupChannelModule.Header.swift in Sources */, - 7BE7D16AA268041DA4311D83 /* SBUGroupChannelModule.Input.swift in Sources */, - 7538F0E65C79C7FAB52F6B99 /* SBUGroupChannelModule.List.swift in Sources */, - 235CD47C6532AA6E4C908EA2 /* SBUGroupChannelModule.swift in Sources */, - 196916A19FC7201C8968EB5D /* SBUChatNotificationChannelModule.Header.swift in Sources */, - 34BAF956B5C72FBD42A25EC2 /* SBUChatNotificationChannelModule.List.swift in Sources */, - C442881C52A6E97531255B38 /* SBUChatNotificationChannelModule.swift in Sources */, - 4C6E5C9621E30E36FCCEC564 /* SBUFeedNotificationChannelViewParams.swift in Sources */, - E02567B2CAECEE8F2D052794 /* SBUFeedNotificationChannelModule.CategoryFilter.swift in Sources */, - 272163E47F1425C6F3B79A00 /* SBUFeedNotificationChannelModule.Header.swift in Sources */, - 95582ABC7DC10CBFFD531C8A /* SBUFeedNotificationChannelModule.List.swift in Sources */, - 3715C1D13E9F87E3FC72829E /* SBUFeedNotificationChannelModule.swift in Sources */, - 0596553868CE49CEA3A155DB /* SBUOpenChannelModule.Header.swift in Sources */, - 4EA4CF786661F9B146F4735A /* SBUOpenChannelModule.Input.swift in Sources */, - 21EED0DCCC8D5BE3FF10337C /* SBUOpenChannelModule.List.swift in Sources */, - AFC08AC83773A3AB193DDA2D /* SBUOpenChannelModule.Media.swift in Sources */, - 1BF99D5BA258D6F1EBF9A3AB /* SBUOpenChannelModule.swift in Sources */, - 3C28D09F5445576352F25FCF /* SBUBaseChannelModule.Header.swift in Sources */, - 9CA754E9A53619E4C5BB1C7A /* SBUBaseChannelModule.Input.swift in Sources */, - 6C010894D10F8F290A0096C3 /* SBUBaseChannelModule.List.swift in Sources */, - 2D0D9C51BDF91F4D1FC0E047 /* SBUBaseChannelModule.swift in Sources */, - 31FC45AC3DF9A6E98B2102EB /* SBUGroupChannelListModule.Common.swift in Sources */, - 55FCA07674E3268DC33C8E10 /* SBUGroupChannelListModule.Header.swift in Sources */, - 5AB8467A215C3FBFA9A14E15 /* SBUGroupChannelListModule.List.swift in Sources */, - F09B3B9E53913C96392CAE26 /* SBUGroupChannelListModule.swift in Sources */, - 683B11C49FF73ED504E3EBC8 /* SBUOpenChannelListModule.Header.swift in Sources */, - 56401A5E819973A3FBEB9493 /* SBUOpenChannelListModule.List.swift in Sources */, - 94EE970075241AB99172A184 /* SBUOpenChannelListModule.swift in Sources */, - 5493995F2E803CD472563AB4 /* SBUBaseChannelListModule.Header.swift in Sources */, - 6AD6F7ED657FE98F8E1995AD /* SBUBaseChannelListModule.List.swift in Sources */, - ADA703D703EFB2984693773D /* SBUBaseChannelListModule.swift in Sources */, - 3EA9B59DC3F3BA0D8FFEC608 /* SBUChannelSettingItem.swift in Sources */, - 1C79F8472D64D9AA16DD05DC /* SBUGroupChannelSettingsModule.Header.swift in Sources */, - EBA7D023409D69E0153DA28B /* SBUGroupChannelSettingsModule.List.swift in Sources */, - 469C1E0147E3C59B59648941 /* SBUGroupChannelSettingsModule.swift in Sources */, - A0B8620473C72A621C336560 /* SBUOpenChannelSettingsModule.Header.swift in Sources */, - 17F15A0DCCB37ACEA3E8679B /* SBUOpenChannelSettingsModule.List.swift in Sources */, - 6304F74A0B5F769CD18F7B1D /* SBUOpenChannelSettingsModule.swift in Sources */, - CFC5E1EA1BF4B91BF8C8A71D /* SBUBaseChannelSettingsModule.Header.swift in Sources */, - AC9C302075D77AC8CB68D2A6 /* SBUBaseChannelSettingsModule.List.swift in Sources */, - BFA17E50D38342A0EE2ADF9B /* SBUBaseChannelSettingsModule.swift in Sources */, - DD41AE849AA528A2EF3767D4 /* SBUCommonModule.swift in Sources */, - 545E4FF841DFBA46D83D4A2A /* SBUMessageSearchModule.Header.swift in Sources */, - DE56D2AEF9EAF0BC7EE1CA0B /* SBUMessageSearchModule.List.swift in Sources */, - 67ED820C30991972E2AD65C5 /* SBUMessageSearchModule.swift in Sources */, - FC9BB39E4BF47330081DAE9E /* SBUMessageThreadModule.Header.swift in Sources */, - B8D9B4DCE95C4C1A8BEF62C1 /* SBUMessageThreadModule.Input.swift in Sources */, - B01F3FBD9B61C9B53D16243D /* SBUMessageThreadModule.List.swift in Sources */, - 8B80A3AEBA6D7B152CD808E2 /* SBUMessageThreadModule.swift in Sources */, - F2AAE077DFE8D688733159EE /* SBUModerationsModule.Header.swift in Sources */, - D7A5760180F7A6D435DDA8EF /* SBUModerationsModule.List.swift in Sources */, - 2C2E60816D9A1D0CBE982812 /* SBUModerationsModule.swift in Sources */, - 650BFC0BC8D99E60952C8C84 /* SBUGroupChannelPushSettingsModule.Header.swift in Sources */, - 6A7C1E8C73286917594CC011 /* SBUGroupChannelPushSettingsModule.List.swift in Sources */, - B778D47BEEF0AFD6D6633B06 /* SBUGroupChannelPushSettingsModule.swift in Sources */, - 2ADEC2B2EED7A726EB29DF0A /* SBUModuleSet.swift in Sources */, - E254E362F2444CBBD0B93D22 /* SBUCreateChannelModule.Header.swift in Sources */, - 642D77F753082F10EE6D33C6 /* SBUCreateChannelModule.List.swift in Sources */, - 3A0B261457195E3C47772143 /* SBUCreateChannelModule.swift in Sources */, - 021D9AE2C33EF155BC8ECD54 /* SBUCreateOpenChannelModule.Header.swift in Sources */, - 973DED65E9B29A2C8B4BCB30 /* SBUCreateOpenChannelModule.ProfileInput.swift in Sources */, - CC9798EDB0CA866FC5BF8C7E /* SBUCreateOpenChannelModule.swift in Sources */, - 3086842BF1FFEECEE7442A4B /* SBUInviteUserModule.Header.swift in Sources */, - 17A65C7B69016FE6A0A01401 /* SBUInviteUserModule.List.swift in Sources */, - 0247FBACEDEC4BACB4D309B6 /* SBUInviteUserModule.swift in Sources */, - B73BCC410A4D5E5FA2F57036 /* SBURegisterOperatorModule.Header.swift in Sources */, - E163F91AB9B5539431B0A572 /* SBURegisterOperatorModule.List.swift in Sources */, - B2D250377BFE621FF7B365AF /* SBURegisterOperatorModule.swift in Sources */, - 7FF62F99C3FE34E51DA6E376 /* SBUBaseSelectUserModule.Header.swift in Sources */, - 960A6155D4B8BD018FCF2365 /* SBUBaseSelectUserModule.List.swift in Sources */, - 0A9D07EFFA030C78A98F980C /* SBUBaseSelectUserModule.swift in Sources */, - 20888D7D78CB4C08428D7907 /* SBUUserListModule.Header.swift in Sources */, - 07A64F764EADBE67510A8B9C /* SBUUserListModule.List.swift in Sources */, - C78392DD6A521FD443F7C7C1 /* SBUUserListModule.swift in Sources */, - F82768B57FC7F22D21F43B69 /* CommonProtocols.swift in Sources */, - FCCB1C12A5882872FCFE040F /* SBUAvailable.swift in Sources */, - 57CE66E2DE84745CED43C8DC /* SBUGlobalCustomParams.swift in Sources */, - 6987CD81318F0DD37A8668AB /* SBUGlobals.swift in Sources */, - D11446A22421C48D49D1C4C4 /* SendbirdUI.swift in Sources */, - 19F2EFD05500C57C8F35E70D /* SBUColorSet.swift in Sources */, - A1C706E48C166566EB0DED90 /* SBUFontSet.swift in Sources */, - D73C26A5DF16F92E7AE5A521 /* SBUIconSet.swift in Sources */, - FD0BEBDF1C3FBCF3F2F365EA /* SBUTheme+Type.swift in Sources */, - CAB01193528DC35A3C27D530 /* SBUTheme.swift in Sources */, - 72571077EC7B70D849B6BE22 /* BlockingOperation.swift in Sources */, - 7FD8752CDD05A4CF72200FB1 /* SBUDebouncer.swift in Sources */, - EA8151FD0F2CEF2F533CA3FC /* SBULogger.swift in Sources */, - 37B29B414376D9B51FD7DCA4 /* SBUMentionManager.swift in Sources */, - 744767316F343B24558A553D /* SBUPropertyWrapper.swift in Sources */, - FDB4E8A38EA5EB87AC17A75B /* SBUUtils.swift in Sources */, - B29D7680EEBB775988AC8571 /* WeakDelegateStorage.swift in Sources */, - 806E11DA5C05EE35A441CCD1 /* SBUCategoryFilterCell.swift in Sources */, - 2990A59B9FD171AE34C2BA0F /* SBULinkClickableTextView.swift in Sources */, - F8B8898E1E8F72F80477F861 /* SBUMarkdownTransfer.swift in Sources */, - 45E725D52DB53654AB78965A /* SBUMessageDateView.swift in Sources */, - B86BE85129F3E3E340D34FC6 /* SBUMessageProfileView.swift in Sources */, - 305B6295428F8361AB110547 /* SBUMessageStateView.swift in Sources */, - 4939795375329232D00555A4 /* SBUMessageWebView.swift in Sources */, - B64560D394F185036E9DC812 /* SBUNotificationTimelineView.swift in Sources */, - 36F30D02E9DEC9AC44F73762 /* SBUOpenChannelMessageWebView.swift in Sources */, - 6967E509EC13BDDAFD043AEE /* SBUSelectableStackView.swift in Sources */, - 72A7D8AD235D2467DC5BB2AC /* SBUUserMessageTextView.swift in Sources */, - C74800D2216A82A84BBF5424 /* SBUUserNameView.swift in Sources */, - D07E64C37ACECB4DFA38A9F9 /* SBUChannelStateBanner.swift in Sources */, - A9B684C838F45A0048C1E184 /* SBUFileViewController.swift in Sources */, - 9B155C92529DE8A70CE8301C /* SBUChannelInfoHeaderView.swift in Sources */, - 6245254964AF2882DDA36305 /* SBUChannelTitleView.swift in Sources */, - 5DC4F3DB1C38AC2B0E26CF0B /* SBUMediaView.swift in Sources */, - 556B5CF7709D79A35A37A024 /* SBUBaseCarouselView.swift in Sources */, - 83CBFE32260293EBD7D3404D /* SBUExtendedMessagePayloadCustomViewFactory.swift in Sources */, - 2852C6BF7360B8277B534410 /* SBUFeedbackView.swift in Sources */, - 930F5032D7A298D7EA8B3019 /* SBUFeedbackViewParams.swift in Sources */, - E91B54E68711D9793A9DA960 /* SBUBaseFileContentView.swift in Sources */, - 6346114C9D88339B6380DF93 /* SBUCommonContentView.swift in Sources */, - 797686BA984FDCC60B457B76 /* SBUImageContentView.swift in Sources */, - E7049DE05B9D48EB597B0CB3 /* SBUOpenChannelCommonContentView.swift in Sources */, - 4710D6D2A7E21C244553CE89 /* SBUOpenChannelImageContentView.swift in Sources */, - C4EADBF3434333C0A87F52AF /* SBUVoiceContentView.swift in Sources */, - 6835F2DDE4BF7931DDDF3CC5 /* SBUAdminMessageCellParams.swift in Sources */, - 0AB69C4998C733A323BE2CEA /* SBUBaseMessageCellParams.swift in Sources */, - E48FAB087F78E351A2ED2756 /* SBUFeedNotificationCellParams.swift in Sources */, - 6D814DA42C4D01F2AAC3B26E /* SBUFileMessageCellParams.swift in Sources */, - 8A94409504D094AD9F13DB2D /* SBUMessageTemplateCellParams.swift in Sources */, - AFD7E333A8CF10EC8DFB5B07 /* SBUMultipleFilesMessageCellParams.swift in Sources */, - 2A2B3D874CB7384A69B55CFE /* SBUTypingMessageCellParams.swift in Sources */, - 36E10E11EE332D8B95E4F892 /* SBUUnknownMessageCellParams.swift in Sources */, - 8147EE76406BB0090A57EC6C /* SBUUserMessageCellParams.swift in Sources */, - A6B67132703B583F5FEA876B /* SBUMessageFormViewParams.swift in Sources */, - EDDA8CECC339FBFF1F7F222F /* SBUMessageFormChipsItemView.swift in Sources */, - 5EB4D287728DD9C36B43365A /* SBUMessageFormFallbackView.swift in Sources */, - 21FDF6AD0174FDCB2C1841BA /* SBUMessageFormItemView.swift in Sources */, - D11C7B07A3F68A3A4D4288EB /* SBUMessageFormMultiTextItemView.swift in Sources */, - 8A60E595DBD273FAA3DCF48C /* SBUMessageFormSingleTextItemView.swift in Sources */, - 4AA328F3A7B5C29F79AA8352 /* SBUMessageFormView.swift in Sources */, - F9359465E36107FDE883D3EA /* SBUMessageFormChipView.swift in Sources */, - 1C73433BE654C98C51F508D3 /* SBUMultipleFilesMessageCell.swift in Sources */, - 4B3E473A457014964F2DC7B3 /* SBUMultipleFilesMessageCollectionView.swift in Sources */, - D6C66BB02B03C6064A0E0857 /* SBUMultipleFilesMessageCollectionViewCell.swift in Sources */, - 70F2B8701F2A24E1839E975D /* SBUChatNotificationCell.swift in Sources */, - F119DAEDE7C7E3CE5C5A9FD1 /* SBUFeedNotificationCell.swift in Sources */, - 7BB72348E9C79A1407521504 /* SBUNotificationCell.swift in Sources */, - D3089A5F5E89CD6E7DC5976C /* SBUOpenChannelAdminMessageCell.swift in Sources */, - 40316590398FE6CBF860E65B /* SBUOpenChannelBaseMessageCell.swift in Sources */, - 3424052206350C6D80B49DEC /* SBUOpenChannelContentBaseMessageCell.swift in Sources */, - 19641DAAF07FFBFCF61424E1 /* SBUOpenChannelFileMessageCell.swift in Sources */, - A8984B91D1F6C78D2F7CE3E5 /* SBUOpenChannelUnknownMessageCell.swift in Sources */, - F18B4B787AF711D3CB5F529C /* SBUOpenChannelUserMessageCell.swift in Sources */, - 7004477F3B3FC4F09154ED04 /* QuotedFileCommonContentView.swift in Sources */, - F44B4C42EB25D18A9571255B /* QuotedFileImageContentView.swift in Sources */, - 146C081AA198D637EFACB4DF /* SBUQuotedBaseMessageView.swift in Sources */, - 43C582D5693EAA336D971083 /* SBUQuotedFileMessageView.swift in Sources */, - 11330D0C45B720C74CC8E578 /* SBUQuotedUserMessageView.swift in Sources */, - 6ED4DAF1F227C24C6198D394 /* SBUThreadInfoView.swift in Sources */, - 87AAF68C32F753042B51DD67 /* SBUQuotedBaseMessageViewParams.swift in Sources */, - 23ACD6070E5BE0494775D445 /* SBUAdminMessageCell.swift in Sources */, - EB0FCAA7435B4007322EF470 /* SBUBaseMessageCell.Feedback.swift in Sources */, - 3C95A4A1BC39446D1FF0FB8A /* SBUBaseMessageCell.swift in Sources */, - C95628EFBD4464AA1A981A72 /* SBUContentBaseMessageCell.swift in Sources */, - F7DDEA8D7E0F37EC601A52AD /* SBUFileMessageCell.swift in Sources */, - 5813EAC89773E7C2F17D73C8 /* SBUMessageTemplateCell.MessageTemplateLayer.swift in Sources */, - 1B703CA9C49E64A7377525FA /* SBUMessageTemplateCell.swift in Sources */, - 5E64AB318FF38A6365289165 /* SBUMessageTemplateCellLayout.swift in Sources */, - 00A85F7965CFE0B222FBECAD /* SBUTypingIndicatorMessageCell.swift in Sources */, - FF689B972964723106DF8D1B /* SBUUnknownMessageCell.swift in Sources */, - 9830D26433E7F7C3E69BFDB7 /* SBUUserMessageCell.swift in Sources */, - A17C22336716D9CD5D01F126 /* SBUSuggestedReplyViewParams.swift in Sources */, - 698E795ABA4D91E02B3CCD5C /* SBUHorizontalSuggestedReplyOptionView.swift in Sources */, - 56876CE6DF626C47658DF458 /* SBUHorizontalSuggestedReplyView.swift in Sources */, - 837B7A74F5B474BE8709E71D /* SBUSimpleSuggestedReplyOptionView.swift in Sources */, - BACC1F6500340C02D7082BDC /* SBUSuggestedReplyOptionView.swift in Sources */, - 2F9641F8F9BF4B6943E1BCDB /* SBUSuggestedReplyView.swift in Sources */, - 2878D33AA8E88D95B249E704 /* SBUVerticalSuggestedReplyView.swift in Sources */, - 8B33B2334812CD3E4BC58BB0 /* SBUMentionLimitGuideCell.swift in Sources */, - 147BDA6F7CFB468B5B048FC3 /* SBUMessageInputMode.swift in Sources */, - 16D6617A9CBE459E1C34BD9F /* SBUMessageInputView.swift in Sources */, - B9E575DBEA36B7F6A0D02AB1 /* SBUQuoteMessageInputView.swift in Sources */, - 2EE942D3FB8E7116F8C714FC /* SBUSuggestedMentionList.swift in Sources */, - 28EF2C2266D825AA3EF47287 /* SBUQuoteMessageInputViewParams.swift in Sources */, - 7F72A5801440B97D94C31741 /* SBUNewMessageInfo.swift in Sources */, - 6AB858C55B49E9CBABADF394 /* SBUNewNotificationInfo.swift in Sources */, - E6B69A09FD3B42914BC7BF81 /* SBUEmojiListViewController.swift in Sources */, - 547EAE5E1663593578E1016B /* SBUMessageReactionView.swift in Sources */, - D66512BF918C66EE07A31EEF /* SBUParentMessageInfoReactionView.swift in Sources */, - A6AB1D7C2A27EEEFFAE38EED /* SBUReactionCollectionViewCell.swift in Sources */, - 052153480783F5D8836E5702 /* SBUReactionsViewController.swift in Sources */, - 7EEBA539C1AFF2E7AC2D4BEE /* SBUBaseChannelViewController.Keyboard.swift in Sources */, - 40B1BBBFBD6B392EDEB6753C /* SBUBaseChannelViewController.swift in Sources */, - 63421D1E54B106C4BA7B8B39 /* SBUChatNotificationChannelViewController.swift in Sources */, - 1A4A80D6484826D7512F4A53 /* SBUFeedNotificationChannelViewController.swift in Sources */, - 31D9AB3CDE49DB38342783C7 /* SBUGroupChannelViewController.swift in Sources */, - EA0EB80F343FA43FE9F2E7C6 /* SBUOpenChannelViewController.swift in Sources */, - 201FBBB691E81B927E0CB182 /* SBUScrollBottomView.swift in Sources */, - 6D0A3EF358FF62CC8C906990 /* SBUMessageWebViewModel.swift in Sources */, - 616C89E4A323AFEAB1901F58 /* SBUUserMessageTextViewModel.swift in Sources */, - B3EA9B78FD03AB287A18E41A /* SBUBaseChannelCell.swift in Sources */, - A78D4F202B5EE59BDC47B5EE /* SBUGroupChannelCell.swift in Sources */, - D3EE407715F3C4695B3F6E8C /* SBUOpenChannelCell.swift in Sources */, - FFEAB42E4A351B73ACD7E379 /* SBUBaseChannelListViewController.swift in Sources */, - 79238A4F35078D28DE0A93B7 /* SBUGroupChannelListViewController.swift in Sources */, - C50E2A5C9ED5AFDB863C53C9 /* SBUOpenChannelListViewController.swift in Sources */, - 5EE2E5216552403C43119491 /* SBUBaseChannelSettingCell.swift in Sources */, - 131DE842F31D7008EF376010 /* SBUGroupChannelSettingCell.swift in Sources */, - C52232967BAE2D4DEBD1BC3F /* SBUModerationCell.swift in Sources */, - 4270F6BFFABE3D067F8D6B22 /* SBUOpenChannelSettingCell.swift in Sources */, - DB3A2BA155A9F72E16FF917A /* SBUBaseChannelSettingsViewController.swift in Sources */, - B3AF9C0DFEF207D7567FC9C2 /* SBUGroupChannelSettingsViewController.swift in Sources */, - 43B42E3DF3E6158C7941ED58 /* SBUOpenChannelSettingsViewController.swift in Sources */, - C8B75C5F2463E367E3F45A87 /* SBUChannelSettingsChannelInfoView.swift in Sources */, - F277D4442F94884AAAEFA714 /* SBUActionSheet.Item.swift in Sources */, - 3F9CCDC97B2256D24FCE6500 /* SBUActionSheet.swift in Sources */, - 54984DC9B66CDD287A53F2E8 /* SBUAlertView.Item.swift in Sources */, - C5B67C34FF461465953CDA10 /* SBUAlertView.swift in Sources */, - EE5F9DB8ECD3046949EC7AD2 /* SBUBottomSheetController.swift in Sources */, - F50426E1B731092D4409A6BE /* SBUMenuCell.swift in Sources */, - ED76F131A779554CD0A8D7E7 /* SBUMenuSheetViewController.swift in Sources */, - 6230B926AD64917D8A9D6EDB /* SBUMenuView.swift in Sources */, - 4FCCC04FD18C9D5112234ECB /* SBUPhotoAccess.swift in Sources */, - 87E23DC7D78C1B70AEAB0735 /* SBUPhotoCollectionViewCell.swift in Sources */, - EAE6856D9D5C22268221894D /* SBUSelectablePhotoViewController.swift in Sources */, - 6A1FB5AF60E8050AB3E2F9BF /* SBUAnimation.swift in Sources */, - 96D53A009C5B6B152447E1D4 /* SBUBarButtonItem.swift in Sources */, - 22DF9A7F9C6506622FAC4533 /* SBUCollectionViewFlowLayout.swift in Sources */, - CDC69C51937FE809F82C7716 /* SBUCommonItem.swift in Sources */, - 349486C54773C95CCBA12576 /* SBUCommonViewControllerSet.swift in Sources */, - F533A32AFF949F76B9CE8AB6 /* SBUCoverImageView.swift in Sources */, - 2B48A9D6A1326433F95F584D /* SBUEmptyView.swift in Sources */, - E152B2A44F429EC0672D3070 /* SBULayoutableButton.swift in Sources */, - 02ABB1BAB91A78E40B617A55 /* SBULoading.swift in Sources */, - 9E5342A02F016252999E0B7C /* SBUMarginView.swift in Sources */, - CEA24D3F839EB26BDC929798 /* SBUNavigationTitleView.swift in Sources */, - 398C16F6F35B047BB4A3CBC8 /* SBUNotificationEmptyView.swift in Sources */, - B85FEAF0DED9210AE12489EF /* SBUNotificationNavigationTitleView.swift in Sources */, - 38C73FD0F0856D4AAA83368B /* SBUPaddingLabel.swift in Sources */, - 8CC58146E32D38AA662F573F /* SBUSearchBar.swift in Sources */, - A40899BF23F24B02410C548E /* SBUStackView.swift in Sources */, - 1BCE5B9037ABA084B86C4B91 /* SBUTemplateLabel.swift in Sources */, - 8D6F401F044923A8D07EF7A5 /* SBUTypingIndicatorBubbleView.swift in Sources */, - 36FA0E71A095D97C08BBCA64 /* SBUUnderLineTextField.swift in Sources */, - 2AAD55045818B48FAEEF2465 /* SBUToastType.swift in Sources */, - 2539F5D72FC72984B857EEA1 /* SBUToastView.Internal.swift in Sources */, - 3C84696762454874158EE72E /* SBUToastView.Item.swift in Sources */, - 7A89A9C582CF46E2242E4539 /* SBUToastView.swift in Sources */, - 5377233C1AFD80188DF7EE9F /* SBUUserProfileView.swift in Sources */, - C1CCBC9618A0BF48AE95351B /* SBUUserCell.swift in Sources */, - 75294A616CE898609F25538E /* SBUCollectionViewCell.swift in Sources */, - CF96D6E337107CAD689ABB89 /* SBULabel.swift in Sources */, - E9D49919948094A583639B0E /* SBUMessageCellProtocol.swift in Sources */, - 57784394BD3DEB685E11B138 /* SBUQuoteMessageInputViewProtocol.swift in Sources */, - 7337428C0B44C436FDADAA2A /* SBUQuotedMessageViewProtocol.swift in Sources */, - A320818E4557003A4C845F6A /* SBUTableViewCell.swift in Sources */, - 3209A0CD58B3D11F8BC8D971 /* SBUTextView.swift in Sources */, - 9298DD060DCA713933ACDBBC /* SBUView.swift in Sources */, - 0712BEF000CF282632B5F090 /* SBUViewLifeCycle.swift in Sources */, - F70A4FB640AD9E9DF51A99AF /* SBUMessageSearchResultCell.swift in Sources */, - 0F0BC25DFA231A1F3CFCB4DF /* SBUMessageSearchViewController.swift in Sources */, - A6C21FBA527924B90E4B65A7 /* SBUMessageThreadTitleView.swift in Sources */, - CBC6853524F8C51863E4D2AC /* SBUMessageThreadViewController.swift in Sources */, - A72D5B61415C2222C74754DB /* SBUParentMessageInfoView.swift in Sources */, - 046CB029CCCEEAA4D1AF5A4E /* SBUModerationsViewController.swift in Sources */, - CAC9B740E1595449555BED74 /* SBUChannelPushSettingCell.swift in Sources */, - 27AB6FD6FF6FCC0EE0FBC7F8 /* SBUGroupChannelPushSettingsViewController.swift in Sources */, - 50CF1B96A842FBF8D173E476 /* SBUBaseViewController.swift in Sources */, - 51C545D87BF919577589549F /* SBUViewControllerSet.swift in Sources */, - 112BB9532661659424BA9CAC /* SBUCreateChannelViewController.swift in Sources */, - 547B35224DB2693DDA35B9FE /* SBUCreateOpenChannelViewController.swift in Sources */, - CE7147F5BA14D9B0858D7795 /* SBUCreateChannelTypeSelector.swift in Sources */, - 6B457C31619CA7BED4102170 /* SBUBaseSelectUserViewController.swift in Sources */, - 25712D8C82D49853C68FD088 /* SBUInviteUserViewController.swift in Sources */, - EFABA7CA0B3D237F1F943B08 /* SBURegisterOperatorViewController.swift in Sources */, - 038C05C76118FB5BFBA4693F /* SBUUserListViewController.swift in Sources */, - 31064A73E50DF83127D91F2F /* SBUVoiceMessageInputView.swift in Sources */, - 1B46CCCDAAB5C28445E7F4A1 /* SBUBaseChannelViewModel.swift in Sources */, - 46CEC4A27578C59EBD37B6DF /* SBUChatNotificationChannelViewModel.swift in Sources */, - A1344A549B21BC91E86172D4 /* SBUFeedNotificationChannelViewModel.swift in Sources */, - FD5E83410214F607D0D82519 /* SBUGroupChannelViewModel.swift in Sources */, - 9B8A84E4DC4EFDA29E20EDC7 /* SBUOpenChannelViewModel.swift in Sources */, - 68DBDC2463E500762B12A5B7 /* SBUBaseChannelListViewModel.swift in Sources */, - 612125EB13A29B5CD166D2C8 /* SBUGroupChannelListViewModel.swift in Sources */, - D1672B77066B45540C155A8D /* SBUOpenChannelListViewModel.swift in Sources */, - 8E5346F894889DED67223BD9 /* SBUBaseChannelSettingsViewModel.swift in Sources */, - 428DB3C76DD0B583F6F5CE9A /* SBUGroupChannelSettingsViewModel.swift in Sources */, - C7AA3BB4D77F409E895E80D9 /* SBUModerationsViewModel.swift in Sources */, - A84226985091B2C3313E6C56 /* SBUOpenChannelSettingsViewModel.swift in Sources */, - EA6330B57DA9C8B173469686 /* SBUCommonDelegate.swift in Sources */, - 4BF112784A79654A6A6D42D8 /* SBUMessageSearchViewModel.swift in Sources */, - BF419109765133769BE9CB4D /* SBUMessageThreadViewModel.swift in Sources */, - AB818DC97E67255B845B0B2E /* SBUGroupChannelPushSettingsViewModel.swift in Sources */, - 564D74651DA65E0E9D6266B7 /* SBUViewModelDelegate.swift in Sources */, - 004511D159EFF115534D1114 /* SBUViewModelSet.swift in Sources */, - E8CACC9B47C909408B6E26C1 /* SBUCreateChannelViewModel.swift in Sources */, - 292ABCDE8853C81CFC26C56E /* SBUCreateOpenChannelViewModel.swift in Sources */, - A780D7EED85AB9305B63EBDB /* SBUBaseSelectUserViewModel.swift in Sources */, - 8BA49BF6C27BF4EEF881E180 /* SBUInviteUserViewModel.swift in Sources */, - 49A6913A97425F61644FE524 /* SBURegisterOperatorViewModel.swift in Sources */, - D7FB3DC7A7BE77AEE95C0971 /* SBUUserListViewModel.swift in Sources */, + 0E462DC1A4001E706D07DE2B /* SBUViewModelDelegate.swift in Sources */, + 0616F5181F6799482BAE643E /* SBUGroupChannelListViewModel.swift in Sources */, + 5C5D3A4797123C6C3A93CA82 /* SBUOpenChannelListViewModel.swift in Sources */, + 2318B21FA6FCB7DC23527F95 /* SBUBaseChannelListViewModel.swift in Sources */, + 3962B5DDF35ACFB49CD0E7C5 /* SBUGroupChannelPushSettingsViewModel.swift in Sources */, + FF2D59701DA81F6FA1D3F355 /* SBUFeedNotificationChannelViewModel.swift in Sources */, + 0E48C2D5CBF46E1080E7F532 /* SBUOpenChannelViewModel.swift in Sources */, + 00937F5E085DF052503A50CD /* SBUBaseChannelViewModel.swift in Sources */, + E7F9C6293A9A3A093A6B0F41 /* SBUChatNotificationChannelViewModel.swift in Sources */, + 8C748C492B431BD48ED934B1 /* SBUGroupChannelViewModel.swift in Sources */, + 51A64B27520FAA970D1E8A1A /* SBUBaseChannelSettingsViewModel.swift in Sources */, + 5B6FE36C1B38B491B0746FEF /* SBUModerationsViewModel.swift in Sources */, + EA8BCD7591CBDFF74E12E381 /* SBUGroupChannelSettingsViewModel.swift in Sources */, + 93F9895F06202889CD374F70 /* SBUOpenChannelSettingsViewModel.swift in Sources */, + 275A4570BF15797A99285AFB /* SBUCommonDelegate.swift in Sources */, + 84C1788864332167EC7E1286 /* SBUUserListViewModel.swift in Sources */, + BBF583F4B921C1C320FD82D8 /* SBUMessageSearchViewModel.swift in Sources */, + 1D0110DD6C43E18871203515 /* SBUMessageThreadViewModel.swift in Sources */, + 64E03FD9947068B6ED1F6499 /* SBUBaseSelectUserViewModel.swift in Sources */, + C7A9C853C04967BF5BF0BA99 /* SBURegisterOperatorViewModel.swift in Sources */, + 33BE2DA014908FCF65BEAB98 /* SBUCreateChannelViewModel.swift in Sources */, + 7F3BE925A4BDAF463D61FD08 /* SBUCreateOpenChannelViewModel.swift in Sources */, + 2AFC9A383FF500CE109FA653 /* SBUInviteUserViewModel.swift in Sources */, + 9E224603647BAFFDB7BC9877 /* SBUViewModelSet.swift in Sources */, + B48C0DAD357045D133FB8C4B /* SBUScrollPostionConfiguration.swift in Sources */, + 3808C9B9C4A566C506DFFC61 /* SBUMessageCellConfiguration.swift in Sources */, + A5EBC0EFE37423C41BD1B6B0 /* SBUReplyConfiguration.swift in Sources */, + D3BD6B44E8C59B2011647F75 /* SBUConfigManager.swift in Sources */, + EA5EDED604173F802F5EFB65 /* SBUConfig.OpenChannel.swift in Sources */, + 9ED12D4FA4628D61F75227B8 /* SBUConfig.swift in Sources */, + 9637924BF8EF1D5BE8D5B911 /* SBUVoiceMessageConfiguration.swift in Sources */, + C8A7A1FF4BFBBEE96B85EE4D /* SBUConfig.Base.swift in Sources */, + F0AB64A0726F1CECBCBD3EF6 /* SBUConfig.GroupChannel.swift in Sources */, + 536DC110E2B80FF67DA01AE9 /* SBUMentionConfiguration.swift in Sources */, + F75A2646F83D000F4A64E9C4 /* SBUUserMentionConfiguration.swift in Sources */, + 1C302A943D8447128BA7CF52 /* SBUConfig.Common.swift in Sources */, + 4D1D89D6415DF203A5DA5285 /* SBUDashboardConfig.swift in Sources */, + 8ECE6CA119A8541B0384DA7A /* SBUConfig.CodingKeys.swift in Sources */, + D1EF17FC58AD53303C5760FF /* UIStackView.SBUIKit.swift in Sources */, + 7D41D501CA86AD9373DC6750 /* UITableView+SBUIKit.swift in Sources */, + F62180CAA418C757A5BD4854 /* Array+SBUIKit.swift in Sources */, + 17A8D4619AF60BC0683E1572 /* Formatter+SBUIKit.swift in Sources */, + 091F134B0DE0CF39BE5DDB8F /* UIButton+SBUIKit.swift in Sources */, + C0979DF5EE55A2E9C6AD73F5 /* URL+SBUIKit.swift in Sources */, + 63086D558BBC1859B0458C2C /* UINavigationController+SBUIKit.swift in Sources */, + 4F3F0DF5F8EF7BDE5DB18820 /* BaseMessage+SBUIKit.swift in Sources */, + E3366B0529A9C85F20AFF2ED /* MultipleFilesMessage+SBUIKit.swift in Sources */, + ED87FFC08C66C4F23994C11B /* SendbirdChat+SBUIKit.swift in Sources */, + FC43B407AFCC698BB5C62E95 /* BaseMessage+SBUIKit.MessageTemplate.swift in Sources */, + D94C07851AF225969EC66081 /* MessageForm+SBUIKit.swift in Sources */, + 96954C363D7F4D6C7FC0DD46 /* CGSize+SBUIKit.swift in Sources */, + E0712A2ECD2CD49EED8393DD /* Thread+SBUIKit.swift in Sources */, + 8867926F9E648DA1F7BC85DF /* UIColor+SBUIKit.swift in Sources */, + DA2CC9C1219750C1B884DD6D /* UIImage+SBUIKit.swift in Sources */, + EB5FF878755D68232EA957A2 /* NSLayoutConstraint+SBUIKit.swift in Sources */, + ACD91F92E74F9008E424EBEE /* Float+SBUIKit.swift in Sources */, + 3D992E3B2818844BC8D4D36D /* UILabel+SBUIKit.swift in Sources */, + EF6CD874424B44CECC47BC31 /* String+SBUIKit.swift in Sources */, + 304B3AE19B79F577FA539D11 /* Data+SBUIKit.swift in Sources */, + 2AE88EA2D3D9637311946419 /* Collection+SBUIKit.swift in Sources */, + 296C0D1DFC6459CE35F87E46 /* UIApplication+SBUIKit.swift in Sources */, + E7019EF2EA13B251C4A4C5B8 /* UIView+SBUIKit.swift in Sources */, + 8772153D81BE6A27078C34B8 /* UIImageView+SBUIKit.swift in Sources */, + 47DBB458984D7C2C405EFEB7 /* UICollectionView+SBUIKit.swift in Sources */, + E16D963AC23A607F5E6F7CF4 /* UIScrollView+SBUIKit.swift in Sources */, + 49E07196EB4161BEAB20D62C /* UIViewController+SBUIKit.swift in Sources */, + C9F1BC218CD343BF6A50B625 /* Date+SBUIKit.swift in Sources */, + DD4F04C1F578E3AD35E25725 /* StringProtocol+SBUIKit.swift in Sources */, + 11831D32FB6DF64168EFF466 /* Sequence+SBUIKit.swift in Sources */, + 5A9A7E497598E1EC1F8C9BF8 /* NSObject+SBUIKit.swift in Sources */, + 1CC7562C555EA45884DB876E /* UITextField+SBUIKit.swift in Sources */, + 0CEDDB80FE5F787C3E43C318 /* SBUPropertyWrapper.swift in Sources */, + ABC5B8F9CF66EA252A1FB7AE /* BlockingOperation.swift in Sources */, + 6A98708A6A0478CD02A29277 /* SBUUtils.swift in Sources */, + 68215E6ED1E788F18930E312 /* SBULogger.swift in Sources */, + A9ECEF172915C40CFA42AACA /* SBUMentionManager.swift in Sources */, + A7749831B60A089336DA0FBD /* WeakDelegateStorage.swift in Sources */, + 7A95C737A13D4D9BA5D527A5 /* SBUDebouncer.swift in Sources */, + 3EB7DD92A842320DFDBC3E36 /* SendbirdUI.swift in Sources */, + 3637874CE365EAFA79B0E303 /* SBUAvailable.swift in Sources */, + 6C4070AE31BBC4EDF4E9B146 /* SBUBaseChannelListModule.swift in Sources */, + A0DA5CE39FB6F2348945B725 /* SBUGroupChannelListModule.List.swift in Sources */, + 9916176345C1CC0F22B37585 /* SBUGroupChannelListModule.Common.swift in Sources */, + 5AEFCFA128CF318577E61BE2 /* SBUGroupChannelListModule.swift in Sources */, + 713D262622CBDCC1FAC23AE0 /* SBUGroupChannelListModule.Header.swift in Sources */, + D654B9D7C3FABF21C014F84A /* SBUBaseChannelListModule.Header.swift in Sources */, + 8FB18D04F3352A34027E0545 /* SBUBaseChannelListModule.List.swift in Sources */, + C63A53861471EA6BFDA61336 /* SBUOpenChannelListModule.swift in Sources */, + 27ACF7E9384630EAA4BC138A /* SBUOpenChannelListModule.List.swift in Sources */, + 76ECD646877B1B4B0D93B304 /* SBUOpenChannelListModule.Header.swift in Sources */, + 14E93AB1F9E0588FABA776DF /* SBUGroupChannelPushSettingsModule.List.swift in Sources */, + 938118BEBDD93F6871F9B0B9 /* SBUGroupChannelPushSettingsModule.swift in Sources */, + 74F09F7A0ECA41BBC7846124 /* SBUGroupChannelPushSettingsModule.Header.swift in Sources */, + EE0AC5619FE4F11162A9E337 /* SBUGroupChannelModule.Input.swift in Sources */, + 79F4C1E956F08CF44FC61BDB /* SBUGroupChannelModule.List.swift in Sources */, + 31ACAE422280F954E664A104 /* SBUGroupChannelModule.Header.swift in Sources */, + 2D909187CECC80192A363839 /* SBUGroupChannelModule.swift in Sources */, + BCAE2849BFDE3C50BA567935 /* SBUChatNotificationChannelModule.swift in Sources */, + C38282C772C6E2171E4E43D3 /* SBUChatNotificationChannelModule.List.swift in Sources */, + 9F467E52157A894975238025 /* SBUChatNotificationChannelModule.Header.swift in Sources */, + FCB65A668D615B63509B4EC7 /* SBUFeedNotificationChannelModule.Header.swift in Sources */, + 735912F7C751A84CECD9F9A1 /* SBUFeedNotificationChannelModule.List.swift in Sources */, + 2C4D6C2BBC56593D62ADA968 /* SBUFeedNotificationChannelModule.CategoryFilter.swift in Sources */, + 6A051B34F7FD8871428B5755 /* SBUFeedNotificationChannelModule.swift in Sources */, + 7C18A5504A27DE958069B59A /* SBUFeedNotificationChannelViewParams.swift in Sources */, + DDB397DBE3C153B051076012 /* SBUBaseChannelModule.Input.swift in Sources */, + 458E4389570378DC34D02CE9 /* SBUBaseChannelModule.swift in Sources */, + 7B45A66312DCA6F23283B66B /* SBUBaseChannelModule.Header.swift in Sources */, + 34E3AE02CCD4A31BF79F191F /* SBUOpenChannelModule.List.swift in Sources */, + 482B6EEB4D421D5DF4AC5395 /* SBUOpenChannelModule.Media.swift in Sources */, + F61920C3825A9455DFFBD94C /* SBUOpenChannelModule.Input.swift in Sources */, + C9D0AFEA93A6EE5EA622D849 /* SBUOpenChannelModule.Header.swift in Sources */, + AD0EA5D7A399047450CE899D /* SBUOpenChannelModule.swift in Sources */, + A004A2F9DFF29C88B084C96C /* SBUBaseChannelModule.List.swift in Sources */, + 86501695B3551AAA83AF1B39 /* SBUBaseChannelSettingsModule.Header.swift in Sources */, + B94D506394EDE7383C6E81BB /* SBUBaseChannelSettingsModule.List.swift in Sources */, + 7287ACC6B7D3D9044ACD8AFD /* SBUChannelSettingItem.swift in Sources */, + 996A0F29943487F2915D3605 /* SBUGroupChannelSettingsModule.swift in Sources */, + 4018962DDE442059A33C9664 /* SBUGroupChannelSettingsModule.Header.swift in Sources */, + E3CE20FC1FB6B31FAB0E2EAB /* SBUGroupChannelSettingsModule.List.swift in Sources */, + CD3DA94546B398C3D45A3898 /* SBUBaseChannelSettingsModule.swift in Sources */, + 5A85A2B12702A94FF03DB52A /* SBUOpenChannelSettingsModule.List.swift in Sources */, + 20F58252A971163CB1ECD4A0 /* SBUOpenChannelSettingsModule.swift in Sources */, + A2A86B1B95580AD8B36CEC7D /* SBUOpenChannelSettingsModule.Header.swift in Sources */, + 6B8F3F1179B70AFFE6C9727E /* SBUCommonModule.swift in Sources */, + 40DDDE3C4FA105EA3B8EFDFF /* SBUUserListModule.swift in Sources */, + 80BE8ADE50ED422A837BC0CD /* SBUUserListModule.List.swift in Sources */, + 9D512AE874DC1703EA332329 /* SBUUserListModule.Header.swift in Sources */, + 3D8BDE3686B173FCD33A217F /* SBUModuleSet.swift in Sources */, + 30B07C0FE69F4EA61E88081D /* SBUMessageSearchModule.Header.swift in Sources */, + 59CEFAF672CB6FD3F00ABD8A /* SBUMessageSearchModule.List.swift in Sources */, + 51B1C2A8E62A266551D6773B /* SBUMessageSearchModule.swift in Sources */, + 6B33CE6BDBF2A760B7E58B99 /* SBUMessageThreadModule.List.swift in Sources */, + 809EE64F19A1F28018204F1A /* SBUMessageThreadModule.swift in Sources */, + 8540F9577C272B4166514720 /* SBUMessageThreadModule.Input.swift in Sources */, + DD45844E342A2C976C6E4F2C /* SBUMessageThreadModule.Header.swift in Sources */, + 8C1B21C33686EDA0A8FD6F50 /* SBUModerationsModule.List.swift in Sources */, + FAD1A427840AD8BEE369FB0F /* SBUModerationsModule.swift in Sources */, + FCA3A10EF8FAD9E4A9831A07 /* SBUModerationsModule.Header.swift in Sources */, + A524D74B58AA3459DD06A946 /* SBURegisterOperatorModule.List.swift in Sources */, + 4F9C1239F64A0D5D7EAAD706 /* SBURegisterOperatorModule.Header.swift in Sources */, + B04A782D9294573B983BFCE5 /* SBURegisterOperatorModule.swift in Sources */, + BD53D420A7E39FE386685B47 /* SBUInviteUserModule.List.swift in Sources */, + 1C424728C17D31495FAC8229 /* SBUInviteUserModule.swift in Sources */, + E6990E40416A58BA96D021D6 /* SBUInviteUserModule.Header.swift in Sources */, + 7DD00D3279E4E952537B9CFB /* SBUBaseSelectUserModule.Header.swift in Sources */, + A184B5D79AB75A6818763DBF /* SBUBaseSelectUserModule.swift in Sources */, + 597F0B054BFDDA8EB52D78A3 /* SBUCreateOpenChannelModule.ProfileInput.swift in Sources */, + 8B484D0C2FF16ACB539EED6C /* SBUCreateChannelModule.swift in Sources */, + 16046275C3DA17C86B2478DE /* SBUCreateOpenChannelModule.swift in Sources */, + 4B38B971594C4F817F8851F3 /* SBUCreateOpenChannelModule.Header.swift in Sources */, + E561C9A3D1DA6B1F23880DD5 /* SBUCreateChannelModule.Header.swift in Sources */, + 2AD9B7636FD359F9717D97D1 /* SBUCreateChannelModule.List.swift in Sources */, + A61F0D353C156136948FC6E6 /* SBUBaseSelectUserModule.List.swift in Sources */, + 08D5C9AB7E2E54CF7A3D0B01 /* VoiceMessageStatus.swift in Sources */, + 83BE08DDA363AA2C674BB9C9 /* SBUIconSetType.swift in Sources */, + 5F96A4C3FD4C81717FA0007A /* SBUEnums.swift in Sources */, + FA287103CBF93ABF7A7DBA1C /* SBUMessageTemplate.Coordinator.swift in Sources */, + 652664074D284B39945DF623 /* SBUMessageTemplate.TemplateCacheState.swift in Sources */, + B9F3C651ED1751FC8F3E96F1 /* SBUTheme+MessageTemplate.swift in Sources */, + 3D3E828BFA8F91A2D4DB4A52 /* SBUMessageTemplate.Action.swift in Sources */, + ED7FC016E6D9A646888DAFEE /* SBUMessageTemplate.Container.swift in Sources */, + 96F312B6FBC8A151B8CF7C9E /* SBUMessageTemplateManager.swift in Sources */, + 9068BE2419767A0511EE5E16 /* SBUMessageTemplate.ErrorMessages.swift in Sources */, + 3DFB72F8E258961C1BFD56DE /* SBUCacheManager.Template.swift in Sources */, + 4964A4291144823BAC39732E /* SBUMessageTemplate.TemplateType.swift in Sources */, + 463FB2980D19AD005550753D /* SBUMessageTemplate.RendererType.swift in Sources */, + 26DC976103E1E6730F127679 /* SBUCacheManager.NotificationSetting.swift in Sources */, + 24387E6C0B960CBA9000D530 /* CommonProtocols.swift in Sources */, + 14B33750A5C0825A154276A0 /* SBUEmojiManager.swift in Sources */, + 7368F31715B1F3334460F645 /* SBUCacheManager.Config.swift in Sources */, + 6D6F954A560F3B15C37EBB12 /* SBUCacheManager.MemoryCache.swift in Sources */, + F226D3C0EE74D3952C4D1225 /* SBUCacheManager.Version.swift in Sources */, + 32E88D86DE216247512C854E /* SBUCacheManager.PathType.swift in Sources */, + FD079804A9AB29404FB5FC20 /* SBUCacheManager.File.swift in Sources */, + A0A989D1CE1ED8CE9C21869B /* SBUCacheManager.Image+FileMessage.swift in Sources */, + 29E83767995C57F3965F8011 /* SBUCacheManager.Image.swift in Sources */, + F9B4434EEA7AFD2C8B09E958 /* SBUCacheManager.swift in Sources */, + E3167576DAC7934874947D04 /* SBUCacheManager.DiskCache.swift in Sources */, + B33FCAC0953894D9F202AFB6 /* SBUVoicePlayer.swift in Sources */, + 1FE4226D142D3643E865A646 /* SBUNotificationChannelManager.swift in Sources */, + 28B1FF5FD159EECDACBF25B4 /* SBUTypingIndicatorMessageManager.swift in Sources */, + 67B29EAF1CC40778417AE92D /* SBUPendingMessageManager.swift in Sources */, + A3EE31A2749547D94EBF8039 /* SBUDownloadManager.swift in Sources */, + FCAFEC22449432377FC21B0E /* SBUVoiceRecorder.swift in Sources */, + E87D314C852A863EECE70061 /* SBUPermissionManager.swift in Sources */, + 9CF60EB5E6189924CE953F19 /* SBUGlobalCustomParams.swift in Sources */, + 5C2AD3FBB2EE86ABDEBB9F6D /* SBUStringSet.Deprecated.swift in Sources */, + 1AE080F1AD4A76CF537093E5 /* SBUDateFormatSet.swift in Sources */, + 37A2620962920E5FDF84EA43 /* SBUConstant.swift in Sources */, + 0F2839909F63779558D35396 /* SBUStringSet.swift in Sources */, + 0C2B461AEC9DA2A04C4FE866 /* SBUIconSet.swift in Sources */, + F47DF872861EC724D082BD12 /* SBUColorSet.swift in Sources */, + A3EDA9B7D8DE6096F81BAC85 /* SBUTheme+Type.swift in Sources */, + ABA02BE103404FCBB1D86EC4 /* SBUFontSet.swift in Sources */, + 6BA1BFFB8DCB4BCC8F56C6DB /* SBUTheme.swift in Sources */, + 3743EED80D99CD4ED33625EB /* SBUTypingIndicatorMessage.swift in Sources */, + 6D655E49569B55DFF293C6D9 /* SBUMention.swift in Sources */, + E2CDEC36629BBAE9CDDAFD26 /* SBUMessageCache.swift in Sources */, + 1EC783195092253E9A2929BF /* SBUUser.swift in Sources */, + CEFFEF2F8358CF17E0FC3C33 /* SBUError.swift in Sources */, + 4E7A90FAB67572D67BF18849 /* SBUVoiceFileInfo.swift in Sources */, + 5D22446F333D3FC188B11466 /* SBUTypingIndicatorInfo.swift in Sources */, + CE5F4D5A0868255FD5B99F9C /* SBUFeedbackAction.swift in Sources */, + 77FB641ADCCA6ADFFD2FAD62 /* SBUHighlightMessageInfo.swift in Sources */, + 2588AC9BBCD66A140311B635 /* SBUScrollOptions.swift in Sources */, + C7E0F6D5150821BE61E9096F /* SBUExtendedMessagePayload.swift in Sources */, + 2730F078562AC8C86545B4B0 /* SBUExtendedMessagePayloadForUI.swift in Sources */, + 758ED21D50FAE7E4500E7EAF /* SBUBaseViewController.swift in Sources */, + E585F36C1AD3F04ADCAB1C4E /* SBUOpenChannelCell.swift in Sources */, + E4B7C73B66517D2EB942E5B4 /* SBUGroupChannelCell.swift in Sources */, + 307730DBADF79E6C9C252F2B /* SBUBaseChannelCell.swift in Sources */, + D724723E618315DFCB56E86B /* SBUBaseChannelListViewController.swift in Sources */, + 7982A5FD51725C1FE6AFD95F /* SBUGroupChannelListViewController.swift in Sources */, + D8FDB154EFB6150130658EFF /* SBUOpenChannelListViewController.swift in Sources */, + 680D01799B9BA8C7E6FEAE28 /* SBUChannelPushSettingCell.swift in Sources */, + 66BEDA9F35A4970402618607 /* SBUGroupChannelPushSettingsViewController.swift in Sources */, + AEB5994E3D5068A8843CD960 /* SBUUserMessageTextViewModel.swift in Sources */, + B3D5A5F760D3994F71473545 /* SBUMessageWebViewModel.swift in Sources */, + 4FC8CFF773ED51A9FCF4FE04 /* SBUParentMessageInfoReactionView.swift in Sources */, + 06E5AC559550FCC1542F1A23 /* SBUReactionCollectionViewCell.swift in Sources */, + 7D33149CAEA5993FF6DBADBB /* SBUReactionsViewController.swift in Sources */, + 0B6AE62D23A5C0B19A49DA6B /* SBUMessageReactionView.swift in Sources */, + 0969D662845530A2B2B1D3AC /* SBUEmojiListViewController.swift in Sources */, + 28F23F21DDED30DFE80677C9 /* SBUFeedNotificationChannelViewController.swift in Sources */, + 930A83838B5F6A67C18C4FCD /* SBUBaseChannelViewController.swift in Sources */, + 60C6DB82824EFAF8CCBB1596 /* SBUScrollBottomView.swift in Sources */, + 20A0CD5587D8D036ED896DD3 /* SBUMessageTemplateCell.swift in Sources */, + 35BA4C70FF32428E331807B9 /* SBUMultipleFilesMessageCellParams.swift in Sources */, + 3449DE14B32BA6EE5AC62C1B /* SBUTypingMessageCellParams.swift in Sources */, + EA9C2D42F97A79FAEB2307A8 /* SBUUserMessageCellParams.swift in Sources */, + 85D0CC01EBBDDB41D997EE0F /* SBUMessageTemplateCellParams.swift in Sources */, + 1B9C6B80827F064019FA5D17 /* SBUUnknownMessageCellParams.swift in Sources */, + 3BC771C85B8EBBA4564F414F /* SBUFeedNotificationCellParams.swift in Sources */, + 88E8D29395D11BD6F94CF913 /* SBUAdminMessageCellParams.swift in Sources */, + 85001497BC896D80FD94EC60 /* SBUBaseMessageCellParams.swift in Sources */, + D63C4856535F2847A6133BFD /* SBUFileMessageCellParams.swift in Sources */, + 05CF4A6F52516DC2463B9410 /* SBUTypingIndicatorMessageCell.swift in Sources */, + 516B3A4E4261AA6DBA650CE0 /* SBUBaseFileContentView.swift in Sources */, + BD78F5FCE02537FC2E5C4156 /* SBUOpenChannelCommonContentView.swift in Sources */, + 9886FB2E31222EE5613C22F0 /* SBUVoiceContentView.swift in Sources */, + 5273FFFEABD9A1ACD3EB65B0 /* SBUImageContentView.swift in Sources */, + 3F131B92EDBA9F6053C60922 /* SBUCommonContentView.swift in Sources */, + 3C31B95D9B9E5C13D4FEE107 /* SBUOpenChannelImageContentView.swift in Sources */, + 46F4D52A4615112FADE6F5EE /* SBUSuggestedReplyViewParams.swift in Sources */, + C3C1B7C412BC2D08E333A7A6 /* SBUSuggestedReplyView.swift in Sources */, + 32C26EEEA10F74DF0F68796C /* SBUHorizontalSuggestedReplyView.swift in Sources */, + C09138A74DE3F12D743A3A72 /* SBUVerticalSuggestedReplyView.swift in Sources */, + 2AB04DCEEEC0CE2C9A407C26 /* SBUHorizontalSuggestedReplyOptionView.swift in Sources */, + DA1BE3CD057A0B1CED3ACD5E /* SBUSuggestedReplyOptionView.swift in Sources */, + F7A7EF7CD20380F9E3C93EE8 /* SBUSimpleSuggestedReplyOptionView.swift in Sources */, + 59FDBF023D7A3116159B2E01 /* SBUNotificationCell.swift in Sources */, + 1E9ACEF77FF2954FAB698215 /* SBUFeedNotificationCell.swift in Sources */, + A475850FAB3680259B3D17E5 /* SBUChatNotificationCell.swift in Sources */, + 4145877FF9CC8E8B048C97E0 /* QuotedFileCommonContentView.swift in Sources */, + 09C06672A09115D0FFC53FDD /* SBUQuotedBaseMessageView.swift in Sources */, + 2D58CFEB71504B5091C7DEFF /* SBUThreadInfoView.swift in Sources */, + EDA62633CF60C7E9BD4F04DF /* QuotedFileImageContentView.swift in Sources */, + E97544ABD942F912B3D371F9 /* SBUQuotedFileMessageView.swift in Sources */, + F365E54F08ED1EFECAD6F0C0 /* SBUQuotedUserMessageView.swift in Sources */, + B13C3994F02EA88B6ECB1959 /* SBUQuotedBaseMessageViewParams.swift in Sources */, + 88B92AD20F26792D359CAABD /* SBUFeedbackView.swift in Sources */, + C2AEE3786985DDA73421794F /* SBUFeedbackViewParams.swift in Sources */, + 89C9EE9BD67FE0C8B1C871E3 /* SBUMultipleFilesMessageCollectionViewCell.swift in Sources */, + B233D0966D404ACB9803278E /* SBUMultipleFilesMessageCollectionView.swift in Sources */, + 97048704F3B016E2B56A55CF /* SBUMultipleFilesMessageCell.swift in Sources */, + DF36BFFF252D6DC85507BC79 /* SBUBaseMessageCell.swift in Sources */, + D2C7F25B6698800FD6C23F6A /* SBUOpenChannelFileMessageCell.swift in Sources */, + D67273711F602079DC738162 /* SBUOpenChannelAdminMessageCell.swift in Sources */, + 5A78736A5207D04039DF5F27 /* SBUOpenChannelContentBaseMessageCell.swift in Sources */, + 694E6FE94DD9648C084645D7 /* SBUOpenChannelUserMessageCell.swift in Sources */, + 08184BDD477D58D4BFD2CF41 /* SBUOpenChannelUnknownMessageCell.swift in Sources */, + CABB8E4D37000958052A6F97 /* SBUOpenChannelBaseMessageCell.swift in Sources */, + 5EB07F9E232DDFB8EA69401C /* SBUMessageTemplateCell.MessageTemplateLayer.swift in Sources */, + E1083358592D30DA09860E07 /* SBUMessageFormViewParams.swift in Sources */, + 8911328B8B6085E87A6F1E6C /* SBUMessageFormItemView.swift in Sources */, + 46AD92C554D7638C2A7D89FB /* SBUMessageFormSingleTextItemView.swift in Sources */, + 62E1CFD4D9105D2DDBBA5FEC /* SBUMessageFormChipView.swift in Sources */, + 850AD5AA2F8DABCF0273DB5C /* SBUMessageFormMultiTextItemView.swift in Sources */, + 9DEB4002098CB66C343364C7 /* SBUMessageFormFallbackView.swift in Sources */, + 712E25296130027871C4FF02 /* SBUMessageFormView.swift in Sources */, + 697009EF8A31C2535FB9F6DC /* SBUMessageFormChipsItemView.swift in Sources */, + 9E5B7F99F4B671A3DC964531 /* SBUExtendedMessagePayloadCustomViewFactory.swift in Sources */, + 3E6D2B22410F33955520A6F8 /* SBUFileMessageCell.swift in Sources */, + 9756356766AFBD83ED6CC014 /* SBUAdminMessageCell.swift in Sources */, + B2B5C8033EBF7F55012744F2 /* SBUContentBaseMessageCell.swift in Sources */, + BE0EC4518DCC4A3185EC5C88 /* SBUMessageTemplateCellLayout.swift in Sources */, + F4C0AF0AFF126245FAD7F13C /* SBUBaseMessageCell.Feedback.swift in Sources */, + 786C85EEE390036AB41661B2 /* SBUUnknownMessageCell.swift in Sources */, + C192062D7EEFB59C3FA1277E /* SBUUserMessageCell.swift in Sources */, + D42DC3D72F26823DBDDA7DA1 /* SBUGroupChannelViewController.swift in Sources */, + 23FEFD9EFC112F097C468545 /* SBUMentionLimitGuideCell.swift in Sources */, + AD0C956D0AB1330206126CCD /* SBUSuggestedMentionList.swift in Sources */, + F389595FC301D06B38FB9B3C /* SBUQuoteMessageInputView.swift in Sources */, + F36A34B4CDC2FE7A34E35647 /* SBUMessageInputMode.swift in Sources */, + 65B953366BBF1AD26E136FC6 /* SBUQuoteMessageInputViewParams.swift in Sources */, + D73095EF792F7F8A68C90FD2 /* SBUMessageInputView.swift in Sources */, + 3C7C54F91AFFF677F303F70F /* SBUCategoryFilterCell.swift in Sources */, + C22F3392FDDE72F161A975FF /* SBUMarkdownTransfer.swift in Sources */, + 41545E45A81F3EFE6475CA8B /* SBUMessageStateView.swift in Sources */, + 86E489F503386792C21DD631 /* SBUMessageProfileView.swift in Sources */, + 5CE82E77435CCB1D36E040A0 /* SBUUserMessageTextView.swift in Sources */, + 2CE3151A43ADE274E4B1364C /* SBUUserNameView.swift in Sources */, + BF39E2D170663E0374D80C20 /* SBUMessageWebView.swift in Sources */, + B4F957476E956B4C43E42A7D /* SBUMessageDateView.swift in Sources */, + CE5327E400FAB138565948B3 /* SBULinkClickableTextView.swift in Sources */, + 6D0E4FD63C061A96D2E22578 /* SBUOpenChannelMessageWebView.swift in Sources */, + 571000A42FC7A651DB70D6B5 /* SBUSelectableStackView.swift in Sources */, + AEAF0410870936BC5FB7E643 /* SBUNotificationTimelineView.swift in Sources */, + 6526738B1D12C3D386FC0512 /* SBUFileViewController.swift in Sources */, + 3733C78990F397C25B60016B /* SBUBaseChannelViewController.Keyboard.swift in Sources */, + B12C81FC4CE8BE8921E81F26 /* SBUChatNotificationChannelViewController.swift in Sources */, + 90E18F278AC7C886503BA432 /* SBUChannelStateBanner.swift in Sources */, + 58123B32AA965AC87D9275C0 /* SBUNewNotificationInfo.swift in Sources */, + B9D737C1F364BD53F64D95AA /* SBUNewMessageInfo.swift in Sources */, + 1C919B5C486FEAE7BFC7C4F0 /* SBUOpenChannelViewController.swift in Sources */, + DC691EC893842D421034060C /* SBUChannelInfoHeaderView.swift in Sources */, + A4A32A281F4F723565589BF4 /* SBUChannelTitleView.swift in Sources */, + 8CED52205513894C0BA45BE1 /* SBUMediaView.swift in Sources */, + 37CCBCCCCD3DE73EDB85171E /* SBUBaseChannelSettingsViewController.swift in Sources */, + D1A0E74D4D3012F54D3BCB6B /* SBUOpenChannelSettingsViewController.swift in Sources */, + 8466CF8863438B423F9A4C28 /* SBUOpenChannelSettingCell.swift in Sources */, + F0FAD6538EB858D51DB4D9B4 /* SBUBaseChannelSettingCell.swift in Sources */, + 8B55522FCE18AA303E58A5A7 /* SBUModerationCell.swift in Sources */, + E8D99E583804DD35F83CA1AD /* SBUGroupChannelSettingCell.swift in Sources */, + AB49C925869C575C30422B62 /* SBUChannelSettingsChannelInfoView.swift in Sources */, + CF18B9B4974A810ED9297986 /* SBUGroupChannelSettingsViewController.swift in Sources */, + 52D1774BAF35B5484A797C06 /* SBUVoiceMessageInputView.swift in Sources */, + 8554532040A0184FD8190CE1 /* SBUStackView.swift in Sources */, + 1398308CEC1D2B7E695FF9C9 /* SBUAnimation.swift in Sources */, + EAF08A4C016BB290F3384557 /* SBUEmptyView.swift in Sources */, + 1FA3E6DFB2D5541780E5C2CF /* SBUActionSheet.Item.swift in Sources */, + 6A9347E2A4721316C8F1448E /* SBUActionSheet.swift in Sources */, + A1AE6F4848B70DD90AABD6A7 /* SBUCoverImageView.swift in Sources */, + 417D72D33BCEA40CB17D161B /* SBUPhotoAccess.swift in Sources */, + 49F18ADCF98AD04A65A2D737 /* SBUPhotoCollectionViewCell.swift in Sources */, + B3A6835C6A28199C494DF891 /* SBUSelectablePhotoViewController.swift in Sources */, + 4A3E7FBF20A0D46F51C5D410 /* SBUSearchBar.swift in Sources */, + 4030ADCE290CC75D5B12F19A /* SBUPaddingLabel.swift in Sources */, + C737EAA1DC0CCBD47F7B25C2 /* SBUToastType.swift in Sources */, + 448ECB1134BC6F6562791566 /* SBUToastView.swift in Sources */, + 9F462FEFE50A95722645D1F7 /* SBUToastView.Item.swift in Sources */, + 496252DCDB7D17CAF67A8BFF /* SBUToastView.Internal.swift in Sources */, + 12471A58B789BCE56BC11CCA /* SBUCommonItem.swift in Sources */, + 8D3E0D74B48615D35DF2CCD7 /* SBULayoutableButton.swift in Sources */, + 12F343E4C7125E78B52B461F /* SBUUserProfileView.swift in Sources */, + D2E80722CD1787E9AB4EE6F1 /* SBUNavigationTitleView.swift in Sources */, + 13014EB3B5C7712701E0E77B /* SBUNotificationNavigationTitleView.swift in Sources */, + 57280DEA75397DC3F56B81C4 /* SBUBarButtonItem.swift in Sources */, + 118DAD44A629451250C39833 /* SBUNotificationEmptyView.swift in Sources */, + 57B1E3078E67A81C4B304B83 /* SBUMenuSheetViewController.swift in Sources */, + 013883B46AA5F5030797AECF /* SBUMenuCell.swift in Sources */, + 06660AE1935F28F14E6CDAC0 /* SBUMenuView.swift in Sources */, + 6D507239E9EA3D0CC0B9927E /* SBUBottomSheetController.swift in Sources */, + C404FEB5C6EC188973C3FC10 /* SBUUnderLineTextField.swift in Sources */, + C8C64D60429320E89EE507D6 /* SBUAlertView.Item.swift in Sources */, + 1BA31707DC1EB3B1FA1A050B /* SBUAlertView.swift in Sources */, + F54ADF0222BE8E51AA8F5A07 /* SBUUserCell.swift in Sources */, + 2B8F1AE7B2504E253CE76F4B /* SBUTemplateLabel.swift in Sources */, + B9608F715B56F107F7088BAC /* SBUMarginView.swift in Sources */, + 5FA6076F09CD02DF60A157B3 /* SBUTypingIndicatorBubbleView.swift in Sources */, + 71B7B148E380A189DFBF6125 /* SBUCommonViewControllerSet.swift in Sources */, + 109FCAE34E79403D95C5510C /* SBULoading.swift in Sources */, + DB987AC37304EFBDF5496CB7 /* SBUCollectionViewFlowLayout.swift in Sources */, + 87BC6197FEAD502D379C1636 /* SBUUserListViewController.swift in Sources */, + C57505F19E16B5B6849C7B57 /* SBUViewControllerSet.swift in Sources */, + B4D085F33C7C84F86E6922C8 /* SBUMessageSearchViewController.swift in Sources */, + EEED94725DAA1266C517B048 /* SBUMessageSearchResultCell.swift in Sources */, + 98271BADC9083F1128E15C02 /* SBUTableViewCell.swift in Sources */, + A2A52E10A576A61CBEC5CFEA /* SBUTextView.swift in Sources */, + 348E580D52EFF48E01A496EF /* SBUCollectionViewCell.swift in Sources */, + 39E527C5373CBBD6C25E615A /* SBUQuoteMessageInputViewProtocol.swift in Sources */, + 654A8EC021187583237B5616 /* SBUMessageCellProtocol.swift in Sources */, + CEE39A16F34F39B04FC6D6BE /* SBULabel.swift in Sources */, + 399FAD6EA06B8715156A4649 /* SBUViewLifeCycle.swift in Sources */, + 2250C88BB1ABE3B65EBDE5AC /* SBUQuotedMessageViewProtocol.swift in Sources */, + 5F541E48C523FB25041C5ED2 /* SBUView.swift in Sources */, + 40F38C92056CD96F8876CD83 /* SBUMessageThreadViewController.swift in Sources */, + 8C3D0DB2EAC914E47F5DCE72 /* SBUMessageThreadTitleView.swift in Sources */, + AF4EB06CA4443670771FEF14 /* SBUParentMessageInfoView.swift in Sources */, + D1A903EAF64D2955A899F4CE /* SBUModerationsViewController.swift in Sources */, + 69E6CE9F99F6A981FC36653A /* SBURegisterOperatorViewController.swift in Sources */, + 1E78F486C49B35B97137FF68 /* SBUBaseSelectUserViewController.swift in Sources */, + C467304F19F43A22160E7D82 /* SBUInviteUserViewController.swift in Sources */, + B1BA6B69EE87ADDC5FD7EFC0 /* SBUCreateChannelTypeSelector.swift in Sources */, + B451E841663564EA229FC10B /* SBUCreateChannelViewController.swift in Sources */, + 7E88965168041C61F35A9EC4 /* SBUCreateOpenChannelViewController.swift in Sources */, + 12C0AA5A156D78B36978D993 /* SBUGlobals.swift in Sources */, + EA74D4D94333A0A9CC58FDA8 /* SBUFormView.Deprecated.swift in Sources */, + FFFD0BA359BF212F44EB957B /* SBUFormFieldView.Deprecated.swift in Sources */, + 99CF91C0DC7366585987382F /* SBUTableViewCell.Unavailable.swift in Sources */, + F7FCFEB5B80A3ECA03820EE6 /* SBUFormViewParams.Deprecated.swift in Sources */, + 8C14F752576F2236756E98FA /* SBUForm.Deprecated.swift in Sources */, + F3714CFC766F361B2D968B99 /* SendbirdUI.Deprecated.swift in Sources */, + 22429183F564B531B9DFDCDF /* SBUGroupChannelListModule.Deprecated.swift in Sources */, + EE534EC50116525B2D6014C7 /* SBUOpenChannelListModule.Deprecated.swift in Sources */, + 2D26801B00871ED07A4219C8 /* SBUGroupChannelPushSettingsModule.Deprecated.swift in Sources */, + B0A0DF929974683D5F9905BF /* SBUBaseChannelModule.Deprecated.swift in Sources */, + BB5FC43B7175E110C2E50F06 /* SBUGroupChannelModule.Deprecated.swift in Sources */, + 2D4B03E4EA2BDA0E6130BF55 /* SBUOpenChannelModule.Deprecated.swift in Sources */, + 76C537921EA2887BCE5706F2 /* SBUFeedNotificationChannelModule.Deprecated.swift in Sources */, + 675D7495D2FBB4E62D0A704C /* SBUChatNotificationChannelModule.Deprecated.swift in Sources */, + 593E8360EAD80FB70BBD9FCB /* SBUGroupChannelSettingsModule.Deprecated.swift in Sources */, + 8EEF72455867BE1311424CE6 /* SBUOpenChannelSettingsModule.Deprecated.swift in Sources */, + 4C3F1D5EACBBD8624A96C17A /* SBUUserListModule.Deprecated.swift in Sources */, + ABCE73B50B09ECBA3DFC8AD0 /* SBUMessageSearchModule.Deprecated.swift in Sources */, + 713B473AB6470D6CB899375D /* SBUMessageThreadModule.Deprecated.swift in Sources */, + 973C42DEB471F6E60F11FD7E /* SBUModerationsModule.Deprecated.swift in Sources */, + CF94DCC2BE56A910C3F777DB /* SBUModuleSet.Deprecated.swift in Sources */, + C67A0B8CCCB8E63BF417B86F /* SBURegisterOperatorModule.Deprecated.swift in Sources */, + 102032265A52213DECE8D624 /* SBUCreateOpenChannelModule.Deprecated.swift in Sources */, + EF362D809330B5B458F95ECA /* SBUCreateChannelModule.Deprecated.swift in Sources */, + 46FC87BC702806E3CF5D4CA4 /* SBUInviteUserModule.Deprecated.swift in Sources */, + D4C4284BA81A7AEE5C337E38 /* SBUChannelListViewController.Deprecated.swift in Sources */, + 70FC64A015A51BE7C191E116 /* SBUBaseMessageCellParams.Deprecated.swift in Sources */, + 661A681EBF370024D1505F09 /* SBUQuotedBaseMessageViewParams.Deprecated.swift in Sources */, + F81C3B47EAA92D25F4CE8788 /* SBUContentBaseMessageCell.Deprecated.swift in Sources */, + B46714815F6B7EB8A12DB091 /* SBUBaseChannelViewController.Deprecated.swift in Sources */, + 3440652CA97F7E1008A69405 /* SBUGroupChannelViewController.Unavailable.swift in Sources */, + ACA4ABC0B29DF115408395EE /* SBUOpenChannelViewController.Deprecated.swift in Sources */, + 48BF1C5CEB694E94A926C100 /* SBUOpenChannelViewController.Unavailable.swift in Sources */, + 0D07D037D04FBC48B9F5C390 /* SBUGroupChannelViewController.Deprecated.swift in Sources */, + 2F18B3FAB8B76389B6F876A4 /* SBUBaseChannelViewController.Unavailable.swift in Sources */, + 0BCBF99DEDC305F5C361BA1E /* SBUBaseChannelSettingsViewController.Deprecated.swift in Sources */, + BA13CEDB7B40F39DCFD6F0C4 /* SBUBaseViewController.Unavailable.swift in Sources */, + 971A675037247BC5860FC038 /* SBUMemberListViewController.Deprecated.swift in Sources */, + 82308D857AAD56F320740AFF /* SBUBaseSelectUserViewController.Deprecated.swift in Sources */, + D7B6FF6D22A1643599224661 /* SBUMessageSearchViewController.Deprecated.swift in Sources */, + 5F5CAE4EF1FFE44A0DAC9FED /* SBUView.Unavaliable.swift in Sources */, + 603CD221648A07110F8697BE /* BaseMesssage+SBUIKit.Deprecated.swift in Sources */, + DB3F7986987023181284A9F0 /* SBUGlobals.Deprecated.swift in Sources */, + 58BE21D169A8397FAFACA357 /* SBUCoverImageView.Deprecated.swift in Sources */, + B4713D55209E3EDF6F4DC70F /* SBUModerationsViewModel.Deprecated.swift in Sources */, + B78C40DE47283DA9991D937F /* SBUModerationsViewController.Deprecated.swift in Sources */, + 6A41E7397C84FADD39C0E09E /* SBUTheme.Deprecated.swift in Sources */, + 8D42C1882866C48A1CA5606E /* SBUCreateChannelViewController.Deprecated.swift in Sources */, + ACC82029ED9DB4DCEEC6C21B /* SBUEnums.Deprecated.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SendBirdUIKit.podspec b/SendBirdUIKit.podspec index 83abd77a..54b791dd 100644 --- a/SendBirdUIKit.podspec +++ b/SendBirdUIKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "SendBirdUIKit" - s.version = "3.28.1" + s.version = "3.29.0" s.summary = "UIKit based on SendbirdChatSDK" s.description = "Sendbird UIKit is a framework composed of basic UI components based on SendbirdChatSDK." s.homepage = "https://sendbird.com" @@ -16,10 +16,11 @@ Pod::Spec.new do |s| "Kai" => "kai.lee@sendbird.com" } s.platform = :ios, "12.0" - s.source = { :http => "https://github.com/sendbird/sendbird-uikit-ios/releases/download/#{s.version}/SendBirdUIKit.zip", :sha1 => "41192f0e9a4a0131a84aecc9e299afae2cc4eb93" } + s.source = { :http => "https://github.com/sendbird/sendbird-uikit-ios/releases/download/#{s.version}/SendBirdUIKit.zip", :sha1 => "a787030f4a2c477990903b8bcd5cf0a22d2550ea" } s.ios.vendored_frameworks = 'SendBirdUIKit/SendbirdUIKit.xcframework' s.ios.frameworks = ["UIKit", "Foundation", "CoreData", "SendbirdChatSDK"] s.requires_arc = true s.dependency "SendbirdChatSDK", ">= 4.23.1" + s.dependency "SendbirdUIMessageTemplate", ">= 3.29.0" s.ios.library = "icucore" end diff --git a/SendbirdUIMessageTemplate.podspec b/SendbirdUIMessageTemplate.podspec new file mode 100644 index 00000000..7a37ad5d --- /dev/null +++ b/SendbirdUIMessageTemplate.podspec @@ -0,0 +1,24 @@ +Pod::Spec.new do |s| + s.name = "SendbirdUIMessageTemplate" + s.version = "3.29.0" + s.summary = "SendbirdUIMessageTemplate based on SendbirdChatSDK" + s.description = "Sendbird UI MessageTemplate is a framework composed of basic Message Template UI components based on SendbirdChatSDK." + s.homepage = "https://sendbird.com" + s.documentation_url = 'https://sendbird.com/docs/uikit' + s.license = { :type => 'Commercial', :file => 'SendbirdUIMessageTemplate/LICENSE.md' } + s.authors = { + "Tez" => "tez.park@sendbird.com", + "Celine" => "celine.moon@senrbid.com", + "Damon" => "damon.park@sendbird.com", + "Jed" => "jed.gyeong@sendbird.com", + "Young" => "young.hwang@sendbird.com", + "Kai" => "kai.lee@sendbird.com" + } + s.platform = :ios, "12.0" + s.source = { :http => "https://github.com/sendbird/sendbird-uikit-ios/releases/download/#{s.version}/SendbirdUIMessageTemplate.zip", :sha1 => "dcfdcb54416f96c33db9d7507e3fd5dd2d6859e9" } + s.ios.vendored_frameworks = 'SendbirdUIMessageTemplate/SendbirdUIMessageTemplate.xcframework' + s.ios.frameworks = ["UIKit", "Foundation", "CoreData", "SendbirdChatSDK"] + s.requires_arc = true + s.dependency "SendbirdChatSDK", ">= 4.23.1" + s.ios.library = "icucore" +end \ No newline at end of file diff --git a/Sources/Enums/SBUEnums.swift b/Sources/Enums/SBUEnums.swift index 74393792..bc776637 100644 --- a/Sources/Enums/SBUEnums.swift +++ b/Sources/Enums/SBUEnums.swift @@ -286,15 +286,6 @@ public enum NewMessageInfoItemType: Int { case button } -@objc -public enum LogType: UInt8 { - case none = 0b00000000 - case error = 0b00000001 - case warning = 0b00000010 - case info = 0b00000100 - case all = 0b00000111 -} - /// This is an enumeration for notification type. /// - Since: 3.5.0 enum NotificationType: Int { diff --git a/Sources/Extension/Array+SBUIKit.swift b/Sources/Extension/Array+SBUIKit.swift index 6b7ceda1..23f5f49c 100644 --- a/Sources/Extension/Array+SBUIKit.swift +++ b/Sources/Extension/Array+SBUIKit.swift @@ -110,12 +110,6 @@ public extension NSArray { } } -extension Array { - subscript(safe index: Int) -> Element? { - return indices.contains(index) ? self[index] : nil - } -} - extension Array where Element == String { func toggle(_ value: String) -> [String] { var copy = self diff --git a/Sources/Extension/Collection+SBUIKit.swift b/Sources/Extension/Shared/Collection+SBUIKit.swift similarity index 65% rename from Sources/Extension/Collection+SBUIKit.swift rename to Sources/Extension/Shared/Collection+SBUIKit.swift index e645a10e..e2a0d7da 100644 --- a/Sources/Extension/Collection+SBUIKit.swift +++ b/Sources/Extension/Shared/Collection+SBUIKit.swift @@ -11,3 +11,9 @@ import Foundation extension Collection { var hasElements: Bool { isEmpty == false } } + +extension Array { + subscript(safe index: Int) -> Element? { + return indices.contains(index) ? self[index] : nil + } +} diff --git a/Sources/Extension/Data+SBUIKit.swift b/Sources/Extension/Shared/Data+SBUIKit.swift similarity index 100% rename from Sources/Extension/Data+SBUIKit.swift rename to Sources/Extension/Shared/Data+SBUIKit.swift diff --git a/Sources/Extension/Float+SBUIKit.swift b/Sources/Extension/Shared/Float+SBUIKit.swift similarity index 100% rename from Sources/Extension/Float+SBUIKit.swift rename to Sources/Extension/Shared/Float+SBUIKit.swift diff --git a/Sources/Extension/NSLayoutConstraint+SBUIKit.swift b/Sources/Extension/Shared/NSLayoutConstraint+SBUIKit.swift similarity index 100% rename from Sources/Extension/NSLayoutConstraint+SBUIKit.swift rename to Sources/Extension/Shared/NSLayoutConstraint+SBUIKit.swift diff --git a/Sources/Extension/String+SBUIKit.swift b/Sources/Extension/Shared/String+SBUIKit.swift similarity index 100% rename from Sources/Extension/String+SBUIKit.swift rename to Sources/Extension/Shared/String+SBUIKit.swift diff --git a/Sources/Extension/Thread+SBUIKit.swift b/Sources/Extension/Shared/Thread+SBUIKit.swift similarity index 100% rename from Sources/Extension/Thread+SBUIKit.swift rename to Sources/Extension/Shared/Thread+SBUIKit.swift diff --git a/Sources/Extension/UIApplication+SBUIKit.swift b/Sources/Extension/Shared/UIApplication+SBUIKit.swift similarity index 100% rename from Sources/Extension/UIApplication+SBUIKit.swift rename to Sources/Extension/Shared/UIApplication+SBUIKit.swift diff --git a/Sources/Extension/UIColor+SBUIKit.swift b/Sources/Extension/Shared/UIColor+SBUIKit.swift similarity index 100% rename from Sources/Extension/UIColor+SBUIKit.swift rename to Sources/Extension/Shared/UIColor+SBUIKit.swift diff --git a/Sources/Extension/UIImage+SBUIKit.swift b/Sources/Extension/Shared/UIImage+SBUIKit.swift similarity index 86% rename from Sources/Extension/UIImage+SBUIKit.swift rename to Sources/Extension/Shared/UIImage+SBUIKit.swift index 3ff3a33f..2d5408e2 100644 --- a/Sources/Extension/UIImage+SBUIKit.swift +++ b/Sources/Extension/Shared/UIImage+SBUIKit.swift @@ -94,9 +94,7 @@ public extension UIImage { } let data = image.jpegData( - compressionQuality: SBUGlobals.isImageCompressionEnabled - ? SBUGlobals.imageCompressionRate - : 1.0 + compressionQuality: SBUGlobals.imageCompressionQuality ) if data == nil { @@ -337,19 +335,23 @@ extension UIImage { // swiftlint:enable identifier_name extension UIImage { + /// test downloader static var sbu_imageDownloader = SBUImageDownloader() } -// 이미지 다운로드 클래스 정의 +/// image downloader class SBUImageDownloader { + /// string to url. func url(string: String) -> URL? { URL(string: string) } + /// url to image. func image(url: URL) -> UIImage? { UIImage(url: url) } + // download image from url. func downloadImage( from url: URL, completion: @escaping (Data?, Error?) -> Void @@ -359,3 +361,42 @@ class SBUImageDownloader { } } } + +extension UIImage { + // https://stackoverflow.com/a/47884962 + // INFO: Edge case - image height is wrap + func resizeTopAlignedToFill(newWidth: CGFloat) -> UIImage? { + // Calculate ratio used for resizing the image + let scale = newWidth / size.width + let newHeight = size.height * scale + let newSize = CGSize(width: newWidth, height: newHeight) + + // Array that stores image frames + var images: [UIImage] = [] + + // If animated GIF image, resize all images in frames and append them to the array + if let animatedImages = self.images { + for animatedImage in animatedImages { + guard let cgImage = animatedImage.cgImage else { continue } + let image = UIImage(cgImage: cgImage) + UIGraphicsBeginImageContextWithOptions(newSize, false, image.scale) + let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height) + image.draw(in: rect) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + guard let newImage = newImage else { continue } + images.append(newImage) + } + } else { + // If not an animated GIF image, create a new image with resizing + UIGraphicsBeginImageContextWithOptions(newSize, false, UIApplication.shared.currentWindow?.screen.scale ?? 1.0) + draw(in: CGRect(origin: .zero, size: newSize)) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return newImage + } + + // Create a new GIF image with modified images + return UIImage.animatedImage(with: images, duration: self.duration) + } +} diff --git a/Sources/Extension/UIImageView+SBUIKit.swift b/Sources/Extension/Shared/UIImageView+SBUIKit.swift similarity index 100% rename from Sources/Extension/UIImageView+SBUIKit.swift rename to Sources/Extension/Shared/UIImageView+SBUIKit.swift diff --git a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+Utils.swift b/Sources/Extension/Shared/UILabel+SBUIKit.swift similarity index 54% rename from Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+Utils.swift rename to Sources/Extension/Shared/UILabel+SBUIKit.swift index 6775e8e7..507f898e 100644 --- a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+Utils.swift +++ b/Sources/Extension/Shared/UILabel+SBUIKit.swift @@ -1,53 +1,12 @@ // -// SBUMessageTemplate.Renderer+Utils.swift +// UILabel+SBUIKit.swift // SendbirdUIKit // -// Created by Tez Park on 2022/10/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. +// Created by Damon Park on 11/21/24. // import UIKit -extension UIImage { - // https://stackoverflow.com/a/47884962 - // INFO: Edge case - image height is wrap - func resizeTopAlignedToFill(newWidth: CGFloat) -> UIImage? { - // Calculate ratio used for resizing the image - let scale = newWidth / size.width - let newHeight = size.height * scale - let newSize = CGSize(width: newWidth, height: newHeight) - - // Array that stores image frames - var images: [UIImage] = [] - - // If animated GIF image, resize all images in frames and append them to the array - if let animatedImages = self.images { - for animatedImage in animatedImages { - guard let cgImage = animatedImage.cgImage else { continue } - let image = UIImage(cgImage: cgImage) - UIGraphicsBeginImageContextWithOptions(newSize, false, image.scale) - let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height) - image.draw(in: rect) - let newImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - guard let newImage = newImage else { continue } - images.append(newImage) - } - } else { - // If not an animated GIF image, create a new image with resizing - UIGraphicsBeginImageContextWithOptions(newSize, false, UIApplication.shared.currentWindow?.screen.scale ?? 1.0) - draw(in: CGRect(origin: .zero, size: newSize)) - let newImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - return newImage - } - - // Create a new GIF image with modified images - return UIImage.animatedImage(with: images, duration: self.duration) - } -} - -// TODO: will be separated by a file extension UILabel { func textWidth() -> CGFloat { return UILabel.textWidth(font: self.font, text: self.text ?? "") diff --git a/Sources/Extension/UIView+SBUIKit.swift b/Sources/Extension/Shared/UIView+SBUIKit.swift similarity index 99% rename from Sources/Extension/UIView+SBUIKit.swift rename to Sources/Extension/Shared/UIView+SBUIKit.swift index e1dc7ede..47019043 100644 --- a/Sources/Extension/UIView+SBUIKit.swift +++ b/Sources/Extension/Shared/UIView+SBUIKit.swift @@ -1385,3 +1385,9 @@ extension UIView { return view } } + +extension UIView { + var memoryAddress: String { + String(describing: Unmanaged.passUnretained(self).toOpaque()).uppercased() + } +} diff --git a/Sources/Manager/CacheManager/SBUCacheManager.DiskCache.swift b/Sources/Manager/CacheManager/SBUCacheManager.DiskCache.swift new file mode 100644 index 00000000..4e9f75a2 --- /dev/null +++ b/Sources/Manager/CacheManager/SBUCacheManager.DiskCache.swift @@ -0,0 +1,224 @@ +// +// SBUCacheManager.DiskCache.swift +// SendbirdUIKitCommon +// +// Created by Damon Park on 10/18/24. +// + +import UIKit +import AVFoundation + +extension SBUCacheManager { + // MARK: - DiskCache + struct DiskCache { + // MARK: - Properties + private let fileManager = FileManager.default + private let cacheType: String + private let diskQueue = DispatchQueue(label: "\(SBUConstant.bundleIdentifier).queue.diskcache", qos: .background) + + // MARK: - Initializers + init(cacheType: String) { + self.cacheType = cacheType + + do { + try self.createDirectoryIfNeeded() + } catch { + SBULog.error(error.localizedDescription) + } + } + + func createDirectoryIfNeeded() throws { + let cachePath = self.cachePathURL().path + + if self.fileManager.fileExists(atPath: cachePath) { + return + } + + try self.fileManager.createDirectory( + atPath: cachePath, + withIntermediateDirectories: true, + attributes: nil + ) + } + + func cacheExists(key: String) -> Bool { + return fileManager.fileExists(atPath: self.pathForKey(key)) + } + + func get(fullPath: URL) -> Data? { + do { + let data = try Data(contentsOf: fullPath) + return data + } catch { + SBULog.info(error.localizedDescription) + } + return nil + } + + func get(key: String) -> NSData? { + guard cacheExists(key: key) else { return nil } + + let filePath = URL(fileURLWithPath: self.pathForKey(key)) + + do { + let data = try Data(contentsOf: filePath) + return data as NSData + } catch { + SBULog.info(error.localizedDescription) + } + return nil + } + + // FIXME: Seperate image / file handling logic + func set(key: String, data: NSData, image: UIImage? = nil, completionHandler: T? = nil) { + diskQueue.async { [weak image] in + let filePath = URL(fileURLWithPath: self.pathForKey(key)) + + do { + let subPath = filePath.deletingLastPathComponent() + try self.fileManager.createDirectory( + atPath: subPath.path, + withIntermediateDirectories: true, + attributes: nil + ) + } catch { + SBULog.error(error.localizedDescription) + DispatchQueue.main.async { + switch completionHandler { + case let cacheHandler as SBUCacheCompletionHandler: + cacheHandler(nil, nil) + case let imageCacheHandler as SBUImageCacheCompletionHandler: + imageCacheHandler(nil, nil, image) + default: + SBULog.error("Invalid cacheHandler type") + } + } + return + } + + data.write(to: filePath, atomically: true) + DispatchQueue.main.async { + switch completionHandler { + case let cacheHandler as SBUCacheCompletionHandler: + cacheHandler(filePath, data) + case let imageCacheHandler as SBUImageCacheCompletionHandler: + imageCacheHandler(filePath, data, image) + default: + SBULog.error("Invalid cacheHandler type") + } + } + } + } + + func rename(key: String, newKey: String) { + diskQueue.async { + let fileManager = self.fileManager + let atPath = self.pathForKey(key) + let toPath = self.pathForKey(newKey) + try? fileManager.moveItem(atPath: atPath, toPath: toPath) + } + } + + func remove(key: String) { + diskQueue.async { + let path = self.pathForKey(key) + let fileManager = self.fileManager + + do { + try fileManager.removeItem(atPath: path) + } catch { + SBULog.error("Could not remove file: \(error)") + } + } + } + + func removeAll() { + diskQueue.async { + let fileManager = self.fileManager + let cachePath = self.cachePathURL().path + + do { + try fileManager.removeItem(atPath: cachePath) + } catch { + SBULog.error("Could not remove cache path: \(error)") + } + } + } + + func cachePathURL() -> URL { + guard let cacheDirectoryURL = try? FileManager.default.url( + for: .cachesDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true) else { return URL(fileURLWithPath: "") } + + let cachePathURL = cacheDirectoryURL.appendingPathComponent("\(self.cacheType)/") + return cachePathURL + } + + func pathForKey(_ key: String) -> String { + let cachePathURL = cachePathURL() + let fullPath = cachePathURL.appendingPathComponent(key) + return fullPath.path + } + + // swiftlint:disable missing_docs + @available(*, deprecated, renamed: "cacheExists(key:)") + public func hasImage(key: String) -> Bool { + self.cacheExists(key: key) + } + // swiftlint:enable missing_docs + + // Voice + func voiceTempPath(fileName: String) -> URL? { + let documentPath = URL(fileURLWithPath: self.pathForKey("voice_temp")) + + if !FileManager.default.fileExists(atPath: documentPath.path) { + do { + try FileManager.default.createDirectory(at: documentPath, withIntermediateDirectories: true) + return documentPath.appendingPathComponent(fileName) + } catch { + SBULog.error("[Failed] Create directory : \(error.localizedDescription)") + return nil + } + } + return documentPath.appendingPathComponent(fileName) + } + + func removeVoiceTemp(fileName: String?) { + guard let fileName = fileName, + let path = self.voiceTempPath(fileName: fileName)?.path else { return } + + diskQueue.async { + let fileManager = self.fileManager + + do { + try fileManager.removeItem(atPath: path) + } catch { + SBULog.error("Could not remove file: \(error)") + } + } + } + + // MARK: - Reset + func resetCache() { + self.removeAll() + } + + private func executeCompletion( + _ image: UIImage? = nil, + handler: T? + ) { + Thread.executeOnMain { + switch handler { + case let cacheHandler as SBUCacheCompletionHandler: + cacheHandler(nil, nil) + case let imageCacheHandler as SBUImageCacheCompletionHandler: + imageCacheHandler(nil, nil, image) + default: + SBULog.error("Invalid cacheHandler type") + } + } + } + } +} diff --git a/Sources/Manager/CacheManager/SBUCacheManager.Image+FileMessage.swift b/Sources/Manager/CacheManager/SBUCacheManager.Image+FileMessage.swift new file mode 100644 index 00000000..70133107 --- /dev/null +++ b/Sources/Manager/CacheManager/SBUCacheManager.Image+FileMessage.swift @@ -0,0 +1,81 @@ +// +// SBUCacheManager.Image+FileMessage.swift +// SendbirdUIKitCommon +// +// Created by Damon Park on 10/30/24. +// + +import UIKit +import AVFoundation +import SendbirdChatSDK + +extension SBUCacheManager.Image { + static func preSave( + fileMessage: FileMessage, + isQuotedImage: Bool? = false, + completionHandler: SBUImageCacheCompletionHandler? = nil + ) { + if let messageParams = fileMessage.messageParams as? FileMessageCreateParams { + var fileName = self.createCacheFileName( + urlString: fileMessage.url, + cacheKey: fileMessage.cacheKey, + fileNameForExtension: fileMessage.name, + needPathExtension: true + ) + if isQuotedImage == true { fileName = "quoted_\(fileName)" } + + switch SBUUtils.getFileType(by: fileMessage) { + case .image: + self.save( + data: messageParams.file, + fileName: fileName, + subPath: fileMessage.channelURL, + completionHandler: completionHandler + ) + case .video: + guard let asset = messageParams.file?.getAVAsset() else { break } + + let avAssetImageGenerator = AVAssetImageGenerator(asset: asset) + avAssetImageGenerator.appliesPreferredTrackTransform = true + let cmTime = CMTimeMake(value: 2, timescale: 1) + guard let cgImage = try? avAssetImageGenerator + .copyCGImage(at: cmTime, actualTime: nil) else { + break + } + + let image = UIImage(cgImage: cgImage) + self.save( + image: image, + fileName: fileName, + subPath: fileMessage.channelURL, + completionHandler: completionHandler + ) + default: + break + } + } + } + + static func preSave( + multipleFilesMessage: MultipleFilesMessage, + uploadableFileInfo: UploadableFileInfo, + index: Int, + isQuotedImage: Bool, + completionHandler: SBUImageCacheCompletionHandler? + ) { + var fileName = self.createCacheFileName( + urlString: uploadableFileInfo.fileURL ?? "", + cacheKey: multipleFilesMessage.cacheKey + "_\(index)", + fileNameForExtension: uploadableFileInfo.fileName, + needPathExtension: true + ) + if isQuotedImage == true { fileName = "quoted_\(fileName)" } + + self.save( + data: uploadableFileInfo.file, + fileName: fileName, + subPath: multipleFilesMessage.channelURL, + completionHandler: completionHandler + ) + } +} diff --git a/Sources/Manager/CacheManager/SBUCacheManager.Image.swift b/Sources/Manager/CacheManager/SBUCacheManager.Image.swift index 3ef37ecf..678c5e04 100644 --- a/Sources/Manager/CacheManager/SBUCacheManager.Image.swift +++ b/Sources/Manager/CacheManager/SBUCacheManager.Image.swift @@ -68,73 +68,6 @@ extension SBUCacheManager { return image } - static func preSave( - fileMessage: FileMessage, - isQuotedImage: Bool? = false, - completionHandler: SBUImageCacheCompletionHandler? = nil - ) { - if let messageParams = fileMessage.messageParams as? FileMessageCreateParams { - var fileName = self.createCacheFileName( - urlString: fileMessage.url, - cacheKey: fileMessage.cacheKey, - fileNameForExtension: fileMessage.name - ) - if isQuotedImage == true { fileName = "quoted_\(fileName)" } - - switch SBUUtils.getFileType(by: fileMessage) { - case .image: - self.save( - data: messageParams.file, - fileName: fileName, - subPath: fileMessage.channelURL, - completionHandler: completionHandler - ) - case .video: - guard let asset = messageParams.file?.getAVAsset() else { break } - - let avAssetImageGenerator = AVAssetImageGenerator(asset: asset) - avAssetImageGenerator.appliesPreferredTrackTransform = true - let cmTime = CMTimeMake(value: 2, timescale: 1) - guard let cgImage = try? avAssetImageGenerator - .copyCGImage(at: cmTime, actualTime: nil) else { - break - } - - let image = UIImage(cgImage: cgImage) - self.save( - image: image, - fileName: fileName, - subPath: fileMessage.channelURL, - completionHandler: completionHandler - ) - default: - break - } - } - } - - static func preSave( - multipleFilesMessage: MultipleFilesMessage, - uploadableFileInfo: UploadableFileInfo, - index: Int, - isQuotedImage: Bool = false, - completionHandler: SBUImageCacheCompletionHandler? = nil - ) { - var fileName = self.createCacheFileName( - urlString: uploadableFileInfo.fileURL ?? "", - cacheKey: multipleFilesMessage.cacheKey + "_\(index)", - fileNameForExtension: uploadableFileInfo.fileName - ) - if isQuotedImage == true { fileName = "quoted_\(fileName)" } - - self.save( - data: uploadableFileInfo.file, - fileName: fileName, - subPath: multipleFilesMessage.channelURL, - completionHandler: completionHandler - ) - } - static func get(fileName: String, subPath: String) -> UIImage? { let key = key(fileName: fileName, subPath: subPath) if let memoryImage = self.memoryCache.get(key: key) { @@ -195,7 +128,7 @@ extension SBUCacheManager { self.diskCache.rename(key: key, newKey: newKey) if let image = self.memoryCache.get(key: key) { - self.memoryCache.set(key: key, image: image) + self.memoryCache.set(key: newKey, image: image) self.memoryCache.remove(key: key) } } diff --git a/Sources/Manager/CacheManager/SBUCacheManager.MemoryCache.swift b/Sources/Manager/CacheManager/SBUCacheManager.MemoryCache.swift new file mode 100644 index 00000000..12805f1a --- /dev/null +++ b/Sources/Manager/CacheManager/SBUCacheManager.MemoryCache.swift @@ -0,0 +1,62 @@ +// +// SBUCacheManager.MemoryyCache.swift +// SendbirdUIKitCommon +// +// Created by Damon Park on 10/18/24. +// + +import UIKit +import AVFoundation + +extension SBUCacheManager { + // MARK: - MemoryCache (for Image) + struct MemoryCache { + private let memoryQueue = DispatchQueue(label: "\(SBUConstant.bundleIdentifier).queue.memorycache", qos: .background) + + // MARK: - Memory Cache + private var memoryCache: NSCache = { + let cache = NSCache() + cache.totalCostLimit = 10 * 1024 * 1024 // Here the size in bytes of data is used as the cost, here 10 MB limit + cache.countLimit = 30 // 30 url limit + return cache + }() + + func set(key: String, image: UIImage) { + memoryQueue.async { + self.memoryCache.setObject(image, forKey: key as NSString) + } + } + + func set(key: String, data: NSData) { + memoryQueue.async { + guard let image = UIImage.createImage(from: data as Data) else { return } + self.memoryCache.setObject(image, forKey: key as NSString) + } + } + + func get(key: String) -> UIImage? { + memoryQueue.sync { + self.memoryCache.object(forKey: key as NSString) + } + } + + func remove(key: String) { + memoryQueue.async { + self.memoryCache.removeObject(forKey: key as NSString) + } + } + + func cacheExists(key: String) -> Bool { + memoryQueue.sync { + self.memoryCache.object(forKey: key as NSString) != nil + } + } + + // MARK: - Reset + func resetCache() { + memoryQueue.async { + self.memoryCache.removeAllObjects() + } + } + } +} diff --git a/Sources/Manager/CacheManager/SBUCacheManager.PathType.swift b/Sources/Manager/CacheManager/SBUCacheManager.PathType.swift new file mode 100644 index 00000000..b6ae85bc --- /dev/null +++ b/Sources/Manager/CacheManager/SBUCacheManager.PathType.swift @@ -0,0 +1,18 @@ +// +// SBUCacheManager.PathType.swift +// SendbirdUIKitCommon +// +// Created by Damon Park on 10/30/24. +// + +import Foundation + +extension SBUCacheManager { + // MARK: - SubPath + struct PathType { + static let template = "template" + static let userProfile = "user-profile" + static let reaction = "reaction" + static let web = "web" + } +} diff --git a/Sources/Manager/CacheManager/SBUCacheManager.swift b/Sources/Manager/CacheManager/SBUCacheManager.swift index dbd8d626..31bb88b6 100644 --- a/Sources/Manager/CacheManager/SBUCacheManager.swift +++ b/Sources/Manager/CacheManager/SBUCacheManager.swift @@ -15,16 +15,6 @@ typealias SBUImageCacheCompletionHandler = (URL?, NSData?, UIImage?) -> Void class SBUCacheManager { - static internal let fileCacheQueue = DispatchQueue(label: "com.sendbird.cache.file", qos: .background) - - // MARK: - SubPath - struct PathType { - static let template = "template" - static let userProfile = "user-profile" - static let reaction = "reaction" - static let web = "web" - } - // MARK: - Common static func createHashName(urlString: String) -> String { return "\(urlString.persistantHash)" @@ -34,262 +24,6 @@ class SBUCacheManager { let pathExtension = URL(fileURLWithPath: URLComponents(string: urlString)?.path ?? "").pathExtension return pathExtension } - - // MARK: - DiskCache - struct DiskCache { - // MARK: - Properties - private let fileManager = FileManager.default - private let cacheType: String - private let diskQueue = DispatchQueue(label: "\(SBUConstant.bundleIdentifier).queue.diskcache", qos: .background) - - // MARK: - Initializers - init(cacheType: String) { - self.cacheType = cacheType - - do { - try self.createDirectoryIfNeeded() - } catch { - SBULog.error(error.localizedDescription) - } - } - - func createDirectoryIfNeeded() throws { - let cachePath = self.cachePathURL().path - - if self.fileManager.fileExists(atPath: cachePath) { - return - } - - try self.fileManager.createDirectory( - atPath: cachePath, - withIntermediateDirectories: true, - attributes: nil - ) - } - - func cacheExists(key: String) -> Bool { - return fileManager.fileExists(atPath: self.pathForKey(key)) - } - - func get(fullPath: URL) -> Data? { - do { - let data = try Data(contentsOf: fullPath) - return data - } catch { - SBULog.info(error.localizedDescription) - } - return nil - } - - func get(key: String) -> NSData? { - guard cacheExists(key: key) else { return nil } - - let filePath = URL(fileURLWithPath: self.pathForKey(key)) - - do { - let data = try Data(contentsOf: filePath) - return data as NSData - } catch { - SBULog.info(error.localizedDescription) - } - return nil - } - - // FIXME: Seperate image / file handling logic - func set(key: String, data: NSData, image: UIImage? = nil, completionHandler: T? = nil) { - diskQueue.async { [weak image] in - let filePath = URL(fileURLWithPath: self.pathForKey(key)) - - do { - let subPath = filePath.deletingLastPathComponent() - try self.fileManager.createDirectory( - atPath: subPath.path, - withIntermediateDirectories: true, - attributes: nil - ) - } catch { - SBULog.error(error.localizedDescription) - DispatchQueue.main.async { - switch completionHandler { - case let cacheHandler as SBUCacheCompletionHandler: - cacheHandler(nil, nil) - case let imageCacheHandler as SBUImageCacheCompletionHandler: - imageCacheHandler(nil, nil, image) - default: - SBULog.error("Invalid cacheHandler type") - } - } - return - } - - data.write(to: filePath, atomically: true) - DispatchQueue.main.async { - switch completionHandler { - case let cacheHandler as SBUCacheCompletionHandler: - cacheHandler(filePath, data) - case let imageCacheHandler as SBUImageCacheCompletionHandler: - imageCacheHandler(filePath, data, image) - default: - SBULog.error("Invalid cacheHandler type") - } - } - } - } - - func rename(key: String, newKey: String) { - diskQueue.async { - let fileManager = self.fileManager - let atPath = self.pathForKey(key) - let toPath = self.pathForKey(newKey) - try? fileManager.moveItem(atPath: atPath, toPath: toPath) - } - } - - func remove(key: String) { - diskQueue.async { - let path = self.pathForKey(key) - let fileManager = self.fileManager - - do { - try fileManager.removeItem(atPath: path) - } catch { - SBULog.error("Could not remove file: \(error)") - } - } - } - - func removeAll() { - diskQueue.async { - let fileManager = self.fileManager - let cachePath = self.cachePathURL().path - - do { - try fileManager.removeItem(atPath: cachePath) - } catch { - SBULog.error("Could not remove cache path: \(error)") - } - } - } - - func cachePathURL() -> URL { - guard let cacheDirectoryURL = try? FileManager.default.url( - for: .cachesDirectory, - in: .userDomainMask, - appropriateFor: nil, - create: true) else { return URL(fileURLWithPath: "") } - - let cachePathURL = cacheDirectoryURL.appendingPathComponent("\(self.cacheType)/") - return cachePathURL - } - - func pathForKey(_ key: String) -> String { - let cachePathURL = cachePathURL() - let fullPath = cachePathURL.appendingPathComponent(key) - return fullPath.path - } - - // swiftlint:disable missing_docs - @available(*, deprecated, renamed: "cacheExists(key:)") - public func hasImage(key: String) -> Bool { - self.cacheExists(key: key) - } - // swiftlint:enable missing_docs - - // Voice - func voiceTempPath(fileName: String) -> URL? { - let documentPath = URL(fileURLWithPath: self.pathForKey("voice_temp")) - - if !FileManager.default.fileExists(atPath: documentPath.path) { - do { - try FileManager.default.createDirectory(at: documentPath, withIntermediateDirectories: true) - return documentPath.appendingPathComponent(fileName) - } catch { - SBULog.error("[Failed] Create directory : \(error.localizedDescription)") - return nil - } - } - return documentPath.appendingPathComponent(fileName) - } - - func removeVoiceTemp(fileName: String?) { - guard let fileName = fileName, - let path = self.voiceTempPath(fileName: fileName)?.path else { return } - - diskQueue.async { - let fileManager = self.fileManager - - do { - try fileManager.removeItem(atPath: path) - } catch { - SBULog.error("Could not remove file: \(error)") - } - } - } - - // MARK: - Reset - func resetCache() { - self.removeAll() - } - - private func executeCompletion( - _ image: UIImage? = nil, - handler: T? - ) { - Thread.executeOnMain { - switch handler { - case let cacheHandler as SBUCacheCompletionHandler: - cacheHandler(nil, nil) - case let imageCacheHandler as SBUImageCacheCompletionHandler: - imageCacheHandler(nil, nil, image) - default: - SBULog.error("Invalid cacheHandler type") - } - } - } - } - - // MARK: - MemoryCache (for Image) - struct MemoryCache { - private let memoryQueue = DispatchQueue(label: "\(SBUConstant.bundleIdentifier).queue.memorycache", qos: .background) - - // MARK: - Memory Cache - private var memoryCache: NSCache = { - let cache = NSCache() - cache.totalCostLimit = 10 * 1024 * 1024 // Here the size in bytes of data is used as the cost, here 10 MB limit - cache.countLimit = 30 // 30 url limit - return cache - }() - - func set(key: String, image: UIImage) { - memoryQueue.async { - self.memoryCache.setObject(image, forKey: key as NSString) - } - } - - func set(key: String, data: NSData) { - memoryQueue.async { - guard let image = UIImage.createImage(from: data as Data) else { return } - self.set(key: key, image: image) - } - } - - func get(key: String) -> UIImage? { - return self.memoryCache.object(forKey: key as NSString) - } - - func remove(key: String) { - self.memoryCache.removeObject(forKey: key as NSString) - } - - func cacheExists(key: String) -> Bool { - return self.memoryCache.object(forKey: key as NSString) != nil - } - - // MARK: - Reset - func resetCache() { - self.memoryCache.removeAllObjects() - } - } } // swiftlint:disable missing_docs diff --git a/Sources/Manager/SBUMessageTemplateManager.swift b/Sources/Manager/SBUMessageTemplateManager.swift deleted file mode 100644 index 75bf95bc..00000000 --- a/Sources/Manager/SBUMessageTemplateManager.swift +++ /dev/null @@ -1,344 +0,0 @@ -// -// SBUMessageTemplateManager.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/02/17. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit -import SendbirdChatSDK - -public class SBUMessageTemplateManager: NSObject { - static var templateDownloadRetryCount: [String: Int] = [:] - - static let retryCountQueue = DispatchQueue(label: "com.sendbird.message_template.retry_count.queue") - - /// Resets notification template cache - /// - Since: 3.21.0 - public static func resetNotificationTemplateCache() { - SBUCacheManager.template(with: .notification).resetCache() - } - - /// Resets message template cache - /// - Since: 3.21.0 - public static func resetMessageTemplateCache() { - SBUCacheManager.template(with: .message).resetCache() - } - - static let exeucuteQueue = DispatchQueue(label: "com.sendbird.message_template.images") - - static func increaseTemplateDownloadRetryCount(templateKey: String) { - retryCountQueue.sync { - let retryCount = templateDownloadRetryCount[templateKey] ?? 0 - templateDownloadRetryCount[templateKey] = retryCount + 1 - - SBULog.info("Template download retry count for \(templateKey) increased to: \(templateDownloadRetryCount[templateKey]!)") - } - } - - static func isTemplateDownloadRetryAvailable(templateKey: String) -> Bool { - retryCountQueue.sync { - let retryCount = templateDownloadRetryCount[templateKey] ?? 0 - SBULog.info("Template download retry count for \(templateKey): \(retryCount)") - return retryCount < 10 - } - } -} - -// MARK: - Template list -extension SBUMessageTemplateManager { - - // original - static func generateTemplate( - type: SBUTemplateType, - subData: String?, - themeMode: String? = nil, - newTemplateResponseHandler: ((_ success: Bool) -> Void)? = nil - ) -> (BindedTemplate?, Bool) { // bindedTemplate, isNewTemplate - guard let subData = subData else { return (nil, false) } - - // data scheme - var templateVariables: [String: String] = [:] - var templateKey: String? - do { - if let subDataDic = try JSONSerialization.jsonObject( - with: Data(subData.utf8), - options: [] - ) as? [String: Any], - let templateKeyValue = subDataDic[type.templateKey] as? String { - let templateVariablesDic = subDataDic[type.dataVariable] as? [String: Any] ?? [:] - for key in templateVariablesDic.keys { - templateVariables[key] = "\(templateVariablesDic[key] ?? "")" - } - - templateKey = templateKeyValue - } - } catch { - SBULog.error(error.localizedDescription) - } - - guard let templateKey = templateKey, - let template = SBUMessageTemplateManager.template( - type: type, - templateKey: templateKey, - newTemplateResponseHandler: newTemplateResponseHandler - ) else { - return (nil, true) // request NewTemplate - } - - // color variabled - var colorVariables: [String: String] = [:] - do { - if let colorVariablesDic = try JSONSerialization.jsonObject( - with: Data(template.colorVariables.utf8), - options: [] - ) as? [String: Any] { - - for key in colorVariablesDic.keys { - colorVariables[key] = "\(colorVariablesDic[key] ?? "")" - } - } - - } catch { - SBULog.error(error.localizedDescription) - } - - var colorVariablesForLight: [String: String] = [:] - var colorVariablesForDark: [String: String] = [:] - for (key, value) in colorVariables { - let colorStrings = value.components(separatedBy: ",") - if colorStrings.count > 1, let first = colorStrings.first, first.isEmpty { - return (nil, false) - } - - var lightIdx = 0 - var darkIdx = (colorStrings.count == 1) ? 0 : 1 - - switch SBUTemplateThemeType.type(with: themeMode) { - case .light: darkIdx = lightIdx - case .dark: lightIdx = darkIdx - case .`default`: break - default: break - } - - colorVariablesForLight[key] = colorStrings[lightIdx] - colorVariablesForDark[key] = colorStrings[darkIdx] - } - - var uiTemplate = template.uiTemplate - uiTemplate = uiTemplate.replacingOccurrences(of: "\\n", with: "\n") - - var dataTemplate = template.dataTemplate - dataTemplate = dataTemplate.replacingOccurrences(of: "\\n", with: "\n") - - // bind - switch SBUTheme.colorScheme { - case .light: - let result = bind( - uiTemplate: uiTemplate, - dataTemplate: dataTemplate, - templateVariables: templateVariables, - colorVariable: colorVariablesForLight - ) - return (result, false) - case .dark: - let result = bind( - uiTemplate: uiTemplate, - dataTemplate: dataTemplate, - templateVariables: templateVariables, - colorVariable: colorVariablesForDark - ) - return (result, false) - } - } - - // original - static func template( - type: SBUTemplateType, - templateKey: String, - newTemplateResponseHandler: ((_ success: Bool) -> Void)? = nil - ) -> SBUMessageTemplate.TemplateModel? { - let cache = SBUCacheManager.template(with: type) - - if let template = cache.getTemplate(forKey: templateKey) { - SBULog.info("\(templateKey) is in cache") - return template - } - - guard isTemplateDownloadRetryAvailable(templateKey: templateKey) else { return nil } - - type.loadTemplate(key: templateKey) { jsonPayload, error in - guard let jsonPayload = jsonPayload, let jsonData = jsonPayload.data(using: .utf8) else { - increaseTemplateDownloadRetryCount(templateKey: templateKey) - newTemplateResponseHandler?(false) - return - } - - do { - if let templateDic = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any], - let template = try SBUMessageTemplate.TemplateModel.createTemplate(with: templateDic) { - cache.save(templates: [template]) - _ = cache.loadAllTemplates() - newTemplateResponseHandler?(true) - } - } catch { - increaseTemplateDownloadRetryCount(templateKey: templateKey) - newTemplateResponseHandler?(false) - SBULog.error(error.localizedDescription) - } - } - - return nil - } - - // original - fileprivate static func bind( - uiTemplate: String, - dataTemplate: String, - templateVariables: [String: String], - colorVariable: [String: String] - ) -> BindedTemplate? { -// {([^{}\n]+)} -// \\{([^{}\\\"\\n]+)\\} - guard let regex = try? NSRegularExpression( - pattern: "\\{([^{}\\\"\\n]+)\\}", - options: [] - ) else { return nil } - let dictionary = templateVariables.merging(colorVariable) { (_, new) in new } - - let resultUiTemplate = bindTemplate( - regex: regex, - template: uiTemplate, - variables: dictionary - ) - let resultDataTemplate = bindTemplate( - regex: regex, - template: dataTemplate, - variables: dictionary - ) - - return BindedTemplate( - resultUiTemplate: resultUiTemplate, - resultDataTemplate: resultDataTemplate - ) - } - - fileprivate static func bindTemplate( - regex: NSRegularExpression, - template: String, - variables: [String: String] - ) -> String { - var resultTemplate = template - let templateMatches = regex.matches( - in: template, - options: [], - range: NSRange(location: 0, length: template.utf16.count) - ) - for match in templateMatches.reversed() { - let keyRange = match.range(at: 1) - let key = (template as NSString).substring(with: keyRange) - if let value = variables[key] { - let escapedValue = value.replacingOccurrences(of: "\"", with: "\\\"") - resultTemplate = resultTemplate.replacingOccurrences( - of: "{\(key)}", - with: escapedValue, - options: [], - range: Range(match.range, in: resultTemplate) - ) - } - } - - return resultTemplate - } -} - -// for view model -extension SBUMessageTemplateManager { - static func loadTemplateList( - type: SBUTemplateType, - completionHandler: ((_ success: Bool) -> Void)? - ) { - let cache = SBUCacheManager.template(with: type) - - let cachedToken = Int64(cache.lastToken) ?? 0 - let serverToken = type.getRemoteToken() - - guard cachedToken < serverToken else { - let success = cache.loadAllTemplates() != nil - completionHandler?(success) - return - } - - type.loadTemplateList(token: cache.lastToken) { jsonPayload, token in - let responseJson = jsonPayload ?? "" - - guard let jsonData = responseJson.data(using: .utf8) else { - completionHandler?(false) - return - } - - let templateList = SBUMessageTemplate.TemplateList(with: jsonData) - - cache.save(templates: templateList.templates) - cache.lastToken = token ?? "" - cache.loadAllTemplates() - - completionHandler?(true) - } - } - - static func loadTemplateImages( - type: SBUTemplateType, - cacheData: [String: String], - completionHandler: ((_ success: Bool) -> Void)? - ) { - let dispatchGroup = DispatchGroup() - var loadCount = 0 - - exeucuteQueue.async { - for (_, url) in cacheData { - dispatchGroup.enter() - - let fileName = SBUCacheManager.Image.createCacheFileName( - urlString: url, - cacheKey: nil - ) - - if SBUCacheManager.Image.get( - fileName: fileName, - subPath: SBUCacheManager.PathType.template - ) != nil { - loadCount += 1 - dispatchGroup.leave() - return - } - - UIImageView.getOriginalImage( - urlString: url, - subPath: SBUCacheManager.PathType.template - ) { image, _ in - if image != nil { - loadCount += 1 - } - dispatchGroup.leave() - } - } - - let result = dispatchGroup.wait(timeout: .now() + .seconds(10)) // timeout: 10 second - - Thread.executeOnMain { - switch result { - case .success: - completionHandler?(cacheData.count == loadCount) - case .timedOut: - completionHandler?(false) - } - } - } - } -} - -extension Array where Element == String { - func toJsonString() -> String? { "[\(self.joined(separator: ","))]" } -} diff --git a/Sources/Manager/SBUTemplateType.swift b/Sources/Manager/SBUTemplateType.swift deleted file mode 100644 index 01fed849..00000000 --- a/Sources/Manager/SBUTemplateType.swift +++ /dev/null @@ -1,107 +0,0 @@ -// -// SBUTemplateType.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/02/19. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit -import SendbirdChatSDK - -enum SBUTemplateType { - case notification - case message - - var cacheKey: String { - switch self { - case .notification: return "template" // NOTE: for backward - case .message: return "message_template" - } - } - - var templateKey: String { - switch self { - case .notification: return "template_key" - case .message: return "key" - } - } - - var dataVariable: String { - switch self { - case .notification: return "template_variables" - case .message: return "variables" - } - } - - var viewVariable: String { - switch self { - case .notification: return "template_view_variables" - case .message: return "view_variables" - } - } - - var containerOptions: String { - switch self { - case .notification: return "container_options" - case .message: return "container_options" - } - } -} - -enum SBUTemplateThemeType: String { - case light - case dark - case `default` - - static func type(with themeMode: String?) -> SBUTemplateThemeType? { - SBUTemplateThemeType(rawValue: themeMode ?? "") - } -} - -extension SBUTemplateType { - func getRemoteToken() -> Int64 { - switch self { - case .notification: - return Int64(SendbirdChat.getAppInfo()?.notificationInfo?.templateListToken ?? "0") ?? 0 - - case .message: - return Int64(SendbirdChat.getAppInfo()?.messageTemplateInfo?.templateListToken ?? "0") ?? 0 - } - } - - func loadTemplate( - key: String, - completionHandler: @escaping (_ payload: String?, _ error: Error?) -> Void - ) { - switch self { - case .notification: - SendbirdChat.getNotificationTemplate(key: key) { template, error in - completionHandler(template?.jsonPayload, error) - } - - case .message: - SendbirdChat.getMessageTemplate(key: key) { template, error in - completionHandler(template?.jsonPayload, error) - } - } - } - - func loadTemplateList( - token: String?, - completionHandler: @escaping (_ payload: String?, _ token: String?) -> Void - ) { - switch self { - case .notification: - let params = NotificationTemplateListParams { $0.limit = 100 } - SendbirdChat.getNotificationTemplateList(token: token, params: params) { templateList, _, token, _ in - completionHandler(templateList?.jsonPayload, token) - } - case .message: - let params = MessageTemplateListParams { $0.limit = 100 } - SendbirdChat.getMessageTemplateList(token: token, params: params) { templateList, _, token, _ in - completionHandler(templateList?.jsonPayload, token) - } - } - } -} diff --git a/Sources/MessageTemplate/Processor/SBUMessageTemplate.Binder.swift b/Sources/MessageTemplate/Processor/SBUMessageTemplate.Binder.swift deleted file mode 100644 index 2fefcc30..00000000 --- a/Sources/MessageTemplate/Processor/SBUMessageTemplate.Binder.swift +++ /dev/null @@ -1,161 +0,0 @@ -// -// SBUMessageTemplate.Binder.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/03/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit -import SendbirdChatSDK - -extension SBUMessageTemplate { - class Binder { - static func bind( - template: TemplateModel, - children: [String: TemplateModel], - payload: SBUMessageTemplate.Payload, - themeMode: String? - ) -> String? { - // 1. binding root template. - guard let rootData = bindDataPayload( - template: template, - payload: payload, - themeMode: themeMode - ) else { return nil } - - if children.isEmpty == true { return rootData } - - // 2. create child templates data to bind. - let childrenData = payload.views.reduce(into: [String: String]()) { result, view in - result[view.key] = view.value.compactMap { (child: Payload.Child) -> String? in - guard let template = children[child.key] else { return nil } - return bindDataPayload( - template: template, - payload: child, - themeMode: themeMode - ) - } - .toJsonString() - } - - // 3. binding child templates data - let result = BindingType.view.replace( - with: rootData, - datas: childrenData - ) - - return result - } - } -} - -extension SBUMessageTemplate.Binder { - fileprivate static func bindDataPayload( - template: SBUMessageTemplate.TemplateModel, - payload: MessageTemplatePayload, - themeMode: String? - ) -> String? { - guard let colors = self.themeColorData( - template: template, - themeMode: themeMode - ) else { return nil } - - let result = BindingType.data.replace( - with: template.uiTemplateRemovedEscape, - datas: payload.datas.merging(colors) { (_, new) in new } // override by colors - ) - - return result - } - - fileprivate static func themeColorData( - template: SBUMessageTemplate.TemplateModel, - themeMode: String? - ) -> [String: String]? { - let variables = template.colorDictionary - let result = variables.reduce(into: [String: String]()) { result, element in - let colors = element.value.components(separatedBy: ",") - var target: String? - switch (colors.count, SBUTemplateThemeType.type(with: themeMode)) { - case (1, _): target = colors[0] - case (2, .light): target = colors[0] - case (2, .dark): target = colors[1] - default: target = colors[SBUTheme.colorScheme == .light ? 0 : 1] - } - - if let target = target, target.hasElements { - result[element.key] = target - } - } - - if result.count != variables.count { return nil } // 필요한가?? - - return result - } -} - -extension SBUMessageTemplate.Binder { - enum BindingType { - case data - case view - } -} - -extension SBUMessageTemplate.Binder.BindingType { - func replace(with json: String, datas: [String: String]) -> String { - var result = json - - for match in self.matches(with: json).reversed() { - let keyRange = match.range(at: 1) - let key = (json as NSString).substring(with: keyRange) - - if let value = datas[key] { - let escapedValue = self.replaceEscape(with: value) - result = result.replacingOccurrences( - of: self.key(key), - with: escapedValue, - options: [], - range: Range(match.range, in: result) - ) - } - } - - return result - } -} - -extension SBUMessageTemplate.Binder.BindingType { - private func key(_ key: String) -> String { - switch self { - case .data: return #"{\#(key)}"# - case .view: return #""{@\#(key)}""# - } - } - - private var pattern: String { - switch self { - case .data: return #"\{([^{}\\"\n]+)\}"# // `{data_key}` - case .view: return #"\"\{@([^{}\n]+)\}\""# // `"{@view_key}"` - } - } - - private var regex: NSRegularExpression? { - try? NSRegularExpression(pattern: self.pattern, options: []) - } - - private func replaceEscape(with value: String) -> String { - switch self { - case .data: return value.replacingOccurrences(of: "\"", with: "\\\"") - case .view: return value - } - } - - private func matches(with json: String) -> [NSTextCheckingResult] { - self.regex?.matches( - in: json, - options: [], - range: NSRange(location: 0, length: json.utf16.count) - ) ?? [] - } -} diff --git a/Sources/MessageTemplate/Processor/SBUMessageTemplate.Coordinator.swift b/Sources/MessageTemplate/Processor/SBUMessageTemplate.Coordinator.swift deleted file mode 100644 index 1f742f03..00000000 --- a/Sources/MessageTemplate/Processor/SBUMessageTemplate.Coordinator.swift +++ /dev/null @@ -1,88 +0,0 @@ -// -// SBUMessageTemplate.Coordinator.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/03/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import Foundation -import SendbirdChatSDK - -extension SBUMessageTemplate.Coordinator { - enum ResultType { - case reload(ReloadType) - case template(key: String, template: SBUMessageTemplate.Syntax.TemplateView) - case failed - - enum ReloadType { - case download(DownloadType) - } - - enum DownloadType { - case template(keys: [String]) - case images(cacheData: [String: String]) - } - - var template: SBUMessageTemplate.Syntax.TemplateView? { - switch self { - case .template(_, let template): return template - default: return nil - } - } - } -} - -extension SBUMessageTemplate { - class Coordinator { - static func execute( - type: SBUTemplateType, - message: BaseMessage, - payloadJson: String?, - themeMode: String? = nil, - imageRetryStatus: SBUTemplateMessageRetryStatus - ) -> SBUMessageTemplate.Coordinator.ResultType? { - guard let payload = SBUMessageTemplate.Payload.generate(type: type, json: payloadJson) else { - return .failed - } - - // main template. - guard let template = SBUCacheManager.template(with: type).getTemplate(forKey: payload.key) else { - return .reload(.download(.template(keys: [payload.key]))) - } - - // child templates from view data. (can be empty) - guard let children = SBUCacheManager.template(with: type).getTemplateList(forKeys: payload.viewKeys) else { - return .reload(.download(.template(keys: payload.viewKeys))) - } - - // data mapping - guard let result = SBUMessageTemplate.Binder.bind( - template: template, - children: children, - payload: payload, - themeMode: themeMode - ) else { - return .failed - } - - // child views mapping - guard let template = SBUMessageTemplate.Syntax.TemplateView.generate( - json: result, - messageId: message.messageId - ) else { - return .failed - } - - // download cache image size -// if let noHitData = template.identifierFactory.getUncachedData(), noHitData.hasElements { -// if imageRetryStatus.isRetry { -// return .reload(.download(.images(cacheData: [:]))) -// } -// return .reload(.download(.images(cacheData: noHitData))) -// } - - return .template(key: payload.key, template: template) - } - } -} diff --git a/Sources/MessageTemplate/Processor/SBUMessageTemplate.Payload.swift b/Sources/MessageTemplate/Processor/SBUMessageTemplate.Payload.swift deleted file mode 100644 index 6ca91cce..00000000 --- a/Sources/MessageTemplate/Processor/SBUMessageTemplate.Payload.swift +++ /dev/null @@ -1,88 +0,0 @@ -// -// SBUMessageTemplate.Payload.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/03/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit -import SendbirdChatSDK - -protocol MessageTemplatePayload { - var key: String { get } - var datas: [String: String] { get } -} - -extension SBUMessageTemplate { - struct Payload: MessageTemplatePayload { - let key: String - let datas: [String: String] - let views: [String: [Payload.Child]] - - var viewKeys: [String] { - self.views.reduce(into: [String]()) { result, views in result += views.value.compactMap { $0.key } } - } - } -} - -extension SBUMessageTemplate.Payload { - static func generate( - type: SBUTemplateType, - json: String? - ) -> SBUMessageTemplate.Payload? { - guard let json = json else { return nil } - - do { - guard let dic = try JSONSerialization.jsonObject(with: Data(json.utf8), options: []) as? [String: Any] else { return nil } - guard let key = dic[type.templateKey] as? String else { return nil } - - let datas = (dic[type.dataVariable] as? [String: Any] ?? [:]) - .reduce(into: [String: String]()) { result, element in - result[element.key] = "\(element.value)" - } - - let views = (dic[type.viewVariable] as? [String: [Any]] ?? [:]) - .reduce(into: [String: [SBUMessageTemplate.Payload.Child]]()) { result, element in - result[element.key] = element.value.compactMap { - SBUMessageTemplate.Payload.Child.generate(type: type, data: $0) - } - } - - return SBUMessageTemplate.Payload(key: key, datas: datas, views: views) - } catch { - SBULog.error(error.localizedDescription) - return nil - } - } -} - -extension SBUMessageTemplate.Payload { - struct Child: MessageTemplatePayload { - let key: String - let datas: [String: String] - } -} - -extension SBUMessageTemplate.Payload.Child { - static func generate( - type: SBUTemplateType, - data: Any? - ) -> SBUMessageTemplate.Payload.Child? { - guard let data = data else { return nil } - - do { - guard let json = try? JSONSerialization.data(withJSONObject: data, options: []) else { return nil } - guard let dic = try JSONSerialization.jsonObject(with: json, options: []) as? [String: Any] else { return nil } - guard let key = dic[type.templateKey] as? String else { return nil } - - let datas = (dic[type.dataVariable] as? [String: Any] ?? [:]) - .reduce(into: [String: String]()) { $0[$1.key] = "\($1.value)" } - - return SBUMessageTemplate.Payload.Child(key: key, datas: datas) - } catch { - SBULog.error(error.localizedDescription) - return nil - } - } -} diff --git a/Sources/MessageTemplate/Processor/SBUMessageTemplate.PayloadType.swift b/Sources/MessageTemplate/Processor/SBUMessageTemplate.PayloadType.swift deleted file mode 100644 index ba36f7cb..00000000 --- a/Sources/MessageTemplate/Processor/SBUMessageTemplate.PayloadType.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// SBUMessageTemplate.PayloadType.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/03/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import Foundation - -extension SBUMessageTemplate { - enum PayloadType: String { - case `default` - case unknown - - static let typeKey = "type" - - init(with template: [String: Any]) { - guard let type = template[Self.typeKey] as? String else { - self = .default - return - } - - self = PayloadType(rawValue: type) ?? .unknown - } - } -} diff --git a/Sources/MessageTemplate/Processor/SBUMessageTemplate.TemplateList.swift b/Sources/MessageTemplate/Processor/SBUMessageTemplate.TemplateList.swift deleted file mode 100644 index 66b5205a..00000000 --- a/Sources/MessageTemplate/Processor/SBUMessageTemplate.TemplateList.swift +++ /dev/null @@ -1,120 +0,0 @@ -// -// SBUMessageTemplate.TemplateList.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/02/19. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit -import SendbirdChatSDK - -// MARK: - TemplateList object -extension SBUMessageTemplate { - struct TemplateList { - var templates: [SBUMessageTemplate.TemplateModel] = [] - - enum CodingKeys: String, CodingKey { - case templates - } - - init(with jsonData: Data) { - do { - guard let json = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] else { return } - guard let templateList = json[CodingKeys.templates.rawValue] as? [[String: Any]] else { return } - - self.templates = try templateList.compactMap { templateDic in - try TemplateModel.createTemplate(with: templateDic) - } - } catch { - SBULog.error(error.localizedDescription) - } - } - } -} - -extension SBUMessageTemplate { - struct TemplateModel: Codable { - let key: String // unique - let name: String - let uiTemplate: String // JSON_OBJECT - let dataTemplate: String // JSON_OBJECT - let colorVariables: String // JSON_OBJECT - let createdAt: Int64 - let updatedAt: Int64 - - enum CodingKeys: String, CodingKey { - case key - case name - case createdAt = "created_at" - case updatedAt = "updated_at" - case uiTemplate = "ui_template" - case dataTemplate = "data_template" - case colorVariables = "color_variables" - } - - var uiTemplateRemovedEscape: String { - self.uiTemplate.removedNewLineEscape - } - - var colorDictionary: [String: String] { - do { - let data = Data(self.colorVariables.utf8) - guard let variables = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else { return [:] } - return variables.reduce(into: [String: String]()) { $0[$1.key] = "\($1.value)" } - } catch { - SBULog.error(error.localizedDescription) - return [:] - } - } - } -} - -extension SBUMessageTemplate { - struct RawValues { - let values: [String: Any] - - func value(from key: SBUMessageTemplate.TemplateModel.CodingKeys) -> Any? { - values[key.rawValue] - } - } -} - -extension SBUMessageTemplate.TemplateModel { - // original - static func createTemplate(with data: [String: Any]) throws -> SBUMessageTemplate.TemplateModel? { - let template = SBUMessageTemplate.RawValues(values: data) - if let key = template.value(from: .key) as? String, - let name = template.value(from: .name) as? String, - let createdAt = template.value(from: .createdAt) as? Int64, - let updatedAt = template.value(from: .updatedAt) as? Int64 { - - let uiTemplate = template.value(from: .uiTemplate) as? [String: Any] ?? [:] - let dataTemplate = template.value(from: .dataTemplate) as? [String: Any] ?? [:] - let colorVariables = template.value(from: .colorVariables) as? [String: Any] ?? [:] - - let uiTemplateJson = try JSONSerialization.data(withJSONObject: uiTemplate, options: []) - let uiTemplateJsonStr = String(data: uiTemplateJson, encoding: .utf8) - - let dataTemplateJson = try JSONSerialization.data(withJSONObject: dataTemplate, options: []) - let dataTemplateJsonStr = String(data: dataTemplateJson, encoding: .utf8) - - let colorVariablesJson = try JSONSerialization.data(withJSONObject: colorVariables, options: []) - let colorVariablesJsonStr = String(data: colorVariablesJson, encoding: .utf8) - - let template = SBUMessageTemplate.TemplateModel( - key: key, - name: name, - uiTemplate: uiTemplateJsonStr ?? "", - dataTemplate: dataTemplateJsonStr ?? "", - colorVariables: colorVariablesJsonStr ?? "", - createdAt: createdAt, - updatedAt: updatedAt - ) - - return template - } - return nil - } - -} diff --git a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+Events.swift b/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+Events.swift deleted file mode 100644 index cd5845c7..00000000 --- a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+Events.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// SBUMessageTemplate.Renderer+Events.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/10/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -protocol MessageTemplateRendererDelegate: AnyObject { - func messageTemplateRender(_ renderer: SBUMessageTemplate.Renderer, didFinishLoadingImage imageView: UIImageView) - func messageTemplateNeedReloadCell(_ renderer: SBUMessageTemplate.Renderer) - func messageTemplateRender(_ renderer: SBUMessageTemplate.Renderer, didUpdateValue value: Any, forKey key: SBUMessageTemplate.Renderer.EventSourceKeys) -} -extension MessageTemplateRendererDelegate { // optional - func messageTemplateRender(_ renderer: SBUMessageTemplate.Renderer, didUpdateValue value: Any, forKey key: SBUMessageTemplate.Renderer.EventSourceKeys) { } -} - -protocol MessageTemplateRendererDataSource: AnyObject { - func messageTemplateRender(_ renderer: SBUMessageTemplate.Renderer, valueFor key: SBUMessageTemplate.Renderer.EventSourceKeys) -> Any? -} - -extension SBUMessageTemplate.Renderer { - enum EventSourceKeys: String { - case templateFactory - case carouselRestoreView - } -} - -extension SBUMessageTemplate.Renderer { - func rendererValueFor( - key: EventSourceKeys, - defaultValue: Element - ) -> Element { - (self.dataSource?.messageTemplateRender(self, valueFor: key) as? Element) ?? defaultValue - } - - func rendererValueFor( - key: EventSourceKeys - ) -> Element? { - (self.dataSource?.messageTemplateRender(self, valueFor: key) as? Element) - } - - func rendererUpdateValue( - _ value: Element, - forKey key: EventSourceKeys - ) { - self.delegate?.messageTemplateRender(self, didUpdateValue: value, forKey: key) - } -} diff --git a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+RenderItems.swift b/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+RenderItems.swift deleted file mode 100644 index 31f316d3..00000000 --- a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+RenderItems.swift +++ /dev/null @@ -1,857 +0,0 @@ -// -// SBUMessageTemplate.Renderer+RenderItems.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/10/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -extension SBUMessageTemplate.Renderer { - - func render(template: SBUMessageTemplate.Syntax.TemplateView) -> Bool { - guard let body = template.body else { return false } - - // AutoLayout - self.addSubview(self.contentView) - self.rendererConstraints += self.contentView.sbu_constraint_v2( - equalTo: self, - leading: 0, - trailing: 0, - top: 0, - bottom: 0 - ) - - // Render subview - self.contentView.addSubview(self.bodyView) - self.rendererConstraints += self.bodyView.sbu_constraint_v2( - equalTo: self.contentView, - leading: 0, - trailing: 0, - top: 0, - bottom: 0 - ) - - self.renderBody(body) - NSLayoutConstraint.activate(self.rendererConstraints) - return true - } - - // MARK: - Body - func renderBody(_ body: SBUMessageTemplate.Syntax.Body) { - guard let items = body.items else { return } - - var prevView: UIView = self.bodyView - var prevItem: SBUMessageTemplate.Syntax.View? - var currentView: UIView = self.bodyView - for (index, item) in items.enumerated() { - let isLastItem = (index == items.count - 1) - - switch item { - case .box(let boxItem): - let boxView = self.renderBox( - item: boxItem, - parentView: self.bodyView, - prevView: prevView, - prevItem: prevItem, - isLastItem: isLastItem - ) - currentView = boxView - self.bodyView.addSubview(boxView) - prevItem = boxItem - - case .text(let textItem): - let textLabel = self.renderText( - item: textItem, - parentView: self.bodyView, - prevView: prevView, - prevItem: prevItem, - isLastItem: isLastItem - ) - currentView = textLabel - self.bodyView.addSubview(textLabel) - prevItem = textItem - - case .image(let imageItem): - let imageView = self.renderImage( - imageType: imageItem, - parentView: self.bodyView, - prevView: prevView, - prevItem: prevItem, - isLastItem: isLastItem - ) - currentView = imageView - self.bodyView.addSubview(imageView) - prevItem = imageItem - - case .textButton(let textButtonItem): - let textButton = self.renderTextButton( - item: textButtonItem, - parentView: self.bodyView, - prevView: prevView, - prevItem: prevItem, - isLastItem: isLastItem - ) - currentView = textButton - self.bodyView.addSubview(textButton) - prevItem = textButtonItem - - case .imageButton(let imageButtonItem): - let imageButton = self.renderImage( - imageType: imageButtonItem, - parentView: self.bodyView, - prevView: prevView, - prevItem: prevItem, - isLastItem: isLastItem - ) - currentView = imageButton - self.bodyView.addSubview(imageButton) - prevItem = imageButtonItem - - case .carouselView(let carouselItem): - let carouselView = self.renderCarouselView( - item: carouselItem, - parentView: self.bodyView, - prevView: prevView, - prevItem: prevItem, - isLastItem: isLastItem - ) - currentView = carouselView - self.bodyView.addSubview(carouselView) - prevItem = carouselItem - } - - prevView = currentView - } - } - - // MARK: - Box - func renderBox( - item: SBUMessageTemplate.Syntax.Box, - parentView: UIView, - prevView: UIView, - prevItem: SBUMessageTemplate.Syntax.View? = nil, - itemsAlign: SBUMessageTemplate.Syntax.ItemsAlign? = .defaultAlign(), - layout: SBUMessageTemplate.Syntax.LayoutType = .column, - isLastItem: Bool = false - ) -> UIView { - let baseView = SBUMessageTemplate.Renderer.BoxBaseView(item: item, layout: layout) - let boxView = SBUMessageTemplate.Renderer.BoxView() - boxView.layout = layout - baseView.clipsToBounds = true - - baseView.addSubview(boxView) - parentView.addSubview(baseView) - - // Items - self.renderBoxItems(item, parentView: baseView) - - // View Style - self.renderViewStyle(with: item, to: baseView) - - // Layout - self.renderViewLayout( - with: item, - to: baseView, - parentView: parentView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - - // Action - self.setAction(on: baseView, item: item) - - return baseView - } - - // MARK: BoxItems - func renderBoxItems( - _ item: SBUMessageTemplate.Syntax.Box, - parentView: UIView - ) { - guard let items = item.items else { return } - - let parentBoxView = parentView.subviews[0] - // INFO: SideViews are placed at the top/bottom or left/right and used for align. According to Align, - // the area of the SideView is adjusted in the form of holding the position of the actual item. - let sideView1 = UIView() - sideView1.tag = Self.sideViewTypeLeft - let sideView2 = UIView() - sideView2.tag = Self.sideViewTypeRight - parentBoxView.addSubview(sideView1) - - var prevView: UIView = sideView1 - var prevItem: SBUMessageTemplate.Syntax.View? - var currentView: UIView = sideView1 - let itemsAlign = item.align - let layout = item.layout - - var haveWidthFillParent = false - var heightFillParentCount = 0 - var haveHeightFillParent = false - - for (index, item) in items.enumerated() { - let isLastItem = false// edge case (wrap contents separate issue) - - switch item { - case .box(let boxItem): - let boxView = self.renderBox( - item: boxItem, - parentView: parentBoxView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - currentView = boxView - prevItem = boxItem - - case .text(let textItem): - let textLabel = self.renderText( - item: textItem, - parentView: parentBoxView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - currentView = textLabel - prevItem = textItem - - case .image(let imageItem): - let imageView = self.renderImage( - imageType: imageItem, - parentView: parentBoxView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - currentView = imageView - prevItem = imageItem - - case .textButton(let textButtonItem): - let textButton = self.renderTextButton( - item: textButtonItem, - parentView: parentBoxView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout - ) - currentView = textButton - prevItem = textButtonItem - - case .imageButton(let imageButtonItem): - let imageButton = self.renderImage( - imageType: imageButtonItem, - parentView: parentBoxView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - currentView = imageButton - prevItem = imageButtonItem - - case .carouselView(let carouselItem): - let carouselView = self.renderCarouselView( - item: carouselItem, - parentView: self.bodyView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - currentView = carouselView - prevItem = carouselItem - } - - if prevItem?.width.type == .flex, - prevItem?.width.value == flexTypeFillValue { - haveWidthFillParent = true - } - if prevItem?.height.type == .flex, - prevItem?.height.value == flexTypeFillValue { - heightFillParentCount += 1 - haveHeightFillParent = true - } - - parentBoxView.addSubview(currentView) - prevView = currentView - currentView.setContentHuggingPriority(UILayoutPriority(Float(250 - index)), for: .horizontal) - } - - parentBoxView.addSubview(sideView2) - - if item.layout == .row { // Direction - Horizontal - self.rendererConstraints += sideView1.sbu_constraint_v2(equalTo: parentBoxView, top: 0, bottom: 0) - self.rendererConstraints += sideView2.sbu_constraint_v2(equalTo: parentBoxView, top: 0, bottom: 0) - - self.rendererConstraints += sideView1.sbu_constraint_v2(equalTo: parentBoxView, leading: 0) - self.rendererConstraints += sideView2.sbu_constraint_v2(equalTo: parentBoxView, trailing: 0) - - if haveWidthFillParent || item.align.horizontal == .center { - self.rendererConstraints += sideView1.sbu_constraint_v2( - widthAnchor: sideView2.widthAnchor, - width: 0 - ) - } - - // INFO: When all items are fill type, the horizontal widths are the same - let fillParentViews = parentBoxView - .subviews - .compactMap { $0 as? SBUMessageTemplate.Renderer.BaseView } - .filter { - ($0.width.type == .flex) - && ($0.width.value == flexTypeFillValue) - } - let fillParentBaseWidthAnchor = fillParentViews.first?.widthAnchor - - if let fillParentBaseWidthAnchor = fillParentBaseWidthAnchor { - for view in fillParentViews { - self.rendererConstraints += view.sbu_constraint_v2( - widthAnchor: fillParentBaseWidthAnchor, - width: 0 - ) - } - } - - switch item.align.horizontal { - case .left: - self.rendererConstraints += sideView1.sbu_constraint_v2(width: 0) - self.rendererConstraints += sideView2.sbu_constraint_greaterThan_v2(width: 0) - case .center: - if haveWidthFillParent { - self.rendererConstraints += sideView1.sbu_constraint_v2(width: 0) - } else { - self.rendererConstraints += sideView1.sbu_constraint_greaterThan_v2(width: 0) - } - self.rendererConstraints += sideView2.sbu_constraint_greaterThan_v2(width: 0) - case .right: - self.rendererConstraints += sideView1.sbu_constraint_greaterThan_v2(width: 0) - self.rendererConstraints += sideView2.sbu_constraint_v2(width: 0) - default: - break - } - - let prevItemRightMargin = prevItem?.viewStyle.margin?.right ?? 0.0 - self.rendererConstraints += sideView2.sbu_constraint_equalTo_v2( - leadingAnchor: prevView.trailingAnchor, - leading: (item.viewStyle.margin?.left ?? 0.0) + prevItemRightMargin - ) - - } else { // Direction - Vertical - self.rendererConstraints += sideView1.sbu_constraint_v2(equalTo: parentBoxView, leading: 0, trailing: 0, top: 0) - self.rendererConstraints += sideView2.sbu_constraint_v2(equalTo: parentBoxView, leading: 0, trailing: 0, bottom: 0) - - if haveHeightFillParent || item.align.vertical == .center { - self.rendererConstraints += sideView1.sbu_constraint_v2( - heightAnchor: sideView2.heightAnchor, - height: 0 - ) - } - - // INFO: When all items are fill type, the vertical heights are the same - let fillParentViews = parentBoxView - .subviews - .compactMap { $0 as? SBUMessageTemplate.Renderer.BaseView } - .filter { - ($0.height.type == .flex) - && ($0.height.value == flexTypeFillValue) - } - let fillParentBaseHeightAnchor = fillParentViews.first?.heightAnchor - - if let fillParentBaseHeightAnchor = fillParentBaseHeightAnchor { - for view in fillParentViews { - self.rendererConstraints += view.sbu_constraint_v2( - heightAnchor: fillParentBaseHeightAnchor, - height: 0 - ) - } - } - - switch item.align.vertical { - case .top: - self.rendererConstraints += sideView1.sbu_constraint_v2(height: 0) - self.rendererConstraints += sideView2.sbu_constraint_greaterThan_v2(height: 0) - case .center: - if haveHeightFillParent { - self.rendererConstraints += sideView1.sbu_constraint_v2(height: 0) - } else { - self.rendererConstraints += sideView1.sbu_constraint_greaterThan_v2(height: 0) - } - self.rendererConstraints += sideView2.sbu_constraint_greaterThan_v2(height: 0) - case .bottom: - self.rendererConstraints += sideView1.sbu_constraint_greaterThan_v2(height: 0) - self.rendererConstraints += sideView2.sbu_constraint_v2(height: 0) - default: - break - } - - let prevItemBottomMargin = prevItem?.viewStyle.margin?.bottom ?? 0.0 - self.rendererConstraints += sideView2.sbu_constraint_equalTo_v2( - topAnchor: prevView.bottomAnchor, - top: prevItemBottomMargin - ) - } - } - - // MARK: - Text - func renderText( - item: SBUMessageTemplate.Syntax.Text, - parentView: UIView, - prevView: UIView, - prevItem: SBUMessageTemplate.Syntax.View? = nil, - itemsAlign: SBUMessageTemplate.Syntax.ItemsAlign? = .defaultAlign(), - layout: SBUMessageTemplate.Syntax.LayoutType = .column, - isLastItem: Bool = false - ) -> UIView { - return renderCommonText( - item: item, - parentView: parentView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - } - - // MARK: - TextButton - func renderTextButton( - item: SBUMessageTemplate.Syntax.TextButton, - parentView: UIView, - prevView: UIView, - prevItem: SBUMessageTemplate.Syntax.View? = nil, - itemsAlign: SBUMessageTemplate.Syntax.ItemsAlign? = .defaultAlign(), - layout: SBUMessageTemplate.Syntax.LayoutType = .column, - isLastItem: Bool = false - ) -> UIView { - return renderCommonText( - item: item, - parentView: parentView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - } - - // MARK: - CommonText: Text, TextButton - func renderCommonText( - item: SBUMessageTemplate.Syntax.View, - parentView: UIView, - prevView: UIView, - prevItem: SBUMessageTemplate.Syntax.View? = nil, - itemsAlign: SBUMessageTemplate.Syntax.ItemsAlign? = .defaultAlign(), - layout: SBUMessageTemplate.Syntax.LayoutType = .column, - isLastItem: Bool = false - ) -> UIView { - - let isTextButton = (item is SBUMessageTemplate.Syntax.TextButton) - - let baseView = isTextButton - ? SBUMessageTemplate.Renderer.TextButtonBaseView(item: item, layout: layout) - : SBUMessageTemplate.Renderer.TextBaseView(item: item, layout: layout) - baseView.clipsToBounds = true - - var text: String? - var numberOfLines = 0 - var textStyle: SBUMessageTemplate.Syntax.TextStyle? - var textAlign: SBUMessageTemplate.Syntax.TextAlign? - - switch item { - case let textItem as SBUMessageTemplate.Syntax.Text: - text = textItem.text - numberOfLines = textItem.maxTextLines - textStyle = textItem.textStyle - textAlign = textItem.align - case let textButtonItem as SBUMessageTemplate.Syntax.TextButton: - text = textButtonItem.text - numberOfLines = textButtonItem.maxTextLines - textStyle = textButtonItem.textStyle - default: - break - } - - let label = isTextButton ? SBUMessageTemplate.Renderer.TextButton() : SBUMessageTemplate.Renderer.Label() - label.padding = item.viewStyle.padding - label.updateLayoutHandler = { constraints, deactivatedConstraints in - NSLayoutConstraint.deactivate(self.rendererConstraints) - self.rendererConstraints += constraints - self.rendererConstraints = self.rendererConstraints.filter { !deactivatedConstraints.contains($0) } - NSLayoutConstraint.activate(self.rendererConstraints) - } - - let textWithoutLineChange: NSAttributedString? = { - guard let text = text else { return nil } - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineBreakStrategy = .pushOut - let attributes = [NSAttributedString.Key.paragraphStyle: paragraphStyle] - return NSAttributedString( - string: text, - attributes: attributes - ) - }() - - label.attributedText = textWithoutLineChange - - label.numberOfLines = numberOfLines - label.lineBreakMode = .byTruncatingTail - label.clipsToBounds = isTextButton - - // INFO: Edge case - text wrap issue - if baseView.layout == .row { - let totalTextWidth = parentView - .subviews - .compactMap { $0.subviews.first as? SBUMessageTemplate.Renderer.Label } - .filter { $0.isWrapTypeWidth } - .reduce(0) { $0 + $1.fullTextViewWidth } - - if self.maxWidth > 0, totalTextWidth >= self.maxWidth { - label.numberOfLines = 1 - } - } - - baseView.addSubview(label) - parentView.addSubview(baseView) - - // Text Style - if let textStyle = textStyle { - var fontSize = self.themeForDefault.textFont.pointSize - if let size = textStyle.size { - fontSize = CGFloat(size) - } - - switch textStyle.weight { - case .normal: - label.font = self.templateFont(size: fontSize) - case .bold: - label.font = self.templateFont(size: fontSize, weight: .bold) - case .none: - if item is SBUMessageTemplate.Syntax.TextButton { - label.font = self.templateFont(size: fontSize, weight: .bold) - } - } - - if let textColor = textStyle.color { - label.textColor = UIColor(hexString: textColor) - } else { - if item is SBUMessageTemplate.Syntax.TextButton { - label.textColor = self.themeForDefault.textButtonTitleColor - } else { - label.textColor = self.themeForDefault.textColor - } - } - - } else { - label.font = self.templateFont(size: self.themeForDefault.textFont.pointSize) - if item is SBUMessageTemplate.Syntax.TextButton { - label.textColor = self.themeForDefault.textButtonTitleColor - } else { - label.textColor = self.themeForDefault.textColor - } - label.contentMode = .center // TODO: check - label.textAlignment = isTextButton ? .center : .left - } - - if let textAlign = textAlign { - switch textAlign.vertical { - case .top: - label.contentMode = .top - case .center: - label.contentMode = .center - case .bottom: - label.contentMode = .bottom - case .none: - break - } - - switch textAlign.horizontal { - case .left: - label.textAlignment = .left - case .center: - label.textAlignment = .center - case .right: - label.textAlignment = .right - case .none: - break - } - } else { - // Text(no textAlign) | TextButton - label.contentMode = .center - label.textAlignment = .center - } - - // View Style - self.renderViewStyle(with: item, to: baseView) - - // Layout - self.renderViewLayout( - with: item, - to: baseView, - parentView: parentView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - - if baseView.layout == .row { - if item.width.type == .flex, item.width.value == flexTypeWrapValue { - label.setContentCompressionResistancePriority(UILayoutPriority(751), for: NSLayoutConstraint.Axis.horizontal) - } - } else { - if item.height.type == .flex, item.height.value == flexTypeWrapValue { - label.setContentCompressionResistancePriority(UILayoutPriority(751), for: NSLayoutConstraint.Axis.vertical) - } - } - - if label.numberOfLines == 0 { - label.setContentCompressionResistancePriority(UILayoutPriority(751), for: NSLayoutConstraint.Axis.vertical) - } - - // Action - self.setAction(on: baseView, item: item) - - return baseView - } - - // MARK: - CarouselView - - func renderCarouselView( - item: SBUMessageTemplate.Syntax.CarouselItem, - parentView: UIView, - prevView: UIView, - prevItem: SBUMessageTemplate.Syntax.View? = nil, - itemsAlign: SBUMessageTemplate.Syntax.ItemsAlign = .defaultAlign(), - layout: SBUMessageTemplate.Syntax.LayoutType = .column, - isLastItem: Bool = false - ) -> UIView { - let baseView = SBUMessageTemplate.Renderer.CarouselBaseView(item: item, layout: layout) - - let factory: SBUMessageTemplate.Syntax.Identifier.Factory? = self.rendererValueFor(key: .templateFactory) // cacheKey - let restoreView: SBUBaseCarouselView? = self.rendererValueFor(key: .carouselRestoreView) - let carouselView = restoreView?.cacheKey?.isEqualCacheKey(factory) == true ? restoreView! : SBUBaseCarouselView(frame: .init(x: 0, y: 0, width: 1, height: 1)) - - if restoreView != carouselView { - let renderers = item.items?.compactMap { data in - SBUMessageTemplate.Renderer.CarouselRenderer( - data: data, - maxWidth: item.carouselStyle.maxChildWidth, - actionHandler: self.actionHandler - ) - } ?? [] - - let padding = UIEdgeInsets( - top: item.viewStyle.padding?.top ?? 0, - left: item.viewStyle.padding?.left ?? 0, - bottom: item.viewStyle.padding?.bottom ?? 0, - right: item.viewStyle.padding?.right ?? 0 - ) - - carouselView.configure( - with: SBUBaseCarouselViewParams( - padding: padding, - spacing: item.carouselStyle.spacing, - renderers: renderers - ) - ) - - carouselView.cacheKey = factory - - self.rendererUpdateValue(carouselView, forKey: .carouselRestoreView) - } else { - carouselView.setNeedsLayout() - carouselView.layoutSubviews() - } - - baseView.addSubview(carouselView) - parentView.addSubview(baseView) - - // For `carousel view`, `padding` is used inside the carousel container (scroll view padding). - // `padding` is mapped to `nil` to avoid having to check the item type inside renderViewLayout(:) where it is used. - item.viewStyle.padding = nil - - // View Style - self.renderViewStyle(with: item, to: baseView) - - // Layout - self.renderViewLayout( - with: item, - to: baseView, - parentView: parentView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - - // Action - self.setAction(on: baseView, item: item) - - return baseView - } - - // MARK: - Image - func renderImage( - imageType: MessageTemplateImageRatioType, - parentView: UIView, - prevView: UIView, - prevItem: SBUMessageTemplate.Syntax.View? = nil, - itemsAlign: SBUMessageTemplate.Syntax.ItemsAlign = .defaultAlign(), - layout: SBUMessageTemplate.Syntax.LayoutType = .column, - isLastItem: Bool = false - ) -> UIView { - let item = imageType as SBUMessageTemplate.Syntax.View - let baseView = SBUMessageTemplate.Renderer.ImageBaseView(item: item, layout: layout) - baseView.clipsToBounds = true - let imageView = SBUMessageTemplate.Renderer.ImageView() - - // INFO: Edge case - image height is wrap - imageView.contentMode = imageType.imageViewContentMode(with: itemsAlign) - imageView.needResizeImage = imageType.needResizeImage - - baseView.addSubview(imageView) - parentView.addSubview(baseView) - - self.rendererConstraints += imageView.sbu_constraint_equalTo_v2( - centerXAnchor: baseView.centerXAnchor, - centerX: 0, - centerYAnchor: baseView.centerYAnchor, - centerY: 0 - ) - - // View Style - self.renderViewStyle(with: item, to: baseView) - - // Layout - self.renderViewLayout( - with: item, - to: baseView, - parentView: parentView, - prevView: prevView, - prevItem: prevItem, - itemsAlign: itemsAlign, - layout: layout, - isLastItem: isLastItem - ) - - let constraints = imageType.imagePlaceholderConstraints( - view: imageView, - saveCache: true - ) - - NSLayoutConstraint.activate(constraints) - - // Action - self.setAction(on: baseView, item: item) - - // Load image - if imageType.isForDownloadingTemplate { - imageView.updateDownloadTemplate(tintColor: imageType.imageStyle.tintColorValue) - return baseView - } - - imageView.loadImage( - urlString: imageType.imageUrl, - subPath: SBUCacheManager.PathType.template, - autoset: false - ) { [weak self, weak item, weak imageView] result in - guard let self, let item, let imageView, let image = result.image else { return } - - self.setImage( - image, - imageView: imageView, - imageType: imageType, - placeholderConstraints: constraints - ) - } - - return baseView - } - - // MARK: - ImageButton -// func renderImageButton( -// item: SBUMessageTemplate.Syntax.ImageButton, -// parentView: UIView, -// prevView: UIView, -// prevItem: SBUMessageTemplate.Syntax.View? = nil, -// itemsAlign: SBUMessageTemplate.Syntax.ItemsAlign? = .defaultAlign(), -// layout: SBUMessageTemplate.Syntax.LayoutType = .column, -// isLastItem: Bool = false -// ) -> UIView { -// let baseView = SBUMessageTemplate.Renderer.ImageButtonBaseView(item: item, layout: layout) -// baseView.clipsToBounds = true -// let imageButton = SBUMessageTemplate.Renderer.ImageButton() -// -// // Image Style -// imageButton.contentMode = item.imageStyle.contentMode -// imageButton.imageView?.contentMode = item.imageStyle.contentMode -// -// baseView.addSubview(imageButton) -// parentView.addSubview(baseView) -// -// self.rendererConstraints += imageButton.sbu_constraint_equalTo_v2( -// centerXAnchor: baseView.centerXAnchor, -// centerX: 0, -// centerYAnchor: baseView.centerYAnchor, -// centerY: 0 -// ) -// -// // View Style -// self.renderViewStyle(with: item, to: baseView) -// -// // Layout -// self.renderViewLayout( -// with: item, -// to: baseView, -// parentView: parentView, -// prevView: prevView, -// prevItem: prevItem, -// itemsAlign: itemsAlign, -// layout: layout, -// isLastItem: isLastItem -// ) -// -// // Action -// self.setAction(on: baseView, item: item) -// -// let constraints = item.imagePlaceholderConstraints( -// view: imageButton, -// saveCache: false -// ) -// -// NSLayoutConstraint.activate(constraints) -// -// imageButton.loadImage( -// urlString: item.imageUrl, -// for: .normal, -// subPath: SBUCacheManager.PathType.template, -// completion: { [weak self, weak imageButton, weak item] _ in -// guard let self, let imageButton, let item else { return } -// -// self.setImageButton( -// imageButton, -// item: item, -// placeholderConstraints: constraints -// ) -// } -// ) -// -// return baseView -// } -} diff --git a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+RenderStyles.swift b/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+RenderStyles.swift deleted file mode 100644 index 0fc307b6..00000000 --- a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer+RenderStyles.swift +++ /dev/null @@ -1,237 +0,0 @@ -// -// SBUMessageTemplate.Renderer+RenderStyles.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/10/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -extension SBUMessageTemplate.Renderer { - // MARK: - ViewStyle - func renderViewStyle( - with item: SBUMessageTemplate.Syntax.View, - to view: SBUMessageTemplate.Renderer.BaseView - ) { - if item is SBUMessageTemplate.Syntax.CarouselItem { - view.backgroundColor = .clear - return - } - - if let backgroundColor = item.viewStyle.backgroundColor { - view.backgroundColor = UIColor(hexString: backgroundColor) - } else if item is SBUMessageTemplate.Syntax.TextButton { - view.backgroundColor = self.themeForDefault.textButtonBackgroundColor - } - - if let urlString = item.viewStyle.backgroundImageUrl, - let url = UIImage.sbu_imageDownloader.url(string: urlString), - let image = UIImage.sbu_imageDownloader.image(url: url) { - view.backgroundImageURLView.image = image - } - - if let borderWidth = item.viewStyle.borderWidth { - view.layer.borderWidth = CGFloat(borderWidth) - } - - if let borderColor = item.viewStyle.borderColor { - view.layer.borderColor = UIColor(hexString: borderColor).cgColor - } else { - view.layer.borderColor = UIColor.clear.cgColor - } - } - - // MARK: - ViewLayout - func renderViewLayout( - with item: SBUMessageTemplate.Syntax.View, - to baseView: UIView, - parentView: UIView, - prevView: UIView, - prevItem: SBUMessageTemplate.Syntax.View? = nil, - itemsAlign: SBUMessageTemplate.Syntax.ItemsAlign? = .defaultAlign(), - layout: SBUMessageTemplate.Syntax.LayoutType? = .column, - isLastItem: Bool = false - ) { - var marginInsets: UIEdgeInsets = .zero - if let margin = item.viewStyle.margin { - marginInsets = UIEdgeInsets( - top: margin.top, - left: margin.left, - bottom: margin.bottom, - right: margin.right - ) - } - - // Size - let width = item.width - let height = item.height - - let horizontalAlign = itemsAlign?.horizontal ?? .left - let verticalAlign = itemsAlign?.vertical ?? .top - let subView = !baseView.subviews.isEmpty ? baseView.subviews[0] : nil - - // Size: width - let padding = item.viewStyle.padding - let paddingWidth = (padding?.left ?? 0.0) + (padding?.right ?? 0.0) - - if width.type == .fixed { - self.rendererConstraints += subView?.sbu_constraint_v2(width: CGFloat(width.value) - paddingWidth) ?? [] - } else { - self.rendererConstraints += subView?.sbu_constraint_lessThan_v2(widthAnchor: baseView.widthAnchor, width: -paddingWidth) ?? [] - } - - // left/right - if layout == .column { // default - if width.type == .flex, width.value == flexTypeFillValue { - // default - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, centerX: 0) - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, leading: marginInsets.left) - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, trailing: -marginInsets.right) - } else { - /** - - left: |ㅁ----| - center: |--ㅁ--| - right: |----ㅁ| - */ - - switch horizontalAlign { - case .left: - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, leading: marginInsets.left) - self.rendererConstraints += baseView.sbu_constraint_v2(lessThanOrEqualTo: parentView, trailing: -marginInsets.right) - case .center: - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, centerX: 0) - self.rendererConstraints += baseView.sbu_constraint_v2(greaterThanOrEqualTo: parentView, leading: marginInsets.left) - self.rendererConstraints += baseView.sbu_constraint_v2(lessThanOrEqualTo: parentView, trailing: -marginInsets.right) - case .right: - self.rendererConstraints += baseView.sbu_constraint_v2(greaterThanOrEqualTo: parentView, leading: marginInsets.left) - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, trailing: -marginInsets.right) - } - } - - } else { // row - // left anchor - let prevItemRightMargin = prevItem?.viewStyle.margin?.right ?? 0.0 - self.rendererConstraints += baseView.sbu_constraint_equalTo_v2( - leadingAnchor: prevView.trailingAnchor, - leading: marginInsets.left + prevItemRightMargin - ) - - // right anchor - if isLastItem { - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, trailing: -marginInsets.right) - } - } - - // MARK: - Body - - // Size: height - let paddingHeight = (padding?.top ?? 0.0) + (padding?.bottom ?? 0.0) - - if height.type == .fixed { - self.rendererConstraints += subView?.sbu_constraint_v2(height: CGFloat(height.value) - paddingHeight) ?? [] - } else { - self.rendererConstraints += subView?.sbu_constraint_lessThan_v2(heightAnchor: baseView.heightAnchor, height: -paddingHeight) ?? [] - } - - // top/bottom - if layout == .column { // Default - // top anchor - if prevItem == nil && prevView.tag != Self.sideViewTypeLeft { - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, top: marginInsets.top) - } else { - let prevItemBottomMargin = prevItem?.viewStyle.margin?.bottom ?? 0.0 - self.rendererConstraints += baseView.sbu_constraint_equalTo_v2( - topAnchor: prevView.bottomAnchor, - top: marginInsets.top + prevItemBottomMargin - ) - } - - // bottom anchor - if isLastItem { - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, bottom: marginInsets.bottom) - } - } else { // row - /** - - top center bottom - -- -- -- - ㅁ ㅣ ㅣ - ㅣ ㅁ ㅣ - ㅣ ㅣ ㅁ - -- -- -- - */ - - if height.type == .flex, height.value == flexTypeFillValue { - // default - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, centerY: 0) - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, top: marginInsets.top) - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, bottom: marginInsets.bottom) - } else { - switch verticalAlign { - case .top: - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, top: marginInsets.top) - self.rendererConstraints += baseView.sbu_constraint_v2(lessThanOrEqualTo: parentView, bottom: marginInsets.bottom) - case .center: - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, centerY: 0) - self.rendererConstraints += baseView.sbu_constraint_v2(greaterThanOrEqualTo: parentView, top: marginInsets.top) - self.rendererConstraints += baseView.sbu_constraint_v2(lessThanOrEqualTo: parentView, bottom: marginInsets.bottom) - case .bottom: - self.rendererConstraints += baseView.sbu_constraint_v2(equalTo: parentView, bottom: marginInsets.bottom) - self.rendererConstraints += baseView.sbu_constraint_v2(greaterThanOrEqualTo: parentView, top: marginInsets.top) - } - } - } - - // Padding - var paddingInsets = UIEdgeInsets.zero - if let padding = item.viewStyle.padding { - paddingInsets = UIEdgeInsets( - top: padding.top, - left: padding.left, - bottom: padding.bottom, - right: padding.right - ) - } - if !baseView.subviews.isEmpty { - self.rendererConstraints += subView?.sbu_constraint_v2( - equalTo: baseView, - left: paddingInsets.left, - top: paddingInsets.top, - bottom: paddingInsets.bottom, - priority: .required - ) ?? [] - - // INFO: Edge case - for right padding constraint adjustment - if let baseView = baseView as? SBUMessageTemplate.Renderer.BaseView, - let rightPaddingConstraint = subView?.rightAnchor.constraint(equalTo: baseView.rightAnchor, constant: -paddingInsets.right) { - baseView.rightPaddingConstraint = rightPaddingConstraint - baseView.rightPaddingConstraint?.priority = .required - - if let baseViewRightPaddingConstraint = baseView.rightPaddingConstraint { - self.rendererConstraints += [baseViewRightPaddingConstraint] - } - } - } - } - - // MARK: - Action - func setAction( - on view: UIView, - item: SBUMessageTemplate.Syntax.View - ) { - guard !view.subviews.isEmpty, let action = item.action else { return } - let subView = view.subviews[0] - - if let button = subView as? ActionItemButton { - button.action = action - button.addTarget(self, action: #selector(didTapAction), for: .touchUpInside) - } else { - let tapGesture = ActionTapGesture(target: self, action: #selector(didTapActionGestures(_:))) - tapGesture.action = action - view.addGestureRecognizer(tapGesture) - view.isUserInteractionEnabled = true - } - } -} diff --git a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.Image.swift b/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.Image.swift deleted file mode 100644 index a29171f5..00000000 --- a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.Image.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// SBUMessageTemplate.Renderer.Image.swift -// -// Created by Jed Gyeong on 10/17/23. -// Copyright © 2023 SendBird, Inc. All rights reserved. -// - -import Foundation -import UIKit - -extension SBUMessageTemplate.Renderer { - func setImage( - _ image: UIImage, - imageView: SBUMessageTemplate.Renderer.ImageView, - imageType: MessageTemplateImageRatioType, - placeholderConstraints: [NSLayoutConstraint] - ) { - let item = imageType as SBUMessageTemplate.Syntax.View - let image = image.sbu_with( - tintColor: imageType.imageStyle.tintColorValue, - forTemplate: true - ) - imageView.identifier = item.identifier - imageView.originalImage = image - - NSLayoutConstraint.deactivate(self.rendererConstraints) - NSLayoutConstraint.deactivate(placeholderConstraints) - - imageView.setNeedsLayout() - - self.rendererConstraints += imageType.ratioConstraintsBySize(image.size, view: imageView) - NSLayoutConstraint.activate(self.rendererConstraints) - - if imageType.haveToUseRatio() == true { - NSLayoutConstraint.activate(placeholderConstraints) - self.delegate?.messageTemplateRender(self, didFinishLoadingImage: imageView) - } - } -} - -extension SBUMessageTemplate.Renderer { - func setImageButton( - _ button: ImageButton, - item: SBUMessageTemplate.Syntax.ImageButton, - placeholderConstraints: [NSLayoutConstraint] - ) { - guard let imageView = button.imageView else { return } - - let image = imageView.image?.sbu_with( - tintColor: item.imageStyle.tintColorValue, - forTemplate: true - ) - - button.setImage(image, for: .normal) - button.setNeedsLayout() - - if let size = imageView.image?.size { - NSLayoutConstraint.deactivate(self.rendererConstraints) - NSLayoutConstraint.deactivate(placeholderConstraints) - - self.rendererConstraints += item.ratioConstraintsBySize(size, view: button) - self.rendererConstraints.forEach { $0.isActive = true } - NSLayoutConstraint.activate(self.rendererConstraints) - - if item.haveToUseRatio() == true { - self.delegate?.messageTemplateRender(self, didFinishLoadingImage: imageView) - } - } - } -} diff --git a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.Views.swift b/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.Views.swift deleted file mode 100644 index 36a9b9b2..00000000 --- a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.Views.swift +++ /dev/null @@ -1,484 +0,0 @@ -// -// SBUMessageTemplate.Renderer.Views.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/10/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -extension SBUMessageTemplate.Renderer { - // MARK: - BaseView Wrapper class (for debugging, update each item) - class ContentView: UIView {} - - class BodyView: UIView {} - - // MARK: - base views - - class BaseView: UIView { - var item: SBUMessageTemplate.Syntax.View - var layout: SBUMessageTemplate.Syntax.LayoutType - - var width: SBUMessageTemplate.Syntax.SizeSpec { self.item.width } - var height: SBUMessageTemplate.Syntax.SizeSpec { self.item.height } - - var viewStyle: SBUMessageTemplate.Syntax.ViewStyle { self.item.viewStyle } - - lazy var backgroundImageURLView: UIImageView = { - let view = UIImageView() - view.contentMode = .scaleAspectFill - view.backgroundColor = .clear - return view - }() - - weak var rightPaddingConstraint: NSLayoutConstraint? - - init(item: SBUMessageTemplate.Syntax.View, layout: SBUMessageTemplate.Syntax.LayoutType) { - self.item = item - self.layout = layout - - super.init(frame: .zero) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - } - - class BoxBaseView: SBUMessageTemplate.Renderer.BaseView {} - - class TextBaseView: SBUMessageTemplate.Renderer.BaseView {} - - class ImageBaseView: SBUMessageTemplate.Renderer.BaseView {} - - class TextButtonBaseView: SBUMessageTemplate.Renderer.TextBaseView {} - - class ImageButtonBaseView: SBUMessageTemplate.Renderer.BaseView {} - - class CarouselBaseView: SBUMessageTemplate.Renderer.BaseView {} - - // MARK: - item views - - class BoxView: UIView { - var layout: SBUMessageTemplate.Syntax.LayoutType = .column - } - - class TextButton: Label {} - - class ActionItemButton: SBUMessageTemplate.Renderer.Button { - var action: SBUMessageTemplate.Action? - } - - class ImageButton: SBUMessageTemplate.Renderer.ActionItemButton {} - - class ImageView: UIImageView { - var originalImage: UIImage? { - didSet { self.image = self.originalImage } - } - var identifier: SBUMessageTemplate.Syntax.Identifier? - var needResizeImage: Bool = false - } - - class ImageViewForAspect: UIImageView {} - - class ImageButtonForAspectFit: SBUMessageTemplate.Renderer.ImageButton {} - - // MARK: - base customize views - - class Button: UIButton { - private var animationImageView: UIImageView? - } - - class ActionTapGesture: UITapGestureRecognizer { - var action: SBUMessageTemplate.Action? - } - - class Label: UILabel { - var padding: SBUMessageTemplate.Syntax.Padding? - var updateLayoutHandler: (([NSLayoutConstraint], [NSLayoutConstraint]) -> Void)? - var boxWidth: CGFloat = 0.0 - } -} - -// MARK: - extension for detail customize flows. - -extension SBUMessageTemplate.Renderer.BaseView { - override func layoutSubviews() { - super.layoutSubviews() - self.applyRoundCorners() - self.sizeToFitForBackgroundImageUrlView() - } - - func applyRoundCorners() { - guard let borderRadius = viewStyle.radius else { return } - - let width = item.width - let height = item.height - - var maxRadius = borderRadius - if width.type == .fixed { - maxRadius = min(maxRadius, width.value / 2) - } else { - maxRadius = min(maxRadius, Int(self.frame.width / 2)) - } - - if height.type == .fixed { - maxRadius = min(maxRadius, height.value / 2) - } else { - maxRadius = min(maxRadius, Int(self.frame.height / 2)) - } - - self.roundCorners(corners: .allCorners, radius: CGFloat(maxRadius)) - } - - func sizeToFitForBackgroundImageUrlView() { - if self.backgroundImageURLView.superview == nil { - self.addSubview(self.backgroundImageURLView) - self.backgroundImageURLView.sbu_constraint(equalTo: self, left: 0, right: 0, top: 0, bottom: 0) - } - - self.backgroundImageURLView.isHidden = (self.backgroundImageURLView.image == nil) - - self.sendSubviewToBack(self.backgroundImageURLView) - } -} - -extension SBUMessageTemplate.Renderer { - class CarouselRenderer: SBUBaseCarouselCellRenderer { - let data: SBUMessageTemplate.Syntax.TemplateView - let renderer: SBUMessageTemplate.Renderer - let expectedWidth: CGFloat - - init?( - data: SBUMessageTemplate.Syntax.TemplateView, - maxWidth: CGFloat, - actionHandler: ((SBUMessageTemplate.Action) -> Void)? - ) { - guard let renderer = SBUMessageTemplate.Renderer.generate( - template: data, - maxWidth: maxWidth, - actionHandler: { actionHandler?($0) } - ) else { return nil } - self.data = data - self.renderer = renderer - self.expectedWidth = data.itemsMaxWidth(with: maxWidth) - } - - func render() -> UIView { - self.renderer.backgroundColor = .clear - self.renderer.sbu_constraint_lessThan(width: self.expectedWidth, priority: .required) - return renderer - } - - func getExpectedWidth() -> CGFloat { self.expectedWidth } - } -} - -/// https://stackoverflow.com/a/32368958 - -/// This class supports padding and 9 direction Align. -/// -/// How to use -/// - Padding : `label.padding = edgeInsets` -/// - Align: -/// - horizontal: `label.textAlignment` -/// - vertical: `label.contentMode` -extension SBUMessageTemplate.Renderer.Label { - var fullTextViewWidth: CGFloat { - (self.padding?.left ?? 0) - + (self.padding?.right ?? 0) - + self.textWidth() - } - - var fullTextViewHeight: CGFloat { - (self.padding?.top ?? 0) - + (self.padding?.bottom ?? 0) - + self.textHeight(with: boxWidth, numberOfLines: self.numberOfLines) - } - - var isWrapTypeWidth: Bool { - let width = (self.superview as? SBUMessageTemplate.Renderer.TextBaseView)?.width - return (width?.type == .flex && - width?.value == SBUMessageTemplate.Syntax.FlexSizeType.wrapContent.rawValue) - } - - var isWrapTypeHeight: Bool { - let height = (self.superview as? SBUMessageTemplate.Renderer.TextBaseView)?.height - return (height?.type == .flex && - height?.value == SBUMessageTemplate.Syntax.FlexSizeType.wrapContent.rawValue) - } - - var isFixedTypeWidth: Bool { - let width = (self.superview as? SBUMessageTemplate.Renderer.TextBaseView)?.width - return width?.type == .fixed - } - - var isFixedTypeHeight: Bool { - let height = (self.superview as? SBUMessageTemplate.Renderer.TextBaseView)?.height - return height?.type == .fixed - } - - override func drawText(in rect: CGRect) { - var newRect = rect - switch contentMode { - case .top: - newRect.size.height = sizeThatFits(rect.size).height - case .bottom: - let height = sizeThatFits(rect.size).height - newRect.origin.y += rect.size.height - height - newRect.size.height = height - default: - () - } - - super.drawText(in: newRect.inset(by: .zero)) - } - - override func layoutSubviews() { - super.layoutSubviews() - - // INFO: Edge case - text wrap issue: width - guard let baseView = self.superview as? SBUMessageTemplate.Renderer.TextBaseView, - let boxView = baseView.superview as? SBUMessageTemplate.Renderer.BoxView, - let currentIndex = boxView.subviews.firstIndex(of: baseView) else { return } - - if baseView.layout == .row { - if isWrapTypeWidth { - var constraints: [NSLayoutConstraint] = [] - var deactivatedConstraints: [NSLayoutConstraint] = [] - - boxWidth = boxView.frame.width - let isOverSize = (baseView.frame.origin.x + fullTextViewWidth) > boxWidth - - constraints += self.sbu_constraint_v2(width: self.textWidth(), priority: .defaultLow) - - if isOverSize { - constraints += baseView.sbu_constraint_v2( - greaterThanOrEqualTo: boxView, - right: 0, - priority: .required - ) - - for (index, baseView) in boxView.subviews.enumerated() { - if index <= currentIndex { continue } - deactivatedConstraints += baseView.constraints - baseView.isHidden = true - } - - for (index, baseView) in boxView.subviews.enumerated() { - if index >= currentIndex { continue } - if let width = (baseView as? SBUMessageTemplate.Renderer.BaseView)?.width, - (width.type == .flex && width.value == SBUMessageTemplate.Syntax.FlexSizeType.fillParent.rawValue) { - deactivatedConstraints += baseView.constraints - baseView.isHidden = true - } - } - } - - updateLayoutHandler?(constraints, deactivatedConstraints) - } else if isFixedTypeWidth { - // INFO: Edge case - If all items are fixed, the last fixed label should not pad the text when over the box area - - boxWidth = boxView.frame.width - let isOverSize = (baseView.frame.origin.x + fullTextViewWidth) > boxWidth - - let itemCount: Int = boxView.subviews.count - 2 - if let index = boxView.subviews.firstIndex(of: baseView), - index == (boxView.subviews.count - 2), // check last item - isOverSize { // when only over size - - let fixedWidthItems = boxView - .subviews - .compactMap { $0.subviews.first as? SBUMessageTemplate.Renderer.Label } - .filter { $0.isFixedTypeWidth } - if fixedWidthItems.count == itemCount { - baseView.rightPaddingConstraint?.priority = .defaultLow - } - } - } - } else if baseView.layout == .column, - let boxBaseView = boxView.superview as? SBUMessageTemplate.Renderer.BoxBaseView, - boxBaseView.height.type == .fixed { - // INFO: Edge case - text wrap/fixed issue: height - - if !isWrapTypeHeight { return } - var constraints: [NSLayoutConstraint] = [] - var deactivatedConstraints: [NSLayoutConstraint] = [] - - self.boxWidth = boxView.frame.width - ((self.padding?.left ?? 0) - + (self.padding?.right ?? 0)) - let boxHeight = boxView.frame.height - ((self.padding?.top ?? 0) - + (self.padding?.bottom ?? 0)) - - let isOverSize = (baseView.frame.origin.y + fullTextViewHeight) >= boxHeight - - let totalTextHeight = boxView - .subviews - .compactMap { $0.subviews.first as? SBUMessageTemplate.Renderer.Label } - .filter { $0.isWrapTypeHeight || $0.isFixedTypeHeight } - .reduce(0) { $0 + $1.fullTextViewHeight } - let needToRemoveFillTypes = totalTextHeight >= boxHeight - - constraints += self.sbu_constraint_v2(height: self.textHeight(with: boxWidth, numberOfLines: self.numberOfLines), priority: .defaultLow) - - if isOverSize { - constraints += baseView.sbu_constraint_v2( - greaterThanOrEqualTo: boxView, - bottom: 0, - priority: .required - ) - - for (index, baseView) in boxView.subviews.enumerated() { - if currentIndex >= index { continue } - deactivatedConstraints += baseView.constraints - baseView.isHidden = true - } - - if needToRemoveFillTypes { - for (index, baseView) in boxView.subviews.enumerated() { - if currentIndex <= index { continue } - if let height = (baseView as? SBUMessageTemplate.Renderer.BaseView)?.height, - (height.type == .flex && height.value == SBUMessageTemplate.Syntax.FlexSizeType.fillParent.rawValue) { - deactivatedConstraints += baseView.constraints - baseView.isHidden = true - } - } - } - } - - updateLayoutHandler?(constraints, deactivatedConstraints) - } - } - - override var intrinsicContentSize: CGSize { - let size = super.intrinsicContentSize - return CGSize(width: size.width, - height: size.height) - } - - override var bounds: CGRect { - didSet { - preferredMaxLayoutWidth = bounds.width - } - } -} - -extension SBUMessageTemplate.Renderer.ImageView { - func saveImageCacheSize() { - guard let image, image.size.width > 0, image.size.height > 0 else { return } - guard let identifier = self.identifier else { return } - - SBUCacheManager.TemplateImage.save( - messageId: identifier.messageId, - viewIndex: identifier.index, - size: image.size - ) - } - - func resizeImageSize() { - guard self.needResizeImage == true else { return } - guard self.frame.width != self.image?.size.width else { return } - guard self.frame.width > 0 else { return } - guard let resizeImage = self.originalImage?.resizeTopAlignedToFill( - newWidth: self.frame.width - ) else { return } - - self.image = resizeImage - } - - override func layoutSubviews() { - super.layoutSubviews() - - self.resizeImageSize() - - self.saveImageCacheSize() - } - - func updateDownloadTemplate(tintColor: UIColor?) { - self.layer.removeAnimation(forKey: SBUAnimation.Key.spin.identifier) - - let image = SBUIconSetType.iconSpinner - .image( - to: SBUIconSetType.Metric.iconSpinnerSizeForTemplate - ) - .sbu_with( - tintColor: tintColor, - forTemplate: true - ) - - self.image = image - self.contentMode = .center - - let rotation = CABasicAnimation(keyPath: "transform.rotation") - rotation.fromValue = 0 - rotation.toValue = 2 * Double.pi - rotation.duration = 1.1 - rotation.repeatCount = Float.infinity - self.layer.add(rotation, forKey: SBUAnimation.Key.spin.identifier) - } -} - -extension SBUMessageTemplate.Renderer.ImageViewForAspect { - override var intrinsicContentSize: CGSize { - if let image = self.image { - let width = image.size.width - let height = image.size.height - - let ratio = self.frame.size.width / width - let scaledHeight = height * ratio - - return CGSize(width: self.frame.size.width, height: scaledHeight) - } - - return CGSize(width: -1.0, height: -1.0) - } -} - -extension SBUMessageTemplate.Renderer.ImageButtonForAspectFit { - override var intrinsicContentSize: CGSize { - if let image = self.imageView?.image { - let width = image.size.width - let height = image.size.height - - let ratio = self.frame.size.width / width - let scaledHeight = height * ratio - - return CGSize(width: self.frame.size.width, height: scaledHeight) - } - - return CGSize(width: -1.0, height: -1.0) - } -} - -extension SBUMessageTemplate.Renderer.Button { - private func setupAnimationImageViewIfPossible() { - if self.animationImageView == nil { - let imageView = UIImageView(frame: bounds) - self.addSubview(imageView) - self.sendSubviewToBack(imageView) // Position the button's text or default image so that it is on top. - self.animationImageView = imageView - } - self.animationImageView?.contentMode = self.contentMode - } - - private func clearAnimationImageView() { - self.animationImageView?.removeFromSuperview() - self.animationImageView = nil - } - - override func setImage(_ image: UIImage?, for state: UIControl.State) { - if let images = image?.images, images.hasElements { - self.setupAnimationImageViewIfPossible() - self.animationImageView?.image = image - } else { - super.setImage(image, for: state) - } - self.layoutIfNeeded() - } - - override func layoutSubviews() { - super.layoutSubviews() - self.animationImageView?.frame = bounds - } -} diff --git a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.swift b/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.swift deleted file mode 100644 index a26d34f2..00000000 --- a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.swift +++ /dev/null @@ -1,236 +0,0 @@ -// -// SBUMessageTemplate.Renderer.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/10/14. -// Copyright © 2022 Sendbird, Inc. All rights reserved. -// - -import UIKit - -/** - View - - contentView - - bodyView - - item - - item - - item - */ - -/** - --------------------------------- - | ParentView | - | --------------------- | - | | baseView | | - | | ---------- | | - | | | | | | - | M | P | Item | P | M | - | | | | | | - | | ---------- | | - | | P | | - | --------------------- | - | M | - --------------------------------- - M: margin / P: padding - */ - -extension SBUMessageTemplate { - class Renderer: UIView { - // Property(public) - var messageId: Int64 = 0 - var contentView = ContentView() - var bodyView = BodyView() - var version: Int = 0 - - var themeForDefault: SBUMessageTemplateTheme { Self.defaultTheme } - - var body: SBUMessageTemplate.Syntax.Body? - - var actionHandler: ((SBUMessageTemplate.Action) -> Void)? - - var maxWidth: CGFloat = 0.0 - - let flexTypeWrapValue = SBUMessageTemplate.Syntax.FlexSizeType.wrapContent.rawValue - let flexTypeFillValue = SBUMessageTemplate.Syntax.FlexSizeType.fillParent.rawValue - - weak var delegate: MessageTemplateRendererDelegate? - weak var dataSource: MessageTemplateRendererDataSource? - - var rendererConstraints: [NSLayoutConstraint] = [] - - /// If this value is set, all of the fonts in Template are use this fontFamily. - /// - Since: 3.5.7 - var fontFamily: String? - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc - func didTapAction(_ sender: ActionItemButton) { - if let action = sender.action { - self.actionHandler?(action) - } - } - - @objc - func didTapActionGestures(_ sender: ActionTapGesture) { - if let action = sender.action { - self.actionHandler?(action) - } - } - - // MARK: - Common - func reloadCell() { - self.delegate?.messageTemplateNeedReloadCell(self) - } - - init?( - template: SBUMessageTemplate.Syntax.TemplateView, - delegate: MessageTemplateRendererDelegate? = nil, - dataSource: MessageTemplateRendererDataSource? = nil, - maxWidth: CGFloat = UIApplication.shared.currentWindow?.bounds.width ?? 0.0, - fontFamily: String? = nil, - actionHandler: ((Action) -> Void)? - ) { - super.init(frame: .zero) - - guard template.identifierFactory.isValid == true else { return nil } - - self.messageId = template.identifierFactory.messageId - self.actionHandler = actionHandler - self.delegate = delegate - self.dataSource = dataSource - self.version = template.version ?? 0 - self.maxWidth = maxWidth - self.fontFamily = fontFamily - - if self.render(template: template) == false { return nil } - } - - // for tester - init?( - with data: String, - messageId: Int64? = 0, - delegate: MessageTemplateRendererDelegate? = nil, - dataSource: MessageTemplateRendererDataSource? = nil, - maxWidth: CGFloat = UIApplication.shared.currentWindow?.bounds.width ?? 0.0, - fontFamily: String? = nil, - actionHandler: ((Action) -> Void)? - ) { - super.init(frame: .zero) - - self.messageId = messageId ?? 0 - self.delegate = delegate - self.dataSource = dataSource - self.maxWidth = maxWidth - self.fontFamily = fontFamily - self.actionHandler = actionHandler - - let data = Data(data.utf8) - do { - let template = try JSONDecoder().decode(SBUMessageTemplate.Syntax.TemplateView.self, from: data) - template.setIdentifier(with: .init(messageId: messageId)) - self.version = template.version ?? 0 - if self.render(template: template) == false { return nil } - } catch { - SBULog.error(error) - return nil - } - } - - // for error messages - init( - messageId: Int64? = 0, - body: SBUMessageTemplate.Syntax.Body, - fontFamily: String? = nil, - actionHandler: ((Action) -> Void)? = nil - ) { - super.init(frame: .zero) - - self.messageId = messageId ?? 0 - self.fontFamily = fontFamily - self.actionHandler = actionHandler - - // AutoLayout - self.addSubview(self.contentView) - self.rendererConstraints += self.contentView.sbu_constraint_v2( - equalTo: self, - leading: 0, - trailing: 0, - top: 0, - bottom: 0, - priority: .required - ) - - // Render subview - self.contentView.addSubview(self.bodyView) - self.rendererConstraints += self.bodyView.sbu_constraint_v2( - equalTo: self.contentView, - leading: 0, - trailing: 0, - top: 0, - bottom: 0 - ) - - self.renderBody(body) - NSLayoutConstraint.activate(self.rendererConstraints) - } - - } -} - -extension SBUMessageTemplate.Renderer { - static let sideViewTypeLeft = 10 - static let sideViewTypeRight = 20 - - static var defaultTheme: SBUMessageTemplateTheme { - switch SBUTheme.colorScheme { - case .light: return .light - case .dark: return .dark - } - } -} - -extension SBUMessageTemplate.Renderer { - - /// Returns system font or custom font by checking if there is a set fontFamily value for Template. - /// - Since: 3.5.7 - func templateFont(size: CGFloat, weight: UIFont.Weight = .regular) -> UIFont { - guard let fontFamily = self.fontFamily else { - return UIFont.systemFont(ofSize: size, weight: weight) - } - - let descriptor = UIFontDescriptor( - fontAttributes: [ - .family: fontFamily, - .traits: [UIFontDescriptor.TraitKey.weight: weight] - ] - ) - let font = UIFont(descriptor: descriptor, size: size) - return font - } - - // factory-v2 - static func generate( - template: SBUMessageTemplate.Syntax.TemplateView, - delegate: MessageTemplateRendererDelegate? = nil, - dataSource: MessageTemplateRendererDataSource? = nil, - maxWidth: CGFloat = UIApplication.shared.currentWindow?.bounds.width ?? 0.0, - fontFamily: String? = nil, - actionHandler: ((SBUMessageTemplate.Action) -> Void)? - ) -> SBUMessageTemplate.Renderer? { - guard let renderer = SBUMessageTemplate.Renderer( - template: template, - delegate: delegate, - dataSource: dataSource, - maxWidth: maxWidth, - fontFamily: fontFamily, - actionHandler: actionHandler - ) else { return nil } - - guard [1, 2].contains(renderer.version) else { return nil } - - return renderer - } -} diff --git a/Sources/MessageTemplate/SBUMessageTemplate.swift b/Sources/MessageTemplate/SBUMessageTemplate.swift deleted file mode 100644 index 29964f6a..00000000 --- a/Sources/MessageTemplate/SBUMessageTemplate.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// SBUMessageTemplate.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/09/30. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -// MARK: - Body -/// `SBUMessageTemplate` is a class that handles message templates. -public class SBUMessageTemplate { - static let urlForTemplateDownload = "TEMPLATE_DOWNLOAD" - static var defaultMaxSize: CGFloat = 256.0 -} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Decoders.swift b/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Decoders.swift deleted file mode 100644 index e06cf210..00000000 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Decoders.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// SBUMessageTemplate.Decoders.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/09/30. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import Foundation - -// MARK: - Utils -extension SBUMessageTemplate { - static func decodeMultipleTypeForInt( - forKey key: C, - from container: KeyedDecodingContainer - ) -> Int { - if let stringValue = try? container.decode(String.self, forKey: key) { - return Int(stringValue) ?? 0 - } else if let intValue = try? container.decode(Int.self, forKey: key) { - return intValue - } else { - return 0 - } - } - - static func decodeIfPresentMultipleTypeForInt( - forKey key: C, - from container: KeyedDecodingContainer, - defaultValue: Int = 0 - ) -> Int? { - if let stringValue = try? container.decodeIfPresent(String.self, forKey: key) { - return Int(stringValue) - } else if let intValue = try? container.decodeIfPresent(Int.self, forKey: key) { - return intValue - } else { - return nil - } - } - - static func decodeMultipleTypeForCGFloat( - forKey key: C, - from container: KeyedDecodingContainer - ) -> CGFloat { - if let stringValue = try? container.decode(String.self, forKey: key) { - return CGFloat(Double(stringValue) ?? 0.0) - } else if let floatValue = try? container.decode(CGFloat.self, forKey: key) { - return floatValue - } else { - return 0.0 - } - } - - static func decodeIfPresentMultipleTypeForCGFloat( - forKey key: C, - from container: KeyedDecodingContainer, - defaultValue: CGFloat = 0 - ) -> CGFloat? { - if let stringValue = try? container.decodeIfPresent(String.self, forKey: key) { - if let doubleValue = Double(stringValue) { - return CGFloat(doubleValue) - } else { - return nil - } - } else if let floatValue = try? container.decodeIfPresent(CGFloat.self, forKey: key) { - return floatValue - } else { - return nil - } - } -} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.ImageRatioType.swift b/Sources/MessageTemplate/Syntax/SBUMessageTemplate.ImageRatioType.swift deleted file mode 100644 index 72f56a4c..00000000 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.ImageRatioType.swift +++ /dev/null @@ -1,180 +0,0 @@ -// -// SBUMessageTemplate.ImageRatioType.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/04/24. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -protocol MessageTemplateImageRatioType where Self: SBUMessageTemplate.Syntax.View { - var identifier: SBUMessageTemplate.Syntax.Identifier { get } - - var imageUrl: String { get } - - var width: SBUMessageTemplate.Syntax.SizeSpec { get } - var height: SBUMessageTemplate.Syntax.SizeSpec { get } - - var imageStyle: SBUMessageTemplate.Syntax.ImageStyle { get } - var metaData: SBUMessageTemplate.Syntax.MetaData? { get } -} - -extension MessageTemplateImageRatioType { - var isImageView: Bool { self is SBUMessageTemplate.Syntax.Image } - var isImageButton: Bool { self is SBUMessageTemplate.Syntax.ImageButton } - - var isForDownloadingTemplate: Bool { - self.imageUrl == SBUMessageTemplate.urlForTemplateDownload - } - - var isRatioUsed: Bool { self.imageRatioType.isRatioUsed } - - var imageRatioType: SBUMessageTemplate.Syntax.ImageRatioType { - // [VALID_CASE](https://sendbird.atlassian.net/wiki/spaces/UK/pages/2008220608/Message+template+-+Image+policy#Valid-cases) - switch (self.width.internalSizeType, self.height.internalSizeType) { - case (.fixed, .fixed): return .minimumWrap(cached: isImageView) - case (.fixed, .fillParent): - switch self.imageStyle.contentMode { - case .scaleAspectFit: return .ratio - case .scaleAspectFill: return .ratio - case .scaleToFill: return isImageButton ? .minimumWrap() : .ratio - default: break - } - case (.fixed, .wrapContent): - switch self.imageStyle.contentMode { - case .scaleAspectFit: return .ratio - case .scaleAspectFill: return .ratio - case .scaleToFill: return .ratio // QM-2657 - default: break - } - case (.fillParent, .fixed): return isImageButton ? .minimumWrap() : .fixedHeightRatio - case (.fillParent, .fillParent): return .ratio - case (.fillParent, .wrapContent): return .ratio - case (.wrapContent, .fixed): return .ratio - case (.wrapContent, .fillParent): return .minimumWrap() - case (.wrapContent, .wrapContent): return isImageButton ? .minimumWrap() : .ratio - default: break - } - - return .unknown - } -} - -// MARK: - placeholder constraints -extension MessageTemplateImageRatioType { - - func ratioPlaceholderConstraints(view: UIView) -> [NSLayoutConstraint] { - guard let metaData = self.metaData else { return [] } - - let ratio = metaData.pixelWidth != 0 - ? CGFloat(metaData.pixelHeight) / CGFloat(metaData.pixelWidth) - : 0 - let constraint = view.heightAnchor.constraint( - equalTo: view.widthAnchor, - multiplier: ratio - ) - - return [constraint] - } - - func minimumWrapPlaceholderConstraints(view: UIView) -> [NSLayoutConstraint] { - view.sbu_constraint_greaterThan_v2(width: 1, height: 1, priority: .defaultLow) - } - - func fixedHeightPlaceholderConstraints(view: UIView) -> [NSLayoutConstraint] { - guard let metaData = self.metaData else { return [] } - - var ratio: CGFloat = 1 - - if metaData.pixelHeight > metaData.pixelWidth, metaData.pixelWidth != 0 { - ratio = CGFloat(metaData.pixelHeight) / CGFloat(metaData.pixelWidth) - } - if metaData.pixelWidth > metaData.pixelHeight, metaData.pixelHeight != 0 { - ratio = CGFloat(metaData.pixelWidth) / CGFloat(metaData.pixelHeight) - } - - let constraint = view.heightAnchor.constraint( - equalTo: view.widthAnchor, - multiplier: ratio - ) - - return [constraint] - } - - func imagePlaceholderConstraints(view: UIView, saveCache: Bool) -> [NSLayoutConstraint] { - switch self.imageRatioType { - case .minimumWrap(let cached): - if saveCache && cached { - let size = CGSize.init(width: self.width.value, - height: self.height.value) - SBUCacheManager.TemplateImage.save( - messageId: self.identifier.messageId, - viewIndex: self.identifier.index, - size: size - ) - } - return self.minimumWrapPlaceholderConstraints(view: view) - case .ratio: - return self.ratioPlaceholderConstraints(view: view) - case .fixedHeightRatio: - return self.fixedHeightPlaceholderConstraints(view: view) - case .unknown: - return [] - } - } -} - -extension MessageTemplateImageRatioType { - var expectedImageSize: CGSize? { - guard let size = SBUCacheManager.TemplateImage.load( - messageId: self.identifier.messageId, - viewIndex: self.identifier.index - ), size.width > 0 else { return nil } - return size - } - - var needResizeImage: Bool { - if self.isForDownloadingTemplate { return false } - - switch (width.internalSizeType, height.internalSizeType) { - case (.fixed, .wrapContent): return true - case (.fillParent, .wrapContent): return true - default: return false - } - } - - func imageViewContentMode(with align: SBUMessageTemplate.Syntax.ItemsAlign) -> UIView.ContentMode { - if self.needResizeImage == false { return imageStyle.contentMode } - return align.imageViewContentMode ?? imageStyle.contentMode - } - - func ratioConstraintsBySize(_ size: CGSize, view: UIView) -> [NSLayoutConstraint] { - guard self.isRatioUsed == true else { return [] } - - // NOTE: Added defensive code for crash when image size is zero. - guard size.width > 0, size.height > 0 else { return [] } - - let ratio = size.height / size.width - - let heightConstraint = view.heightAnchor.constraint( - equalTo: view.widthAnchor, - multiplier: ratio - ) - heightConstraint.priority = .defaultHigh - - return [heightConstraint] - } - - func haveToUseRatio() -> Bool { - // If size is not available due to lack of meta-data. - if self.metaData?.isValid == true { return false } - - // Failure to calculate the image ratio (using ratio = not being able to predict the image size in advance). - if self.isRatioUsed == false { return false } - - if self.expectedImageSize != nil { return false } - - return true - } -} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Aligns.swift b/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Aligns.swift deleted file mode 100644 index a665e3ee..00000000 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Aligns.swift +++ /dev/null @@ -1,66 +0,0 @@ -// -// SBUMessageTemplate.Aligns.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/09/30. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -extension SBUMessageTemplate.Syntax { - class Align: Decodable { - var horizontal: HorizontalAlign? - var vertical: VerticalAlign? - - enum CodingKeys: String, CodingKey { - case horizontal, vertical - } - - init(horizontal: HorizontalAlign = .left, vertical: VerticalAlign = .top) { - self.horizontal = horizontal - self.vertical = vertical - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.horizontal = try container.decode(HorizontalAlign.self, forKey: .horizontal) - self.vertical = try container.decode(VerticalAlign.self, forKey: .vertical) - } - } - - class TextAlign: Align { - class func defaultAlign() -> TextAlign { - let align = TextAlign() - align.horizontal = .left - align.vertical = .top - return align - } - } - - class ItemsAlign: Align { - class func defaultAlign() -> ItemsAlign { - let align = ItemsAlign() - align.horizontal = .left - align.vertical = .top - return align - } - } -} - -extension SBUMessageTemplate.Syntax.ItemsAlign { - var imageViewContentMode: UIView.ContentMode? { - switch (self.vertical, self.horizontal) { - case (.top, .left): return .topLeft - case (.top, .center): return .top - case (.top, .right): return .topRight - case (.center, .left): return .left - case (.center, .center): return .center - case (.center, .right): return .right - case (.bottom, .left): return .bottomLeft - case (.bottom, .center): return .bottom - case (.bottom, .right): return .bottomRight - default: return nil - } - } -} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Identifier.swift b/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Identifier.swift deleted file mode 100644 index e9a8371a..00000000 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Identifier.swift +++ /dev/null @@ -1,106 +0,0 @@ -// -// SBUMessageTemplate.Syntax.Identifier.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/03/28. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -protocol MessageTemplateItemIdentifiable { - func setIdentifier(with factory: SBUMessageTemplate.Syntax.Identifier.Factory) -} - -extension SBUMessageTemplate.Syntax { - struct Identifier: Equatable, Codable { - let messageId: Int64 - let index: Int - let className: String - - static var `default`: Identifier { - Identifier(messageId: 0, index: NSNotFound, className: "unknown") - } - - var isValid: Bool { self.messageId != 0 && self.index != NSNotFound } - - var key: String { - SBUCacheManager.TemplateImage.memoryCache.generateKey( - messageId: self.messageId, - viewIndex: self.index - ) - } - - static func == ( - lhs: SBUMessageTemplate.Syntax.Identifier, - rhs: SBUMessageTemplate.Syntax.Identifier - ) -> Bool { - lhs.messageId == rhs.messageId && - lhs.index == rhs.index && - lhs.className == rhs.className - } - - } -} - -extension SBUMessageTemplate.Syntax.Identifier { - class Factory: Equatable, Codable { - private(set) var messageId: Int64 = 0 - private(set) var currentIndex: Int = 0 - - var cacheTarget = [String: String]() // [cacheKey: urlString] - var identifiers = [SBUMessageTemplate.Syntax.Identifier]() - - init(messageId: Int64? = nil) { self.messageId = messageId ?? 0 } - - private func getIndexBeforeIncrement() -> Int { - let index = self.currentIndex - self.currentIndex += 1 - return index - } - - var isValid: Bool { self.messageId != 0 } - - func generate(with view: SBUMessageTemplate.Syntax.View) -> SBUMessageTemplate.Syntax.Identifier { - let identifier = SBUMessageTemplate.Syntax.Identifier( - messageId: self.messageId, - index: self.getIndexBeforeIncrement(), - className: String(describing: type(of: view)) - ) - - if let url = view.imageUrlString, view.isFixedSize == false { - self.cacheTarget[identifier.key] = url - } - - identifiers.append(identifier) - - return identifier - } - - func getUncachedData() -> [String: String]? { - let noHit = cacheTarget - .filter { - let fileName = SBUCacheManager.Image.createCacheFileName( - urlString: $0.value, - cacheKey: nil - ) - return SBUCacheManager.Image.get( - fileName: fileName, - subPath: SBUCacheManager.PathType.template - ) == nil - } - - return noHit.hasElements ? noHit : nil - } - - static func == ( - lhs: SBUMessageTemplate.Syntax.Identifier.Factory, - rhs: SBUMessageTemplate.Syntax.Identifier.Factory - ) -> Bool { - lhs.identifiers == rhs.identifiers && - lhs.cacheTarget == rhs.cacheTarget - } - } -} - -extension SBUMessageTemplate.Syntax.Identifier.Factory: SBUCarouselCacheKey { } diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Item.swift b/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Item.swift deleted file mode 100644 index 9be33756..00000000 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Item.swift +++ /dev/null @@ -1,87 +0,0 @@ -// -// SBUMessageTemplate.Item.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/09/30. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -extension SBUMessageTemplate { - struct Syntax { } // namespace -} - -extension SBUMessageTemplate.Syntax { - enum Item { - case box(Box) - case text(Text) - case textButton(TextButton) - case imageButton(ImageButton) - case image(Image) - case carouselView(CarouselItem) - - var asView: View { - switch self { - case .box(let view): return view - case .text(let view): return view - case .textButton(let view): return view - case .imageButton(let view): return view - case .image(let view): return view - case .carouselView(let view): return view - } - } - - var hasCompositeType: Bool { - switch self { - case .box: return false - case .text: return false - case .textButton: return false - case .imageButton: return false - case .image: return false - case .carouselView: return true - } - } - } -} - -extension SBUMessageTemplate.Syntax.Item: Decodable { - init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: TypeCodingKey.self) - let singleContainer = try decoder.singleValueContainer() - let type = try container.decode(ItemType.self, forKey: .type) - switch type { - case .box: - let box = try singleContainer.decode(SBUMessageTemplate.Syntax.Box.self) - self = .box(box) - case .text: - let text = try singleContainer.decode(SBUMessageTemplate.Syntax.Text.self) - self = .text(text) - case .textButton: - let textButton = try singleContainer.decode(SBUMessageTemplate.Syntax.TextButton.self) - self = .textButton(textButton) - case .imageButton: - let imageButton = try singleContainer.decode(SBUMessageTemplate.Syntax.ImageButton.self) - self = .imageButton(imageButton) - case .image: - let image = try singleContainer.decode(SBUMessageTemplate.Syntax.Image.self) - self = .image(image) - case .carouselView: - let carousel = try singleContainer.decode(SBUMessageTemplate.Syntax.CarouselItem.self) - self = .carouselView(carousel) - } - } - - enum TypeCodingKey: String, CodingKey { - case type - } - - enum ItemType: String, Decodable { - case box - case text - case image - case textButton - case imageButton - case carouselView - } -} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Sizes.swift b/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Sizes.swift deleted file mode 100644 index b3d246bc..00000000 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Sizes.swift +++ /dev/null @@ -1,183 +0,0 @@ -// -// SBUMessageTemplate.Sizes.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/09/30. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -extension SBUMessageTemplate.Syntax { - - // MARK: - Size - class SizeSpec: Decodable { - var type: SizeType - var value: Int // flex -> 0: fillParent, 1: wrapContent - - var internalSizeType: InternalSizeType - - enum CodingKeys: String, CodingKey { - case type, value - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.type = try container.decode(SizeType.self, forKey: .type) - - self.value = SBUMessageTemplate.decodeMultipleTypeForInt( - forKey: .value, - from: container - ) - - self.internalSizeType = InternalSizeType(type: self.type, value: self.value) - - if self.internalSizeType.isValid == false { - throw DecodingError.dataCorruptedError( - forKey: .value, - in: container, - debugDescription: "Invalid size spec value." - ) - } - } - - init(type: SizeType = .fixed, value: Int = 0) { - self.type = type - self.value = value - self.internalSizeType = InternalSizeType(type: type, value: value) - } - - class func fillParent() -> SizeSpec { - let sizeSpec = SizeSpec( - type: .flex, - value: FlexSizeType.fillParent.rawValue - ) - return sizeSpec - } - - class func wrapContent() -> SizeSpec { - let sizeSpec = SizeSpec( - type: .flex, - value: FlexSizeType.wrapContent.rawValue - ) - return sizeSpec - } - } - - class MetaData: Decodable { - var pixelWidth: Int - var pixelHeight: Int - - enum CodingKeys: String, CodingKey { - case pixelWidth, pixelHeight - } - - var isValid: Bool { pixelWidth > 0 && pixelHeight > 0 } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.pixelWidth = SBUMessageTemplate.decodeMultipleTypeForInt( - forKey: .pixelWidth, - from: container - ) - self.pixelHeight = SBUMessageTemplate.decodeMultipleTypeForInt( - forKey: .pixelHeight, - from: container - ) - } - } - - // MARK: - Margin, Padding - class Margin: Decodable { - let top: CGFloat - let bottom: CGFloat - let left: CGFloat - let right: CGFloat - - enum CodingKeys: String, CodingKey { - case top, bottom, left, right - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.top = SBUMessageTemplate.decodeMultipleTypeForCGFloat( - forKey: .top, - from: container - ) - self.bottom = SBUMessageTemplate.decodeMultipleTypeForCGFloat( - forKey: .bottom, - from: container - ) - self.left = SBUMessageTemplate.decodeMultipleTypeForCGFloat( - forKey: .left, - from: container - ) - self.right = SBUMessageTemplate.decodeMultipleTypeForCGFloat( - forKey: .right, - from: container - ) - } - - /// Used for rendering internal template types (error, download) - init( - top: CGFloat, - bottom: CGFloat, - left: CGFloat, - right: CGFloat - ) { - self.top = top - self.bottom = bottom - self.left = left - self.right = right - } - } - - class Padding: Decodable { - var top: CGFloat - var bottom: CGFloat - var left: CGFloat - var right: CGFloat - - enum CodingKeys: String, CodingKey { - case top, bottom, left, right - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.top = SBUMessageTemplate.decodeMultipleTypeForCGFloat( - forKey: .top, - from: container - ) - self.bottom = SBUMessageTemplate.decodeMultipleTypeForCGFloat( - forKey: .bottom, - from: container - ) - self.left = SBUMessageTemplate.decodeMultipleTypeForCGFloat( - forKey: .left, - from: container - ) - self.right = SBUMessageTemplate.decodeMultipleTypeForCGFloat( - forKey: .right, - from: container - ) - } - - init(top: CGFloat, bottom: CGFloat, left: CGFloat, right: CGFloat) { - self.top = top - self.bottom = bottom - self.left = left - self.right = right - } - } -} - -extension UIEdgeInsets { - var asMessageTemplatePadding: SBUMessageTemplate.Syntax.Padding { - SBUMessageTemplate.Syntax.Padding( - top: self.top, - bottom: self.bottom, - left: self.left, - right: self.right - ) - } -} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Styles.swift b/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Styles.swift deleted file mode 100644 index be5a991b..00000000 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Styles.swift +++ /dev/null @@ -1,145 +0,0 @@ -// -// SBUMessageTemplate.Styles.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/09/30. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -extension SBUMessageTemplate.Syntax { - - // MARK: - Style - class ViewStyle: Decodable { - var isDefault: Bool { false } - - let backgroundColor: String? - let backgroundImageUrl: String? - let borderWidth: Int? - let borderColor: String? - var radius: Int? - let margin: Margin? - var padding: Padding? - - enum CodingKeys: String, CodingKey { - case backgroundColor, backgroundImageUrl, borderWidth, borderColor, radius, margin, padding - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.backgroundColor = try container.decodeIfPresent(String.self, forKey: .backgroundColor) - self.backgroundImageUrl = try container.decodeIfPresent(String.self, forKey: .backgroundImageUrl) - self.borderWidth = SBUMessageTemplate.decodeIfPresentMultipleTypeForInt( - forKey: .borderWidth, - from: container - ) - self.borderColor = try container.decodeIfPresent(String.self, forKey: .borderColor) - self.radius = SBUMessageTemplate.decodeIfPresentMultipleTypeForInt( - forKey: .radius, - from: container - ) - self.margin = try container.decodeIfPresent(Margin.self, forKey: .margin) - self.padding = try container.decodeIfPresent(Padding.self, forKey: .padding) - } - - init( - backgroundColor: String? = nil, - backgroundImageUrl: String? = nil, - borderWidth: Int? = nil, - borderColor: String? = nil, - radius: Int? = nil, - margin: Margin? = nil, - padding: Padding? = nil - ) { - self.backgroundColor = backgroundColor - self.backgroundImageUrl = backgroundImageUrl - self.borderWidth = borderWidth - self.borderColor = borderColor - self.radius = radius - self.margin = margin - self.padding = padding - } - } - - class TextStyle: Decodable { - let size: Int? - let color: String? - let weight: WeightType? - - enum CodingKeys: String, CodingKey { - case size, color, weight, align - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.size = SBUMessageTemplate.decodeIfPresentMultipleTypeForInt( - forKey: .size, - from: container - ) - self.color = try container.decodeIfPresent(String.self, forKey: .color) - self.weight = try container.decodeIfPresent(WeightType.self, forKey: .weight) ?? .normal - } - - init( - size: Int? = nil, - color: String? = nil, - weight: WeightType? = nil - ) { - self.size = size - self.color = color - self.weight = weight - } - } - - class ImageStyle: Decodable { - let contentMode: UIView.ContentMode - private let decodedContentMode: ContentMode - let tintColor: String? - - var tintColorValue: UIColor? { - guard let color = tintColor else { return nil } - return UIColor(hexString: color) - } - - enum CodingKeys: String, CodingKey { - case contentMode, tintColor - } - - init() { - self.contentMode = .scaleAspectFit - self.decodedContentMode = .aspectFit - self.tintColor = nil - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.decodedContentMode = try container.decodeIfPresent(ContentMode.self, forKey: .contentMode) ?? .aspectFit - switch self.decodedContentMode { - case .scalesToFill: - self.contentMode = .scaleToFill - case .aspectFit: - self.contentMode = .scaleAspectFit - case .aspectFill: - self.contentMode = .scaleAspectFill - } - self.tintColor = try container.decodeIfPresent(String.self, forKey: .tintColor) - } - - init ( - contentMode: UIView.ContentMode, - tintColor: String? - ) { - self.contentMode = contentMode - self.decodedContentMode = .aspectFit - self.tintColor = tintColor - } - } -} - - -extension SBUMessageTemplate.Syntax.ViewStyle { - class Default: SBUMessageTemplate.Syntax.ViewStyle { - override var isDefault: Bool { true } - } -} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Types.swift b/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Types.swift deleted file mode 100644 index 2988cc39..00000000 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Types.swift +++ /dev/null @@ -1,107 +0,0 @@ -// -// SBUMessageTemplate.Types.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/09/30. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -extension SBUMessageTemplate.Syntax { - enum LayoutType: String, Decodable { - case row, column - } - - enum WeightType: String, Decodable { - case normal, bold - } - - enum ContentMode: String, Decodable { - case aspectFill, aspectFit, scalesToFill - } - - enum SizeType: String, Decodable { - case fixed, flex - - init(from decoder: Decoder) throws { - self = try SizeType(rawValue: decoder.singleValueContainer().decode(RawValue.self)) ?? .fixed - } - } - - enum FlexSizeType: Int, Decodable { - case fillParent = 0 - case wrapContent = 1 - } - - enum HorizontalAlign: String, Decodable { - case left, center, right - } - - enum VerticalAlign: String, Decodable { - case top, center, bottom - } -} - -extension SBUMessageTemplate.Syntax { - enum InternalSizeType { - case fixed(value: Int) - case fillParent - case wrapContent - case unknown - - init(type: SizeType, value: Int) { - switch (type, value) { - case (.fixed, _): self = .fixed(value: value) - case (.flex, 0): self = .fillParent - case (.flex, 1): self = .wrapContent - default: self = .unknown - } - } - - var isValid: Bool { - switch self { - case .fixed: return true - case .fillParent: return true - case .wrapContent: return true - case .unknown: return false - } - } - - var isFixed: Bool { - switch self { - case .fixed: return true - default: return false - } - } - var isFillParent: Bool { - switch self { - case .fillParent: return true - default: return false - } - } - var isWrapContent: Bool { - switch self { - case .wrapContent: return true - default: return false - } - } - } -} - -extension SBUMessageTemplate.Syntax { - enum ImageRatioType { - case minimumWrap(cached: Bool = false) - case ratio - case fixedHeightRatio - case unknown - - var isRatioUsed: Bool { - switch self { - case .ratio: return true - case .fixedHeightRatio: return true - default: return false - } - } - } -} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Views.swift b/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Views.swift deleted file mode 100644 index baa877c6..00000000 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Syntax.Views.swift +++ /dev/null @@ -1,420 +0,0 @@ -// -// SBUMessageTemplate.Body.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/09/30. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -/* - Root: `TemplateView` - ㄴ body - ㄴ items: `[SBUMessageTemplate.Item]` - ㄴ Box: `SBUMessageTemplate.Box` - ㄴ Text: `SBUMessageTemplate.Text` - ㄴ Image: `SBUMessageTemplate.Image` - ㄴ Button: `SBUMessageTemplate.TextButton` - ㄴ Button: `SBUMessageTemplate.ImageButton` - - All item of `SBUMessageTemplate.Item` inherited `SBUMessageTemplate.View`. - */ - -// MARK: - Root - -extension SBUMessageTemplate.Syntax { - class TemplateView: Decodable, MessageTemplateItemIdentifiable { - var version: Int? - var body: SBUMessageTemplate.Syntax.Body? - var identifierFactory: SBUMessageTemplate.Syntax.Identifier.Factory - - enum CodingKeys: String, CodingKey { - case version, body - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.version = SBUMessageTemplate.decodeIfPresentMultipleTypeForInt( - forKey: .version, - from: container, - defaultValue: 0 - ) - self.body = try container.decodeIfPresent(SBUMessageTemplate.Syntax.Body.self, forKey: .body) - self.identifierFactory = SBUMessageTemplate.Syntax.Identifier.Factory() - } - - static func generate( - json: String, - messageId: Int64, - replaceEscape: Bool = true // for unit test - ) -> TemplateView? { - var result = json - do { - if replaceEscape == true { - // NOTE: **DO NOT remove below** - result = result.replacingOccurrences(of: "\\n", with: "\\\\n") - result = result.replacingOccurrences(of: "\n", with: "\\n") - // NOTE: **DO NOT remove above** - } - - let template = try JSONDecoder().decode(TemplateView.self, from: Data(result.utf8)) - template.setIdentifier(with: .init(messageId: messageId)) - return template - } catch { - SBULog.error(error) - return nil - } - } - - func setIdentifier(with factory: SBUMessageTemplate.Syntax.Identifier.Factory) { - self.identifierFactory = factory - self.body?.items?.forEach { $0.asView.setIdentifier(with: factory ) } - } - - /* - template body: vertical_items - - 0: [_] - - 1: [____] <--- template max width - - 2: [__] - */ - func itemsMaxWidth(with limit: CGFloat) -> CGFloat { - guard let items = self.body?.items?.compactMap({ $0.asView }) else { return .infinity } - - var maxWidth: CGFloat = 0 - var hasWrapContent: Bool = false - var hasFillParent: Bool = false - - for item in items { - if item.width.internalSizeType.isFillParent { hasFillParent = true } - if item.width.internalSizeType.isWrapContent { hasWrapContent = true } - if maxWidth < item.widthValue { maxWidth = item.fullWidthValue } - } - - // If {fill_parent} is present, it will be drawn with {max_fixed_width} or {limit} because it doesn't know how it will be drawn. - if hasFillParent == true { return max(maxWidth, limit) } - // If {wrap_content} is present, make it smaller than {limit} and allow it to have a wrap area. - if hasWrapContent == true { return max(maxWidth, limit) } // NOTE: lessThan `{limit}` in renderer. - // If there are only fixed width values. - return maxWidth - } - - var hasCompositeType: Bool { - self.body?.items?.contains(where: { $0.hasCompositeType }) ?? false - } - } -} - -extension SBUMessageTemplate.Syntax { - class Body: Decodable { - var items: [SBUMessageTemplate.Syntax.Item]? - } - - class View: Decodable, MessageTemplateItemIdentifiable { - let type: Item.ItemType - let action: SBUMessageTemplate.Action? - let viewStyle: ViewStyle - let width: SizeSpec // fill - let height: SizeSpec // wrap - - var identifier: SBUMessageTemplate.Syntax.Identifier = .default - - enum CodingKeys: String, CodingKey { - case type, action, width, height, viewStyle - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.type = try container.decode(SBUMessageTemplate.Syntax.Item.ItemType.self, forKey: .type) - self.action = try container.decodeIfPresent(SBUMessageTemplate.Action.self, forKey: .action) - self.width = try container.decodeIfPresent(SBUMessageTemplate.Syntax.SizeSpec.self, forKey: .width) ?? SizeSpec.fillParent() - self.height = try container.decodeIfPresent(SBUMessageTemplate.Syntax.SizeSpec.self, forKey: .height) ?? SizeSpec.wrapContent() - self.viewStyle = try container.decodeIfPresent(SBUMessageTemplate.Syntax.ViewStyle.self, forKey: .viewStyle) ?? ViewStyle.Default() - } - - init( - type: Item.ItemType, - viewStyle: ViewStyle? = nil, - width: SizeSpec = .fillParent(), - height: SizeSpec = .wrapContent(), - action: SBUMessageTemplate.Action? = nil - ) { - self.type = type - self.viewStyle = viewStyle ?? ViewStyle.Default() - self.width = width - self.height = height - self.action = action - } - - // MARK: Common - func setDefaultRadiusIfNeeded(_ radius: Int) { - if self.viewStyle.radius == nil { - self.viewStyle.radius = radius - } - } - - var widthValue: CGFloat { CGFloat(self.width.value) } - var leftMarginValue: CGFloat { self.viewStyle.margin?.left ?? 0 } - var rightMarginValue: CGFloat { self.viewStyle.margin?.right ?? 0 } - var fullWidthValue: CGFloat { self.widthValue + self.leftMarginValue + self.rightMarginValue } - - func setDefaultPaddingIfNeeded(top: CGFloat, bottom: CGFloat, left: CGFloat, right: CGFloat) { - if self.viewStyle.padding == nil { - self.viewStyle.padding = Padding(top: top, bottom: bottom, left: left, right: right) - } - } - - func setIdentifier(with factory: SBUMessageTemplate.Syntax.Identifier.Factory) { - self.identifier = factory.generate(with: self) - } - - var imageUrlString: String? { - switch self { - case let item as SBUMessageTemplate.Syntax.ImageButton: return item.imageUrl - case let item as SBUMessageTemplate.Syntax.Image: return item.imageUrl - default: return nil - } - } - - var isFixedSize: Bool { - self.width.type == .fixed && self.height.type == .fixed - } - } -} - -extension SBUMessageTemplate.Syntax { - class Box: View { - let layout: LayoutType - let items: [Item]? - let align: ItemsAlign - - enum CodingKeys: String, CodingKey { - case items, layout, align - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.layout = try container.decodeIfPresent(LayoutType.self, forKey: .layout) ?? .row - self.items = try container.decodeIfPresent([Item].self, forKey: .items) - self.align = try container.decodeIfPresent(ItemsAlign.self, forKey: .align) ?? ItemsAlign.defaultAlign() - - try super.init(from: decoder) - } - - init( - layout: LayoutType, - align: ItemsAlign, - type: Item.ItemType, - viewStyle: ViewStyle? = nil, - width: SizeSpec = .fillParent(), - height: SizeSpec = .wrapContent(), - items: [Item]?, - action: SBUMessageTemplate.Action? = nil - ) { - self.layout = layout - self.items = items - self.align = align - - super.init( - type: type, - viewStyle: viewStyle, - width: width, - height: height, - action: action - ) - } - - override func setIdentifier(with factory: SBUMessageTemplate.Syntax.Identifier.Factory) { - self.identifier = factory.generate(with: self) - self.items?.forEach { $0.asView.setIdentifier(with: factory) } - } - } - - class Text: View { - let text: String - let maxTextLines: Int - let textStyle: TextStyle? - let align: TextAlign - - enum CodingKeys: String, CodingKey { - case text, maxTextLines, textStyle, align - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.text = try container.decode(String.self, forKey: .text) - self.maxTextLines = SBUMessageTemplate.decodeIfPresentMultipleTypeForInt( - forKey: .maxTextLines, - from: container, - defaultValue: 0 - ) ?? 0 - self.textStyle = try container.decodeIfPresent(TextStyle.self, forKey: .textStyle) - self.align = try container.decodeIfPresent(TextAlign.self, forKey: .align) ?? TextAlign.defaultAlign() - - try super.init(from: decoder) - } - - init( - text: String, - maxTextLines: Int, - textStyle: TextStyle?, - type: Item.ItemType, - viewStyle: ViewStyle? = nil, - width: SizeSpec = .fillParent(), - height: SizeSpec = .wrapContent(), - action: SBUMessageTemplate.Action? = nil, - align: TextAlign = .defaultAlign() - ) { - self.text = text - self.maxTextLines = maxTextLines - self.textStyle = textStyle - self.align = align - - super.init( - type: type, - viewStyle: viewStyle, - width: width, - height: height, - action: action - ) - } - } - - class Image: View, MessageTemplateImageRatioType { - let imageUrl: String - let imageStyle: ImageStyle - let metaData: MetaData? - - enum CodingKeys: String, CodingKey { - case imageUrl, imageStyle, metaData - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.imageUrl = try container.decode(String.self, forKey: .imageUrl) - self.imageStyle = try container.decodeIfPresent(ImageStyle.self, forKey: .imageStyle) ?? ImageStyle() - self.metaData = try container.decodeIfPresent(MetaData.self, forKey: .metaData) - - try super.init(from: decoder) - } - - init( - imageUrl: String, - imageStyle: ImageStyle, - metaData: MetaData?, - viewStyle: ViewStyle? = nil, - width: SizeSpec = .fillParent(), - height: SizeSpec = .wrapContent(), - action: SBUMessageTemplate.Action? = nil - ) { - self.imageUrl = imageUrl - self.imageStyle = imageStyle - self.metaData = metaData - - super.init( - type: .image, - viewStyle: viewStyle, - width: width, - height: height, - action: action - ) - } - } - - class TextButton: View { - let text: String? - let maxTextLines: Int - let textStyle: TextStyle? - - enum CodingKeys: String, CodingKey { - case text, maxTextLines, textStyle - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.text = try container.decode(String.self, forKey: .text) - self.maxTextLines = SBUMessageTemplate.decodeIfPresentMultipleTypeForInt( - forKey: .maxTextLines, - from: container, - defaultValue: 1 - ) ?? 1 - self.textStyle = try container.decodeIfPresent(TextStyle.self, forKey: .textStyle) - - try super.init(from: decoder) - - self.setDefaultRadiusIfNeeded(6) - self.setDefaultPaddingIfNeeded(top: 10.0, bottom: 10.0, left: 10.0, right: 10.0) - } - } - - class ImageButton: View, MessageTemplateImageRatioType { - let imageUrl: String - let imageStyle: ImageStyle - let metaData: MetaData? - - enum CodingKeys: String, CodingKey { - case imageUrl, imageStyle, metaData - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.imageUrl = try container.decode(String.self, forKey: .imageUrl) - self.imageStyle = try container.decodeIfPresent(ImageStyle.self, forKey: .imageStyle) ?? ImageStyle() - self.metaData = try container.decodeIfPresent(MetaData.self, forKey: .metaData) - - try super.init(from: decoder) - } - } - - class CarouselItem: View { - let items: [TemplateView]? - let carouselStyle: CarouselStyle - - enum CodingKeys: String, CodingKey { - case items, carouselStyle - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - let items = try container.decodeIfPresent([TemplateView].self, forKey: .items) ?? [] - self.items = items - - self.carouselStyle = try container.decodeIfPresent(CarouselStyle.self, forKey: .carouselStyle) ?? .init() - - try super.init(from: decoder) - } - - override func setIdentifier(with factory: SBUMessageTemplate.Syntax.Identifier.Factory) { - self.identifier = factory.generate(with: self) - items?.forEach { $0.setIdentifier(with: factory) } - } - - class CarouselStyle: Decodable { - let spacing: CGFloat - let maxChildWidth: CGFloat - - enum CodingKeys: String, CodingKey { - case spacing - case maxChildWidth - } - - init(spacing: CGFloat = 10, maxChildWidth: CGFloat = SBUMessageTemplate.defaultMaxSize) { - self.spacing = spacing - self.maxChildWidth = maxChildWidth - } - - required init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - - self.spacing = SBUMessageTemplate.decodeMultipleTypeForCGFloat( - forKey: .spacing, - from: container - ) - self.maxChildWidth = SBUMessageTemplate.decodeIfPresentMultipleTypeForCGFloat( - forKey: .maxChildWidth, - from: container - ) ?? SBUMessageTemplate.defaultMaxSize - } - } - } -} diff --git a/Sources/MessageTemplate/Tester/MessageTemplateParserTest.swift b/Sources/MessageTemplate/Tester/MessageTemplateParserTest.swift deleted file mode 100644 index 32fb88fb..00000000 --- a/Sources/MessageTemplate/Tester/MessageTemplateParserTest.swift +++ /dev/null @@ -1,195 +0,0 @@ -// -// MessageTemplateParserTest.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/10/14. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -public class MessageTemplateParser: NSObject { - static let MockJson = """ - { - "version": "1", - "body": { - "items": [ - { - "type": "box", - "layout": "column", - "items": [ - { - "type": "box", - "layout": "column", - "items": [ - { - "type": "image", - "imageUrl": "https://dxstmhyqfqr1o.cloudfront.net/notifications/preset-notification-channel-cover.png", - "imageStyle": { - "contentMode": "aspectFill" - }, - "viewStyle": {}, - "metaData": { - "pixelWidth": "168", - "pixelHeight": "168" - } - }, - { - "type": "box", - "layout": "column", - "viewStyle": { - "radius": "8", - "padding": { - "top": "12", - "bottom": "12", - "left": "12", - "right": "12" - } - }, - "items": [ - { - "type": "text", - "align": { - "horizontal": "left", - "vertical": "top" - }, - "viewStyle": {}, - "width": { - "type": "flex", - "value": "1" - }, - "height": { - "type": "flex", - "value": "1" - }, - "text": "Hello tez", - "textStyle": { - "color": "#ffbdb8bd", - "size": "16", - "weight": "normal" - }, - "maxTextLines": "1" - }, - { - "type": "text", - "align": { - "horizontal": "left", - "vertical": "top" - }, - "viewStyle": {}, - "width": { - "type": "fixed", - "value": "1" - }, - "height": { - "type": "flex", - "value": "1" - }, - "text": "Your order #123123 has been shipped.", - "textStyle": { - "color": "#ffbdb8bd", - "size": "16", - "weight": "normal" - }, - "maxTextLines": "1" - }, - { - "type": "textButton", - "viewStyle": { - "backgroundColor": "#E0E0E0", - "padding": { - "top": "10", - "bottom": "10", - "left": "20", - "right": "20" - } - }, - "width": { - "type": "flex", - "value": "0" - }, - "height": { - "type": "flex", - "value": "0" - }, - "text": "Check status", - "textStyle": { - "color": "#742DDD", - "size": "16", - "weight": "normal" - }, - "maxTextLines": "5", - "action": { - "type": "web", - "data": "https://naver.com" - } - } - ], - "height": { - "type": "fixed", - "value": "300" - }, - "width": { - "type": "flex", - "value": "0" - }, - "align": { - "horizontal": "left", - "vertical": "top" - } - } - ], - "viewStyle": {} - } - ], - "viewStyle": {} - } - ] - } - } - """ - - public static func getMock(widthT: String, widthV: Int, heightT: String, heightV: Int, contentMode: String) -> String { - return """ - {"version": 1,"body": {"items": [{"type": "box","layout": "column","items": [{"type": "image","metaData": {"pixelWidth": 4000,"pixelHeight": 3000},"width": {"type": "\(widthT)","value": \(widthV)},"height": {"type": "\(heightT)","value": \(heightV)},"imageStyle": {"contentMode": "\(contentMode)"},"imageUrl": "https://images.unsplash.com/photo-1579393329936-4bc9bc673651?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format"},{"type": "box","viewStyle": {"padding": {"top": 12,"right": 12,"bottom": 12,"left": 12}},"layout": "column","items": [{"type": "box","layout": "row","items": [{"type": "box","layout": "column","items": [{"type": "text","text": "Notification channel creation guide","maxTextLines": 3,"viewStyle": {"padding": {"top": 0,"bottom": 6,"left": 0,"right": 0}},"textStyle": {"size": 16,"weight": "bold"}},{"type": "text","text": "Notification Center is basically a group channel to which a single user, the receiver of a notification, belongs. A notification channel, which is a single group channel dedicated to the Notification Center, must be created for each user.","maxTextLines": 10,"textStyle": {"size": 14}}]}]},{"type": "box","layout": "column","items": [{"type": "box","viewStyle": {"margin": {"top": 16,"bottom": 0,"left": 0,"right": 0}},"align": {"horizontal": "left","vertical": "center"},"layout": "row","action": {"type": "web","data": "www.sendbird.com"},"items": [{"type": "box","viewStyle": {"margin": {"top": 0,"bottom": 0,"left": 12,"right": 0}},"layout": "column","items": [{"type": "text","text": "Title","maxTextLines": 1,"textStyle": {"size": 16,"weight": "bold"}},{"type": "text","viewStyle": {"margin": {"top": 4,"bottom": 0,"left": 0,"right": 0}},"text": "Hi","maxTextLines": 1,"textStyle": {"size": 14}}]}]}]}]}]}]}} - """ - } - /** - var tmpData = MessageTemplateParser.getMock( - // widthT: "fixed", widthV: 200, - // widthT: "flex", widthV: 0, - widthT: "flex", widthV: 1, - // heightT: "fixed", heightV: 200, - // heightT: "flex", heightV: 0, - heightT: "flex", heightV: 1, - // contentMode: "aspectFit" - // contentMode: "aspectFill" - contentMode: "scalesToFill" - ) - */ - - public func parserTest() { - let data = Data(MessageTemplateParser.MockJson.utf8) - let decoded = try? JSONDecoder().decode(SBUMessageTemplate.Syntax.TemplateView.self, from: data) - - let items = decoded?.body?.items - - let item = items?[safe: 0] - switch item { - case .box(let box): - print(box) - case .text(let text): - print(text) - case .image(let image): - print(image) - case .textButton(let textButton): - print(textButton) - case .imageButton(let imageButton): - print(imageButton) - case .carouselView(let carouselItem): - print(carouselItem) - case .none: - break - } - } -} diff --git a/Sources/MessageTemplate/Tester/MessageTemplateTestViewController.swift b/Sources/MessageTemplate/Tester/MessageTemplateTestViewController.swift deleted file mode 100644 index 3602c2b0..00000000 --- a/Sources/MessageTemplate/Tester/MessageTemplateTestViewController.swift +++ /dev/null @@ -1,97 +0,0 @@ -// -// MessageTemplateTestViewController.swift -// SendbirdUIKit -// -// Created by Tez Park on 2022/10/14. -// Copyright © 2022 Sendbird, Inc. All rights reserved. -// - -import UIKit - -public class MessageTemplateTestViewController: SBUBaseViewController { - let scrollView = UIScrollView() - var renderedView: UIView? - - var useParserTest: Bool = false - - public override func viewDidLoad() { - super.viewDidLoad() - - let backButton = SBUBarButtonItem.backButton( - target: self, - selector: #selector(onTapLeftBarButton) - ) - self.navigationItem.leftBarButtonItem = backButton - - if self.useParserTest == true { - MessageTemplateParser().parserTest() - } - } - - @objc - open func onTapLeftBarButton() { - self.dismiss(animated: true) -// self.navigationController?.popViewController(animated: true) - } - - public override func setupViews() { - super.setupViews() - - let mockJson = MessageTemplateParser.MockJson - self.renderedView = SBUMessageTemplate.Renderer( - with: mockJson, - messageId: 1, - actionHandler: { action in - SBULog.info(action.data) - } - ) ?? SBUMessageTemplate.Renderer( - body: .parsingError(text: "(Message template error)\nCan’t read this message.") - ) - - if let renderedView = self.renderedView { - self.scrollView.addSubview(renderedView) - } - - self.scrollView.clipsToBounds = true - - self.view.backgroundColor = .gray - self.view.addSubview(self.scrollView) - } - - public override func setupStyles() { - super.setupStyles() - - self.scrollView.backgroundColor = .white - } - - public override func setupLayouts() { - super.setupLayouts() - - // Must implement belows - - self.scrollView.sbu_constraint( - equalTo: self.view, - leading: 0, - trailing: 0, - top: 0, - bottom: 0 - ) - - if let renderedView = self.renderedView { - renderedView.sbu_constraint(equalTo: self.scrollView, leading: 0, trailing: 0, top: 0, bottom: 0) - renderedView.sbu_constraint(widthAnchor: self.scrollView.widthAnchor, width: 0) -// renderedView.sbu_constraint_greater(bottomAnchor: self.baseView.bottomAnchor, bottom: 0) - } - } - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. - } - */ - -} diff --git a/Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.List.swift b/Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.List.swift index 6cbf95c6..b3751255 100644 --- a/Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.List.swift +++ b/Sources/Module/Channel/GroupChannel/SBUGroupChannelModule.List.swift @@ -148,6 +148,14 @@ public protocol SBUGroupChannelModuleListDataSource: SBUBaseChannelModuleListDat /// - tableView: `UITableView` object from list component. /// - Returns: `SBUHightlightMessageInfo` object. func groupChannelModule(_ listComponent: SBUGroupChannelModule.List, highlightInfoInTableView tableView: UITableView) -> SBUHighlightMessageInfo? + + /// Ask to data source to return template load state cache. + /// - Returns: If the result is `nil`, it means that no attempt was made to load the template. + /// - Since: 3.29.0 + func groupChannelModule( + _ listComponent: SBUGroupChannelModule.List, + didHandleUncachedTemplateKeys templateKeys: [String] + ) -> Bool? } extension SBUGroupChannelModule { @@ -609,6 +617,16 @@ extension SBUGroupChannelModule { let useReaction = SBUEmojiManager.isReactionEnabled(channel: self.channel) let enableEmojiLongPress = SBUEmojiManager.isEmojiLongPressEnabled(channel: channel) + messageCell.reloadCellHandler = { [weak self] cell in + guard let self = self else { return } + self.reloadCell(cell) + } + + self.configureMessageTemplateHandlers( + with: messageCell, + indexPath: indexPath + ) + switch (message, messageCell) { // Admin message case let (adminMessage, adminMessageCell) as (AdminMessage, SBUAdminMessageCell): @@ -740,6 +758,7 @@ extension SBUGroupChannelModule { let configuration = SBUMessageTemplateCellParams( message: message, + hideDateView: isSameDay, // FIXED: https://sendbird.atlassian.net/browse/CLNP-6060 shouldHideSuggestedReplies: shouldHideSuggestedReplies ) templateCell.configure(with: configuration) @@ -807,49 +826,6 @@ extension SBUGroupChannelModule { self.delegate?.groupChannelModule(self, didUpdate: answer, messageCell: cell) } - messageCell.reloadCellHandler = { [weak self] cell in - guard let self = self else { return } - self.reloadCell(cell) - } - - messageCell.messageTemplateActionHandler = { [weak self, indexPath] action in - guard let self = self, let message = messageCell.message else { return } - - // Action Events - switch action.type { - case .uikit: - self.delegate?.groupChannelModule( - self, - shouldHandleTemplatePreDefinedAction: action, - message: message, - forRowAt: indexPath - ) - case .custom: - self.delegate?.groupChannelModule( - self, - shouldHandleTemplateCustomAction: action, - message: message, - forRowAt: indexPath - ) - case .web: - self.delegate?.groupChannelModule( - self, - shouldHandleTemplateAction: action, - message: message, - forRowAt: indexPath - ) - } - } - - messageCell.uncachedMessageTemplateDownloadHandler = { [weak self] templateKeys, messageCell in - guard let self = self else { return } - self.delegate?.groupChannelModule( - self, - shouldHandleUncachedTemplateKeys: templateKeys, - messageCell: messageCell - ) - } - messageCell.uncachedMessageTemplateImageHandler = { [weak self] cacheData, messageCell in guard let self = self else { return } self.delegate?.groupChannelModule( @@ -1194,3 +1170,53 @@ extension SBUGroupChannelModule.List { } } } + +extension SBUGroupChannelModule.List { + public func configureMessageTemplateHandlers( + with messageCell: SBUBaseMessageCell, + indexPath: IndexPath + ) { + messageCell.messageTemplateActionHandler = { [weak self, indexPath] action in + guard let self = self, let message = messageCell.message else { return } + + // Action Events + switch action.type { + case .uikit: + self.delegate?.groupChannelModule( + self, + shouldHandleTemplatePreDefinedAction: action, + message: message, + forRowAt: indexPath + ) + case .custom: + self.delegate?.groupChannelModule( + self, + shouldHandleTemplateCustomAction: action, + message: message, + forRowAt: indexPath + ) + case .web: + self.delegate?.groupChannelModule( + self, + shouldHandleTemplateAction: action, + message: message, + forRowAt: indexPath + ) + } + } + + messageCell.uncachedMessageTemplateDownloadHandler = { [weak self] templateKeys, messageCell in + guard let self = self else { return } + self.delegate?.groupChannelModule( + self, + shouldHandleUncachedTemplateKeys: templateKeys, + messageCell: messageCell + ) + } + + messageCell.uncachedMessageTemplateStateHandler = { [weak self] keys in + guard let self = self else { return nil } + return self.dataSource?.groupChannelModule(self, didHandleUncachedTemplateKeys: keys) ?? nil + } + } +} diff --git a/Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.List.swift b/Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.List.swift index 366bbb75..85433759 100644 --- a/Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.List.swift +++ b/Sources/Module/Channel/NotificationChannel/Chat/SBUChatNotificationChannelModule.List.swift @@ -83,6 +83,14 @@ protocol SBUChatNotificationChannelModuleListDelegate: SBUCommonDelegate { func chatNotificationChannelModuleDidSelectRetry( _ listComponent: SBUChatNotificationChannelModule.List ) + + /// Called when a message template is not cached and needs to be downloaded. + /// - Since: 3.29.0 + func chatNotificationChannelModule( + _ listComponent: SBUChatNotificationChannelModule.List, + shouldHandleUncachedTemplateKeys templateKeys: [String], + messageCell: SBUBaseMessageCell + ) } extension SBUChatNotificationChannelModuleListDelegate { @@ -128,6 +136,14 @@ protocol SBUChatNotificationChannelModuleListDataSource: AnyObject { _ listComponent: SBUChatNotificationChannelModule.List, startingPointIn tableView: UITableView ) -> Int64? + + /// Ask to data source to return template load state cache. + /// - Returns: If the result is `nil`, it means that no attempt was made to load the template. + /// - Since: 3.29.0 + func chatNotificationChannelModule( + _ listComponent: SBUChatNotificationChannelModule.List, + didHandleUncachedTemplateKeys templateKeys: [String] + ) -> Bool? } // swiftlint:enable type_name @@ -459,6 +475,14 @@ extension SBUChatNotificationChannelModule { notificationCell.reloadCellHandler = { [weak self] cell in self?.tableView.sbu_reloadCell(cell) } + notificationCell.uncachedMessageTemplateDownloadHandler = { [weak self] keys, cell in + guard let self = self else { return } + self.delegate?.chatNotificationChannelModule(self, shouldHandleUncachedTemplateKeys: keys, messageCell: cell) + } + notificationCell.uncachedMessageTemplateStateHandler = { [weak self] keys in + guard let self = self else { return nil } + return self.dataSource?.chatNotificationChannelModule(self, didHandleUncachedTemplateKeys: keys) + } UIView.setAnimationsEnabled(true) } diff --git a/Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.List.swift b/Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.List.swift index 64e3742a..a5e6f866 100644 --- a/Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.List.swift +++ b/Sources/Module/Channel/NotificationChannel/Feed/SBUFeedNotificationChannelModule.List.swift @@ -98,6 +98,14 @@ protocol SBUFeedNotificationChannelModuleListDelegate: SBUCommonDelegate { func feedNotificationChannelModuleStopMarkAsViewedTimer( _ listComponent: SBUFeedNotificationChannelModule.List ) + + /// Called when a message template is not cached and needs to be downloaded. + /// - Since: 3.29.0 + func feedNotificationChannelModule( + _ listComponent: SBUFeedNotificationChannelModule.List, + shouldHandleUncachedTemplateKeys templateKeys: [String], + messageCell: SBUBaseMessageCell + ) } extension SBUFeedNotificationChannelModuleListDelegate { @@ -142,6 +150,14 @@ protocol SBUFeedNotificationChannelModuleListDataSource: AnyObject { _ listComponent: SBUFeedNotificationChannelModule.List, startingPointIn tableView: UITableView ) -> Int64? + + /// Ask to data source to return template load state cache. + /// - Returns: If the result is `nil`, it means that no attempt was made to load the template. + /// - Since: 3.29.0 + func feedNotificationChannelModule( + _ listComponent: SBUFeedNotificationChannelModule.List, + didHandleUncachedTemplateKeys templateKeys: [String] + ) -> Bool? } // swiftlint:enable type_name @@ -486,6 +502,14 @@ extension SBUFeedNotificationChannelModule { notificationCell.reloadCellHandler = { [weak self] cell in self?.tableView.sbu_reloadCell(cell) } + notificationCell.uncachedMessageTemplateDownloadHandler = { [weak self] keys, cell in + guard let self = self else { return } + self.delegate?.feedNotificationChannelModule(self, shouldHandleUncachedTemplateKeys: keys, messageCell: cell) + } + notificationCell.uncachedMessageTemplateStateHandler = { [weak self] keys in + guard let self = self else { return nil } + return self.dataSource?.feedNotificationChannelModule(self, didHandleUncachedTemplateKeys: keys) + } UIView.setAnimationsEnabled(true) } diff --git a/Sources/SBUGlobals.swift b/Sources/SBUGlobals.swift index 7895e902..2604dbca 100644 --- a/Sources/SBUGlobals.swift +++ b/Sources/SBUGlobals.swift @@ -258,3 +258,9 @@ extension SBUGlobals { } } } + +extension SBUGlobals { + static var imageCompressionQuality: CGFloat { + SBUGlobals.isImageCompressionEnabled ? SBUGlobals.imageCompressionRate : 1.0 + } +} diff --git a/Sources/Manager/CacheManager/SBUCacheManager.NotificationSetting.swift b/Sources/Template/SBUCacheManager.NotificationSetting.swift similarity index 100% rename from Sources/Manager/CacheManager/SBUCacheManager.NotificationSetting.swift rename to Sources/Template/SBUCacheManager.NotificationSetting.swift diff --git a/Sources/Manager/CacheManager/SBUCacheManager.Template.swift b/Sources/Template/SBUCacheManager.Template.swift similarity index 76% rename from Sources/Manager/CacheManager/SBUCacheManager.Template.swift rename to Sources/Template/SBUCacheManager.Template.swift index 065cc143..1b3a3384 100644 --- a/Sources/Manager/CacheManager/SBUCacheManager.Template.swift +++ b/Sources/Template/SBUCacheManager.Template.swift @@ -7,9 +7,12 @@ // import UIKit +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif extension SBUCacheManager { - static func template(with type: SBUTemplateType) -> SBUTemplateCacheType { + static func template(with type: SBUMessageTemplate.TemplateType) -> SBUTemplateCacheType { switch type { case .notification: return NotificationMessageTemplate.shared case .message: return GroupMessageTemplate.shared @@ -18,21 +21,21 @@ extension SBUCacheManager { class NotificationMessageTemplate: SBUTemplateCacheType { static let shared = NotificationMessageTemplate() - static let type = SBUTemplateType.notification + static let type = SBUMessageTemplate.TemplateType.notification static let memoryCache = MemoryCacheForTemplate() static let diskCache = DiskCacheForTemplate(cacheType: type.cacheKey) } class GroupMessageTemplate: SBUTemplateCacheType { static let shared = GroupMessageTemplate() - static let type = SBUTemplateType.message + static let type = SBUMessageTemplate.TemplateType.message static let memoryCache = MemoryCacheForTemplate() static let diskCache = DiskCacheForTemplate(cacheType: type.cacheKey) } } protocol SBUTemplateCacheType: AnyObject { - static var type: SBUTemplateType { get } + static var type: SBUMessageTemplate.TemplateType { get } static var memoryCache: SBUCacheManager.MemoryCacheForTemplate { get } static var diskCache: SBUCacheManager.DiskCacheForTemplate { get } } @@ -46,13 +49,13 @@ extension SBUTemplateCacheType { } // MARK: - Template list - func save(templates: [SBUMessageTemplate.TemplateModel]) { + func save(templates: [MessageTemplate]) { Self.memoryCache.set(templates: templates) Self.diskCache.set(templates: templates) } @discardableResult - func loadAllTemplates() -> [String: SBUMessageTemplate.TemplateModel]? { + func loadAllTemplates() -> [String: MessageTemplate]? { if let templateList = Self.memoryCache.getAllTemplates() { // SBULog.info("Loaded templates from memory cache") return templateList @@ -66,16 +69,16 @@ extension SBUTemplateCacheType { return nil } - func upsert(templates: [SBUMessageTemplate.TemplateModel]) { + func upsert(templates: [MessageTemplate]) { self.save(templates: templates) } // MARK: - Single template - func save(template: SBUMessageTemplate.TemplateModel) { + func save(template: MessageTemplate) { self.save(templates: [template]) } - func getTemplate(forKey key: String) -> SBUMessageTemplate.TemplateModel? { + func getTemplate(forKey key: String) -> MessageTemplate? { if let memoryTemplate = Self.memoryCache.get(key: key) { return memoryTemplate } else if let templates = loadAllTemplates(), @@ -88,10 +91,10 @@ extension SBUTemplateCacheType { return nil } - func getTemplateList(forKeys keys: [String]) -> [String: SBUMessageTemplate.TemplateModel]? { + func getTemplateList(forKeys keys: [String]) -> [String: MessageTemplate]? { let results = keys.compactMap { self.getTemplate(forKey: $0) } guard results.count == keys.count else { return nil } - return results.reduce(into: [String: SBUMessageTemplate.TemplateModel]()) { $0[$1.key] = $1 } + return results.reduce(into: [String: MessageTemplate]()) { $0[$1.key] = $1 } } func removeTemplate(forKey key: String) { @@ -119,28 +122,6 @@ extension SBUTemplateCacheType { Self.memoryCache.resetCache() } } - -extension SBUCacheManager { - class TemplateImage { - static let memoryCache = MemoryCacheForTemplateImageSize() - - static func save(messageId: Int64, viewIndex: Int, size: CGSize) { - self.memoryCache.set(messageId: messageId, viewIndex: viewIndex, size: size) - } - - static func load(messageId: Int64, viewIndex: Int) -> CGSize? { - self.memoryCache.get(messageId: messageId, viewIndex: viewIndex) - } - - static func save(key: String, size: CGSize) { - self.memoryCache.set(key: key, size: size) - } - - static func load(key: String) -> CGSize? { - self.memoryCache.get(key: key) - } - } -} extension SBUCacheManager { struct DiskCacheForTemplate { @@ -181,12 +162,12 @@ extension SBUCacheManager { return fileManager.fileExists(atPath: self.pathForKey(key)) } - func get(fullPath: URL, needToSync: Bool = true) -> SBUMessageTemplate.TemplateModel? { - let template: SBUMessageTemplate.TemplateModel? = { + func get(fullPath: URL, needToSync: Bool = true) -> MessageTemplate? { + let template: MessageTemplate? = { do { let data = try Data(contentsOf: fullPath) - let template = try JSONDecoder().decode(SBUMessageTemplate.TemplateModel.self, from: data) - return template as SBUMessageTemplate.TemplateModel + let template = try JSONDecoder().decode(MessageTemplate.self, from: data) + return template } catch { SBULog.info(error.localizedDescription) } @@ -205,19 +186,19 @@ extension SBUCacheManager { } } - func get(key: String) -> SBUMessageTemplate.TemplateModel? { + func get(key: String) -> MessageTemplate? { guard cacheExists(key: key) else { return nil } let filePath = URL(fileURLWithPath: self.pathForKey(key)) return self.get(fullPath: filePath) } - func getAllTemplates() -> [String: SBUMessageTemplate.TemplateModel]? { + func getAllTemplates() -> [String: MessageTemplate]? { return self.diskQueue.sync { self.fileSemaphore.wait() defer { self.fileSemaphore.signal() } - var templateList: [String: SBUMessageTemplate.TemplateModel]? + var templateList: [String: MessageTemplate]? do { let items = try fileManager.contentsOfDirectory(at: cachePathURL(), includingPropertiesForKeys: nil) @@ -237,7 +218,7 @@ extension SBUCacheManager { } } - func set(templates: [SBUMessageTemplate.TemplateModel]) { + func set(templates: [MessageTemplate]) { for template in templates { let encoder = JSONEncoder() do { @@ -370,26 +351,26 @@ extension SBUCacheManager { // MARK: - MemoryCache class MemoryCacheForTemplate { var lastToken: String? - var templateList: [String: SBUMessageTemplate.TemplateModel]? + var templateList: [String: MessageTemplate]? // MARK: - Memory Cache - func set(templates: [SBUMessageTemplate.TemplateModel]) { + func set(templates: [MessageTemplate]) { for template in templates { set(key: template.key, template: template) } } - func set(key: String, template: SBUMessageTemplate.TemplateModel) { + func set(key: String, template: MessageTemplate) { if self.templateList == nil { self.templateList = [:] } self.templateList?[key] = template } - func get(key: String) -> SBUMessageTemplate.TemplateModel? { + func get(key: String) -> MessageTemplate? { guard let template = self.templateList?[key] else { return nil } - return template as SBUMessageTemplate.TemplateModel + return template as MessageTemplate } - func getAllTemplates() -> [String: SBUMessageTemplate.TemplateModel]? { + func getAllTemplates() -> [String: MessageTemplate]? { return templateList } @@ -401,35 +382,6 @@ extension SBUCacheManager { self.lastToken = nil self.templateList = nil } - -// func cacheExists(key: String) -> Bool { -// return self.templateList?[key] != nil -// } } } -extension SBUCacheManager { - class MemoryCacheForTemplateImageSize { - var sizeCache: [String: CGSize] = [:] // The key is a combination of the message ID and the index of view item. - - func generateKey(messageId: Int64, viewIndex: Int) -> String { - "\(messageId)_\(viewIndex)" - } - - func set(messageId: Int64, viewIndex: Int, size: CGSize) { - self.sizeCache[self.generateKey(messageId: messageId, viewIndex: viewIndex)] = size - } - - func get(messageId: Int64, viewIndex: Int) -> CGSize? { - self.sizeCache[self.generateKey(messageId: messageId, viewIndex: viewIndex)] - } - - func set(key: String, size: CGSize) { - self.sizeCache[key] = size - } - - func get(key: String) -> CGSize? { - self.sizeCache[key] - } - } -} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Action.swift b/Sources/Template/SBUMessageTemplate.Action.swift similarity index 64% rename from Sources/MessageTemplate/Syntax/SBUMessageTemplate.Action.swift rename to Sources/Template/SBUMessageTemplate.Action.swift index eaab64bc..99d3309a 100644 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.Action.swift +++ b/Sources/Template/SBUMessageTemplate.Action.swift @@ -7,12 +7,21 @@ // import UIKit +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif -extension SBUMessageTemplate { +/// Message template namespace class +public class SBUMessageTemplate { // MARK: - Action + /// Message Template Touch Action Class + /// - Since: 3.29.0 public class Action: Decodable { + /// Action type public let type: ActionType + /// String data values public let data: String + /// Additional data values public let alterData: String? enum CodingKeys: String, CodingKey { @@ -26,6 +35,22 @@ extension SBUMessageTemplate { self.alterData = try container.decodeIfPresent(String.self, forKey: .alterData) } + init( + type: ActionType, + data: String, + alterData: String? + ) { + self.type = type + self.data = data + self.alterData = alterData + } + + init(action: TemplateSyntax.Action) { + self.type = .init(rawValue: action.type.rawValue) ?? .custom + self.data = action.data + self.alterData = action.alterData + } + /// - Since: 3.21.0 public var urlFromActionDatas: URL? { if let url = URL(string: self.data.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "") { @@ -40,6 +65,8 @@ extension SBUMessageTemplate { } } + /// Action type + /// - Since: 3.29.0 public enum ActionType: String, Decodable { case web, custom, uikit } diff --git a/Sources/MessageTemplate/Processor/SBUMessageTemplate.Container.swift b/Sources/Template/SBUMessageTemplate.Container.swift similarity index 92% rename from Sources/MessageTemplate/Processor/SBUMessageTemplate.Container.swift rename to Sources/Template/SBUMessageTemplate.Container.swift index d5cae44a..49ff85e5 100644 --- a/Sources/MessageTemplate/Processor/SBUMessageTemplate.Container.swift +++ b/Sources/Template/SBUMessageTemplate.Container.swift @@ -2,7 +2,7 @@ // SBUMessageTemplate.Container.swift // SendbirdUIKit // -// Created by Damon Park on 8/26/24. +// Created by Damon Park on 10/24/24. // import Foundation @@ -19,6 +19,7 @@ extension SBUMessageTemplate { } extension SBUMessageTemplate.Container { + /// Methods to parse TemplateData to create container objects static func create(with data: [String: Any]?) -> SBUMessageTemplate.Container { guard let data = data else { return .default } let type = ContainerType(typeString: data["type"] as? String) @@ -57,24 +58,19 @@ extension SBUMessageTemplate.Container.ContainerType { /// A value indicating whether the container type is a valid type public var isValid: Bool { self != .unknown } - init(typeString: String?) { - self = .init(rawValue: typeString ?? "") ?? .unknown - } - + /// Methods to check the validity of a template. public static func isValidType(with template: [String: Any]) -> Bool { SBUMessageTemplate.Container.ContainerType(typeString: template["type"] as? String).isValid } } -extension SBUMessageTemplate.Container.ContainerOptions: Decodable { - static var `default`: SBUMessageTemplate.Container.ContainerOptions { - SBUMessageTemplate.Container.ContainerOptions( - profile: true, - time: true, - nickname: true - ) +extension SBUMessageTemplate.Container.ContainerType { + init(typeString: String?) { + self = .init(rawValue: typeString ?? "") ?? .unknown } - +} + +extension SBUMessageTemplate.Container.ContainerOptions: Decodable { enum CodingKeys: String, CodingKey { case profile, time, nickname } @@ -86,6 +82,16 @@ extension SBUMessageTemplate.Container.ContainerOptions: Decodable { self.time = try container.decodeIfPresent(Bool.self, forKey: .time) ?? true self.nickname = try container.decodeIfPresent(Bool.self, forKey: .nickname) ?? true } +} + +extension SBUMessageTemplate.Container.ContainerOptions { + static var `default`: SBUMessageTemplate.Container.ContainerOptions { + SBUMessageTemplate.Container.ContainerOptions( + profile: true, + time: true, + nickname: true + ) + } static func create(with data: [String: Any]?) -> SBUMessageTemplate.Container.ContainerOptions { guard let data = data else { return .default } diff --git a/Sources/Template/SBUMessageTemplate.Coordinator.swift b/Sources/Template/SBUMessageTemplate.Coordinator.swift new file mode 100644 index 00000000..575f5529 --- /dev/null +++ b/Sources/Template/SBUMessageTemplate.Coordinator.swift @@ -0,0 +1,97 @@ +// +// SBUMessageTemplate.Coordinator.swift +// SendbirdUIKit +// +// Created by Damon Park on 2024/03/14. +// Copyright © 2024 Sendbird, Inc. All rights reserved. +// + +import UIKit +import SendbirdChatSDK +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif + +extension SBUMessageTemplate.Coordinator { + enum ResultType { + case reload(ReloadType) + case template(syntax: TemplateSyntax.TemplateView, view: UIView) + case failed + + enum ReloadType { + case download(DownloadType) + } + + enum DownloadType { + case template(keys: [String]) + } + + var template: TemplateSyntax.TemplateView? { + switch self { + case .template(let syntax, _): return syntax + default: return nil + } + } + + var view: UIView? { + switch self { + case .template(_, let view): return view + default: return nil + } + } + } +} + +extension SBUMessageTemplate { + class Coordinator { + static func execute( + type: SBUMessageTemplate.TemplateType, + message: BaseMessage?, + theme: TemplateColorScheme? = nil, + params: ViewGeneratorParams + ) -> SBUMessageTemplate.Coordinator.ResultType { + guard let message = message else { return .failed } + guard let payload = type.payload(from: message) else { return .failed } + + do { + let result = try TemplateParser(provider: type).parse( + key: payload.key, + messageId: payload.messageId, + dataVariables: payload.datas, + viewVariables: payload.views, + theme: theme + ) + + var templateView = result + + if result.templateModel?.isDataTemplate == true { + templateView = .init( + body: .dataTemplate( + text: "[This message is sent from data template.]", + subText: result.templateJson + ), + messageId: message.messageId + ) + } + + let view = try ViewGenerator.draw( + templateView: templateView, + params: params + ) + + return .template( + syntax: templateView, + view: view + ) + + } catch { + switch error { + case let TemplateError.noExist(keys): + return .reload(.download(.template(keys: keys))) + default: + return .failed + } + } + } + } +} diff --git a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.ErrorMessages.swift b/Sources/Template/SBUMessageTemplate.ErrorMessages.swift similarity index 82% rename from Sources/MessageTemplate/Syntax/SBUMessageTemplate.ErrorMessages.swift rename to Sources/Template/SBUMessageTemplate.ErrorMessages.swift index 7e72ccc3..2ce7a184 100644 --- a/Sources/MessageTemplate/Syntax/SBUMessageTemplate.ErrorMessages.swift +++ b/Sources/Template/SBUMessageTemplate.ErrorMessages.swift @@ -1,5 +1,5 @@ // -// SBUMessageTemplate.ErrorMessages.swift +// SendbirdMessageTemplate.ErrorMessages.swift // SendbirdUIKit // // Created by Tez Park on 2022/09/30. @@ -7,16 +7,19 @@ // import UIKit +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif -extension SBUMessageTemplate.Syntax.Body { +extension TemplateSyntax.Body { static func parsingError( text: String, subText: String? = nil, width: CGFloat? = nil, height: CGFloat? = nil, - containerViewStyle viewStyle: SBUMessageTemplate.Syntax.ViewStyle? = nil - ) -> SBUMessageTemplate.Syntax.Body { - var textItems: [SBUMessageTemplate.Syntax.Item] = [ + containerViewStyle viewStyle: TemplateSyntax.ViewStyle? = nil + ) -> TemplateSyntax.Body { + var textItems: [TemplateSyntax.Item] = [ .text(.init( text: text, maxTextLines: 10, @@ -49,15 +52,15 @@ extension SBUMessageTemplate.Syntax.Body { ) } - let body = SBUMessageTemplate.Syntax.Body() + let body = TemplateSyntax.Body() body.items = [ .box(.init( layout: .column, - align: SBUMessageTemplate.Syntax.ItemsAlign(horizontal: .left, vertical: .center), + align: TemplateSyntax.ItemsAlign(horizontal: .left, vertical: .center), type: .box, viewStyle: viewStyle, - width: width != nil ? .init(type: .fixed, value: Int(width!)) : .wrapContent(), - height: height != nil ? .init(type: .fixed, value: Int(height!)) : .wrapContent(), + width: width != nil ? .init(type: .fixed, value: Int(width!)) : .wrapContent, + height: height != nil ? .init(type: .fixed, value: Int(height!)) : .wrapContent, items: [ .box(.init( layout: .column, @@ -77,11 +80,11 @@ extension SBUMessageTemplate.Syntax.Body { static func downloadingTemplate( width: CGFloat? = nil, height: CGFloat, - containerViewStyle viewStyle: SBUMessageTemplate.Syntax.ViewStyle? = nil - ) -> SBUMessageTemplate.Syntax.Body { - let spinnerItems: [SBUMessageTemplate.Syntax.Item] = [ + containerViewStyle viewStyle: TemplateSyntax.ViewStyle? = nil + ) -> TemplateSyntax.Body { + let spinnerItems: [TemplateSyntax.Item] = [ .image(.init( - imageUrl: SBUMessageTemplate.urlForTemplateDownload, + imageUrl: TemplateConfig.urlForTemplateDownload, imageStyle: .init( contentMode: .center, tintColor: SBUTheme.notificationTheme.notificationCell.downloadingBackgroundHexColor @@ -90,14 +93,14 @@ extension SBUMessageTemplate.Syntax.Body { )) ] - let body = SBUMessageTemplate.Syntax.Body() + let body = TemplateSyntax.Body() body.items = [ .box(.init( layout: .column, - align: SBUMessageTemplate.Syntax.ItemsAlign(horizontal: .center, vertical: .center), + align: TemplateSyntax.ItemsAlign(horizontal: .center, vertical: .center), type: .box, viewStyle: viewStyle, - width: width != nil ? .init(type: .fixed, value: Int(width!)) : .wrapContent(), + width: width != nil ? .init(type: .fixed, value: Int(width!)) : .wrapContent, height: .init(type: .fixed, value: Int(height)), items: [ .box(.init( @@ -117,8 +120,8 @@ extension SBUMessageTemplate.Syntax.Body { return body } - static func dataTemplate(text: String, subText: String? = nil) -> SBUMessageTemplate.Syntax.Body { - var textItems: [SBUMessageTemplate.Syntax.Item] = [ + static func dataTemplate(text: String, subText: String? = nil) -> TemplateSyntax.Body { + var textItems: [TemplateSyntax.Item] = [ .text(.init( text: text, maxTextLines: 10, @@ -151,11 +154,11 @@ extension SBUMessageTemplate.Syntax.Body { ) } - let body = SBUMessageTemplate.Syntax.Body() + let body = TemplateSyntax.Body() body.items = [ .box(.init( layout: .column, - align: SBUMessageTemplate.Syntax.ItemsAlign(horizontal: .left, vertical: .center), + align: TemplateSyntax.ItemsAlign(horizontal: .left, vertical: .center), type: .box, items: [ .box(.init( diff --git a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.RendererType.swift b/Sources/Template/SBUMessageTemplate.RendererType.swift similarity index 54% rename from Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.RendererType.swift rename to Sources/Template/SBUMessageTemplate.RendererType.swift index ea8c1765..e1790878 100644 --- a/Sources/MessageTemplate/Renderer/SBUMessageTemplate.Renderer.RendererType.swift +++ b/Sources/Template/SBUMessageTemplate.RendererType.swift @@ -1,5 +1,5 @@ // -// SBUMessageTemplate.Renderer.RendererType.swift +// SBUMessageTemplate.RendererType.swift // SendbirdUIKit // // Created by Damon Park on 2024/02/27. @@ -8,13 +8,16 @@ import UIKit import SendbirdChatSDK +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif -extension SBUMessageTemplate.Renderer { +extension SBUMessageTemplate { enum RendererType { case inProgress - case downloading(renderer: SBUMessageTemplate.Renderer) - case error(renderer: SBUMessageTemplate.Renderer) - case loaded(key: String, renderer: SBUMessageTemplate.Renderer) + case downloading(messageId: Int64?, view: UIView) + case error(messageId: Int64?, view: UIView) + case loaded(messageId: Int64?, view: UIView) var isInProgress: Bool { guard case .inProgress = self else { return false } @@ -23,7 +26,7 @@ extension SBUMessageTemplate.Renderer { } } -extension SBUMessageTemplate.Renderer.RendererType { +extension SBUMessageTemplate.RendererType { var isLoaded: Bool { switch self { case .loaded: return true @@ -38,28 +41,36 @@ extension SBUMessageTemplate.Renderer.RendererType { } } - var renderer: SBUMessageTemplate.Renderer? { + var renderer: UIView? { switch self { case .inProgress: return nil - case .downloading(let renderer): return renderer - case .error(let renderer): return renderer - case .loaded(_, let renderer): return renderer + case let .downloading(_, view): return view + case let .error(_, view): return view + case let .loaded(_, view): return view + } + } + + var messageId: Int64? { + switch self { + case .inProgress: return nil + case let .downloading(messageId, _): return messageId + case let .error(messageId, _): return messageId + case let .loaded(messageId, _): return messageId } } mutating func clear() { self.renderer?.removeFromSuperview() - self.renderer?.delegate = nil self = .inProgress } } -extension SBUMessageTemplate.Renderer { +extension SBUMessageTemplate { static func parsingErrorMesageTemplateBody( - type: SBUTemplateType, + type: SBUMessageTemplate.TemplateType, message: BaseMessage?, - containerViewStyle viewStyle: SBUMessageTemplate.Syntax.ViewStyle? = nil - ) -> SBUMessageTemplate.Syntax.Body { + containerViewStyle viewStyle: TemplateSyntax.ViewStyle? = nil + ) -> TemplateSyntax.Body { if let defaultMessage = message?.message, defaultMessage.hasElements { return .parsingError( text: defaultMessage, @@ -84,33 +95,37 @@ extension SBUMessageTemplate.Renderer { } static func errorRenderer( - type: SBUTemplateType, + type: SBUMessageTemplate.TemplateType, message: BaseMessage?, - viewStyle: SBUMessageTemplate.Syntax.ViewStyle? = nil - ) -> SBUMessageTemplate.Renderer { - let body: SBUMessageTemplate.Syntax.Body = parsingErrorMesageTemplateBody( + viewStyle: TemplateSyntax.ViewStyle? = nil + ) -> UIView { + let body: TemplateSyntax.Body = parsingErrorMesageTemplateBody( type: type, message: message, containerViewStyle: viewStyle ) - return SBUMessageTemplate.Renderer( - messageId: message?.messageId, - body: body - ) + + guard let view = try? ViewGenerator.draw(templateView: .init(body: body, messageId: message?.messageId)) else { + return UIView() + } + + return view } static func downloadingRenderer( messageId: Int64?, downloadingHeight: CGFloat, - viewStyle: SBUMessageTemplate.Syntax.ViewStyle? = nil - ) -> SBUMessageTemplate.Renderer { - let body: SBUMessageTemplate.Syntax.Body = .downloadingTemplate( + viewStyle: TemplateSyntax.ViewStyle? = nil + ) -> UIView { + let body: TemplateSyntax.Body = .downloadingTemplate( height: downloadingHeight, containerViewStyle: viewStyle ) - return SBUMessageTemplate.Renderer( - messageId: messageId, - body: body - ) + + guard let view = try? ViewGenerator.draw(templateView: .init(body: body, messageId: messageId)) else { + return UIView() + } + + return view } } diff --git a/Sources/Template/SBUMessageTemplate.TemplateCacheState.swift b/Sources/Template/SBUMessageTemplate.TemplateCacheState.swift new file mode 100644 index 00000000..cdbd4658 --- /dev/null +++ b/Sources/Template/SBUMessageTemplate.TemplateCacheState.swift @@ -0,0 +1,36 @@ +// +// SBUMessageTemplate.TemplateCacheState.swift +// SendbirdUIKit +// +// Created by Damon Park on 11/13/24. +// + +import Foundation + +extension SBUMessageTemplate { + enum TemplateCacheState { + case success + case failure + case loading + } +} + +extension Dictionary where Key == String, Value == SBUMessageTemplate.TemplateCacheState { + func uncachedKeys(from keys: [String]) -> [String]? { + let result = keys.filter { self[$0] != .success && self[$0] != .loading } + if result.isEmpty { return nil } + return result + } + + mutating func loadingKeys(from keys: [String]) { + for key in keys { + self[key] = .loading + } + } + + mutating func didLoadKeys(form keys: [String], success: Bool) { + for key in keys { + self[key] = success ? .success : .failure + } + } +} diff --git a/Sources/Template/SBUMessageTemplate.TemplateType.swift b/Sources/Template/SBUMessageTemplate.TemplateType.swift new file mode 100644 index 00000000..2c6f9476 --- /dev/null +++ b/Sources/Template/SBUMessageTemplate.TemplateType.swift @@ -0,0 +1,147 @@ +// +// SBUMessageTemplate.TemplateType.swift +// SendbirdUIKit +// +// Created by Damon Park on 2024/02/19. +// Copyright © 2024 Sendbird, Inc. All rights reserved. +// + +import UIKit +import SendbirdChatSDK +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif + +extension SBUMessageTemplate { + enum TemplateType { + case notification + case message + } + + enum ThemeType: String { + case light + case dark + case `default` + } + +} + +extension SBUMessageTemplate.TemplateType { + var cacheKey: String { + switch self { + case .notification: return "template" // NOTE: for backward + case .message: return "message_template" + } + } +} + +extension SBUMessageTemplate.ThemeType { + static func type(with themeMode: String?) -> SBUMessageTemplate.ThemeType? { + SBUMessageTemplate.ThemeType(rawValue: themeMode ?? "") + } +} + +extension SBUMessageTemplate.TemplateType { + func getRemoteToken() -> Int64 { + switch self { + case .notification: + return Int64(SendbirdChat.getAppInfo()?.notificationInfo?.templateListToken ?? "0") ?? 0 + + case .message: + return Int64(SendbirdChat.getAppInfo()?.messageTemplateInfo?.templateListToken ?? "0") ?? 0 + } + } + + func loadTemplate( + key: String, + completionHandler: @escaping (_ payload: String?, _ error: Error?) -> Void + ) { + switch self { + case .notification: + SendbirdChat.getNotificationTemplate(key: key) { template, error in + completionHandler(template?.jsonPayload, error) + } + + case .message: + SendbirdChat.getMessageTemplate(key: key) { template, error in + completionHandler(template?.jsonPayload, error) + } + } + } + + func loadTemplateList( + token: String?, + completionHandler: @escaping (_ payload: String?, _ token: String?) -> Void + ) { + switch self { + case .notification: + let params = NotificationTemplateListParams { $0.limit = 100 } + SendbirdChat.getNotificationTemplateList(token: token, params: params) { templateList, _, token, _ in + completionHandler(templateList?.jsonPayload, token) + } + case .message: + let params = MessageTemplateListParams { $0.limit = 100 } + SendbirdChat.getMessageTemplateList(token: token, params: params) { templateList, _, token, _ in + completionHandler(templateList?.jsonPayload, token) + } + } + } + + func loadTemplateList( + keys: [String], + completionHandler: @escaping (_ payload: String?, _ token: String?) -> Void + ) { + switch self { + case .notification: + let params = NotificationTemplateListParams { + $0.limit = 100 + $0.keys = keys + } + SendbirdChat.getNotificationTemplateList(token: nil, params: params) { templateList, _, token, _ in + completionHandler(templateList?.jsonPayload, token) + } + case .message: + let params = MessageTemplateListParams { + $0.limit = 100 + $0.keys = keys + } + SendbirdChat.getMessageTemplateList(token: nil, params: params) { templateList, _, token, _ in + completionHandler(templateList?.jsonPayload, token) + } + } + } +} + +extension SBUMessageTemplate.TemplateType: MessageTemplateProvider { +#if canImport(SendbirdUIMessageTemplate) + typealias TemplateModel = SendbirdUIMessageTemplate.MessageTemplate +#else + typealias TemplateModel = MessageTemplate +#endif + + internal func provide(key: String) -> TemplateModel? { + return SBUCacheManager + .template(with: self) + .getTemplate(forKey: key) + } +} + +extension SBUMessageTemplate.TemplateType { + func payload(from message: BaseMessage) -> SBUMessageTemplate.TemplateType.Payload? { + switch self { + case .notification: + guard let data = message.notifiationData else { return nil } + return .init(messageId: message.messageId, key: data.templateKey, datas: data.templateVariables, views: [:]) + case .message: + guard let data = message.templateMessageData else { return nil } + return .init(messageId: message.messageId, key: data.key, datas: data.variables, views: data.viewVariables) + } + } + + struct Payload { + let messageId: Int64 + let key: String + let datas: [String: Any] + let views: [String: [SendbirdChatSDK.TemplateMessageData.SimpleTemplateData]] + } +} diff --git a/Sources/Template/SBUMessageTemplateManager.swift b/Sources/Template/SBUMessageTemplateManager.swift new file mode 100644 index 00000000..c02c70e7 --- /dev/null +++ b/Sources/Template/SBUMessageTemplateManager.swift @@ -0,0 +1,142 @@ +// +// SBUMessageTemplateManager.swift +// SendbirdUIKit +// +// Created by Damon Park on 2024/02/17. +// Copyright © 2024 Sendbird, Inc. All rights reserved. +// + +import UIKit +import SendbirdChatSDK +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif + +public class SBUMessageTemplateManager: NSObject { + /// Resets notification template cache + /// - Since: 3.21.0 + public static func resetNotificationTemplateCache() { + SBUCacheManager.template(with: .notification).resetCache() + } + + /// Resets message template cache + /// - Since: 3.21.0 + public static func resetMessageTemplateCache() { + SBUCacheManager.template(with: .message).resetCache() + } + + static let exeucuteQueue = DispatchQueue(label: "com.sendbird.message_template.images") +} + +// for view model +extension SBUMessageTemplateManager { + static func loadTemplateList( + type: SBUMessageTemplate.TemplateType, + completionHandler: ((_ success: Bool) -> Void)? + ) { + let cache = SBUCacheManager.template(with: type) + + let cachedToken = Int64(cache.lastToken) ?? 0 + let serverToken = type.getRemoteToken() + + guard cachedToken < serverToken else { + let success = cache.loadAllTemplates() != nil + completionHandler?(success) + return + } + + type.loadTemplateList(token: cache.lastToken) { json, token in + guard let templateList = MessageTemplate.templateList(from: json) else { + completionHandler?(false) + return + } + + cache.save(templates: templateList) + cache.lastToken = token ?? "" + cache.loadAllTemplates() + + completionHandler?(true) + } + } + + static func loadTemplateList( + type: SBUMessageTemplate.TemplateType, + keys: [String], + completionHandler: ((_ success: Bool) -> Void)? + ) { + let cache = SBUCacheManager.template(with: type) + + type.loadTemplateList(keys: keys) { json, token in + guard let templateList = MessageTemplate.templateList(from: json) else { + completionHandler?(false) + return + } + + cache.save(templates: templateList) + cache.loadAllTemplates() + + // FIXED: https://sendbird.atlassian.net/browse/CLNP-6062 + if templateList.count < keys.count { + completionHandler?(false) + } else { + completionHandler?(true) + } + } + } + + static func loadTemplateImages( + type: SBUMessageTemplate.TemplateType, + cacheData: [String: String], + completionHandler: ((_ success: Bool) -> Void)? + ) { + let dispatchGroup = DispatchGroup() + var loadCount = 0 + + exeucuteQueue.async { + for (_, url) in cacheData { + dispatchGroup.enter() + + let fileName = SBUCacheManager.Image.createCacheFileName( + urlString: url, + cacheKey: nil, + fileNameForExtension: nil, + needPathExtension: true + ) + + if SBUCacheManager.Image.get( + fileName: fileName, + subPath: SBUCacheManager.PathType.template + ) != nil { + loadCount += 1 + dispatchGroup.leave() + return + } + + UIImageView.getOriginalImage( + urlString: url, + subPath: SBUCacheManager.PathType.template + ) { image, _ in + if image != nil { + loadCount += 1 + } + dispatchGroup.leave() + } + } + + let result = dispatchGroup.wait(timeout: .now() + .seconds(10)) // timeout: 10 second + + Thread.executeOnMain { + switch result { + case .success: + completionHandler?(cacheData.count == loadCount) + case .timedOut: + completionHandler?(false) + } + } + } + } +} + +extension Array where Element == String { + func toJsonString() -> String? { "[\(self.joined(separator: ","))]" } +} diff --git a/Sources/Template/SBUTheme+MessageTemplate.swift b/Sources/Template/SBUTheme+MessageTemplate.swift new file mode 100644 index 00000000..64a63484 --- /dev/null +++ b/Sources/Template/SBUTheme+MessageTemplate.swift @@ -0,0 +1,137 @@ +// +// SBUTheme+MessageTemplate.swift +// SendbirdUIKitCommon +// +// Created by Damon Park on 10/21/24. +// + +import Foundation + +import UIKit +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif + +@available(*, deprecated, renamed: "SendbirdUIMessageTemplate.TemplateTheme") +extension SBUMessageTemplateTheme { +#if canImport(SendbirdUIMessageTemplate) + static var internal_light: SBUMessageTemplateTheme { + get { + let theme = SendbirdUIMessageTemplate.TemplateTheme.light + return SBUMessageTemplateTheme( + textFont: theme.textFont, + textColor: theme.textColor, + textButtonFont: theme.textButtonFont, + textButtonTitleColor: theme.textButtonTitleColor, + textButtonBackgroundColor: theme.textButtonBackgroundColor, + viewBackgroundColor: theme.viewBackgroundColor + ) + } + set { + SendbirdUIMessageTemplate.TemplateTheme.light = SendbirdUIMessageTemplate.TemplateTheme( + textFont: newValue.textFont, + textColor: newValue.textColor, + textButtonFont: newValue.textButtonFont, + textButtonTitleColor: newValue.textButtonTitleColor, + textButtonBackgroundColor: newValue.textButtonBackgroundColor, + viewBackgroundColor: newValue.viewBackgroundColor + ) + } + } + + static var internal_dark: SBUMessageTemplateTheme { + get { + let theme = SendbirdUIMessageTemplate.TemplateTheme.dark + return SBUMessageTemplateTheme( + textFont: theme.textFont, + textColor: theme.textColor, + textButtonFont: theme.textButtonFont, + textButtonTitleColor: theme.textButtonTitleColor, + textButtonBackgroundColor: theme.textButtonBackgroundColor, + viewBackgroundColor: theme.viewBackgroundColor + ) + } + set { + SendbirdUIMessageTemplate.TemplateTheme.dark = SendbirdUIMessageTemplate.TemplateTheme( + textFont: newValue.textFont, + textColor: newValue.textColor, + textButtonFont: newValue.textButtonFont, + textButtonTitleColor: newValue.textButtonTitleColor, + textButtonBackgroundColor: newValue.textButtonBackgroundColor, + viewBackgroundColor: newValue.viewBackgroundColor + ) + } + } + + static var internal_defaultLight: SBUMessageTemplateTheme { + let theme = SBUMessageTemplateTheme() + + let light = SendbirdUIMessageTemplate.TemplateTheme.defaultLight + theme.textFont = light.textFont + theme.textColor = light.textColor + theme.textButtonFont = light.textButtonFont + theme.textButtonTitleColor = light.textButtonTitleColor + theme.textButtonBackgroundColor = light.textButtonBackgroundColor + theme.viewBackgroundColor = light.viewBackgroundColor + return theme + } + + static var internal_defaultDark: SBUMessageTemplateTheme { + let theme = SBUMessageTemplateTheme() + let dark = SendbirdUIMessageTemplate.TemplateTheme.defaultDark + theme.textFont = dark.textFont + theme.textColor = dark.textColor + theme.textButtonFont = dark.textButtonFont + theme.textButtonTitleColor = dark.textButtonTitleColor + theme.textButtonBackgroundColor = dark.textButtonBackgroundColor + theme.viewBackgroundColor = dark.viewBackgroundColor + + return theme + } + + static func internal_setTheme( + light: SBUMessageTemplateTheme? = nil, + dark: SBUMessageTemplateTheme? = nil + ) { + if let light = light { + let theme = SendbirdUIMessageTemplate.TemplateTheme() + theme.textFont = light.textFont + theme.textColor = light.textColor + theme.textButtonFont = light.textButtonFont + theme.textButtonTitleColor = light.textButtonTitleColor + theme.textButtonBackgroundColor = light.textButtonBackgroundColor + theme.viewBackgroundColor = light.viewBackgroundColor + SendbirdUIMessageTemplate.TemplateTheme.light = theme + } + if let dark = dark { + let theme = SendbirdUIMessageTemplate.TemplateTheme() + theme.textFont = dark.textFont + theme.textColor = dark.textColor + theme.textButtonFont = dark.textButtonFont + theme.textButtonTitleColor = dark.textButtonTitleColor + theme.textButtonBackgroundColor = dark.textButtonBackgroundColor + theme.viewBackgroundColor = dark.viewBackgroundColor + + SendbirdUIMessageTemplate.TemplateTheme.dark = theme + } + } + + static func internal_factory( + textFont: UIFont? = nil, + textColor: UIColor? = nil, + textButtonFont: UIFont? = nil, + textButtonTitleColor: UIColor? = nil, + textButtonBackgroundColor: UIColor? = nil, + viewBackgroundColor: UIColor? = nil + ) -> SBUMessageTemplateTheme { + let theme = SBUMessageTemplateTheme() + theme.textFont = TemplateTheme.defaultLight.textFont + theme.textColor = TemplateTheme.defaultLight.textColor + theme.textButtonFont = TemplateTheme.defaultLight.textButtonFont + theme.textButtonTitleColor = TemplateTheme.defaultLight.textButtonTitleColor + theme.textButtonBackgroundColor = TemplateTheme.defaultLight.textButtonBackgroundColor + theme.viewBackgroundColor = TemplateTheme.defaultLight.viewBackgroundColor + return theme + } +#endif +} diff --git a/Sources/Theme/SBUTheme.swift b/Sources/Theme/SBUTheme.swift index b8db25ca..cde29699 100644 --- a/Sources/Theme/SBUTheme.swift +++ b/Sources/Theme/SBUTheme.swift @@ -4011,7 +4011,12 @@ public class SBUVoiceMessageInputTheme { } } +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif // MARK: - Message template theme + +@available(*, deprecated, renamed: "SendbirdUIMessageTemplate.TemplateTheme") public class SBUMessageTemplateTheme { /** @@ -4035,68 +4040,98 @@ public class SBUMessageTemplateTheme { ``` */ - public static var light: SBUMessageTemplateTheme = SBUMessageTemplateTheme.defaultLight - public static var dark: SBUMessageTemplateTheme = SBUMessageTemplateTheme.defaultDark - - static var defaultLight: SBUMessageTemplateTheme { - let theme = SBUMessageTemplateTheme() - - theme.textFont = SBUFontSet.body3 - theme.textColor = SBUColorSet.onLightTextHighEmphasis - theme.textButtonFont = SBUFontSet.button4 - theme.textButtonTitleColor = SBUColorSet.primaryMain - theme.textButtonBackgroundColor = SBUColorSet.background200 - theme.viewBackgroundColor = SBUColorSet.background100 - - return theme - } - - static var defaultDark: SBUMessageTemplateTheme { - let theme = SBUMessageTemplateTheme() - - theme.textFont = SBUFontSet.body3 - theme.textColor = SBUColorSet.onDarkTextHighEmphasis - theme.textButtonFont = SBUFontSet.button4 - theme.textButtonTitleColor = SBUColorSet.primaryLight - theme.textButtonBackgroundColor = SBUColorSet.background400 - theme.viewBackgroundColor = SBUColorSet.background500 - - return theme - } - - public func setTheme(light: SBUMessageTemplateTheme?, dark: SBUMessageTemplateTheme?) { - if let light = light { - SBUMessageTemplateTheme.light = light - } - - if let dark = dark { - SBUMessageTemplateTheme.dark = dark - } - } - - public init( - textFont: UIFont = SBUFontSet.body3, - textColor: UIColor = SBUColorSet.onLightTextHighEmphasis, - textButtonFont: UIFont = SBUFontSet.button4, - textButtonTitleColor: UIColor = SBUColorSet.primaryMain, - textButtonBackgroundColor: UIColor = SBUColorSet.background200, - viewBackgroundColor: UIColor = SBUColorSet.background100 - ) { - self.textFont = textFont - self.textColor = textColor - self.textButtonFont = textButtonFont - self.textButtonTitleColor = textButtonTitleColor - self.textButtonBackgroundColor = textButtonBackgroundColor - self.viewBackgroundColor = viewBackgroundColor - } - - public var textFont: UIFont = SBUFontSet.body3 - public var textColor: UIColor = SBUColorSet.onLightTextHighEmphasis // SBUColorSet.onDarkTextLowEmphasis - public var textButtonFont: UIFont = SBUFontSet.button4 - public var textButtonTitleColor: UIColor = SBUColorSet.primaryMain // SBUColorSet.primaryLight - public var textButtonBackgroundColor: UIColor = SBUColorSet.background200 // SBUColorSet.background400 - public var viewBackgroundColor: UIColor = SBUColorSet.background100 // SBUColorSet.background500 - +#if canImport(SendbirdUIMessageTemplate) + public static var light: SBUMessageTemplateTheme { + get { internal_light } + set { internal_setTheme(light: newValue) } + } +#else + static var _light: SBUMessageTemplateTheme = SBUMessageTemplateTheme.defaultLight + public static var light: SBUMessageTemplateTheme { + get { _light } + set { _light = newValue } + } +#endif + +#if canImport(SendbirdUIMessageTemplate) + public static var dark: SBUMessageTemplateTheme { + get { internal_dark } + set { internal_setTheme(dark: newValue) } + } +#else + static var _dark: SBUMessageTemplateTheme = SBUMessageTemplateTheme.defaultDark + public static var dark: SBUMessageTemplateTheme { + get { _dark } + set { _dark = newValue } + } +#endif + + static var defaultLight: SBUMessageTemplateTheme { +#if canImport(SendbirdUIMessageTemplate) + return internal_defaultLight +#else + let theme = SBUMessageTemplateTheme() + theme.textFont = SBUFontSet.body3 + theme.textColor = SBUColorSet.onLightTextHighEmphasis + theme.textButtonFont = SBUFontSet.button4 + theme.textButtonTitleColor = SBUColorSet.primaryMain + theme.textButtonBackgroundColor = SBUColorSet.background200 + theme.viewBackgroundColor = SBUColorSet.background100 + return theme +#endif + } + + static var defaultDark: SBUMessageTemplateTheme { +#if canImport(SendbirdUIMessageTemplate) + return internal_defaultDark +#else + let theme = SBUMessageTemplateTheme() + theme.textFont = SBUFontSet.body3 + theme.textColor = SBUColorSet.onDarkTextHighEmphasis + theme.textButtonFont = SBUFontSet.button4 + theme.textButtonTitleColor = SBUColorSet.primaryLight + theme.textButtonBackgroundColor = SBUColorSet.background400 + theme.viewBackgroundColor = SBUColorSet.background500 + return theme +#endif + } + + public func setTheme(light: SBUMessageTemplateTheme?, dark: SBUMessageTemplateTheme?) { +#if canImport(SendbirdUIMessageTemplate) + Self.internal_setTheme(light: light, dark: dark) +#else + if let light = light { + SBUMessageTemplateTheme.light = light + } + if let dark = dark { + SBUMessageTemplateTheme.dark = dark + } +#endif + } + + public init( + textFont: UIFont = SBUFontSet.body3, + textColor: UIColor = SBUColorSet.onLightTextHighEmphasis, + textButtonFont: UIFont = SBUFontSet.button4, + textButtonTitleColor: UIColor = SBUColorSet.primaryMain, + textButtonBackgroundColor: UIColor = SBUColorSet.background200, + viewBackgroundColor: UIColor = SBUColorSet.background100 + ) { + self.textFont = textFont + self.textColor = textColor + self.textButtonFont = textButtonFont + self.textButtonTitleColor = textButtonTitleColor + self.textButtonBackgroundColor = textButtonBackgroundColor + self.viewBackgroundColor = viewBackgroundColor + } + + public var textFont: UIFont = SBUFontSet.body3 + public var textColor: UIColor = SBUColorSet.onLightTextHighEmphasis // SBUColorSet.onDarkTextLowEmphasis + public var textButtonFont: UIFont = SBUFontSet.button4 + public var textButtonTitleColor: UIColor = SBUColorSet.primaryMain // SBUColorSet.primaryLight + public var textButtonBackgroundColor: UIColor = SBUColorSet.background200 // SBUColorSet.background400 + public var viewBackgroundColor: UIColor = SBUColorSet.background100 // SBUColorSet.background500 + } /** diff --git a/Sources/Util/SBULogger.swift b/Sources/Util/SBULogger.swift index f1a4fa35..87fc5aac 100644 --- a/Sources/Util/SBULogger.swift +++ b/Sources/Util/SBULogger.swift @@ -10,6 +10,15 @@ import UIKit // 📕📙📗📘📓📔 +@objc +public enum LogType: UInt8 { + case none = 0b00000000 + case error = 0b00000001 + case warning = 0b00000010 + case info = 0b00000100 + case all = 0b00000111 +} + class SBULog { static var logType: UInt8 = LogType.none.rawValue diff --git a/Sources/View/Channel/MessageCell/CarouselView/SBUBaseCarouselView.swift b/Sources/View/Channel/MessageCell/CarouselView/SBUBaseCarouselView.swift deleted file mode 100644 index 919ac464..00000000 --- a/Sources/View/Channel/MessageCell/CarouselView/SBUBaseCarouselView.swift +++ /dev/null @@ -1,142 +0,0 @@ -// -// BaseCarouselView.swift -// SendbirdUIKit -// -// Created by Damon Park on 2024/03/08. -// Copyright © 2024 Sendbird, Inc. All rights reserved. -// - -import UIKit - -protocol SBUBaseCarouselCellRenderer { - func render() -> UIView - func getExpectedWidth() -> CGFloat -} - -struct SBUBaseCarouselViewParams { - let padding: UIEdgeInsets - let spacing: CGFloat - let renderers: [SBUBaseCarouselCellRenderer] -} - -protocol SBUCarouselCacheKey { - func isEqualCacheKey(_ other: Any?) -> Bool -} - -extension SBUCarouselCacheKey where Self: Equatable { - func isEqualCacheKey(_ other: Any?) -> Bool { - guard let otherSelf = other as? Self else { return false } - return self == otherSelf - } -} - -class SBUBaseCarouselView: UIView, UIScrollViewDelegate { - var cacheKey: SBUCarouselCacheKey? - - lazy var scrollView: UIScrollView = { - let scrollView = UIScrollView() - scrollView.translatesAutoresizingMaskIntoConstraints = false - scrollView.showsHorizontalScrollIndicator = false - scrollView.backgroundColor = .clear - scrollView.delegate = self - return scrollView - }() - - lazy var stackView: UIStackView = { - let stack = UIStackView() - stack.axis = .horizontal - stack.alignment = .top - stack.distribution = .fill - stack.translatesAutoresizingMaskIntoConstraints = false - return stack - }() - - // MARK: - Properties - - var params = SBUBaseCarouselViewParams(padding: .zero, spacing: 0, renderers: []) - var contentViews = [UIView]() - - // MARK: - Initialization - - override init(frame: CGRect) { - super.init(frame: frame) - self.setupUI() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - self.setupUI() - } - - // MARK: - Setup - - private func setupUI() { - // UIScrollView와 UIStackView 설정 코드를 여기에 추가 - self.scrollView.addSubview(self.stackView) - self.addSubview(self.scrollView) - } - - // MARK: - Public Methods - - func configure(with params: SBUBaseCarouselViewParams) { - self.params = params - self.stackView.spacing = self.params.spacing - - NSLayoutConstraint.activate([ - self.scrollView.topAnchor.constraint(equalTo: topAnchor), - self.scrollView.bottomAnchor.constraint(equalTo: bottomAnchor), - self.scrollView.leftAnchor.constraint(equalTo: leftAnchor), - self.scrollView.rightAnchor.constraint(equalTo: rightAnchor), - - self.stackView.topAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.topAnchor, constant: self.params.padding.top), - self.stackView.bottomAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.bottomAnchor, constant: self.params.padding.bottom), - self.stackView.leftAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.leftAnchor, constant: self.params.padding.left), - self.stackView.rightAnchor.constraint(equalTo: self.scrollView.contentLayoutGuide.rightAnchor, constant: self.params.padding.right), - self.stackView.heightAnchor.constraint(equalTo: self.scrollView.heightAnchor) - ]) - - self.stackView.arrangedSubviews.forEach { - $0.removeFromSuperview() - stackView.removeArrangedSubview($0) - } - - self.contentViews.removeAll() - - for renderer in params.renderers { - let contentView = renderer.render() - - contentView.translatesAutoresizingMaskIntoConstraints = false - self.stackView.addArrangedSubview(contentView) - self.contentViews.append(contentView) - } - } - - func adjustScrollView(_ scrollView: UIScrollView, velocityX: CGFloat = .zero) { - let offsetX = UIScrollView.SBUScrollAdjustPosition.adjustContentOffsetX( - in: scrollView, - items: self.contentViews, - offset: self.params.padding.left, - velocityX: velocityX - ) - - let contentOffset = CGPoint(x: offsetX, y: 0) - scrollView.setContentOffset(contentOffset, animated: true) - } - - func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { - let velocity = scrollView.panGestureRecognizer.velocity(in: self).x / CGFloat(-1_000) - adjustScrollView(scrollView, velocityX: velocity) - } - - func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { - adjustScrollView(scrollView, velocityX: velocity.x) - } - - override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { - let view = super.hitTest(point, with: event) - - if view == self.scrollView { return HitPassView() } - - return view - } -} diff --git a/Sources/View/Channel/MessageCell/NotificationChannel/SBUNotificationCell.swift b/Sources/View/Channel/MessageCell/NotificationChannel/SBUNotificationCell.swift index 06d25111..e10f9452 100644 --- a/Sources/View/Channel/MessageCell/NotificationChannel/SBUNotificationCell.swift +++ b/Sources/View/Channel/MessageCell/NotificationChannel/SBUNotificationCell.swift @@ -8,6 +8,9 @@ import UIKit import SendbirdChatSDK +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif @IBDesignable class SBUNotificationCell: SBUBaseMessageCell { @@ -29,7 +32,6 @@ class SBUNotificationCell: SBUBaseMessageCell { var newNotificationBadge: UIView? var dateLabel = UILabel() - var isTemplateDownloadFailed = false var isRendered = false var topMarginConstraint: NSLayoutConstraint? @@ -44,24 +46,49 @@ class SBUNotificationCell: SBUBaseMessageCell { } // MARK: - UI Views (Private) - private var notificationTemplateRenderer: SBUMessageTemplate.Renderer? + private var notificationTemplateRenderer: UIView? + private var viewGeneratorParams: ViewGeneratorParams { + ViewGeneratorParams( + maxWidth: self.availableTemplateWidth, + fontFamiliy: SBUFontSet.FontFamily.notifications, + delegate: self + ) + } /// Shows `message.message` or ``SBUStringSet/Notification_Template_Error_Title``, ``SBUStringSet/Notification_Template_Error_Subtitle`` if the `message.message` is `nil` - private var parsingErrorNotificationRenderer: SBUMessageTemplate.Renderer { - if let fallbackMessage = self.message?.message, fallbackMessage.count > 0 { - return SBUMessageTemplate.Renderer( - body: .parsingError(text: fallbackMessage), - fontFamily: SBUFontSet.FontFamily.notifications - ) - } else { - return SBUMessageTemplate.Renderer( - body: .parsingError( - text: SBUStringSet.Notification_Template_Error_Title, - subText: SBUStringSet.Notification_Template_Error_Subtitle - ), - fontFamily: SBUFontSet.FontFamily.notifications - ) + private var errorNotificationRenderer: UIView? { + guard let fallbackMessage = self.message?.message, fallbackMessage.hasElements else { + return self.drawTemplateView(body: .parsingError( + text: SBUStringSet.Notification_Template_Error_Title, + subText: SBUStringSet.Notification_Template_Error_Subtitle + )) } + return self.drawTemplateView(body: .parsingError(text: fallbackMessage)) + } + + private var downloadingRenderer: UIView? { + drawTemplateView(body: .downloadingTemplate( + height: (type == .chat) + ? chatNotificationDownloadingHeight + : feedNotificationDownloadingHeight + )) + } + + private func dataTemplateRenderer(value: String) -> UIView? { + drawTemplateView(body: .dataTemplate( + text: "[This message is sent from data template.]", + subText: value + )) + } + + private func drawTemplateView(body: TemplateSyntax.Body) -> UIView? { + try? ViewGenerator.draw( + templateView: .init( + body: body, + messageId: self.message?.messageId + ), + params: self.viewGeneratorParams + ) } private var categoryMargin = UIView() @@ -293,90 +320,36 @@ class SBUNotificationCell: SBUBaseMessageCell { /// Creates the message template view and updates the views hierarchy. /// If the `message.extendedMessage["sub_data"]` is invalid, the message template view shows `message.message` or ``SBUStringSet/Notification_Template_Error_Title``, ``SBUStringSet/Notification_Template_Error_Subtitle`` if the `message.message` is `nil` func setupNotificationTemplate() { - let notification = self.message - let subType = Int(notification?.extendedMessage["sub_type"] as? String ?? "0") - + let subType = Int(self.message?.extendedMessage["sub_type"] as? String ?? "0") guard subType == 0 else { return } // subType: 0 is template type + let subData = self.message?.extendedMessage["sub_data"] as? String - let subData = notification?.extendedMessage["sub_data"] as? String - var bindedTemplate: BindedTemplate? - var isNewTemplateDownloading: Bool = false - - if !isTemplateDownloadFailed { - (bindedTemplate, isNewTemplateDownloading) = SBUMessageTemplateManager.generateTemplate( - type: .notification, - subData: subData, - themeMode: SBUNotificationChannelManager.notificationChannelThemeMode - ) { [weak self] success in - // This completionHandler is only called when a template download is requested. - self?.isTemplateDownloadFailed = !success - self?.setupNotificationTemplate() // NOTE: realodCell() 과 중복 처리. 확인 필요. - self?.reloadCell() - } - } - - var escapedTemplate = bindedTemplate?.template.replacingOccurrences(of: "\\n", with: "\\\\n") ?? "{}" - escapedTemplate = escapedTemplate.replacingOccurrences(of: "\n", with: "\\n") - bindedTemplate?.template = escapedTemplate - - var template: SBUMessageTemplate.Syntax.TemplateView? - do { - template = try JSONDecoder().decode(SBUMessageTemplate.Syntax.TemplateView.self, from: Data((bindedTemplate?.template ?? "").utf8)) - template?.setIdentifier(with: .init(messageId: message?.messageId)) - } catch { - SBULog.error(error) - } - - var showFallback = false - let version = template?.version ?? 0 - if version != 1 { // Not used now -// bindedData = subData // v0.2 - showFallback = true - } + let template = SBUMessageTemplate.Coordinator.execute( + type: .notification, + message: self.message, + theme: .init(rawValue: SBUNotificationChannelManager.notificationChannelThemeMode), + params: self.viewGeneratorParams + ) - self.notificationTemplateRenderer = nil - switch bindedTemplate?.type { - case .ui: - if isNewTemplateDownloading { - self.notificationTemplateRenderer = SBUMessageTemplate.Renderer( - body: .downloadingTemplate( - height: (type == .chat) - ? chatNotificationDownloadingHeight - : feedNotificationDownloadingHeight - ), - fontFamily: SBUFontSet.FontFamily.notifications - ) - } else if let bindedTemplate = bindedTemplate, !showFallback, // 정상 케이스 - let notificationTemplateRenderer = SBUMessageTemplate.Renderer( - with: bindedTemplate.template, - messageId: message?.messageId, - delegate: self, - maxWidth: self.availableTemplateWidth, - fontFamily: SBUFontSet.FontFamily.notifications, - actionHandler: { [weak self] action in - self?.statisticsForAction(with: subData) - self?.messageTemplateActionHandler?(action) - } - ) { - self.notificationTemplateRenderer = notificationTemplateRenderer - self.isRendered = true - } else { - self.notificationTemplateRenderer = parsingErrorNotificationRenderer + switch template { + case .reload(.download(.template(let keys))): + switch self.uncachedMessageTemplateStateHandler?(keys) { + case .some(true): + self.reloadCell() + case .some(false): + self.notificationTemplateRenderer = self.errorNotificationRenderer + case .none: + self.notificationTemplateRenderer = self.downloadingRenderer + self.uncachedMessageTemplateDownloadHandler?(keys, self) } - case .data: - self.notificationTemplateRenderer = SBUMessageTemplate.Renderer( - body: .dataTemplate( - text: "[This message is sent from data template.]", - subText: bindedTemplate?.template ?? "{}" - ), - fontFamily: SBUFontSet.FontFamily.notifications - ) + + case .template(_, let view): + self.notificationTemplateRenderer = view self.isRendered = true default: - self.notificationTemplateRenderer = parsingErrorNotificationRenderer + self.notificationTemplateRenderer = self.errorNotificationRenderer } - - self.notificationTemplateRenderer?.delegate = self + guard let notificationTemplateRenderer = self.notificationTemplateRenderer else { return } notificationTemplateRenderer.backgroundColor = self.notificationCellTheme.backgroundColor notificationTemplateRenderer.roundCorners(corners: .allCorners, radius: self.notificationCellTheme.radius) @@ -421,6 +394,8 @@ class SBUNotificationCell: SBUBaseMessageCell { override func prepareForReuse() { super.prepareForReuse() + self.isRendered = false + if let profileView = self.profileView as? SBUMessageProfileView { profileView.imageDownloadTask?.cancel() profileView.urlString = "" @@ -431,30 +406,11 @@ class SBUNotificationCell: SBUBaseMessageCell { // MARK: - Common /// Adds stat for action of notification to SendbirdStatistics. - /// - Parameter subData: for exporting templateKey and tags. /// - Since: 3.5.7 @discardableResult - func statisticsForAction(with subData: String?) -> Bool { - guard let subData = subData else { return false } - - // data scheme - var templateKey: String? - var tags: [String] = [] - do { - if let subDataDic = try JSONSerialization.jsonObject( - with: Data(subData.utf8), - options: [] - ) as? [String: Any] { - templateKey = subDataDic["template_key"] as? String - tags = subDataDic["tags"] as? [String] ?? [] - } - } catch { - SBULog.error(error.localizedDescription) - return false - } - - guard let templateKey = templateKey, - let message = self.message else { return false } + func statisticsForAction() -> Bool { + guard let message = self.message else { return false } + guard let data = self.message?.notifiationData else { return false } let type = "noti:stats" let action = "clicked" @@ -464,9 +420,9 @@ class SBUNotificationCell: SBUBaseMessageCell { type: type, data: [ "action": action, - "template_key": templateKey, + "template_key": data.templateKey, "channel_url": message.channelURL, - "tags": tags, + "tags": data.tags ?? [], "message_id": message.messageId, "source": source, "message_ts": message.createdAt, @@ -479,13 +435,45 @@ class SBUNotificationCell: SBUBaseMessageCell { } } -// MARK: - MessageTemplateRendererDelegate -extension SBUNotificationCell: MessageTemplateRendererDelegate { - func messageTemplateRender(_ renderer: SBUMessageTemplate.Renderer, didFinishLoadingImage imageView: UIImageView) { - self.reloadCell() +// MARK: - TemplateViewGeneratorDelegate +extension SBUNotificationCell: TemplateViewGeneratorDelegate { + func templateView(_ templateView: TemplateSyntax.TemplateView, didLoad image: UIImage, from imageURL: String, named fileName: String, in subPath: String) { + SBUCacheManager.Image.save(image: image, fileName: fileName, subPath: subPath, completionHandler: nil) } - func messageTemplateNeedReloadCell(_ renderer: SBUMessageTemplate.Renderer) { - self.reloadCell() + func templateView(_ templateView: TemplateSyntax.TemplateView, didFinishRootView view: UIView, with identifier: String) { + // do nothing + } + + func templateView(_ templateView: TemplateSyntax.TemplateView, didDrawPartialItem item: TemplateSyntax.Item, in view: UIView, with identifier: String) { + switch item { + case .carouselView: + self.message?.messageTemplateCarouselView = view + default: + break + } + } + func templateView(_ templateView: TemplateSyntax.TemplateView, didSelect action: TemplateSyntax.Action) { + self.statisticsForAction() + self.messageTemplateActionHandler?(.init(action: action)) + } +} + +extension SBUNotificationCell: TemplateViewGeneratorDataSource { + func templateView(_ templateView: TemplateSyntax.TemplateView, imageFor urlString: String, named fileName: String, in subPath: String) -> UIImage? { + SBUCacheManager.Image.get(fileName: fileName, subPath: subPath) + } + + func templateView(_ templateView: TemplateSyntax.TemplateView, rootViewFor identifier: String) -> UIView? { + return nil + } + + func templateView(_ templateView: TemplateSyntax.TemplateView, viewForPartialItem item: TemplateSyntax.Item, with identifier: String) -> UIView? { + switch item { + case .carouselView: + return self.message?.messageTemplateCarouselView + default: + return nil + } } } diff --git a/Sources/View/Channel/MessageCell/SBUBaseMessageCell.swift b/Sources/View/Channel/MessageCell/SBUBaseMessageCell.swift index 05f2bdc5..9fbcd1aa 100644 --- a/Sources/View/Channel/MessageCell/SBUBaseMessageCell.swift +++ b/Sources/View/Channel/MessageCell/SBUBaseMessageCell.swift @@ -100,6 +100,7 @@ open class SBUBaseMessageCell: SBUTableViewCell, SBUMessageCellProtocol, SBUFeed // MARK: - message template handlers var messageTemplateActionHandler: ((_ action: SBUMessageTemplate.Action) -> Void)? + var uncachedMessageTemplateStateHandler: ((_ templateKeys: [String]) -> Bool?)? var uncachedMessageTemplateDownloadHandler: ((_ templateKeys: [String], _ messageCell: SBUBaseMessageCell) -> Void)? var uncachedMessageTemplateImageHandler: ((_ cacheData: [String: String], _ messageCell: SBUBaseMessageCell) -> Void)? diff --git a/Sources/View/Channel/MessageCell/SBUMessageTemplateCell.MessageTemplateLayer.swift b/Sources/View/Channel/MessageCell/SBUMessageTemplateCell.MessageTemplateLayer.swift index dc37fab1..65e70810 100644 --- a/Sources/View/Channel/MessageCell/SBUMessageTemplateCell.MessageTemplateLayer.swift +++ b/Sources/View/Channel/MessageCell/SBUMessageTemplateCell.MessageTemplateLayer.swift @@ -8,6 +8,9 @@ import UIKit import SendbirdChatSDK +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif extension SBUMessageTemplateCell { class MessageTemplateLayer { @@ -22,53 +25,45 @@ extension SBUMessageTemplateCell { var templateContainerView = UIStackView() - var templateView: SBUMessageTemplate.Syntax.TemplateView? - var messageTemplateRenderer: SBUMessageTemplate.Renderer.RendererType = .inProgress - - var templateRetryStatus: SBUTemplateMessageRetryStatus { - get { self.message?.templateDownloadRetryStatus ?? .initialized } - set { self.message?.templateDownloadRetryStatus = newValue } - } - - var imagesRetryStatus: SBUTemplateMessageRetryStatus { - get { self.message?.templateImagesRetryStatus ?? .initialized } - set { self.message?.templateImagesRetryStatus = newValue } - } + var templateView: TemplateSyntax.TemplateView? + var messageTemplateRenderer: SBUMessageTemplate.RendererType = .inProgress } } extension SBUMessageTemplateCell.MessageTemplateLayer { func renderError() { - let renderer = SBUMessageTemplate.Renderer.errorRenderer( + let renderer = SBUMessageTemplate.errorRenderer( type: .message, message: self.message, viewStyle: .init( - backgroundColor: SBUMessageTemplate.Renderer.defaultTheme.viewBackgroundColor.toHexString(), + backgroundColor: TemplateConfig.defaultTheme.viewBackgroundColor.toHexString(), radius: 16, margin: .init(top: 0, bottom: 0, left: 50, right: 12) ) ) - self.messageTemplateRenderer = .error(renderer: renderer) + self.messageTemplateRenderer = .error(messageId: self.message?.messageId, view: renderer) } func renderDownload() { - let renderer = SBUMessageTemplate.Renderer.downloadingRenderer( + let renderer = SBUMessageTemplate.downloadingRenderer( messageId: message?.messageId, downloadingHeight: Self.downloadingHeight, viewStyle: .init( - backgroundColor: SBUMessageTemplate.Renderer.defaultTheme.viewBackgroundColor.toHexString(), + backgroundColor: TemplateConfig.defaultTheme.viewBackgroundColor.toHexString(), radius: 16, margin: .init(top: 0, bottom: 0, left: 50, right: 12) ) ) - self.messageTemplateRenderer = .downloading(renderer: renderer) + self.messageTemplateRenderer = .downloading(messageId: self.message?.messageId, view: renderer) } - var validRenderer: SBUMessageTemplate.Renderer? { + var validRenderer: UIView? { guard let renderer = messageTemplateRenderer.renderer, - self.message?.messageId == renderer.messageId else { return nil } + let messageId = messageTemplateRenderer.messageId, + self.message?.messageId == messageId + else { return nil } return renderer } @@ -82,73 +77,34 @@ extension SBUMessageTemplateCell.MessageTemplateLayer { extension SBUMessageTemplateCell { func setupMessageTemplate() { guard let message = self.message else { return } - guard let data = message.asMessageTemplate else { return } - guard let payloadJson = data.toJsonString else { return } if self.messageTemplateLayer.messageTemplateRenderer.isLoaded { return } - if SBUMessageTemplate.PayloadType(with: data) == .unknown { - self.messageTemplateLayer.renderError() - return - } - - if self.messageTemplateLayer.templateRetryStatus.isFailed { - self.messageTemplateLayer.renderError() - return - } - + let params = ViewGeneratorParams(maxWidth: self.bounds.width, delegate: self, dataSource: self) let result = SBUMessageTemplate.Coordinator.execute( type: .message, message: message, - payloadJson: payloadJson, - imageRetryStatus: self.messageTemplateLayer.imagesRetryStatus + params: params ) switch result { case .reload(.download(.template(let keys))): - self.messageTemplateLayer.renderDownload() - - if keys.isEmpty { return } - - DispatchQueue.main.async { [weak self] in - guard let self = self else { return } - - if self.messageTemplateLayer.templateRetryStatus.updateRetry() { - self.uncachedMessageTemplateDownloadHandler?(keys, self) - } else { - self.reloadCell() - } - } - - case .reload(.download(.images(let cacheData))): - self.messageTemplateLayer.renderDownload() - - if cacheData.isEmpty { return } - - DispatchQueue.main.async { [weak self] in - guard let self = self else { return } - - if self.messageTemplateLayer.imagesRetryStatus.updateRetry() { - self.uncachedMessageTemplateImageHandler?(cacheData, self) - } else { - self.reloadCell() - } - } - - case .template(let key, let template): - self.messageTemplateLayer.templateView = template - - if let renderer = SBUMessageTemplate.Renderer.generate( - template: template, - delegate: self, - dataSource: self, - maxWidth: self.bounds.width, - actionHandler: { [weak self] in self?.messageTemplateActionHandler?($0) } - ) { - self.messageTemplateLayer.messageTemplateRenderer = .loaded(key: key, renderer: renderer) - } else { + switch self.uncachedMessageTemplateStateHandler?(keys) { + case .some(true): + self.reloadCell() + case .some(false): self.messageTemplateLayer.renderError() + case .none: + self.messageTemplateLayer.renderDownload() + self.uncachedMessageTemplateDownloadHandler?(keys, self) } + + case .template(let syntax, let view): + self.messageTemplateLayer.templateView = syntax + self.messageTemplateLayer.messageTemplateRenderer = .loaded( + messageId: syntax.messageId, + view: view + ) default: // include .failed self.messageTemplateLayer.renderError() @@ -171,35 +127,44 @@ extension SBUMessageTemplateCell { } } -extension SBUMessageTemplateCell: MessageTemplateRendererDelegate { - func messageTemplateRender(_ renderer: SBUMessageTemplate.Renderer, didFinishLoadingImage imageView: UIImageView) { - guard self.messageTemplateLayer.hasValidRenderer == true else { return } - self.reloadCell() +extension SBUMessageTemplateCell: TemplateViewGeneratorDelegate { + public func templateView(_ templateView: TemplateSyntax.TemplateView, didLoad image: UIImage, from imageURL: String, named fileName: String, in subPath: String) { + SBUCacheManager.Image.save(image: image, fileName: fileName, subPath: subPath, completionHandler: nil) } - func messageTemplateNeedReloadCell(_ renderer: SBUMessageTemplate.Renderer) { - guard self.messageTemplateLayer.hasValidRenderer == true else { return } - self.reloadCell() + public func templateView(_ templateView: TemplateSyntax.TemplateView, didFinishRootView view: UIView, with identifier: String) { + // do nothing } - func messageTemplateRender(_ renderer: SBUMessageTemplate.Renderer, didUpdateValue value: Any, forKey key: SBUMessageTemplate.Renderer.EventSourceKeys) { - switch key { - case .carouselRestoreView: - guard let carouselView = value as? SBUBaseCarouselView else { return } - self.message?.messageTemplateCarouselView = carouselView - default: + public func templateView(_ templateView: TemplateSyntax.TemplateView, didDrawPartialItem item: TemplateSyntax.Item, in view: UIView, with identifier: String) { + switch item { + case .carouselView(_): + self.message?.messageTemplateCarouselView = view + default: break } } + + public func templateView(_ templateView: TemplateSyntax.TemplateView, didSelect action: TemplateSyntax.Action) { + self.messageTemplateActionHandler?(.init(action: action)) + } } -extension SBUMessageTemplateCell: MessageTemplateRendererDataSource { - func messageTemplateRender(_ renderer: SBUMessageTemplate.Renderer, valueFor key: SBUMessageTemplate.Renderer.EventSourceKeys) -> Any? { - switch key { - case .carouselRestoreView: +extension SBUMessageTemplateCell: TemplateViewGeneratorDataSource { + public func templateView(_ templateView: TemplateSyntax.TemplateView, imageFor urlString: String, named fileName: String, in subPath: String) -> UIImage? { + SBUCacheManager.Image.get(fileName: fileName, subPath: subPath) + } + + public func templateView(_ templateView: TemplateSyntax.TemplateView, rootViewFor identifier: String) -> UIView? { + return nil + } + + public func templateView(_ templateView: TemplateSyntax.TemplateView, viewForPartialItem item: TemplateSyntax.Item, with identifier: String) -> UIView? { + switch item { + case .carouselView(_): return self.message?.messageTemplateCarouselView - case .templateFactory: - return self.messageTemplateLayer.templateView?.identifierFactory + default: + return nil } } } diff --git a/Sources/View/Channel/MessageCell/SBUMessageTemplateCell.swift b/Sources/View/Channel/MessageCell/SBUMessageTemplateCell.swift index d1f086ad..53446d0e 100644 --- a/Sources/View/Channel/MessageCell/SBUMessageTemplateCell.swift +++ b/Sources/View/Channel/MessageCell/SBUMessageTemplateCell.swift @@ -52,7 +52,7 @@ open class SBUMessageTemplateCell: SBUBaseMessageCell, SBUSuggestedReplyViewDele public private(set) var shouldHideSuggestedReplies: Bool = true // MARK: - UI Views (Private) - private var renderer: SBUMessageTemplate.Renderer? + private var renderer: UIView? // MARK: - Sendbird Life cycle /// Configures a cell with ``SBUBaseMessageCellParams`` object. diff --git a/Sources/View/Channel/MessageCell/SBUMessageTemplateCellLayout.swift b/Sources/View/Channel/MessageCell/SBUMessageTemplateCellLayout.swift index fac85056..9ef4af8c 100644 --- a/Sources/View/Channel/MessageCell/SBUMessageTemplateCellLayout.swift +++ b/Sources/View/Channel/MessageCell/SBUMessageTemplateCellLayout.swift @@ -102,7 +102,8 @@ class SBUMessageTemplateCellLayout: SBUViewLayoutConfigurable { ) self.topStackView.isHidden = self.topStackViewHidden() - self.bottomStackView.isHidden = self.topStackViewHidden() + // FIXED: https://sendbird.atlassian.net/browse/CLNP-6061 + self.bottomStackView.isHidden = self.bottomStackViewHidden() // layout for optional feature views diff --git a/Sources/View/Channel/SBUChatNotificationChannelViewController.swift b/Sources/View/Channel/SBUChatNotificationChannelViewController.swift index 6d6bdafc..26dfb196 100644 --- a/Sources/View/Channel/SBUChatNotificationChannelViewController.swift +++ b/Sources/View/Channel/SBUChatNotificationChannelViewController.swift @@ -561,6 +561,22 @@ open class SBUChatNotificationChannelViewController: SBUBaseViewController, // Nothing } + func chatNotificationChannelModule( + _ listComponent: SBUChatNotificationChannelModule.List, + didHandleUncachedTemplateKeys templateKeys: [String] + ) -> Bool? { + let cache = self.viewModel?.templateLoadCache ?? [:] + var result = true + for templateKey in templateKeys { + switch cache[templateKey] { + case .success: continue + case .failure, .loading: result = false + default: return nil + } + } + return result + } + // MARK: - SBUChatNotificationChannelModuleListDelegate func chatNotificationChannelModule( _ listComponent: SBUChatNotificationChannelModule.List, @@ -665,6 +681,18 @@ open class SBUChatNotificationChannelViewController: SBUBaseViewController, } } + func chatNotificationChannelModule( + _ listComponent: SBUChatNotificationChannelModule.List, + shouldHandleUncachedTemplateKeys templateKeys: [String], + messageCell: SBUBaseMessageCell + ) { + self.viewModel?.loadUncachedTemplate( + keys: templateKeys + ) { [weak self] success in + self?.listComponent?.reloadTableView() + } + } + // MARK: - SBUChatNotificationChannelModuleListDataSource func chatNotificationChannelModule( _ listComponent: SBUChatNotificationChannelModule.List, diff --git a/Sources/View/Channel/SBUFeedNotificationChannelViewController.swift b/Sources/View/Channel/SBUFeedNotificationChannelViewController.swift index f109a188..bd93b9be 100644 --- a/Sources/View/Channel/SBUFeedNotificationChannelViewController.swift +++ b/Sources/View/Channel/SBUFeedNotificationChannelViewController.swift @@ -299,12 +299,8 @@ open class SBUFeedNotificationChannelViewController: SBUBaseViewController, .sbu_constraint( equalTo: self.view, left: 0, - right: 0 - ) - .sbu_constraint( - equalTo: self.view, - top: 0, - useSafeArea: true + right: 0, + top: 0 ) .sbu_constraint(height: Constants.categoryFilterHeight) @@ -787,6 +783,18 @@ open class SBUFeedNotificationChannelViewController: SBUBaseViewController, ) { self.viewModel?.invalidateLogImpressionTimer() } + + func feedNotificationChannelModule( + _ listComponent: SBUFeedNotificationChannelModule.List, + shouldHandleUncachedTemplateKeys templateKeys: [String], + messageCell: SBUBaseMessageCell + ) { + self.viewModel?.loadUncachedTemplate( + keys: templateKeys + ) { [weak self] _ in + self?.listComponent?.reloadTableView() + } + } // MARK: - SBUFeedNotificationChannelModuleListDataSource func feedNotificationChannelModule( @@ -824,6 +832,22 @@ open class SBUFeedNotificationChannelViewController: SBUBaseViewController, self.viewModel?.startingPoint } + func feedNotificationChannelModule( + _ listComponent: SBUFeedNotificationChannelModule.List, + didHandleUncachedTemplateKeys templateKeys: [String] + ) -> Bool? { + let cache = self.viewModel?.templateLoadCache ?? [:] + var result = true + for templateKey in templateKeys { + switch cache[templateKey] { + case .success: continue + case .failure, .loading: result = false + default: return nil + } + } + return result + } + // MARK: - SBUCommonViewModelDelegate open func shouldUpdateLoadingState(_ isLoading: Bool) { self.showLoading(isLoading) diff --git a/Sources/View/Channel/SBUGroupChannelViewController.swift b/Sources/View/Channel/SBUGroupChannelViewController.swift index d19eee67..f28641c2 100644 --- a/Sources/View/Channel/SBUGroupChannelViewController.swift +++ b/Sources/View/Channel/SBUGroupChannelViewController.swift @@ -1115,8 +1115,7 @@ open class SBUGroupChannelViewController: SBUBaseChannelViewController, SBUGroup ) { self.viewModel?.loadUncachedTemplate( keys: templateKeys - ) { [weak self] success in - messageCell.message?.templateDownloadRetryStatus.update(with: success) + ) { [weak self] _ in self?.baseListComponent?.reloadTableView() } } @@ -1128,8 +1127,7 @@ open class SBUGroupChannelViewController: SBUBaseChannelViewController, SBUGroup ) { self.viewModel?.loadUncachedTemplateImages( data: cacheData - ) { [weak self] success in - messageCell.message?.templateImagesRetryStatus.update(with: success) + ) { [weak self] _ in self?.baseListComponent?.reloadCell(messageCell) } } @@ -1182,6 +1180,19 @@ open class SBUGroupChannelViewController: SBUBaseChannelViewController, SBUGroup return self.highlightInfo } + + open func groupChannelModule(_ listComponent: SBUGroupChannelModule.List, didHandleUncachedTemplateKeys templateKeys: [String]) -> Bool? { + let cache = self.viewModel?.templateLoadCache ?? [:] + var result = true + for templateKey in templateKeys { + switch cache[templateKey] { + case .success: continue + case .failure, .loading: result = false + default: return nil + } + } + return result + } // MARK: - SBUGroupChannelModuleInputDelegate open override func baseChannelModule(_ inputComponent: SBUBaseChannelModule.Input, didUpdateFrozenState isFrozen: Bool) { diff --git a/Sources/View/ChannelList/SBUGroupChannelListViewController.swift b/Sources/View/ChannelList/SBUGroupChannelListViewController.swift index 65c7330d..2aef1730 100644 --- a/Sources/View/ChannelList/SBUGroupChannelListViewController.swift +++ b/Sources/View/ChannelList/SBUGroupChannelListViewController.swift @@ -128,7 +128,7 @@ open class SBUGroupChannelListViewController: SBUBaseChannelListViewController, self.updateStyles() #if INSPECTION - AppDelegate.bringInspectionViewToFront() + NotificationCenter.default.post(name: Notification.Name.bringInspectionViewToFront, object: nil) #endif } diff --git a/Sources/View/ChannelList/SBUOpenChannelListViewController.swift b/Sources/View/ChannelList/SBUOpenChannelListViewController.swift index de4e549b..d37d3d25 100644 --- a/Sources/View/ChannelList/SBUOpenChannelListViewController.swift +++ b/Sources/View/ChannelList/SBUOpenChannelListViewController.swift @@ -109,7 +109,7 @@ open class SBUOpenChannelListViewController: SBUBaseChannelListViewController, S self.updateStyles() #if INSPECTION - AppDelegate.bringInspectionViewToFront() + NotificationCenter.default.post(name: Notification.Name.bringInspectionViewToFront, object: nil) #endif } diff --git a/Sources/View/Common/SBUStackView.swift b/Sources/View/Common/SBUStackView.swift index 1214a7b1..ee242af0 100644 --- a/Sources/View/Common/SBUStackView.swift +++ b/Sources/View/Common/SBUStackView.swift @@ -7,6 +7,9 @@ // import UIKit +#if canImport(SendbirdUIMessageTemplate) +import SendbirdUIMessageTemplate +#endif public class SBUStackView: UIStackView { override init(frame: CGRect) { @@ -32,9 +35,7 @@ public class SBUStackView: UIStackView { public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { let view = super.hitTest(point, with: event) - if view is HitPassView { return nil } + if view is HitPassViewType { return nil } return view } } - -class HitPassView: UIView { } diff --git a/Sources/ViewModel/Channel/SBUChatNotificationChannelViewModel.swift b/Sources/ViewModel/Channel/SBUChatNotificationChannelViewModel.swift index d558113d..eeec21e0 100644 --- a/Sources/ViewModel/Channel/SBUChatNotificationChannelViewModel.swift +++ b/Sources/ViewModel/Channel/SBUChatNotificationChannelViewModel.swift @@ -95,6 +95,10 @@ class SBUChatNotificationChannelViewModel: NSObject { /// This object has all valid notifications synchronized with the server. @SBUAtomic var notifications: [BaseMessage] = [] + /// Data fields for templates to cache load states + /// - Since: 3.29.0 + var templateLoadCache: [String: SBUMessageTemplate.TemplateCacheState] = [:] // template-key : load-state + /// Custom param set by user. var customizedNotificationListParams: MessageListParams? var notificationListParams = MessageListParams() @@ -370,7 +374,7 @@ class SBUChatNotificationChannelViewModel: NSObject { // MARK: - Notification related func markAsRead(completionHandler: SendbirdChatSDK.SBErrorHandler? = nil) { - if let channel = self.channel, + if let channel = self.channel, allowsReadStatusUpdate, SendbirdChat.getConnectState() == .open { channel.markAsRead(completionHandler: completionHandler) @@ -686,6 +690,28 @@ class SBUChatNotificationChannelViewModel: NSObject { ) self.notificationCollection?.delegate = self } + + func loadUncachedTemplate( + keys: [String], + completionHandler: @escaping (Bool) -> Void + ) { + guard let uncachedKeys = self.templateLoadCache.uncachedKeys(from: keys) else { + SBULog.info("[Request] All requested keys are already marked as failed or are loading: \(keys)") + completionHandler(false) + return + } + + self.templateLoadCache.loadingKeys(from: uncachedKeys) + + SBUMessageTemplateManager.loadTemplateList(type: .notification, keys: uncachedKeys) { [weak self] success in + guard let self = self else { return } + SBULog.info("[Request] Load request completed - success: \(success)") + + self.templateLoadCache.didLoadKeys(form: uncachedKeys, success: success) + + completionHandler(success) + } + } } // MARK: - ConnectionDelegate diff --git a/Sources/ViewModel/Channel/SBUFeedNotificationChannelViewModel.swift b/Sources/ViewModel/Channel/SBUFeedNotificationChannelViewModel.swift index 88bae3f4..ce971d92 100644 --- a/Sources/ViewModel/Channel/SBUFeedNotificationChannelViewModel.swift +++ b/Sources/ViewModel/Channel/SBUFeedNotificationChannelViewModel.swift @@ -95,6 +95,10 @@ class SBUFeedNotificationChannelViewModel: NSObject { /// This object has all valid notifications synchronized with the server. @SBUAtomic var notifications: [BaseMessage] = [] + /// Data fields for templates to cache load states + /// - Since: 3.29.0 + var templateLoadCache: [String: SBUMessageTemplate.TemplateCacheState] = [:] // template-key : load-state + /// Custom param set by user. var customizedNotificationListParams: MessageListParams? var notificationListParams = MessageListParams() @@ -700,6 +704,28 @@ class SBUFeedNotificationChannelViewModel: NSObject { self.markAsViewedTimer?.invalidate() } + func loadUncachedTemplate( + keys: [String], + completionHandler: @escaping (Bool) -> Void + ) { + guard let uncachedKeys = self.templateLoadCache.uncachedKeys(from: keys) else { + SBULog.info("[Request] All requested keys are already marked as failed or are loading: \(keys)") + completionHandler(false) + return + } + + self.templateLoadCache.loadingKeys(from: uncachedKeys) + + SBUMessageTemplateManager.loadTemplateList(type: .notification, keys: uncachedKeys) { [weak self] success in + guard let self = self else { return } + SBULog.info("[Request] Load request completed - success: \(success)") + + self.templateLoadCache.didLoadKeys(form: uncachedKeys, success: success) + + completionHandler(success) + } + } + /// This function refreshes channel and checkes updated message. /// - Parameter completionHandler: completion handler /// diff --git a/Sources/ViewModel/Channel/SBUGroupChannelViewModel.swift b/Sources/ViewModel/Channel/SBUGroupChannelViewModel.swift index be0eb936..98f6b77a 100644 --- a/Sources/ViewModel/Channel/SBUGroupChannelViewModel.swift +++ b/Sources/ViewModel/Channel/SBUGroupChannelViewModel.swift @@ -100,6 +100,10 @@ open class SBUGroupChannelViewModel: SBUBaseChannelViewModel { self.messageListParams.reverse ? self.messageCollection?.succeededMessages.first : self.messageCollection?.succeededMessages.last } + /// Data fields for templates to cache load states + /// - Since: 3.29.0 + var templateLoadCache: [String: SBUMessageTemplate.TemplateCacheState] = [:] // template-key : load-state + // MARK: - LifeCycle required public init( channel: BaseChannel? = nil, @@ -330,7 +334,9 @@ open class SBUGroupChannelViewModel: SBUBaseChannelViewModel { SBUCacheManager.Image.preSave( multipleFilesMessage: preSendMessage, uploadableFileInfo: fileInfo, - index: index + index: index, + isQuotedImage: false, + completionHandler: nil ) } } @@ -1016,19 +1022,24 @@ extension SBUGroupChannelViewModel: MessageCollectionDelegate { } } - static var nowLoadingTemplate: Bool = false func loadUncachedTemplate( keys: [String], completionHandler: @escaping (Bool) -> Void ) { - if SBUGroupChannelViewModel.nowLoadingTemplate == true { - SBULog.info("[Request] ignore load missing template: \(keys)") + guard let uncachedKeys = self.templateLoadCache.uncachedKeys(from: keys) else { + SBULog.info("[Request] All requested keys are already marked as failed or are loading: \(keys)") + completionHandler(false) return } - SBUGroupChannelViewModel.nowLoadingTemplate = true - SBUMessageTemplateManager.loadTemplateList(type: .message) { success in - SBULog.info("[Request] load missing templates - success: \(success)") - SBUGroupChannelViewModel.nowLoadingTemplate = false + + self.templateLoadCache.loadingKeys(from: uncachedKeys) + + SBUMessageTemplateManager.loadTemplateList(type: .message, keys: keys) { [weak self] success in + guard let self = self else { return } + SBULog.info("[Request] Load request completed - success: \(success)") + + self.templateLoadCache.didLoadKeys(form: uncachedKeys, success: success) + completionHandler(success) } } diff --git a/Sources/ViewModel/MessageThread/SBUMessageThreadViewModel.swift b/Sources/ViewModel/MessageThread/SBUMessageThreadViewModel.swift index 7830499d..7b0bed13 100644 --- a/Sources/ViewModel/MessageThread/SBUMessageThreadViewModel.swift +++ b/Sources/ViewModel/MessageThread/SBUMessageThreadViewModel.swift @@ -758,7 +758,9 @@ open class SBUMessageThreadViewModel: SBUBaseChannelViewModel { SBUCacheManager.Image.preSave( multipleFilesMessage: preSendMessage, uploadableFileInfo: fileInfo, - index: index + index: index, + isQuotedImage: false, + completionHandler: nil ) } }