diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index dc43e0406..636e464a0 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -78,7 +78,7 @@ 214CDBF0C783155242FFE4A0 /* NotificationItemProxy+NSE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B1FBF8CA40199B8058B1F08 /* NotificationItemProxy+NSE.swift */; }; 2276870A19F34B3FFFDA690F /* SoftLogoutCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AEA20A6B4883E60469ACF8F /* SoftLogoutCoordinator.swift */; }; 2352C541AF857241489756FF /* MockRoomSummaryProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7D42E66E939B709C1EC390 /* MockRoomSummaryProvider.swift */; }; - 235819701B166DFBA21994F1 /* RoomMembersViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33AECDFE83A880328CCFD0B1 /* RoomMembersViewModelTests.swift */; }; + 235819701B166DFBA21994F1 /* RoomMemberDetailsViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33AECDFE83A880328CCFD0B1 /* RoomMemberDetailsViewModelTests.swift */; }; 237FC70AA257B935F53316BA /* SessionVerificationControllerProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55D7E514F9DE4E3D72FDCAD /* SessionVerificationControllerProxy.swift */; }; 23B2CD5A06B16055BDDD0994 /* ApplicationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44D8C8431416EB8DFEC7E235 /* ApplicationTests.swift */; }; 24906A1E82D0046655958536 /* MessageComposer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E18CF12478983A5EB390FB26 /* MessageComposer.swift */; }; @@ -183,11 +183,11 @@ 5F06AD3C66884CE793AE6119 /* FileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04DF593C3F7AF4B2FBAEB05D /* FileManager.swift */; }; 5F1FDE49DFD0C680386E48F9 /* TemplateViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B80895CE021B49847BD7D74 /* TemplateViewModelProtocol.swift */; }; 5F5488FBC9CFEB6F433D74A4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7109E709A7738E6BCC4553E6 /* Localizable.strings */; }; - 60E838D870A4969D9BADF1BC /* RoomMembersViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD38C315F6576DB898EA9529 /* RoomMembersViewModelProtocol.swift */; }; + 60E838D870A4969D9BADF1BC /* RoomMemberDetailsViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD38C315F6576DB898EA9529 /* RoomMemberDetailsViewModelProtocol.swift */; }; 60ED66E63A169E47489348A8 /* GZIP in Frameworks */ = {isa = PBXBuildFile; productRef = 2B788C81F6369D164ADEB917 /* GZIP */; }; 6126CC51654E159804999E6A /* UNMutableNotificationContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5741CD0691019B32FE74CE9E /* UNMutableNotificationContent.swift */; }; 617624A97BDBB75ED3DD8156 /* RoomScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A00C7A331B72C0F05C00392F /* RoomScreenViewModelProtocol.swift */; }; - 626367FC2416CA4E25E15383 /* RoomMembersScreenUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72F910035944E5F38F4F801E /* RoomMembersScreenUITests.swift */; }; + 626367FC2416CA4E25E15383 /* RoomMemberDetailsScreenUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72F910035944E5F38F4F801E /* RoomMemberDetailsScreenUITests.swift */; }; 6298AB0906DDD3525CD78C6B /* SwiftState in Frameworks */ = {isa = PBXBuildFile; productRef = 9573B94B1C86C6DF751AF3FD /* SwiftState */; }; 630E89EBB0F791208EEE6D11 /* FileRoomTimelineItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = C00A7110B937C6AE2EF5D7D6 /* FileRoomTimelineItem.swift */; }; 63C9AF0FB8278AF1C0388A0C /* TemplateModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB10E673916D2B8D21FD197 /* TemplateModels.swift */; }; @@ -321,13 +321,13 @@ A33784831AD880A670CAA9F9 /* FileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04DF593C3F7AF4B2FBAEB05D /* FileManager.swift */; }; A371629728E597C5FCA3C2B2 /* Analytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73FC861755C6388F62B9280A /* Analytics.swift */; }; A37EED79941AD3B7140B3822 /* UIDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 287FC98AF2664EAD79C0D902 /* UIDevice.swift */; }; - A382B0EA99888F74B6952019 /* RoomMembersMemberCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22FECA5919BE59C4BB5AEB22 /* RoomMembersMemberCell.swift */; }; - A3CE203A923A4DD0E9371FB9 /* RoomMembersScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E254EA67FB16AB33F9F9B18D /* RoomMembersScreen.swift */; }; + A382B0EA99888F74B6952019 /* RoomMemberDetailsMemberCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22FECA5919BE59C4BB5AEB22 /* RoomMemberDetailsMemberCell.swift */; }; + A3CE203A923A4DD0E9371FB9 /* RoomMemberDetailsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = E254EA67FB16AB33F9F9B18D /* RoomMemberDetailsScreen.swift */; }; A440D4BC02088482EC633A88 /* KeychainControllerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5E94DCFEE803E5ABAE8ACCE /* KeychainControllerProtocol.swift */; }; A494741843F087881299ACF0 /* RestorationToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3558A15CFB934F9229301527 /* RestorationToken.swift */; }; A4E885358D7DD5A072A06824 /* PostHog in Frameworks */ = {isa = PBXBuildFile; productRef = CCE5BF78B125320CBF3BB834 /* PostHog */; }; A50849766F056FD1DB942DEA /* AlertInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EEB64CC6F3DF5B68736A6B4 /* AlertInfo.swift */; }; - A57A62859AE46AE07281B4AE /* RoomMembersModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F5734DF8967F3595F8C784D /* RoomMembersModels.swift */; }; + A57A62859AE46AE07281B4AE /* RoomMemberDetailsModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F5734DF8967F3595F8C784D /* RoomMemberDetailsModels.swift */; }; A663FE6704CB500EBE782AE1 /* AnalyticsPromptCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4DE1CF8F5EFD353B1A5E36F /* AnalyticsPromptCoordinator.swift */; }; A69A54FF11A3F9EA0660E6BF /* NSE.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0D8F620C8B314840D8602E3F /* NSE.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; A6DEC1ADEC8FEEC206A0FA37 /* AttributedStringBuilderProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72F37B5DA798C9AE436F2C2C /* AttributedStringBuilderProtocol.swift */; }; @@ -391,7 +391,7 @@ CB137BFB3E083C33E398A6CB /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 0DD568A494247444A4B56031 /* Kingfisher */; }; CB498F4E27AA0545DCEF0F6F /* DeviceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 4003BC24B24C9E63D3304177 /* DeviceKit */; }; CB99B0FA38A4AC596F38CC13 /* KeychainControllerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5E94DCFEE803E5ABAE8ACCE /* KeychainControllerProtocol.swift */; }; - CC2A6B71E12DDF1EE6ECD299 /* RoomMembersCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F118CF7C5548099AACF7E90C /* RoomMembersCoordinator.swift */; }; + CC2A6B71E12DDF1EE6ECD299 /* RoomMemberDetailsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F118CF7C5548099AACF7E90C /* RoomMemberDetailsCoordinator.swift */; }; CC736DA1AA8F8B9FD8785009 /* ScreenshotDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5C4AF6E3885730CD560311C /* ScreenshotDetector.swift */; }; CCAA0671B46EAFD0BB528E2C /* apple_emojis_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 8FC26871038FB0E4AAE22605 /* apple_emojis_data.json */; }; CD6A72B65D3B6076F4045C30 /* PHGPostHogConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6B891A6DA826E2461DBB40F /* PHGPostHogConfiguration.swift */; }; @@ -415,7 +415,7 @@ D85D4FA590305180B4A41795 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB3073CCD77D906B330BC1D6 /* Tests.swift */; }; D876EC0FED3B6D46C806912A /* AvatarSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = E24B88AD3D1599E8CB1376E0 /* AvatarSize.swift */; }; D8CFF02C2730EE5BC4F17ABF /* ElementToggleStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0960A7F5C1B0B6679BDF26F9 /* ElementToggleStyle.swift */; }; - DC2D20609B9B612F6946C3F6 /* RoomMembersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4CF2FC815D26B337E78DA45 /* RoomMembersViewModel.swift */; }; + DC2D20609B9B612F6946C3F6 /* RoomMemberDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4CF2FC815D26B337E78DA45 /* RoomMemberDetailsViewModel.swift */; }; DC68E866D6E664B0D2B06E74 /* MockImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC1DA29A5A041CC0BACA7CB0 /* MockImageCache.swift */; }; DD9B70DE54B24E0694A35D8A /* Strings+Untranslated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A18F6CE4D694D21E4EA9B25 /* Strings+Untranslated.swift */; }; DDB80FD2753FEAAE43CC2AAE /* ImageRoomTimelineItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A63815AD6A5C306453342F2 /* ImageRoomTimelineItem.swift */; }; @@ -601,7 +601,7 @@ 227AC5D71A4CE43512062243 /* URL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URL.swift; sourceTree = ""; }; 22B384D54464FA39C6C7F6E7 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ca; path = ca.lproj/Localizable.stringsdict; sourceTree = ""; }; 22D46DB0CC6C55EBA7AE67A3 /* SoftLogoutViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftLogoutViewModel.swift; sourceTree = ""; }; - 22FECA5919BE59C4BB5AEB22 /* RoomMembersMemberCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersMemberCell.swift; sourceTree = ""; }; + 22FECA5919BE59C4BB5AEB22 /* RoomMemberDetailsMemberCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsMemberCell.swift; sourceTree = ""; }; 233D5F7E5E9F49ABF3413291 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = hr; path = hr.lproj/Localizable.stringsdict; sourceTree = ""; }; 24F5530B2212862FA4BEFF2D /* HomeScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenViewModelProtocol.swift; sourceTree = ""; }; 2583416C8974272ADBADDBE1 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-TW"; path = "zh-TW.lproj/Localizable.stringsdict"; sourceTree = ""; }; @@ -634,7 +634,7 @@ 31D6764D6976D235926FE5FC /* HomeScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenViewModel.swift; sourceTree = ""; }; 32C5DAA1773F57653BF1C4F9 /* SoftLogoutViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftLogoutViewModelTests.swift; sourceTree = ""; }; 3340ABAE3A4647E80163AE18 /* TemplateViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateViewModelTests.swift; sourceTree = ""; }; - 33AECDFE83A880328CCFD0B1 /* RoomMembersViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersViewModelTests.swift; sourceTree = ""; }; + 33AECDFE83A880328CCFD0B1 /* RoomMemberDetailsViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsViewModelTests.swift; sourceTree = ""; }; 33E49C5C6F802B4D94CA78D1 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; 3429142FE11930422E7CC1A0 /* UserSessionFlowCoordinatorStateMachine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSessionFlowCoordinatorStateMachine.swift; sourceTree = ""; }; 351E89CE2ED9B73C5CC47955 /* TimelineReactionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineReactionsView.swift; sourceTree = ""; }; @@ -755,7 +755,7 @@ 6E5E9C044BEB7C70B1378E91 /* UserSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSession.swift; sourceTree = ""; }; 6EA1D2CBAEA5D0BD00B90D1B /* BindableState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BindableState.swift; sourceTree = ""; }; 6F3DFE5B444F131648066F05 /* StateStoreViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateStoreViewModel.swift; sourceTree = ""; }; - 6F5734DF8967F3595F8C784D /* RoomMembersModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersModels.swift; sourceTree = ""; }; + 6F5734DF8967F3595F8C784D /* RoomMemberDetailsModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsModels.swift; sourceTree = ""; }; 6FB31A32C93D94930B253FBF /* PermalinkBuilderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PermalinkBuilderTests.swift; sourceTree = ""; }; 6FC5015B9634698BDB8701AF /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = it; path = it.lproj/Localizable.stringsdict; sourceTree = ""; }; 71556206CD5E8B1F53F07178 /* MockRoomTimelineControllerFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockRoomTimelineControllerFactory.swift; sourceTree = ""; }; @@ -763,7 +763,7 @@ 71D52BAA5BADB06E5E8C295D /* Assets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = ""; }; 72D03D36422177EF01905D20 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; 72F37B5DA798C9AE436F2C2C /* AttributedStringBuilderProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedStringBuilderProtocol.swift; sourceTree = ""; }; - 72F910035944E5F38F4F801E /* RoomMembersScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersScreenUITests.swift; sourceTree = ""; }; + 72F910035944E5F38F4F801E /* RoomMemberDetailsScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsScreenUITests.swift; sourceTree = ""; }; 73FC861755C6388F62B9280A /* Analytics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Analytics.swift; sourceTree = ""; }; 748AE77AC3B0A01223033B87 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 756288D339AFC15D2C3F4A0D /* PaginationIndicatorRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationIndicatorRoomTimelineItem.swift; sourceTree = ""; }; @@ -804,7 +804,7 @@ 8D6094DEAAEB388E1AE118C6 /* MockRoomTimelineProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockRoomTimelineProvider.swift; sourceTree = ""; }; 8D8169443E5AC5FF71BFB3DB /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; 8DC2C9E0E15C79BBDA80F0A2 /* TimelineStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineStyle.swift; sourceTree = ""; }; - 8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; path = UITests.xctestplan; sourceTree = ""; }; + 8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = UITests.xctestplan; sourceTree = ""; }; 8ED2D2F6A137A95EA50413BE /* UserNotificationControllerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserNotificationControllerProtocol.swift; sourceTree = ""; }; 8F7D42E66E939B709C1EC390 /* MockRoomSummaryProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockRoomSummaryProvider.swift; sourceTree = ""; }; 8FC26871038FB0E4AAE22605 /* apple_emojis_data.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = apple_emojis_data.json; sourceTree = ""; }; @@ -859,7 +859,7 @@ A443FAE2EE820A5790C35C8D /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Localizable.strings; sourceTree = ""; }; A4756C5A8C8649AD6C10C615 /* MockUserSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockUserSession.swift; sourceTree = ""; }; A4B5B19A10D3F7C2BC5315DF /* VideoRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoRoomTimelineItem.swift; sourceTree = ""; }; - A4CF2FC815D26B337E78DA45 /* RoomMembersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersViewModel.swift; sourceTree = ""; }; + A4CF2FC815D26B337E78DA45 /* RoomMemberDetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsViewModel.swift; sourceTree = ""; }; A5B0B1226DA8DB55918B34CD /* FileCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileCache.swift; sourceTree = ""; }; A64F0DB78E0AC23C91AD89EF /* mk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mk; path = mk.lproj/Localizable.strings; sourceTree = ""; }; A65F140F9FE5E8D4DAEFF354 /* RoomProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomProxy.swift; sourceTree = ""; }; @@ -989,7 +989,7 @@ E157152B11E347F735C3FD6E /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = tr; path = tr.lproj/Localizable.stringsdict; sourceTree = ""; }; E18CF12478983A5EB390FB26 /* MessageComposer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageComposer.swift; sourceTree = ""; }; E24B88AD3D1599E8CB1376E0 /* AvatarSize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarSize.swift; sourceTree = ""; }; - E254EA67FB16AB33F9F9B18D /* RoomMembersScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersScreen.swift; sourceTree = ""; }; + E254EA67FB16AB33F9F9B18D /* RoomMemberDetailsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsScreen.swift; sourceTree = ""; }; E26747B3154A5DBC3A7E24A5 /* Image.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; }; E36CB905A2B9EC2C92A2DA7C /* KeychainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainController.swift; sourceTree = ""; }; E36CFF3E430B27B7C3AD0A28 /* MockMediaProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockMediaProxy.swift; sourceTree = ""; }; @@ -1015,7 +1015,7 @@ EBE5502760CF6CA2D7201883 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ja; path = ja.lproj/Localizable.stringsdict; sourceTree = ""; }; ED044D00F2176681CC02CD54 /* HomeScreenRoomCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenRoomCell.swift; sourceTree = ""; }; ED1D792EB82506A19A72C8DE /* RoomTimelineItemProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTimelineItemProtocol.swift; sourceTree = ""; }; - ED482057AE39D5C6D9C5F3D8 /* message.caf */ = {isa = PBXFileReference; path = message.caf; sourceTree = ""; }; + ED482057AE39D5C6D9C5F3D8 /* message.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = message.caf; sourceTree = ""; }; EDAA4472821985BF868CC21C /* ServerSelectionViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerSelectionViewModelTests.swift; sourceTree = ""; }; EDB6E40BAD4504D899FAAC9A /* TemplateViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateViewModel.swift; sourceTree = ""; }; EE8BCD14EFED23459A43FDFF /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; @@ -1027,7 +1027,7 @@ F012CB5EE3F2B67359F6CC52 /* target.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = target.yml; sourceTree = ""; }; F03C9D319676F3C0DC6B0203 /* ScreenshotDetectorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotDetectorTests.swift; sourceTree = ""; }; F0E7BF8F7BB1021F889C6483 /* MockBugReportService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockBugReportService.swift; sourceTree = ""; }; - F118CF7C5548099AACF7E90C /* RoomMembersCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersCoordinator.swift; sourceTree = ""; }; + F118CF7C5548099AACF7E90C /* RoomMemberDetailsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsCoordinator.swift; sourceTree = ""; }; F15BE37BE2FB86E00C8D150A /* AggregratedReaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AggregratedReaction.swift; sourceTree = ""; }; F174A5627CDB3CAF280D1880 /* EmojiPickerScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerScreenModels.swift; sourceTree = ""; }; F23BA6D4842D53C5AC9B7584 /* nn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = nn; path = nn.lproj/Localizable.stringsdict; sourceTree = ""; }; @@ -1052,7 +1052,7 @@ FAB10E673916D2B8D21FD197 /* TemplateModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateModels.swift; sourceTree = ""; }; FBC776F301D374A3298C69DA /* AppCoordinatorProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppCoordinatorProtocol.swift; sourceTree = ""; }; FC3D31C2DA6910AA0079678A /* MediaProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaProxyProtocol.swift; sourceTree = ""; }; - FD38C315F6576DB898EA9529 /* RoomMembersViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersViewModelProtocol.swift; sourceTree = ""; }; + FD38C315F6576DB898EA9529 /* RoomMemberDetailsViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsViewModelProtocol.swift; sourceTree = ""; }; FDB9C37196A4C79F24CE80C6 /* KeychainControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainControllerTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -1696,7 +1696,7 @@ 00A941F289F6AB876BA3361A /* OnboardingViewModelTests.swift */, 6FB31A32C93D94930B253FBF /* PermalinkBuilderTests.swift */, 2EFE1922F39398ABFB36DF3F /* RoomDetailsViewModelTests.swift */, - 33AECDFE83A880328CCFD0B1 /* RoomMembersViewModelTests.swift */, + 33AECDFE83A880328CCFD0B1 /* RoomMemberDetailsViewModelTests.swift */, 93CF7B19FFCF8EFBE0A8696A /* RoomScreenViewModelTests.swift */, F03C9D319676F3C0DC6B0203 /* ScreenshotDetectorTests.swift */, EDAA4472821985BF868CC21C /* ServerSelectionViewModelTests.swift */, @@ -1891,8 +1891,8 @@ 83CA952B8D738B8E810F569D /* View */ = { isa = PBXGroup; children = ( - 22FECA5919BE59C4BB5AEB22 /* RoomMembersMemberCell.swift */, - E254EA67FB16AB33F9F9B18D /* RoomMembersScreen.swift */, + 22FECA5919BE59C4BB5AEB22 /* RoomMemberDetailsMemberCell.swift */, + E254EA67FB16AB33F9F9B18D /* RoomMemberDetailsScreen.swift */, ); path = View; sourceTree = ""; @@ -1969,7 +1969,7 @@ 1DB34B0C74CD242FED9DD069 /* LoginScreenUITests.swift */, 0C88046D6A070D9827181C4D /* OnboardingUITests.swift */, 3BFDAF6918BB096C44788FC9 /* RoomDetailsScreenUITests.swift */, - 72F910035944E5F38F4F801E /* RoomMembersScreenUITests.swift */, + 72F910035944E5F38F4F801E /* RoomMemberDetailsScreenUITests.swift */, 086B997409328F091EBA43CE /* RoomScreenUITests.swift */, 054F469E433864CC6FE6EE8E /* ServerSelectionUITests.swift */, 6D4777F0142E330A75C46FE4 /* SessionVerificationUITests.swift */, @@ -2381,10 +2381,10 @@ F363C3EEA04EE9F4584B060C /* RoomMembers */ = { isa = PBXGroup; children = ( - F118CF7C5548099AACF7E90C /* RoomMembersCoordinator.swift */, - 6F5734DF8967F3595F8C784D /* RoomMembersModels.swift */, - A4CF2FC815D26B337E78DA45 /* RoomMembersViewModel.swift */, - FD38C315F6576DB898EA9529 /* RoomMembersViewModelProtocol.swift */, + F118CF7C5548099AACF7E90C /* RoomMemberDetailsCoordinator.swift */, + 6F5734DF8967F3595F8C784D /* RoomMemberDetailsModels.swift */, + A4CF2FC815D26B337E78DA45 /* RoomMemberDetailsViewModel.swift */, + FD38C315F6576DB898EA9529 /* RoomMemberDetailsViewModelProtocol.swift */, 83CA952B8D738B8E810F569D /* View */, ); path = RoomMembers; @@ -2895,7 +2895,7 @@ F9F6D2883BBEBB9A3789A137 /* OnboardingViewModelTests.swift in Sources */, 27E9263DA75E266690A37EB1 /* PermalinkBuilderTests.swift in Sources */, EA974337FA7D040E7C74FE6E /* RoomDetailsViewModelTests.swift in Sources */, - 235819701B166DFBA21994F1 /* RoomMembersViewModelTests.swift in Sources */, + 235819701B166DFBA21994F1 /* RoomMemberDetailsViewModelTests.swift in Sources */, 46562110EE202E580A5FFD9C /* RoomScreenViewModelTests.swift in Sources */, EA31DD9043B91ECB8E45A9A6 /* ScreenshotDetectorTests.swift in Sources */, 93875ADD456142D20823ED24 /* ServerSelectionViewModelTests.swift in Sources */, @@ -3092,12 +3092,12 @@ C4F784AABFF44E4716E7A8BC /* RoomDetailsViewModelProtocol.swift in Sources */, 04A16B45228F7678A027C079 /* RoomHeaderView.swift in Sources */, BEEEB659A0BA510D7BE6345C /* RoomMemberProxy.swift in Sources */, - CC2A6B71E12DDF1EE6ECD299 /* RoomMembersCoordinator.swift in Sources */, - A382B0EA99888F74B6952019 /* RoomMembersMemberCell.swift in Sources */, - A57A62859AE46AE07281B4AE /* RoomMembersModels.swift in Sources */, - A3CE203A923A4DD0E9371FB9 /* RoomMembersScreen.swift in Sources */, - DC2D20609B9B612F6946C3F6 /* RoomMembersViewModel.swift in Sources */, - 60E838D870A4969D9BADF1BC /* RoomMembersViewModelProtocol.swift in Sources */, + CC2A6B71E12DDF1EE6ECD299 /* RoomMemberDetailsCoordinator.swift in Sources */, + A382B0EA99888F74B6952019 /* RoomMemberDetailsMemberCell.swift in Sources */, + A57A62859AE46AE07281B4AE /* RoomMemberDetailsModels.swift in Sources */, + A3CE203A923A4DD0E9371FB9 /* RoomMemberDetailsScreen.swift in Sources */, + DC2D20609B9B612F6946C3F6 /* RoomMemberDetailsViewModel.swift in Sources */, + 60E838D870A4969D9BADF1BC /* RoomMemberDetailsViewModelProtocol.swift in Sources */, FE79E2BCCF69E8BF4D21E15A /* RoomMessageFactory.swift in Sources */, 8D9F646387DF656EF91EE4CB /* RoomMessageFactoryProtocol.swift in Sources */, D0619D2E6B9C511190FBEB95 /* RoomMessageProtocol.swift in Sources */, @@ -3233,7 +3233,7 @@ 5C8AFBF168A41E20835F3B86 /* LoginScreenUITests.swift in Sources */, 6B15FF984906AAFCF9DC4F58 /* OnboardingUITests.swift in Sources */, 829062DD3C3F7016FE1A6476 /* RoomDetailsScreenUITests.swift in Sources */, - 626367FC2416CA4E25E15383 /* RoomMembersScreenUITests.swift in Sources */, + 626367FC2416CA4E25E15383 /* RoomMemberDetailsScreenUITests.swift in Sources */, 2F1CF90A3460C153154427F0 /* RoomScreenUITests.swift in Sources */, 77FACC29F98FE2E65BBB6A5F /* ServerSelectionUITests.swift in Sources */, 05EC896A4B9AF4A56670C0BB /* SessionVerificationUITests.swift in Sources */, diff --git a/ElementX/Sources/Screens/RoomDetails/RoomDetailsCoordinator.swift b/ElementX/Sources/Screens/RoomDetails/RoomDetailsCoordinator.swift index e7de6f187..07c5715d2 100644 --- a/ElementX/Sources/Screens/RoomDetails/RoomDetailsCoordinator.swift +++ b/ElementX/Sources/Screens/RoomDetails/RoomDetailsCoordinator.swift @@ -45,10 +45,9 @@ final class RoomDetailsCoordinator: CoordinatorProtocol { func start() { viewModel.callback = { [weak self] action in guard let self else { return } - MXLog.debug("RoomDetailsViewModel did complete with result: \(action).") switch action { - case .peopleTapped: - self.showPeople() + case .requestMemberDetailsPresentation(let members): + self.presentRoomMemberDetails(members) case .cancel: self.callback?(.cancel) } @@ -58,15 +57,15 @@ final class RoomDetailsCoordinator: CoordinatorProtocol { func toPresentable() -> AnyView { AnyView(RoomDetailsScreen(context: viewModel.context)) } - - private func showPeople() { - let params = RoomMembersCoordinatorParameters(roomProxy: parameters.roomProxy, - mediaProvider: parameters.mediaProvider) - let coordinator = RoomMembersCoordinator(parameters: params) + + private func presentRoomMemberDetails(_ members: [RoomMemberProxy]) { + let params = RoomMemberDetailsCoordinatorParameters(mediaProvider: parameters.mediaProvider, + members: members) + let coordinator = RoomMemberDetailsCoordinator(parameters: params) coordinator.callback = { [weak self] _ in self?.navigationStackCoordinator.pop() } - + navigationStackCoordinator.push(coordinator) } } diff --git a/ElementX/Sources/Screens/RoomDetails/RoomDetailsModels.swift b/ElementX/Sources/Screens/RoomDetails/RoomDetailsModels.swift index 1060f483f..04f85f6c5 100644 --- a/ElementX/Sources/Screens/RoomDetails/RoomDetailsModels.swift +++ b/ElementX/Sources/Screens/RoomDetails/RoomDetailsModels.swift @@ -22,7 +22,7 @@ import UIKit // MARK: View model enum RoomDetailsViewModelAction { - case peopleTapped + case requestMemberDetailsPresentation([RoomMemberProxy]) case cancel } diff --git a/ElementX/Sources/Screens/RoomDetails/RoomDetailsViewModel.swift b/ElementX/Sources/Screens/RoomDetails/RoomDetailsViewModel.swift index 58163e55a..2834c8acb 100644 --- a/ElementX/Sources/Screens/RoomDetails/RoomDetailsViewModel.swift +++ b/ElementX/Sources/Screens/RoomDetails/RoomDetailsViewModel.swift @@ -19,19 +19,17 @@ import SwiftUI typealias RoomDetailsViewModelType = StateStoreViewModel class RoomDetailsViewModel: RoomDetailsViewModelType, RoomDetailsViewModelProtocol { - // MARK: - Properties - - // MARK: Private - private let roomProxy: RoomProxyProtocol private let mediaProvider: MediaProviderProtocol - - // MARK: Public + + private var members: [RoomMemberProxy] = [] { + didSet { + state.members = members.map { RoomDetailsMember(withProxy: $0) } + } + } var callback: ((RoomDetailsViewModelAction) -> Void)? - // MARK: - Setup - init(roomProxy: RoomProxyProtocol, mediaProvider: MediaProviderProtocol) { self.roomProxy = roomProxy @@ -47,7 +45,7 @@ class RoomDetailsViewModel: RoomDetailsViewModelType, RoomDetailsViewModelProtoc Task { switch await roomProxy.members() { case .success(let members): - state.members = members.map { RoomDetailsMember(withProxy: $0) } + self.members = members case .failure(let error): MXLog.debug("Failed to retrieve room members: \(error)") state.bindings.alertInfo = AlertInfo(id: .alert(ElementL10n.unknownError)) @@ -69,7 +67,7 @@ class RoomDetailsViewModel: RoomDetailsViewModelType, RoomDetailsViewModelProtoc override func process(viewAction: RoomDetailsViewAction) async { switch viewAction { case .processTapPeople: - callback?(.peopleTapped) + callback?(.requestMemberDetailsPresentation(members)) } } } diff --git a/ElementX/Sources/Screens/RoomMembers/RoomMembersCoordinator.swift b/ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsCoordinator.swift similarity index 56% rename from ElementX/Sources/Screens/RoomMembers/RoomMembersCoordinator.swift rename to ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsCoordinator.swift index e48aca242..5e11fb12d 100644 --- a/ElementX/Sources/Screens/RoomMembers/RoomMembersCoordinator.swift +++ b/ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsCoordinator.swift @@ -16,32 +16,29 @@ import SwiftUI -struct RoomMembersCoordinatorParameters { - let roomProxy: RoomProxyProtocol +struct RoomMemberDetailsCoordinatorParameters { let mediaProvider: MediaProviderProtocol + let members: [RoomMemberProxy] } -enum RoomMembersCoordinatorAction { +enum RoomMemberDetailsCoordinatorAction { case cancel } -final class RoomMembersCoordinator: CoordinatorProtocol { - private let parameters: RoomMembersCoordinatorParameters - private var viewModel: RoomMembersViewModelProtocol +final class RoomMemberDetailsCoordinator: CoordinatorProtocol { + private var viewModel: RoomMemberDetailsViewModelProtocol - var callback: ((RoomMembersCoordinatorAction) -> Void)? + var callback: ((RoomMemberDetailsCoordinatorAction) -> Void)? - init(parameters: RoomMembersCoordinatorParameters) { - self.parameters = parameters - - viewModel = RoomMembersViewModel(roomProxy: parameters.roomProxy, - mediaProvider: parameters.mediaProvider) + init(parameters: RoomMemberDetailsCoordinatorParameters) { + viewModel = RoomMemberDetailsViewModel(mediaProvider: parameters.mediaProvider, + members: parameters.members) } func start() { viewModel.callback = { [weak self] action in guard let self else { return } - MXLog.debug("RoomMembersViewModel did complete with result: \(action).") + MXLog.debug("RoomMemberDetailsViewModel did complete with result: \(action).") switch action { case .cancel: self.callback?(.cancel) @@ -50,6 +47,6 @@ final class RoomMembersCoordinator: CoordinatorProtocol { } func toPresentable() -> AnyView { - AnyView(RoomMembersScreen(context: viewModel.context)) + AnyView(RoomMemberDetailsScreen(context: viewModel.context)) } } diff --git a/ElementX/Sources/Screens/RoomMembers/RoomMembersModels.swift b/ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsModels.swift similarity index 84% rename from ElementX/Sources/Screens/RoomMembers/RoomMembersModels.swift rename to ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsModels.swift index 369e20331..ee96ded1a 100644 --- a/ElementX/Sources/Screens/RoomMembers/RoomMembersModels.swift +++ b/ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsModels.swift @@ -16,14 +16,14 @@ import Foundation -enum RoomMembersViewModelAction { +enum RoomMemberDetailsViewModelAction { case cancel } -struct RoomMembersViewState: BindableState { +struct RoomMemberDetailsViewState: BindableState { var members: [RoomDetailsMember] - var bindings: RoomMembersViewStateBindings + var bindings: RoomMemberDetailsViewStateBindings var visibleMembers: [RoomDetailsMember] { if bindings.searchQuery.isEmpty { @@ -37,14 +37,14 @@ struct RoomMembersViewState: BindableState { } } -struct RoomMembersViewStateBindings { +struct RoomMemberDetailsViewStateBindings { var searchQuery = "" /// Information describing the currently displayed alert. var alertInfo: AlertInfo? } -enum RoomMembersViewAction { +enum RoomMemberDetailsViewAction { case selectMember(id: String) case loadMemberData(id: String) } diff --git a/ElementX/Sources/Screens/RoomMembers/RoomMembersViewModel.swift b/ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsViewModel.swift similarity index 65% rename from ElementX/Sources/Screens/RoomMembers/RoomMembersViewModel.swift rename to ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsViewModel.swift index b59643762..fe5f40251 100644 --- a/ElementX/Sources/Screens/RoomMembers/RoomMembersViewModel.swift +++ b/ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsViewModel.swift @@ -16,35 +16,23 @@ import SwiftUI -typealias RoomMembersViewModelType = StateStoreViewModel +typealias RoomMemberDetailsViewModelType = StateStoreViewModel -class RoomMembersViewModel: RoomMembersViewModelType, RoomMembersViewModelProtocol { - private let roomProxy: RoomProxyProtocol +class RoomMemberDetailsViewModel: RoomMemberDetailsViewModelType, RoomMemberDetailsViewModelProtocol { private let mediaProvider: MediaProviderProtocol + + var callback: ((RoomMemberDetailsViewModelAction) -> Void)? - var callback: ((RoomMembersViewModelAction) -> Void)? - - init(roomProxy: RoomProxyProtocol, - mediaProvider: MediaProviderProtocol) { - self.roomProxy = roomProxy + init(mediaProvider: MediaProviderProtocol, + members: [RoomMemberProxy]) { self.mediaProvider = mediaProvider - super.init(initialViewState: .init(members: [], + super.init(initialViewState: .init(members: members.map { RoomDetailsMember(withProxy: $0) }, bindings: .init())) - - Task { - switch await roomProxy.members() { - case .success(let members): - state.members = members.map { RoomDetailsMember(withProxy: $0) } - case .failure(let error): - MXLog.debug("Failed to retrieve room members: \(error)") - state.bindings.alertInfo = AlertInfo(id: .alert(ElementL10n.unknownError)) - } - } } // MARK: - Public - override func process(viewAction: RoomMembersViewAction) async { + override func process(viewAction: RoomMemberDetailsViewAction) async { switch viewAction { case .selectMember(let id): MXLog.debug("Member selected: \(id)") diff --git a/ElementX/Sources/Screens/RoomMembers/RoomMembersViewModelProtocol.swift b/ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsViewModelProtocol.swift similarity index 77% rename from ElementX/Sources/Screens/RoomMembers/RoomMembersViewModelProtocol.swift rename to ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsViewModelProtocol.swift index 3743223b7..b7be98fdf 100644 --- a/ElementX/Sources/Screens/RoomMembers/RoomMembersViewModelProtocol.swift +++ b/ElementX/Sources/Screens/RoomMembers/RoomMemberDetailsViewModelProtocol.swift @@ -17,7 +17,7 @@ import Foundation @MainActor -protocol RoomMembersViewModelProtocol { - var callback: ((RoomMembersViewModelAction) -> Void)? { get set } - var context: RoomMembersViewModelType.Context { get } +protocol RoomMemberDetailsViewModelProtocol { + var callback: ((RoomMemberDetailsViewModelAction) -> Void)? { get set } + var context: RoomMemberDetailsViewModelType.Context { get } } diff --git a/ElementX/Sources/Screens/RoomMembers/View/RoomMembersMemberCell.swift b/ElementX/Sources/Screens/RoomMembers/View/RoomMemberDetailsMemberCell.swift similarity index 82% rename from ElementX/Sources/Screens/RoomMembers/View/RoomMembersMemberCell.swift rename to ElementX/Sources/Screens/RoomMembers/View/RoomMemberDetailsMemberCell.swift index 3c9355c3b..d8c426d15 100644 --- a/ElementX/Sources/Screens/RoomMembers/View/RoomMembersMemberCell.swift +++ b/ElementX/Sources/Screens/RoomMembers/View/RoomMemberDetailsMemberCell.swift @@ -16,11 +16,11 @@ import SwiftUI -struct RoomMembersMemberCell: View { +struct RoomMemberDetailsMemberCell: View { @ScaledMetric private var avatarSize = AvatarSize.user(on: .roomDetails).value let member: RoomDetailsMember - let context: RoomMembersViewModel.Context + let context: RoomMemberDetailsViewModel.Context var body: some View { Button { @@ -56,7 +56,7 @@ struct RoomMembersMemberCell: View { } } -struct RoomMembersMemberCell_Previews: PreviewProvider { +struct RoomMemberDetailsMemberCell_Previews: PreviewProvider { static var previews: some View { body.preferredColorScheme(.light) .tint(.element.accent) @@ -70,14 +70,12 @@ struct RoomMembersMemberCell_Previews: PreviewProvider { .mockBob, .mockCharlie ] - let roomProxy = MockRoomProxy(displayName: "Room A", - members: members) - let viewModel = RoomMembersViewModel(roomProxy: roomProxy, - mediaProvider: MockMediaProvider()) - + let viewModel = RoomMemberDetailsViewModel(mediaProvider: MockMediaProvider(), + members: members) + return VStack { ForEach(members) { member in - RoomMembersMemberCell(member: .init(withProxy: member), context: viewModel.context) + RoomMemberDetailsMemberCell(member: .init(withProxy: member), context: viewModel.context) } } } diff --git a/ElementX/Sources/Screens/RoomMembers/View/RoomMembersScreen.swift b/ElementX/Sources/Screens/RoomMembers/View/RoomMemberDetailsScreen.swift similarity index 55% rename from ElementX/Sources/Screens/RoomMembers/View/RoomMembersScreen.swift rename to ElementX/Sources/Screens/RoomMembers/View/RoomMemberDetailsScreen.swift index 4ba42d521..b9ee983e6 100644 --- a/ElementX/Sources/Screens/RoomMembers/View/RoomMembersScreen.swift +++ b/ElementX/Sources/Screens/RoomMembers/View/RoomMemberDetailsScreen.swift @@ -16,22 +16,25 @@ import SwiftUI -struct RoomMembersScreen: View { +struct RoomMemberDetailsScreen: View { @Environment(\.colorScheme) private var colorScheme - @ObservedObject var context: RoomMembersViewModel.Context + @ObservedObject var context: RoomMemberDetailsViewModel.Context var body: some View { - Form { - Section { - ForEach(context.viewState.visibleMembers) { member in - RoomMembersMemberCell(member: member, context: context) - .id(member.id) + ScrollView { + LazyVStack(alignment: .leading) { + Section { + ForEach(context.viewState.visibleMembers) { member in + RoomMemberDetailsMemberCell(member: member, context: context) + .id(member.id) + } + } footer: { + Text(ElementL10n.roomTitleMembers(context.viewState.members.count)) + .foregroundColor(.element.secondaryContent) + .font(.element.footnote) } - } footer: { - Text(ElementL10n.roomTitleMembers(context.viewState.members.count)) - .foregroundColor(.element.secondaryContent) - .font(.element.footnote) + .padding(.horizontal) } } .searchable(text: $context.searchQuery, placement: .navigationBarDrawer(displayMode: .always)) @@ -42,7 +45,7 @@ struct RoomMembersScreen: View { // MARK: - Previews -struct RoomMembers_Previews: PreviewProvider { +struct RoomMemberDetails_Previews: PreviewProvider { static var previews: some View { Group { let members: [RoomMemberProxy] = [ @@ -50,11 +53,9 @@ struct RoomMembers_Previews: PreviewProvider { .mockBob, .mockCharlie ] - let roomProxy = MockRoomProxy(displayName: "Room A", - members: members) - let viewModel = RoomMembersViewModel(roomProxy: roomProxy, - mediaProvider: MockMediaProvider()) - RoomMembersScreen(context: viewModel.context) + let viewModel = RoomMemberDetailsViewModel(mediaProvider: MockMediaProvider(), + members: members) + RoomMemberDetailsScreen(context: viewModel.context) } .tint(.element.accent) } diff --git a/ElementX/Sources/UITests/UITestScreenIdentifier.swift b/ElementX/Sources/UITests/UITestScreenIdentifier.swift index 9fedc51c4..7d9c83f2e 100644 --- a/ElementX/Sources/UITests/UITestScreenIdentifier.swift +++ b/ElementX/Sources/UITests/UITestScreenIdentifier.swift @@ -41,7 +41,7 @@ enum UITestScreenIdentifier: String { case sessionVerification case userSessionScreen case roomDetailsScreen - case roomMembersScreen + case roomMemberDetailsScreen } extension UITestScreenIdentifier: CustomStringConvertible { diff --git a/ElementX/Sources/UITests/UITestsAppCoordinator.swift b/ElementX/Sources/UITests/UITestsAppCoordinator.swift index a6d49aec6..953e476f1 100644 --- a/ElementX/Sources/UITests/UITestsAppCoordinator.swift +++ b/ElementX/Sources/UITests/UITestsAppCoordinator.swift @@ -279,11 +279,10 @@ class MockScreen: Identifiable { mediaProvider: MockMediaProvider())) navigationStackCoordinator.setRootCoordinator(coordinator) return navigationStackCoordinator - case .roomMembersScreen: + case .roomMemberDetailsScreen: let navigationStackCoordinator = NavigationStackCoordinator() - let coordinator = RoomMembersCoordinator(parameters: .init(roomProxy: MockRoomProxy(displayName: "Room", - members: [.mockAlice, .mockBob, .mockCharlie]), - mediaProvider: MockMediaProvider())) + let coordinator = RoomMemberDetailsCoordinator(parameters: .init(mediaProvider: MockMediaProvider(), + members: [.mockAlice, .mockBob, .mockCharlie])) navigationStackCoordinator.setRootCoordinator(coordinator) return navigationStackCoordinator } diff --git a/UITests/Sources/RoomMembersScreenUITests.swift b/UITests/Sources/RoomMemberDetailsScreenUITests.swift similarity index 81% rename from UITests/Sources/RoomMembersScreenUITests.swift rename to UITests/Sources/RoomMemberDetailsScreenUITests.swift index 2ee99866e..1d1c29959 100644 --- a/UITests/Sources/RoomMembersScreenUITests.swift +++ b/UITests/Sources/RoomMemberDetailsScreenUITests.swift @@ -17,11 +17,11 @@ import ElementX import XCTest -class RoomMembersScreenUITests: XCTestCase { +class RoomMemberDetailsScreenUITests: XCTestCase { func testInitialStateComponents() { let app = Application.launch() - app.goToScreenWithIdentifier(.roomMembersScreen) + app.goToScreenWithIdentifier(.roomMemberDetailsScreen) - app.assertScreenshot(.roomMembersScreen) + app.assertScreenshot(.roomMemberDetailsScreen) } } diff --git a/UnitTests/Sources/RoomMembersViewModelTests.swift b/UnitTests/Sources/RoomMemberDetailsViewModelTests.swift similarity index 91% rename from UnitTests/Sources/RoomMembersViewModelTests.swift rename to UnitTests/Sources/RoomMemberDetailsViewModelTests.swift index 686e80959..a68deec95 100644 --- a/UnitTests/Sources/RoomMembersViewModelTests.swift +++ b/UnitTests/Sources/RoomMemberDetailsViewModelTests.swift @@ -19,4 +19,4 @@ import XCTest @testable import ElementX @MainActor -class RoomMembersScreenViewModelTests: XCTestCase { } +class RoomMemberDetailsScreenViewModelTests: XCTestCase { } diff --git a/changelog.d/421.bugfix b/changelog.d/421.bugfix new file mode 100644 index 000000000..206e1cde5 --- /dev/null +++ b/changelog.d/421.bugfix @@ -0,0 +1 @@ +Fix room member details screen performance \ No newline at end of file