Remove the protocol for SpaceServiceRoom given its a struct type. (#5000)

* Remove the protocol for SpaceServiceRoom given its a struct type.

* Fix a few missed mocks in the unit tests.
This commit is contained in:
Doug
2026-01-26 09:45:46 +00:00
committed by GitHub
parent 3b231339cd
commit 06f37dacae
46 changed files with 459 additions and 545 deletions
+40 -31
View File
@@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 63; objectVersion = 77;
objects = { objects = {
/* Begin PBXAggregateTarget section */ /* Begin PBXAggregateTarget section */
@@ -835,7 +835,6 @@
90733645AE76FB33DAD28C2B /* URLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE40D4A5DD857AC16EED945A /* URLSession.swift */; }; 90733645AE76FB33DAD28C2B /* URLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE40D4A5DD857AC16EED945A /* URLSession.swift */; };
90DF83A6A347F7EE7EDE89EE /* AttributedStringBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF25E364AE85090A70AE4644 /* AttributedStringBuilderTests.swift */; }; 90DF83A6A347F7EE7EDE89EE /* AttributedStringBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF25E364AE85090A70AE4644 /* AttributedStringBuilderTests.swift */; };
90EB25D13AE6EEF034BDE9D2 /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71D52BAA5BADB06E5E8C295D /* Assets.swift */; }; 90EB25D13AE6EEF034BDE9D2 /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71D52BAA5BADB06E5E8C295D /* Assets.swift */; };
913BCABB99796F82E3D8D93D /* SpaceRoomInfoMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5530D3541C8832D858EB755A /* SpaceRoomInfoMock.swift */; };
914BDF61447C723F104BCE33 /* SessionDirectories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C2067FF58B4996323EB40C /* SessionDirectories.swift */; }; 914BDF61447C723F104BCE33 /* SessionDirectories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C2067FF58B4996323EB40C /* SessionDirectories.swift */; };
915B4CDAF220D9AEB4047D45 /* PollInteractionHandlerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259E5B05BDE6E20C26CF11B4 /* PollInteractionHandlerProtocol.swift */; }; 915B4CDAF220D9AEB4047D45 /* PollInteractionHandlerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259E5B05BDE6E20C26CF11B4 /* PollInteractionHandlerProtocol.swift */; };
91ABC91758A6E4A5FAA2E9C4 /* ReadReceipt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 314F1C79850BE46E8ABEAFCB /* ReadReceipt.swift */; }; 91ABC91758A6E4A5FAA2E9C4 /* ReadReceipt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 314F1C79850BE46E8ABEAFCB /* ReadReceipt.swift */; };
@@ -1401,7 +1400,6 @@
F4996C82A4B3A5FF0C8EDD03 /* RoomListFilterModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = E06AAD6D9D3F5833E7A5A2F9 /* RoomListFilterModels.swift */; }; F4996C82A4B3A5FF0C8EDD03 /* RoomListFilterModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = E06AAD6D9D3F5833E7A5A2F9 /* RoomListFilterModels.swift */; };
F4C005F006FC3657B9F0A31D /* BugReportHook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25586C0ADB814FEE9897DCAA /* BugReportHook.swift */; }; F4C005F006FC3657B9F0A31D /* BugReportHook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25586C0ADB814FEE9897DCAA /* BugReportHook.swift */; };
F4D5A2A8304ED61621BF02D4 /* test_audio.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 66B96842BF5F8ACA1AC84C55 /* test_audio.mp3 */; }; F4D5A2A8304ED61621BF02D4 /* test_audio.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 66B96842BF5F8ACA1AC84C55 /* test_audio.mp3 */; };
F4F29FF972C0C8B38757B2DD /* SpaceServiceRoomProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5416FE342A1E6A1B6D028999 /* SpaceServiceRoomProtocol.swift */; };
F519DE17A3A0F760307B2E6D /* InviteUsersScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D155E09BF961BBA8F85263 /* InviteUsersScreenViewModel.swift */; }; F519DE17A3A0F760307B2E6D /* InviteUsersScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D155E09BF961BBA8F85263 /* InviteUsersScreenViewModel.swift */; };
F54E2D6CAD96E1AC15BC526F /* MessageForwardingScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8E60332509665C00179ACF6 /* MessageForwardingScreenViewModel.swift */; }; F54E2D6CAD96E1AC15BC526F /* MessageForwardingScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8E60332509665C00179ACF6 /* MessageForwardingScreenViewModel.swift */; };
F5D2270B5021D521C0D22E11 /* FlowCoordinatorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B9FCA1CFD07B8CF9BD21266 /* FlowCoordinatorProtocol.swift */; }; F5D2270B5021D521C0D22E11 /* FlowCoordinatorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B9FCA1CFD07B8CF9BD21266 /* FlowCoordinatorProtocol.swift */; };
@@ -1580,7 +1578,7 @@
044E501B8331B339874D1B96 /* CompoundIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompoundIcon.swift; sourceTree = "<group>"; }; 044E501B8331B339874D1B96 /* CompoundIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompoundIcon.swift; sourceTree = "<group>"; };
045253F9967A535EE5B16691 /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = "<group>"; }; 045253F9967A535EE5B16691 /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = "<group>"; };
046C0D3F53B0B5EF0A1F5BEA /* RoomSummaryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSummaryTests.swift; sourceTree = "<group>"; }; 046C0D3F53B0B5EF0A1F5BEA /* RoomSummaryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSummaryTests.swift; sourceTree = "<group>"; };
048A21188AB19349D026BECD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; 048A21188AB19349D026BECD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
04BB8DDE245ED86C489BA983 /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityIdentifiers.swift; sourceTree = "<group>"; }; 04BB8DDE245ED86C489BA983 /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityIdentifiers.swift; sourceTree = "<group>"; };
04DF593C3F7AF4B2FBAEB05D /* FileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileManager.swift; sourceTree = "<group>"; }; 04DF593C3F7AF4B2FBAEB05D /* FileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileManager.swift; sourceTree = "<group>"; };
0516C69708D5CBDE1A8E77EC /* RoomDirectorySearchProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDirectorySearchProxyProtocol.swift; sourceTree = "<group>"; }; 0516C69708D5CBDE1A8E77EC /* RoomDirectorySearchProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDirectorySearchProxyProtocol.swift; sourceTree = "<group>"; };
@@ -1664,7 +1662,7 @@
128501375217576AF0FE3E92 /* RoomAttachmentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomAttachmentPicker.swift; sourceTree = "<group>"; }; 128501375217576AF0FE3E92 /* RoomAttachmentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomAttachmentPicker.swift; sourceTree = "<group>"; };
12B09A94C519227264A41208 /* RoomMembershipDetailsProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembershipDetailsProxy.swift; sourceTree = "<group>"; }; 12B09A94C519227264A41208 /* RoomMembershipDetailsProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembershipDetailsProxy.swift; sourceTree = "<group>"; };
12FD5280AF55AB7F50F8E47D /* preview_avatar_room.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = preview_avatar_room.jpg; sourceTree = "<group>"; }; 12FD5280AF55AB7F50F8E47D /* preview_avatar_room.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = preview_avatar_room.jpg; sourceTree = "<group>"; };
1304D9191300873EADA52D6E /* IntegrationTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = IntegrationTests.xctestplan; sourceTree = "<group>"; }; 1304D9191300873EADA52D6E /* IntegrationTests.xctestplan */ = {isa = PBXFileReference; path = IntegrationTests.xctestplan; sourceTree = "<group>"; };
130ED565A078F7E0B59D9D25 /* UNTextInputNotificationResponse+Creator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNTextInputNotificationResponse+Creator.swift"; sourceTree = "<group>"; }; 130ED565A078F7E0B59D9D25 /* UNTextInputNotificationResponse+Creator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNTextInputNotificationResponse+Creator.swift"; sourceTree = "<group>"; };
136F80A613B55BDD071DCEA5 /* JoinRoomScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreenModels.swift; sourceTree = "<group>"; }; 136F80A613B55BDD071DCEA5 /* JoinRoomScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreenModels.swift; sourceTree = "<group>"; };
13802897C7AFA360EA74C0B0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; 13802897C7AFA360EA74C0B0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
@@ -1685,7 +1683,7 @@
16D09C79746BDCD9173EB3A7 /* RoomDetailsEditScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDetailsEditScreenModels.swift; sourceTree = "<group>"; }; 16D09C79746BDCD9173EB3A7 /* RoomDetailsEditScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDetailsEditScreenModels.swift; sourceTree = "<group>"; };
16D353E10A64172D863769BF /* TombstonedAvatarImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TombstonedAvatarImage.swift; sourceTree = "<group>"; }; 16D353E10A64172D863769BF /* TombstonedAvatarImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TombstonedAvatarImage.swift; sourceTree = "<group>"; };
1715E3D7F53C0748AA50C91C /* PostHogAnalyticsClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogAnalyticsClient.swift; sourceTree = "<group>"; }; 1715E3D7F53C0748AA50C91C /* PostHogAnalyticsClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogAnalyticsClient.swift; sourceTree = "<group>"; };
174E4AEF3DED300AA81046EC /* compound-ios */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "compound-ios"; sourceTree = SOURCE_ROOT; }; 174E4AEF3DED300AA81046EC /* compound-ios */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "compound-ios"; path = "compound-ios"; sourceTree = SOURCE_ROOT; };
17A8AA0DFA06012A9DAB951E /* TimelineProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineProxyMock.swift; sourceTree = "<group>"; }; 17A8AA0DFA06012A9DAB951E /* TimelineProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineProxyMock.swift; sourceTree = "<group>"; };
17BAE25A0E9E9F2F1BBA8930 /* DeactivateAccountScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeactivateAccountScreenViewModel.swift; sourceTree = "<group>"; }; 17BAE25A0E9E9F2F1BBA8930 /* DeactivateAccountScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeactivateAccountScreenViewModel.swift; sourceTree = "<group>"; };
181CF280BC8E3F335AFCB4B8 /* RemotePreferenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemotePreferenceTests.swift; sourceTree = "<group>"; }; 181CF280BC8E3F335AFCB4B8 /* RemotePreferenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemotePreferenceTests.swift; sourceTree = "<group>"; };
@@ -1776,7 +1774,7 @@
25E7E9B7FEAB6169D960C206 /* QRCodeLoginScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeLoginScreenViewModelTests.swift; sourceTree = "<group>"; }; 25E7E9B7FEAB6169D960C206 /* QRCodeLoginScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeLoginScreenViewModelTests.swift; sourceTree = "<group>"; };
25F8664F1FB95AF3C4202478 /* PollFormScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollFormScreenCoordinator.swift; sourceTree = "<group>"; }; 25F8664F1FB95AF3C4202478 /* PollFormScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollFormScreenCoordinator.swift; sourceTree = "<group>"; };
260004737C573A56FA01E86E /* Encodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Encodable.swift; sourceTree = "<group>"; }; 260004737C573A56FA01E86E /* Encodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Encodable.swift; sourceTree = "<group>"; };
267BB1D5B08A9511F894CB57 /* PreviewTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = PreviewTests.xctestplan; sourceTree = "<group>"; }; 267BB1D5B08A9511F894CB57 /* PreviewTests.xctestplan */ = {isa = PBXFileReference; path = PreviewTests.xctestplan; sourceTree = "<group>"; };
26B0A96B8FE4849227945067 /* VoiceMessageRecorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMessageRecorder.swift; sourceTree = "<group>"; }; 26B0A96B8FE4849227945067 /* VoiceMessageRecorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMessageRecorder.swift; sourceTree = "<group>"; };
26EAAB54C6CE91D64B69A9F8 /* AppLockServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockServiceProtocol.swift; sourceTree = "<group>"; }; 26EAAB54C6CE91D64B69A9F8 /* AppLockServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockServiceProtocol.swift; sourceTree = "<group>"; };
2711E5996016ABD6EAAEB58A /* LogLevel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogLevel.swift; sourceTree = "<group>"; }; 2711E5996016ABD6EAAEB58A /* LogLevel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogLevel.swift; sourceTree = "<group>"; };
@@ -1859,7 +1857,7 @@
358528B29FA72ACFD0D9644B /* SpacesScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpacesScreenCoordinator.swift; sourceTree = "<group>"; }; 358528B29FA72ACFD0D9644B /* SpacesScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpacesScreenCoordinator.swift; sourceTree = "<group>"; };
35A057BA9BE0F079784CD061 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; 35A057BA9BE0F079784CD061 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
35AFCF4C05DEED04E3DB1A16 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; }; 35AFCF4C05DEED04E3DB1A16 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
36DA824791172B9821EACBED /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; 36DA824791172B9821EACBED /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
36FD673E24FBFCFDF398716A /* RoomMemberProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberProxyMock.swift; sourceTree = "<group>"; }; 36FD673E24FBFCFDF398716A /* RoomMemberProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberProxyMock.swift; sourceTree = "<group>"; };
3747C96188856006F784BF49 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ko; path = ko.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; 3747C96188856006F784BF49 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ko; path = ko.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
37A63A59BFDDC494B1C20119 /* CallScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallScreenViewModel.swift; sourceTree = "<group>"; }; 37A63A59BFDDC494B1C20119 /* CallScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallScreenViewModel.swift; sourceTree = "<group>"; };
@@ -1978,7 +1976,7 @@
4A2B5274C1D3D2999D643786 /* EncryptionResetPasswordScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptionResetPasswordScreenViewModelProtocol.swift; sourceTree = "<group>"; }; 4A2B5274C1D3D2999D643786 /* EncryptionResetPasswordScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptionResetPasswordScreenViewModelProtocol.swift; sourceTree = "<group>"; };
4A5B4CD611DE7E94F5BA87B2 /* AppLockTimerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockTimerTests.swift; sourceTree = "<group>"; }; 4A5B4CD611DE7E94F5BA87B2 /* AppLockTimerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockTimerTests.swift; sourceTree = "<group>"; };
4AB29A2D95D3469B5F016655 /* SecureBackupControllerMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupControllerMock.swift; sourceTree = "<group>"; }; 4AB29A2D95D3469B5F016655 /* SecureBackupControllerMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupControllerMock.swift; sourceTree = "<group>"; };
4B1F71AC585827E6C416C15A /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = "<group>"; }; 4B1F71AC585827E6C416C15A /* AppIcon.icon */ = {isa = PBXFileReference; path = AppIcon.icon; sourceTree = "<group>"; };
4B2B564CA6570E1487A7C7CC /* SpaceRoomListProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceRoomListProxy.swift; sourceTree = "<group>"; }; 4B2B564CA6570E1487A7C7CC /* SpaceRoomListProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceRoomListProxy.swift; sourceTree = "<group>"; };
4B2D4EEBE8C098BBADD10939 /* SecureBackupKeyBackupScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupKeyBackupScreenCoordinator.swift; sourceTree = "<group>"; }; 4B2D4EEBE8C098BBADD10939 /* SecureBackupKeyBackupScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupKeyBackupScreenCoordinator.swift; sourceTree = "<group>"; };
4B41FABA2B0AEF4389986495 /* LoginMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginMode.swift; sourceTree = "<group>"; }; 4B41FABA2B0AEF4389986495 /* LoginMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginMode.swift; sourceTree = "<group>"; };
@@ -2021,14 +2019,12 @@
536E72DCBEEC4A1FE66CFDCE /* target.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = target.yml; sourceTree = "<group>"; }; 536E72DCBEEC4A1FE66CFDCE /* target.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = target.yml; sourceTree = "<group>"; };
53F41CEAAE2BB4E74CDC2278 /* TimelineMediaPreviewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineMediaPreviewViewModel.swift; sourceTree = "<group>"; }; 53F41CEAAE2BB4E74CDC2278 /* TimelineMediaPreviewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineMediaPreviewViewModel.swift; sourceTree = "<group>"; };
53FD6D3D38F556CEAA280C58 /* test_animated_image.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = test_animated_image.gif; sourceTree = "<group>"; }; 53FD6D3D38F556CEAA280C58 /* test_animated_image.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = test_animated_image.gif; sourceTree = "<group>"; };
5416FE342A1E6A1B6D028999 /* SpaceServiceRoomProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceServiceRoomProtocol.swift; sourceTree = "<group>"; };
5445FCE0CE15E634FDC1A2E2 /* AnalyticsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsService.swift; sourceTree = "<group>"; }; 5445FCE0CE15E634FDC1A2E2 /* AnalyticsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsService.swift; sourceTree = "<group>"; };
5484457C81B325660901B161 /* AppLockSetupSettingsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupSettingsScreen.swift; sourceTree = "<group>"; }; 5484457C81B325660901B161 /* AppLockSetupSettingsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupSettingsScreen.swift; sourceTree = "<group>"; };
54A5E6F398C269AD52C9AE21 /* EncryptionResetPasswordScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptionResetPasswordScreenModels.swift; sourceTree = "<group>"; }; 54A5E6F398C269AD52C9AE21 /* EncryptionResetPasswordScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptionResetPasswordScreenModels.swift; sourceTree = "<group>"; };
54A7923F0115CF17ABC8047F /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/SAS.strings; sourceTree = "<group>"; }; 54A7923F0115CF17ABC8047F /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/SAS.strings; sourceTree = "<group>"; };
54AD70D6E03D2031AE1B5A52 /* TimelineReactionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineReactionsView.swift; sourceTree = "<group>"; }; 54AD70D6E03D2031AE1B5A52 /* TimelineReactionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineReactionsView.swift; sourceTree = "<group>"; };
54C4E7B46099462F12000C91 /* DeveloperOptionsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperOptionsScreenViewModelProtocol.swift; sourceTree = "<group>"; }; 54C4E7B46099462F12000C91 /* DeveloperOptionsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperOptionsScreenViewModelProtocol.swift; sourceTree = "<group>"; };
5530D3541C8832D858EB755A /* SpaceRoomInfoMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceRoomInfoMock.swift; sourceTree = "<group>"; };
5557DDA438841AF5DC003D0B /* SpaceListScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceListScreenViewModelTests.swift; sourceTree = "<group>"; }; 5557DDA438841AF5DC003D0B /* SpaceListScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceListScreenViewModelTests.swift; sourceTree = "<group>"; };
55AEEF8142DF1B59DB40FB93 /* TimelineItemSender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineItemSender.swift; sourceTree = "<group>"; }; 55AEEF8142DF1B59DB40FB93 /* TimelineItemSender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineItemSender.swift; sourceTree = "<group>"; };
5644919DB2022397D9D5825A /* MockSoftLogoutScreenState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSoftLogoutScreenState.swift; sourceTree = "<group>"; }; 5644919DB2022397D9D5825A /* MockSoftLogoutScreenState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSoftLogoutScreenState.swift; sourceTree = "<group>"; };
@@ -2327,7 +2323,7 @@
8D55702474F279D910D2D162 /* RoomStateEventStringBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomStateEventStringBuilder.swift; sourceTree = "<group>"; }; 8D55702474F279D910D2D162 /* RoomStateEventStringBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomStateEventStringBuilder.swift; sourceTree = "<group>"; };
8D8169443E5AC5FF71BFB3DB /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = "<group>"; }; 8D8169443E5AC5FF71BFB3DB /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = "<group>"; };
8DA1E8F287680C8ED25EDBAC /* NetworkMonitorMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitorMock.swift; sourceTree = "<group>"; }; 8DA1E8F287680C8ED25EDBAC /* NetworkMonitorMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitorMock.swift; sourceTree = "<group>"; };
8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = UITests.xctestplan; sourceTree = "<group>"; }; 8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; path = UITests.xctestplan; sourceTree = "<group>"; };
8E1584F8BCF407BB94F48F04 /* EncryptionResetPasswordScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptionResetPasswordScreen.swift; sourceTree = "<group>"; }; 8E1584F8BCF407BB94F48F04 /* EncryptionResetPasswordScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptionResetPasswordScreen.swift; sourceTree = "<group>"; };
8EAF4A49F3ACD8BB8B0D2371 /* ClientSDKMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientSDKMock.swift; sourceTree = "<group>"; }; 8EAF4A49F3ACD8BB8B0D2371 /* ClientSDKMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientSDKMock.swift; sourceTree = "<group>"; };
8F062DD2CCD95DC33528A16F /* KnockRequestProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KnockRequestProxy.swift; sourceTree = "<group>"; }; 8F062DD2CCD95DC33528A16F /* KnockRequestProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KnockRequestProxy.swift; sourceTree = "<group>"; };
@@ -2478,7 +2474,7 @@
AAD8234D0E9C9B12BF9F240B /* LocationAnnotation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationAnnotation.swift; sourceTree = "<group>"; }; AAD8234D0E9C9B12BF9F240B /* LocationAnnotation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationAnnotation.swift; sourceTree = "<group>"; };
AB07F03461023BC39C730922 /* PhishingDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhishingDetector.swift; sourceTree = "<group>"; }; AB07F03461023BC39C730922 /* PhishingDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhishingDetector.swift; sourceTree = "<group>"; };
AB26D5444A4A7E095222DE8B /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.stringsdict"; sourceTree = "<group>"; }; AB26D5444A4A7E095222DE8B /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
AB389C38BD41EB3E47092CFB /* AccessibilityTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = AccessibilityTests.xctestplan; sourceTree = "<group>"; }; AB389C38BD41EB3E47092CFB /* AccessibilityTests.xctestplan */ = {isa = PBXFileReference; path = AccessibilityTests.xctestplan; sourceTree = "<group>"; };
ABA4CF2F5B4F68D02E412004 /* ServerConfirmationScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerConfirmationScreenViewModelProtocol.swift; sourceTree = "<group>"; }; ABA4CF2F5B4F68D02E412004 /* ServerConfirmationScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerConfirmationScreenViewModelProtocol.swift; sourceTree = "<group>"; };
AC0275CEE9CA078B34028BDF /* AppLockScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockScreenViewModelTests.swift; sourceTree = "<group>"; }; AC0275CEE9CA078B34028BDF /* AppLockScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockScreenViewModelTests.swift; sourceTree = "<group>"; };
AC1DA29A5A041CC0BACA7CB0 /* MockImageCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockImageCache.swift; sourceTree = "<group>"; }; AC1DA29A5A041CC0BACA7CB0 /* MockImageCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockImageCache.swift; sourceTree = "<group>"; };
@@ -2546,7 +2542,7 @@
B53AC78E49A297AC1D72A7CF /* AppMediator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppMediator.swift; sourceTree = "<group>"; }; B53AC78E49A297AC1D72A7CF /* AppMediator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppMediator.swift; sourceTree = "<group>"; };
B590BD4507D4F0A377FDE01A /* LoadableAvatarImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadableAvatarImage.swift; sourceTree = "<group>"; }; B590BD4507D4F0A377FDE01A /* LoadableAvatarImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadableAvatarImage.swift; sourceTree = "<group>"; };
B5D829FD8958376614504B18 /* TargetConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TargetConfiguration.swift; sourceTree = "<group>"; }; B5D829FD8958376614504B18 /* TargetConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TargetConfiguration.swift; sourceTree = "<group>"; };
B61C339A2FDDBD067FF6635C /* ConfettiScene.scn */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = ConfettiScene.scn; sourceTree = "<group>"; }; B61C339A2FDDBD067FF6635C /* ConfettiScene.scn */ = {isa = PBXFileReference; path = ConfettiScene.scn; sourceTree = "<group>"; };
B6404166CBF5CC88673FF9E2 /* RoomDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDetails.swift; sourceTree = "<group>"; }; B6404166CBF5CC88673FF9E2 /* RoomDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDetails.swift; sourceTree = "<group>"; };
B65DDCF8E41759890355ACBC /* AuthenticationStartScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationStartScreenViewModelProtocol.swift; sourceTree = "<group>"; }; B65DDCF8E41759890355ACBC /* AuthenticationStartScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationStartScreenViewModelProtocol.swift; sourceTree = "<group>"; };
B682FE2C44C5E163E7023B05 /* CopyTextButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyTextButton.swift; sourceTree = "<group>"; }; B682FE2C44C5E163E7023B05 /* CopyTextButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyTextButton.swift; sourceTree = "<group>"; };
@@ -2578,7 +2574,7 @@
BA40B98B098B6F0371B750B3 /* TemplateScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateScreenModels.swift; sourceTree = "<group>"; }; BA40B98B098B6F0371B750B3 /* TemplateScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateScreenModels.swift; sourceTree = "<group>"; };
BA919F521E9F0EE3638AFC85 /* BugReportScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BugReportScreen.swift; sourceTree = "<group>"; }; BA919F521E9F0EE3638AFC85 /* BugReportScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BugReportScreen.swift; sourceTree = "<group>"; };
BB284643AF7AB131E307DCE0 /* AudioSessionProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioSessionProtocol.swift; sourceTree = "<group>"; }; BB284643AF7AB131E307DCE0 /* AudioSessionProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioSessionProtocol.swift; sourceTree = "<group>"; };
BB576F4118C35E6B5124FA22 /* test_apple_image.heic */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_apple_image.heic; sourceTree = "<group>"; }; BB576F4118C35E6B5124FA22 /* test_apple_image.heic */ = {isa = PBXFileReference; path = test_apple_image.heic; sourceTree = "<group>"; };
BB5B00A014307CE37B2812CD /* TimelineViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineViewModelProtocol.swift; sourceTree = "<group>"; }; BB5B00A014307CE37B2812CD /* TimelineViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineViewModelProtocol.swift; sourceTree = "<group>"; };
BB6ED50FE104992419310EEB /* NotificationHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationHandler.swift; sourceTree = "<group>"; }; BB6ED50FE104992419310EEB /* NotificationHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationHandler.swift; sourceTree = "<group>"; };
BB8BC4C791D0E88CFCF4E5DF /* ServerSelectionScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerSelectionScreenCoordinator.swift; sourceTree = "<group>"; }; BB8BC4C791D0E88CFCF4E5DF /* ServerSelectionScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerSelectionScreenCoordinator.swift; sourceTree = "<group>"; };
@@ -2684,7 +2680,7 @@
CDB3227C7A74B734924942E9 /* RoomSummaryProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSummaryProvider.swift; sourceTree = "<group>"; }; CDB3227C7A74B734924942E9 /* RoomSummaryProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSummaryProvider.swift; sourceTree = "<group>"; };
CDE3F3911FF7CC639BDE5844 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = "<group>"; }; CDE3F3911FF7CC639BDE5844 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = "<group>"; };
CEE20623EB4A9B88FB29F2BA /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SAS.strings; sourceTree = "<group>"; }; CEE20623EB4A9B88FB29F2BA /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SAS.strings; sourceTree = "<group>"; };
CEE41494C837AA403A06A5D9 /* UnitTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = UnitTests.xctestplan; sourceTree = "<group>"; }; CEE41494C837AA403A06A5D9 /* UnitTests.xctestplan */ = {isa = PBXFileReference; path = UnitTests.xctestplan; sourceTree = "<group>"; };
CF19027E7FFA5E63D148873A /* CreateRoomScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateRoomScreenViewModel.swift; sourceTree = "<group>"; }; CF19027E7FFA5E63D148873A /* CreateRoomScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateRoomScreenViewModel.swift; sourceTree = "<group>"; };
CF847A34FC4C8C937CD39E08 /* LabsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabsScreenViewModelProtocol.swift; sourceTree = "<group>"; }; CF847A34FC4C8C937CD39E08 /* LabsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabsScreenViewModelProtocol.swift; sourceTree = "<group>"; };
CFFA5E881D281810AB428EA3 /* RoomPowerLevelsProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomPowerLevelsProxy.swift; sourceTree = "<group>"; }; CFFA5E881D281810AB428EA3 /* RoomPowerLevelsProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomPowerLevelsProxy.swift; sourceTree = "<group>"; };
@@ -2753,7 +2749,7 @@
DC0AEA686E425F86F6BA0404 /* UNNotification+Creator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNNotification+Creator.swift"; sourceTree = "<group>"; }; DC0AEA686E425F86F6BA0404 /* UNNotification+Creator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNNotification+Creator.swift"; sourceTree = "<group>"; };
DC10CCC8D68B863E20660DBC /* MessageForwardingScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageForwardingScreenViewModelProtocol.swift; sourceTree = "<group>"; }; DC10CCC8D68B863E20660DBC /* MessageForwardingScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageForwardingScreenViewModelProtocol.swift; sourceTree = "<group>"; };
DC528B3764E3CF7FCFEF40E7 /* PollInteractionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollInteractionHandler.swift; sourceTree = "<group>"; }; DC528B3764E3CF7FCFEF40E7 /* PollInteractionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollInteractionHandler.swift; sourceTree = "<group>"; };
DCA2D836BD10303F37FAAEED /* test_voice_message.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_voice_message.m4a; sourceTree = "<group>"; }; DCA2D836BD10303F37FAAEED /* test_voice_message.m4a */ = {isa = PBXFileReference; path = test_voice_message.m4a; sourceTree = "<group>"; };
DCAC01A97A43BE07B9E94E43 /* ShareExtensionModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareExtensionModels.swift; sourceTree = "<group>"; }; DCAC01A97A43BE07B9E94E43 /* ShareExtensionModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareExtensionModels.swift; sourceTree = "<group>"; };
DCDAB580109C09A6AA97AF7E /* PollFormScreenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollFormScreenTests.swift; sourceTree = "<group>"; }; DCDAB580109C09A6AA97AF7E /* PollFormScreenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollFormScreenTests.swift; sourceTree = "<group>"; };
DCF239C619971FDE48132550 /* SecureBackupLogoutConfirmationScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupLogoutConfirmationScreenModels.swift; sourceTree = "<group>"; }; DCF239C619971FDE48132550 /* SecureBackupLogoutConfirmationScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupLogoutConfirmationScreenModels.swift; sourceTree = "<group>"; };
@@ -2799,7 +2795,7 @@
E5272BC4A60B6AD7553BACA1 /* BlurHashDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlurHashDecode.swift; sourceTree = "<group>"; }; E5272BC4A60B6AD7553BACA1 /* BlurHashDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlurHashDecode.swift; sourceTree = "<group>"; };
E53BFB7E4F329621C844E8C3 /* AnalyticsPromptScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsPromptScreen.swift; sourceTree = "<group>"; }; E53BFB7E4F329621C844E8C3 /* AnalyticsPromptScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsPromptScreen.swift; sourceTree = "<group>"; };
E55B5EA766E89FF1F87C3ACB /* RoomNotificationSettingsProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomNotificationSettingsProxyProtocol.swift; sourceTree = "<group>"; }; E55B5EA766E89FF1F87C3ACB /* RoomNotificationSettingsProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomNotificationSettingsProxyProtocol.swift; sourceTree = "<group>"; };
E5E7D4EE7CA295E5039FDA21 /* portrait_test_video.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = portrait_test_video.mp4; sourceTree = "<group>"; }; E5E7D4EE7CA295E5039FDA21 /* portrait_test_video.mp4 */ = {isa = PBXFileReference; path = portrait_test_video.mp4; sourceTree = "<group>"; };
E5E94DCFEE803E5ABAE8ACCE /* KeychainControllerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainControllerProtocol.swift; sourceTree = "<group>"; }; E5E94DCFEE803E5ABAE8ACCE /* KeychainControllerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainControllerProtocol.swift; sourceTree = "<group>"; };
E5F2B6443D1ED8602F328539 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ru; path = ru.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; E5F2B6443D1ED8602F328539 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ru; path = ru.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
E5FDFAA04174CC99FB66391C /* EditRoomAddressScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditRoomAddressScreenViewModel.swift; sourceTree = "<group>"; }; E5FDFAA04174CC99FB66391C /* EditRoomAddressScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditRoomAddressScreenViewModel.swift; sourceTree = "<group>"; };
@@ -2847,7 +2843,7 @@
ED0CBEAB5F796BEFBAF7BB6A /* VideoRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoRoomTimelineView.swift; sourceTree = "<group>"; }; ED0CBEAB5F796BEFBAF7BB6A /* VideoRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoRoomTimelineView.swift; sourceTree = "<group>"; };
ED1D792EB82506A19A72C8DE /* RoomTimelineItemProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTimelineItemProtocol.swift; sourceTree = "<group>"; }; ED1D792EB82506A19A72C8DE /* RoomTimelineItemProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTimelineItemProtocol.swift; sourceTree = "<group>"; };
ED33988DA4FD4FC666800106 /* SessionVerificationScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationScreenViewModel.swift; sourceTree = "<group>"; }; ED33988DA4FD4FC666800106 /* SessionVerificationScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationScreenViewModel.swift; sourceTree = "<group>"; };
ED482057AE39D5C6D9C5F3D8 /* message.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = message.caf; sourceTree = "<group>"; }; ED482057AE39D5C6D9C5F3D8 /* message.caf */ = {isa = PBXFileReference; path = message.caf; sourceTree = "<group>"; };
ED49073BB1C1FC649DAC2CCD /* LocationRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationRoomTimelineView.swift; sourceTree = "<group>"; }; ED49073BB1C1FC649DAC2CCD /* LocationRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationRoomTimelineView.swift; sourceTree = "<group>"; };
ED60E4D2CD678E1EBF16F77A /* BlockedUsersScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUsersScreen.swift; sourceTree = "<group>"; }; ED60E4D2CD678E1EBF16F77A /* BlockedUsersScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUsersScreen.swift; sourceTree = "<group>"; };
EDDE826EAB1BAB80C1104980 /* SpaceFlowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceFlowCoordinator.swift; sourceTree = "<group>"; }; EDDE826EAB1BAB80C1104980 /* SpaceFlowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceFlowCoordinator.swift; sourceTree = "<group>"; };
@@ -3674,7 +3670,6 @@
FC83F47D2173B7538AA72E0E /* RoomSummaryProviderMock.swift */, FC83F47D2173B7538AA72E0E /* RoomSummaryProviderMock.swift */,
4AB29A2D95D3469B5F016655 /* SecureBackupControllerMock.swift */, 4AB29A2D95D3469B5F016655 /* SecureBackupControllerMock.swift */,
248649EBA5BC33DB93698734 /* SessionVerificationControllerProxyMock.swift */, 248649EBA5BC33DB93698734 /* SessionVerificationControllerProxyMock.swift */,
5530D3541C8832D858EB755A /* SpaceRoomInfoMock.swift */,
7DB2A5FF1E68BA580A20D405 /* SpaceRoomListProxyMock.swift */, 7DB2A5FF1E68BA580A20D405 /* SpaceRoomListProxyMock.swift */,
EF36FC3DE25B20B7FA91F1FD /* SpaceServiceProxyMock.swift */, EF36FC3DE25B20B7FA91F1FD /* SpaceServiceProxyMock.swift */,
B0F5CC38803B8382D2C63222 /* TimelineControllerFactoryMock.swift */, B0F5CC38803B8382D2C63222 /* TimelineControllerFactoryMock.swift */,
@@ -5774,7 +5769,6 @@
226A56746AD99ABDA97189E1 /* SpaceServiceProxy.swift */, 226A56746AD99ABDA97189E1 /* SpaceServiceProxy.swift */,
C57DB49B8426AA721BF85D83 /* SpaceServiceProxyProtocol.swift */, C57DB49B8426AA721BF85D83 /* SpaceServiceProxyProtocol.swift */,
CCAA1B97A17A750AC706B112 /* SpaceServiceRoom.swift */, CCAA1B97A17A750AC706B112 /* SpaceServiceRoom.swift */,
5416FE342A1E6A1B6D028999 /* SpaceServiceRoomProtocol.swift */,
); );
path = Spaces; path = Spaces;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -7237,6 +7231,7 @@
EE40B0E16A55BD23ECBFFD22 /* XCRemoteSwiftPackageReference "matrix-rich-text-editor-swift" */, EE40B0E16A55BD23ECBFFD22 /* XCRemoteSwiftPackageReference "matrix-rich-text-editor-swift" */,
C89CF7729E028671C5DC461E /* XCLocalSwiftPackageReference "compound-ios" */, C89CF7729E028671C5DC461E /* XCLocalSwiftPackageReference "compound-ios" */,
); );
preferredProjectObjectVersion = 77;
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
targets = ( targets = (
@@ -8638,7 +8633,6 @@
E9B4742B3D6E103327466513 /* SpaceHeaderView.swift in Sources */, E9B4742B3D6E103327466513 /* SpaceHeaderView.swift in Sources */,
36DCA11EA7320A45A4CC8D07 /* SpaceRemoveChildrenConfirmationView.swift in Sources */, 36DCA11EA7320A45A4CC8D07 /* SpaceRemoveChildrenConfirmationView.swift in Sources */,
9B84F55288AB98783C11CC49 /* SpaceRoomCell.swift in Sources */, 9B84F55288AB98783C11CC49 /* SpaceRoomCell.swift in Sources */,
913BCABB99796F82E3D8D93D /* SpaceRoomInfoMock.swift in Sources */,
0DAB08C117E0391F3ADB2031 /* SpaceRoomListProxy.swift in Sources */, 0DAB08C117E0391F3ADB2031 /* SpaceRoomListProxy.swift in Sources */,
9FBF0078657CA4F2A9747E98 /* SpaceRoomListProxyMock.swift in Sources */, 9FBF0078657CA4F2A9747E98 /* SpaceRoomListProxyMock.swift in Sources */,
2EAA1B35D9CA24F090F48792 /* SpaceRoomListProxyProtocol.swift in Sources */, 2EAA1B35D9CA24F090F48792 /* SpaceRoomListProxyProtocol.swift in Sources */,
@@ -8651,7 +8645,6 @@
A2091F4B1332D9BF273B09D5 /* SpaceServiceProxyMock.swift in Sources */, A2091F4B1332D9BF273B09D5 /* SpaceServiceProxyMock.swift in Sources */,
DB5200B87C4CE9DF0024AC4E /* SpaceServiceProxyProtocol.swift in Sources */, DB5200B87C4CE9DF0024AC4E /* SpaceServiceProxyProtocol.swift in Sources */,
612196AF7826846A50C07FA6 /* SpaceServiceRoom.swift in Sources */, 612196AF7826846A50C07FA6 /* SpaceServiceRoom.swift in Sources */,
F4F29FF972C0C8B38757B2DD /* SpaceServiceRoomProtocol.swift in Sources */,
D0E257557DAC8A34C7B52A9F /* SpaceSettingsFlowCoordinator.swift in Sources */, D0E257557DAC8A34C7B52A9F /* SpaceSettingsFlowCoordinator.swift in Sources */,
383063A7924F06D54BA9B24C /* SpaceSettingsScreen.swift in Sources */, 383063A7924F06D54BA9B24C /* SpaceSettingsScreen.swift in Sources */,
0EC0AF8287D6E698969FC25B /* SpacesAnnouncementSheetView.swift in Sources */, 0EC0AF8287D6E698969FC25B /* SpacesAnnouncementSheetView.swift in Sources */,
@@ -9150,7 +9143,9 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@loader_path/Frameworks", "@loader_path/Frameworks",
); );
OTHER_SWIFT_FLAGS = "-DRELEASE"; OTHER_SWIFT_FLAGS = (
"-DRELEASE",
);
PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.accessibility.tests"; PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.accessibility.tests";
PRODUCT_NAME = AccessibilityTests; PRODUCT_NAME = AccessibilityTests;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -9169,7 +9164,9 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@loader_path/Frameworks", "@loader_path/Frameworks",
); );
OTHER_SWIFT_FLAGS = "-DDEBUG"; OTHER_SWIFT_FLAGS = (
"-DDEBUG",
);
PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.accessibility.tests"; PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.accessibility.tests";
PRODUCT_NAME = AccessibilityTests; PRODUCT_NAME = AccessibilityTests;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -9191,7 +9188,9 @@
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = "$(MARKETING_VERSION)"; MARKETING_VERSION = "$(MARKETING_VERSION)";
OTHER_SWIFT_FLAGS = "-DIS_NSE"; OTHER_SWIFT_FLAGS = (
"-DIS_NSE",
);
PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.nse"; PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.nse";
PRODUCT_DISPLAY_NAME = "$(APP_DISPLAY_NAME)"; PRODUCT_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
PRODUCT_NAME = NSE; PRODUCT_NAME = NSE;
@@ -9258,7 +9257,9 @@
"$(inherited)", "$(inherited)",
"-ObjC", "-ObjC",
); );
OTHER_SWIFT_FLAGS = "-DIS_MAIN_APP"; OTHER_SWIFT_FLAGS = (
"-DIS_MAIN_APP",
);
PILLS_UT_TYPE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER).pills"; PILLS_UT_TYPE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER).pills";
PRODUCT_BUNDLE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER)"; PRODUCT_BUNDLE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(APP_NAME)"; PRODUCT_NAME = "$(APP_NAME)";
@@ -9288,7 +9289,9 @@
"$(inherited)", "$(inherited)",
"-ObjC", "-ObjC",
); );
OTHER_SWIFT_FLAGS = "-DIS_MAIN_APP"; OTHER_SWIFT_FLAGS = (
"-DIS_MAIN_APP",
);
PILLS_UT_TYPE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER).pills"; PILLS_UT_TYPE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER).pills";
PRODUCT_BUNDLE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER)"; PRODUCT_BUNDLE_IDENTIFIER = "$(BASE_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(APP_NAME)"; PRODUCT_NAME = "$(APP_NAME)";
@@ -9513,7 +9516,9 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@loader_path/Frameworks", "@loader_path/Frameworks",
); );
OTHER_SWIFT_FLAGS = "-DDEBUG"; OTHER_SWIFT_FLAGS = (
"-DDEBUG",
);
PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.ui.tests"; PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.ui.tests";
PRODUCT_NAME = UITests; PRODUCT_NAME = UITests;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -9532,7 +9537,9 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@loader_path/Frameworks", "@loader_path/Frameworks",
); );
OTHER_SWIFT_FLAGS = "-DRELEASE"; OTHER_SWIFT_FLAGS = (
"-DRELEASE",
);
PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.ui.tests"; PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.ui.tests";
PRODUCT_NAME = UITests; PRODUCT_NAME = UITests;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -9554,7 +9561,9 @@
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = "$(MARKETING_VERSION)"; MARKETING_VERSION = "$(MARKETING_VERSION)";
OTHER_SWIFT_FLAGS = "-DIS_NSE"; OTHER_SWIFT_FLAGS = (
"-DIS_NSE",
);
PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.nse"; PRODUCT_BUNDLE_IDENTIFIER = "${BASE_BUNDLE_IDENTIFIER}.nse";
PRODUCT_DISPLAY_NAME = "$(APP_DISPLAY_NAME)"; PRODUCT_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
PRODUCT_NAME = NSE; PRODUCT_NAME = NSE;
@@ -18,7 +18,7 @@ enum SpaceFlowCoordinatorAction {
enum SpaceFlowCoordinatorEntryPoint { enum SpaceFlowCoordinatorEntryPoint {
case space(SpaceRoomListProxyProtocol) case space(SpaceRoomListProxyProtocol)
case joinSpace(SpaceServiceRoomProtocol) case joinSpace(SpaceServiceRoom)
var spaceID: String { var spaceID: String {
switch self { switch self {
@@ -301,7 +301,7 @@ class SpaceFlowCoordinator: FlowCoordinatorProtocol {
guard event == .startCreateChildRoomFlow, case .space = fromState else { return nil } guard event == .startCreateChildRoomFlow, case .space = fromState else { return nil }
return .createChildRoomFlow return .createChildRoomFlow
} handler: { [weak self] context in } handler: { [weak self] context in
guard let space = context.userInfo as? SpaceServiceRoomProtocol else { fatalError("The space is missing") } guard let space = context.userInfo as? SpaceServiceRoom else { fatalError("The space is missing") }
self?.startCreateChildFlow(space: space) self?.startCreateChildFlow(space: space)
} }
@@ -561,7 +561,7 @@ class SpaceFlowCoordinator: FlowCoordinatorProtocol {
flowCoordinator.start() flowCoordinator.start()
} }
private func startCreateChildFlow(space: SpaceServiceRoomProtocol) { private func startCreateChildFlow(space: SpaceServiceRoom) {
let stackCoordinator = NavigationStackCoordinator() let stackCoordinator = NavigationStackCoordinator()
let flowCoordinator = StartChatFlowCoordinator(entryPoint: .createRoomInSpace(space), let flowCoordinator = StartChatFlowCoordinator(entryPoint: .createRoomInSpace(space),
userDiscoveryService: UserDiscoveryService(clientProxy: flowParameters.userSession.clientProxy), userDiscoveryService: UserDiscoveryService(clientProxy: flowParameters.userSession.clientProxy),
@@ -25,7 +25,7 @@ enum StartChatFlowCoordinatorAction {
enum StartChatFlowCoordinatorEntryPoint { enum StartChatFlowCoordinatorEntryPoint {
case startChat case startChat
case createSpace case createSpace
case createRoomInSpace(SpaceServiceRoomProtocol) case createRoomInSpace(SpaceServiceRoom)
} }
class StartChatFlowCoordinator: FlowCoordinatorProtocol { class StartChatFlowCoordinator: FlowCoordinatorProtocol {
@@ -141,7 +141,7 @@ class StartChatFlowCoordinator: FlowCoordinatorProtocol {
} }
stateMachine.addRoutes(event: .createRoom(isSpace: false), transitions: [.initial => .createRoom]) { [weak self] context in stateMachine.addRoutes(event: .createRoom(isSpace: false), transitions: [.initial => .createRoom]) { [weak self] context in
guard context.fromState == .initial else { return } // Required check because the event is used in another route. guard context.fromState == .initial else { return } // Required check because the event is used in another route.
guard let space = context.userInfo as? SpaceServiceRoomProtocol else { guard let space = context.userInfo as? SpaceServiceRoom else {
fatalError("This transition only supports creating a room in a pre-selected space.") fatalError("This transition only supports creating a room in a pre-selected space.")
} }
self?.presentCreateRoomScreen(isSpace: false, spaceSelectionMode: .preSelected(space), isRoot: true) self?.presentCreateRoomScreen(isSpace: false, spaceSelectionMode: .preSelected(space), isRoot: true)
@@ -16721,16 +16721,16 @@ class SpaceRoomListProxyMock: SpaceRoomListProxyProtocol, @unchecked Sendable {
set(value) { underlyingId = value } set(value) { underlyingId = value }
} }
var underlyingId: String! var underlyingId: String!
var spaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoomProtocol, Never> { var spaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoom, Never> {
get { return underlyingSpaceServiceRoomPublisher } get { return underlyingSpaceServiceRoomPublisher }
set(value) { underlyingSpaceServiceRoomPublisher = value } set(value) { underlyingSpaceServiceRoomPublisher = value }
} }
var underlyingSpaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoomProtocol, Never>! var underlyingSpaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoom, Never>!
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> { var spaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoom], Never> {
get { return underlyingSpaceRoomsPublisher } get { return underlyingSpaceRoomsPublisher }
set(value) { underlyingSpaceRoomsPublisher = value } set(value) { underlyingSpaceRoomsPublisher = value }
} }
var underlyingSpaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never>! var underlyingSpaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoom], Never>!
var paginationStatePublisher: CurrentValuePublisher<SpaceRoomListPaginationState, Never> { var paginationStatePublisher: CurrentValuePublisher<SpaceRoomListPaginationState, Never> {
get { return underlyingPaginationStatePublisher } get { return underlyingPaginationStatePublisher }
set(value) { underlyingPaginationStatePublisher = value } set(value) { underlyingPaginationStatePublisher = value }
@@ -16809,11 +16809,11 @@ class SpaceRoomListProxyMock: SpaceRoomListProxyProtocol, @unchecked Sendable {
} }
} }
class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable { class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> { var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoom], Never> {
get { return underlyingTopLevelSpacesPublisher } get { return underlyingTopLevelSpacesPublisher }
set(value) { underlyingTopLevelSpacesPublisher = value } set(value) { underlyingTopLevelSpacesPublisher = value }
} }
var underlyingTopLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never>! var underlyingTopLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoom], Never>!
var spaceFilterPublisher: CurrentValuePublisher<[SpaceServiceFilter], Never> { var spaceFilterPublisher: CurrentValuePublisher<[SpaceServiceFilter], Never> {
get { return underlyingSpaceFilterPublisher } get { return underlyingSpaceFilterPublisher }
set(value) { underlyingSpaceFilterPublisher = value } set(value) { underlyingSpaceFilterPublisher = value }
@@ -16922,13 +16922,13 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
var spaceForIdentifierSpaceIDReceivedSpaceID: String? var spaceForIdentifierSpaceIDReceivedSpaceID: String?
var spaceForIdentifierSpaceIDReceivedInvocations: [String] = [] var spaceForIdentifierSpaceIDReceivedInvocations: [String] = []
var spaceForIdentifierSpaceIDUnderlyingReturnValue: Result<SpaceServiceRoomProtocol?, SpaceServiceProxyError>! var spaceForIdentifierSpaceIDUnderlyingReturnValue: Result<SpaceServiceRoom?, SpaceServiceProxyError>!
var spaceForIdentifierSpaceIDReturnValue: Result<SpaceServiceRoomProtocol?, SpaceServiceProxyError>! { var spaceForIdentifierSpaceIDReturnValue: Result<SpaceServiceRoom?, SpaceServiceProxyError>! {
get { get {
if Thread.isMainThread { if Thread.isMainThread {
return spaceForIdentifierSpaceIDUnderlyingReturnValue return spaceForIdentifierSpaceIDUnderlyingReturnValue
} else { } else {
var returnValue: Result<SpaceServiceRoomProtocol?, SpaceServiceProxyError>? = nil var returnValue: Result<SpaceServiceRoom?, SpaceServiceProxyError>? = nil
DispatchQueue.main.sync { DispatchQueue.main.sync {
returnValue = spaceForIdentifierSpaceIDUnderlyingReturnValue returnValue = spaceForIdentifierSpaceIDUnderlyingReturnValue
} }
@@ -16946,9 +16946,9 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
} }
} }
} }
var spaceForIdentifierSpaceIDClosure: ((String) async -> Result<SpaceServiceRoomProtocol?, SpaceServiceProxyError>)? var spaceForIdentifierSpaceIDClosure: ((String) async -> Result<SpaceServiceRoom?, SpaceServiceProxyError>)?
func spaceForIdentifier(spaceID: String) async -> Result<SpaceServiceRoomProtocol?, SpaceServiceProxyError> { func spaceForIdentifier(spaceID: String) async -> Result<SpaceServiceRoom?, SpaceServiceProxyError> {
spaceForIdentifierSpaceIDCallsCount += 1 spaceForIdentifierSpaceIDCallsCount += 1
spaceForIdentifierSpaceIDReceivedSpaceID = spaceID spaceForIdentifierSpaceIDReceivedSpaceID = spaceID
DispatchQueue.main.async { DispatchQueue.main.async {
@@ -17062,13 +17062,13 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
var joinedParentsChildIDReceivedChildID: String? var joinedParentsChildIDReceivedChildID: String?
var joinedParentsChildIDReceivedInvocations: [String] = [] var joinedParentsChildIDReceivedInvocations: [String] = []
var joinedParentsChildIDUnderlyingReturnValue: Result<[SpaceServiceRoomProtocol], SpaceServiceProxyError>! var joinedParentsChildIDUnderlyingReturnValue: Result<[SpaceServiceRoom], SpaceServiceProxyError>!
var joinedParentsChildIDReturnValue: Result<[SpaceServiceRoomProtocol], SpaceServiceProxyError>! { var joinedParentsChildIDReturnValue: Result<[SpaceServiceRoom], SpaceServiceProxyError>! {
get { get {
if Thread.isMainThread { if Thread.isMainThread {
return joinedParentsChildIDUnderlyingReturnValue return joinedParentsChildIDUnderlyingReturnValue
} else { } else {
var returnValue: Result<[SpaceServiceRoomProtocol], SpaceServiceProxyError>? = nil var returnValue: Result<[SpaceServiceRoom], SpaceServiceProxyError>? = nil
DispatchQueue.main.sync { DispatchQueue.main.sync {
returnValue = joinedParentsChildIDUnderlyingReturnValue returnValue = joinedParentsChildIDUnderlyingReturnValue
} }
@@ -17086,9 +17086,9 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
} }
} }
} }
var joinedParentsChildIDClosure: ((String) async -> Result<[SpaceServiceRoomProtocol], SpaceServiceProxyError>)? var joinedParentsChildIDClosure: ((String) async -> Result<[SpaceServiceRoom], SpaceServiceProxyError>)?
func joinedParents(childID: String) async -> Result<[SpaceServiceRoomProtocol], SpaceServiceProxyError> { func joinedParents(childID: String) async -> Result<[SpaceServiceRoom], SpaceServiceProxyError> {
joinedParentsChildIDCallsCount += 1 joinedParentsChildIDCallsCount += 1
joinedParentsChildIDReceivedChildID = childID joinedParentsChildIDReceivedChildID = childID
DispatchQueue.main.async { DispatchQueue.main.async {
@@ -17130,13 +17130,13 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
return editableSpacesCallsCount > 0 return editableSpacesCallsCount > 0
} }
var editableSpacesUnderlyingReturnValue: [SpaceServiceRoomProtocol]! var editableSpacesUnderlyingReturnValue: [SpaceServiceRoom]!
var editableSpacesReturnValue: [SpaceServiceRoomProtocol]! { var editableSpacesReturnValue: [SpaceServiceRoom]! {
get { get {
if Thread.isMainThread { if Thread.isMainThread {
return editableSpacesUnderlyingReturnValue return editableSpacesUnderlyingReturnValue
} else { } else {
var returnValue: [SpaceServiceRoomProtocol]? = nil var returnValue: [SpaceServiceRoom]? = nil
DispatchQueue.main.sync { DispatchQueue.main.sync {
returnValue = editableSpacesUnderlyingReturnValue returnValue = editableSpacesUnderlyingReturnValue
} }
@@ -17154,9 +17154,9 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
} }
} }
} }
var editableSpacesClosure: (() async -> [SpaceServiceRoomProtocol])? var editableSpacesClosure: (() async -> [SpaceServiceRoom])?
func editableSpaces() async -> [SpaceServiceRoomProtocol] { func editableSpaces() async -> [SpaceServiceRoom] {
editableSpacesCallsCount += 1 editableSpacesCallsCount += 1
if let editableSpacesClosure = editableSpacesClosure { if let editableSpacesClosure = editableSpacesClosure {
return await editableSpacesClosure() return await editableSpacesClosure()
@@ -17305,49 +17305,6 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
} }
} }
} }
class SpaceServiceRoomMock: SpaceServiceRoomProtocol, @unchecked Sendable {
var id: String {
get { return underlyingId }
set(value) { underlyingId = value }
}
var underlyingId: String!
var name: String {
get { return underlyingName }
set(value) { underlyingName = value }
}
var underlyingName: String!
var rawName: String?
var avatarURL: URL?
var isSpace: Bool {
get { return underlyingIsSpace }
set(value) { underlyingIsSpace = value }
}
var underlyingIsSpace: Bool!
var isDirect: Bool?
var childrenCount: Int {
get { return underlyingChildrenCount }
set(value) { underlyingChildrenCount = value }
}
var underlyingChildrenCount: Int!
var joinedMembersCount: Int {
get { return underlyingJoinedMembersCount }
set(value) { underlyingJoinedMembersCount = value }
}
var underlyingJoinedMembersCount: Int!
var heroes: [UserProfileProxy] = []
var topic: String?
var canonicalAlias: String?
var joinRule: JoinRule?
var worldReadable: Bool?
var guestCanJoin: Bool {
get { return underlyingGuestCanJoin }
set(value) { underlyingGuestCanJoin = value }
}
var underlyingGuestCanJoin: Bool!
var state: Membership?
var via: [String] = []
}
class StaticRoomSummaryProviderMock: StaticRoomSummaryProviderProtocol, @unchecked Sendable { class StaticRoomSummaryProviderMock: StaticRoomSummaryProviderProtocol, @unchecked Sendable {
var statePublisher: CurrentValuePublisher<RoomSummaryProviderState, Never> { var statePublisher: CurrentValuePublisher<RoomSummaryProviderState, Never> {
get { return underlyingStatePublisher } get { return underlyingStatePublisher }
@@ -98,7 +98,7 @@ extension RoomPreviewProxyMock {
underlyingOwnMembershipDetails = roomMembershipDetails underlyingOwnMembershipDetails = roomMembershipDetails
} }
convenience init(spaceServiceRoom: SpaceServiceRoomProtocol) { convenience init(spaceServiceRoom: SpaceServiceRoom) {
self.init(Configuration(roomID: spaceServiceRoom.id, self.init(Configuration(roomID: spaceServiceRoom.id,
canonicalAlias: spaceServiceRoom.canonicalAlias ?? "", canonicalAlias: spaceServiceRoom.canonicalAlias ?? "",
name: spaceServiceRoom.name, name: spaceServiceRoom.name,
@@ -23,11 +23,11 @@ extension LeaveSpaceHandleSDKMock {
} }
extension [LeaveSpaceRoom] { extension [LeaveSpaceRoom] {
static func mockRoomsWithSpace(spaceServiceRoom: SpaceServiceRoomProtocol, isLastOwner: Bool) -> [LeaveSpaceRoom] { static func mockRoomsWithSpace(spaceServiceRoom: SpaceServiceRoom, isLastOwner: Bool) -> [LeaveSpaceRoom] {
mockRooms + mockSingleSpace(spaceServiceRoom: spaceServiceRoom, isLastOwner: isLastOwner) mockRooms + mockSingleSpace(spaceServiceRoom: spaceServiceRoom, isLastOwner: isLastOwner)
} }
static func mockSingleSpace(spaceServiceRoom: SpaceServiceRoomProtocol, isLastOwner: Bool) -> [LeaveSpaceRoom] { static func mockSingleSpace(spaceServiceRoom: SpaceServiceRoom, isLastOwner: Bool) -> [LeaveSpaceRoom] {
[LeaveSpaceRoom(spaceRoom: SpaceRoom(id: spaceServiceRoom.id, [LeaveSpaceRoom(spaceRoom: SpaceRoom(id: spaceServiceRoom.id,
name: spaceServiceRoom.name, name: spaceServiceRoom.name,
avatarURL: spaceServiceRoom.avatarURL, avatarURL: spaceServiceRoom.avatarURL,
@@ -1,208 +0,0 @@
//
// Copyright 2025 Element Creations Ltd.
// Copyright 2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import Foundation
import MatrixRustSDK
extension SpaceServiceRoomMock {
struct Configuration {
var id: String = UUID().uuidString
var name: String?
var rawName: String?
var avatarURL: URL?
var isSpace: Bool
var isDirect: Bool?
var childrenCount = 0
var joinedMembersCount = 0
var heroes: [UserProfileProxy] = []
var topic: String?
var canonicalAlias: String?
var joinRule: JoinRule?
var worldReadable: Bool?
var guestCanJoin = true
var state: Membership?
}
convenience init(_ configuration: Configuration) {
self.init()
id = configuration.id
name = configuration.name ?? configuration.id
rawName = configuration.rawName
avatarURL = configuration.avatarURL
isSpace = configuration.isSpace
isDirect = configuration.isDirect
childrenCount = configuration.childrenCount
joinedMembersCount = configuration.joinedMembersCount
heroes = configuration.heroes
topic = configuration.topic
canonicalAlias = configuration.canonicalAlias
joinRule = configuration.joinRule
worldReadable = configuration.worldReadable
guestCanJoin = configuration.guestCanJoin
state = configuration.state
}
}
extension [SpaceServiceRoomProtocol] {
static var mockJoinedSpaces: [SpaceServiceRoomMock] {
[
SpaceServiceRoomMock(.init(id: "space1",
name: "The Foundation",
isSpace: true,
childrenCount: 1,
joinedMembersCount: 500,
canonicalAlias: "#the-foundation:matrix.org",
state: .joined)),
SpaceServiceRoomMock(.init(id: "space2",
name: "The Second Foundation",
isSpace: true,
childrenCount: 1,
joinedMembersCount: 100,
state: .joined)),
SpaceServiceRoomMock(.init(id: "space3",
name: "The Galactic Empire",
isSpace: true,
childrenCount: 25000,
joinedMembersCount: 1_000_000_000,
canonicalAlias: "#the-galactic-empire:matrix.org",
state: .joined)),
SpaceServiceRoomMock(.init(id: "space4",
name: "The Korellians",
isSpace: true,
childrenCount: 27,
joinedMembersCount: 2_000_000,
state: .joined)),
SpaceServiceRoomMock(.init(id: "space5",
name: "The Luminists",
isSpace: true,
childrenCount: 1,
joinedMembersCount: 100_000,
state: .joined)),
SpaceServiceRoomMock(.init(id: "space6",
name: "The Anacreons",
isSpace: true,
childrenCount: 25,
joinedMembersCount: 400_000,
state: .joined)),
SpaceServiceRoomMock(.init(id: "space7",
name: "The Thespians",
isSpace: true,
childrenCount: 15,
joinedMembersCount: 300_000,
state: .joined))
]
}
static var mockJoinedSpaces2: [SpaceServiceRoomMock] {
[
SpaceServiceRoomMock(.init(id: "space1",
name: "The Foundation",
avatarURL: .mockMXCAvatar,
isSpace: true,
childrenCount: 1,
joinedMembersCount: 500,
canonicalAlias: "#the-foundation:matrix.org",
joinRule: .private,
state: .joined)),
SpaceServiceRoomMock(.init(id: "space2",
name: "The Second Foundation",
isSpace: true,
childrenCount: 1,
joinedMembersCount: 100,
state: .joined)),
SpaceServiceRoomMock(.init(id: "space3",
name: "The Galactic Empire",
isSpace: true,
childrenCount: 25000,
joinedMembersCount: 1_000_000_000,
canonicalAlias: "#the-galactic-empire:matrix.org",
state: .joined))
]
}
static var mockSpaceList: [SpaceServiceRoomProtocol] {
makeSpaceRooms(isSpace: true) + makeSpaceRooms(isSpace: false)
}
static var mockSingleRoom: [SpaceServiceRoomProtocol] {
[SpaceServiceRoomMock(.init(id: "!spaceroom:matrix.org",
name: "Management",
isSpace: false,
joinedMembersCount: 12,
topic: "This is where everything gets organised 📋.",
state: .joined))]
}
private static func makeSpaceRooms(isSpace: Bool) -> [SpaceServiceRoomMock] {
let typeName = isSpace ? "Space" : "Room"
return [
SpaceServiceRoomMock(.init(id: "!\(typeName.lowercased())1:matrix.org",
name: "Company \(typeName)",
isSpace: isSpace)),
SpaceServiceRoomMock(.init(id: "!\(typeName.lowercased())2:matrix.org",
name: "Public \(typeName)",
avatarURL: .mockMXCAvatar,
isSpace: isSpace,
joinedMembersCount: 78,
topic: "Discussion on specific topic goes here.",
joinRule: .public)),
SpaceServiceRoomMock(.init(id: "!\(typeName.lowercased())3:matrix.org",
name: "Joined \(typeName)",
isSpace: isSpace,
joinedMembersCount: 123,
topic: "Discussion on specific topic goes here.",
joinRule: .restricted(rules: []),
state: .joined))
]
}
}
extension SpaceServiceRoomMock {
convenience init(mode: JoinRoomScreenMode) {
var state: Membership?
var joinRule: JoinRule?
switch mode {
case .joinable:
joinRule = .public
case .restricted:
joinRule = .restricted(rules: [])
case .inviteRequired:
joinRule = .private
case .invited:
state = .invited
joinRule = .private
case .knockable:
joinRule = .knock
case .knocked:
state = .knocked
joinRule = .knock
case .banned:
state = .banned
case .loading, .unknown, .forbidden:
break
}
self.init(.init(id: "1",
name: "The Three-Body Problem",
avatarURL: .mockMXCAvatar,
isSpace: true,
childrenCount: 100,
joinedMembersCount: 123,
heroes: [.mockAlice, .mockBob, .mockCharlie],
topic: "“Science and technology were the only keys to opening the door to the future, and people approached science with the faith and sincerity of elementary school students.”",
canonicalAlias: "#3-body-problem:matrix.org",
joinRule: joinRule,
state: state))
}
}
@@ -12,15 +12,15 @@ import MatrixRustSDK
extension SpaceRoomListProxyMock { extension SpaceRoomListProxyMock {
class Configuration { class Configuration {
var spaceServiceRoom: SpaceServiceRoomProtocol var spaceServiceRoom: SpaceServiceRoom
var initialSpaceRooms: [SpaceServiceRoomProtocol] var initialSpaceRooms: [SpaceServiceRoom]
var paginationStateSubject: CurrentValueSubject<SpaceRoomListPaginationState, Never> var paginationStateSubject: CurrentValueSubject<SpaceRoomListPaginationState, Never>
var paginationResponses: [[SpaceServiceRoomProtocol]] var paginationResponses: [[SpaceServiceRoom]]
init(spaceServiceRoom: SpaceServiceRoomProtocol, init(spaceServiceRoom: SpaceServiceRoom,
initialSpaceRooms: [SpaceServiceRoomProtocol] = [], initialSpaceRooms: [SpaceServiceRoom] = [],
paginationStateSubject: CurrentValueSubject<SpaceRoomListPaginationState, Never> = .init(.idle(endReached: true)), paginationStateSubject: CurrentValueSubject<SpaceRoomListPaginationState, Never> = .init(.idle(endReached: true)),
paginationResponses: [[SpaceServiceRoomProtocol]] = []) { paginationResponses: [[SpaceServiceRoom]] = []) {
self.spaceServiceRoom = spaceServiceRoom self.spaceServiceRoom = spaceServiceRoom
self.initialSpaceRooms = initialSpaceRooms self.initialSpaceRooms = initialSpaceRooms
self.paginationStateSubject = paginationStateSubject self.paginationStateSubject = paginationStateSubject
@@ -31,7 +31,7 @@ extension SpaceRoomListProxyMock {
convenience init(_ configuration: Configuration) { convenience init(_ configuration: Configuration) {
self.init() self.init()
let spaceRoomsSubject: CurrentValueSubject<[SpaceServiceRoomProtocol], Never> = .init(configuration.initialSpaceRooms) let spaceRoomsSubject: CurrentValueSubject<[SpaceServiceRoom], Never> = .init(configuration.initialSpaceRooms)
id = configuration.spaceServiceRoom.id id = configuration.spaceServiceRoom.id
spaceServiceRoomPublisher = .init(configuration.spaceServiceRoom) spaceServiceRoomPublisher = .init(configuration.spaceServiceRoom)
@@ -17,10 +17,10 @@ enum SpaceServiceProxyMockError: Error {
extension SpaceServiceProxyMock { extension SpaceServiceProxyMock {
struct Configuration { struct Configuration {
var topLevelSpaces: [SpaceServiceRoomProtocol] = [] var topLevelSpaces: [SpaceServiceRoom] = []
var spaceFilters: [SpaceServiceFilter] = [] var spaceFilters: [SpaceServiceFilter] = []
var joinedParentSpaces: [SpaceServiceRoomProtocol] = [] var joinedParentSpaces: [SpaceServiceRoom] = []
var editableSpaces: [SpaceServiceRoomProtocol] = [] var editableSpaces: [SpaceServiceRoom] = []
var spaceRoomLists: [String: SpaceRoomListProxyMock] = [:] var spaceRoomLists: [String: SpaceRoomListProxyMock] = [:]
var leaveSpaceRooms: [LeaveSpaceRoom] = [] var leaveSpaceRooms: [LeaveSpaceRoom] = []
} }
@@ -55,16 +55,16 @@ extension SpaceServiceProxyMock {
extension SpaceServiceProxyMock.Configuration { extension SpaceServiceProxyMock.Configuration {
static var populated: SpaceServiceProxyMock.Configuration { static var populated: SpaceServiceProxyMock.Configuration {
let spaceFilters = [SpaceServiceRoomProtocol].mockJoinedSpaces.reduce(into: [SpaceServiceFilter]()) { partialResult, spaceRoom in let spaceFilters = [SpaceServiceRoom].mockJoinedSpaces.reduce(into: [SpaceServiceFilter]()) { partialResult, spaceRoom in
partialResult.append(SpaceServiceFilter(room: spaceRoom, level: 0, descendants: .init())) partialResult.append(SpaceServiceFilter(room: spaceRoom, level: 0, descendants: .init()))
partialResult.append(SpaceServiceFilter(room: spaceRoom, level: 1, descendants: .init())) partialResult.append(SpaceServiceFilter(room: spaceRoom, level: 1, descendants: .init()))
} }
let spaceRoomLists = [SpaceServiceRoomProtocol].mockJoinedSpaces.map { let spaceRoomLists = [SpaceServiceRoom].mockJoinedSpaces.map {
($0.id, SpaceRoomListProxyMock(.init(spaceServiceRoom: $0, initialSpaceRooms: .mockSpaceList))) ($0.id, SpaceRoomListProxyMock(.init(spaceServiceRoom: $0, initialSpaceRooms: .mockSpaceList)))
} }
let subSpaceRoomLists = [SpaceServiceRoomProtocol].mockSpaceList.map { let subSpaceRoomLists = [SpaceServiceRoom].mockSpaceList.map {
($0.id, SpaceRoomListProxyMock(.init(spaceServiceRoom: $0, initialSpaceRooms: .mockSingleRoom))) ($0.id, SpaceRoomListProxyMock(.init(spaceServiceRoom: $0, initialSpaceRooms: .mockSingleRoom)))
} }
@@ -89,7 +89,7 @@ struct ChatsSpaceFilterCell: View {
struct ChatsSpaceFilterCell_Previews: PreviewProvider, TestablePreview { struct ChatsSpaceFilterCell_Previews: PreviewProvider, TestablePreview {
static let mediaProvider = MediaProviderMock(configuration: .init()) static let mediaProvider = MediaProviderMock(configuration: .init())
static let spaces = [SpaceServiceRoomProtocol].mockJoinedSpaces2 static let spaces = [SpaceServiceRoom].mockJoinedSpaces2
static var previews: some View { static var previews: some View {
VStack(spacing: 0) { VStack(spacing: 0) {
@@ -31,7 +31,7 @@ struct CreateRoomScreenViewState: BindableState {
let isKnockingFeatureEnabled: Bool let isKnockingFeatureEnabled: Bool
let canSelectSpace: Bool let canSelectSpace: Bool
var aliasLocalPart: String var aliasLocalPart: String
var editableSpaces: [SpaceServiceRoomProtocol] = [] var editableSpaces: [SpaceServiceRoom] = []
var bindings: CreateRoomScreenViewStateBindings var bindings: CreateRoomScreenViewStateBindings
var avatarMediaInfo: MediaInfo? { var avatarMediaInfo: MediaInfo? {
didSet { didSet {
@@ -99,7 +99,7 @@ struct CreateRoomScreenViewState: BindableState {
struct CreateRoomScreenViewStateBindings { struct CreateRoomScreenViewStateBindings {
var roomTopic: String var roomTopic: String
var selectedAccessType: CreateRoomScreenAccessType var selectedAccessType: CreateRoomScreenAccessType
var selectedSpace: SpaceServiceRoomProtocol? var selectedSpace: SpaceServiceRoom?
var showAttachmentConfirmationDialog = false var showAttachmentConfirmationDialog = false
var showSpaceSelectionSheet = false var showSpaceSelectionSheet = false
@@ -144,5 +144,5 @@ enum CreateRoomScreenAccessType {
enum CreateRoomScreenSpaceSelectionMode { enum CreateRoomScreenSpaceSelectionMode {
case editableSpacesList case editableSpacesList
case preSelected(SpaceServiceRoomProtocol) case preSelected(SpaceServiceRoom)
} }
@@ -39,7 +39,7 @@ class CreateRoomScreenViewModel: CreateRoomScreenViewModelType, CreateRoomScreen
self.analytics = analytics self.analytics = analytics
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
var selectedSpace: SpaceServiceRoomProtocol? var selectedSpace: SpaceServiceRoom?
var canSelectSpace = false var canSelectSpace = false
switch spaceSelectionMode { switch spaceSelectionMode {
case .editableSpacesList: case .editableSpacesList:
@@ -378,21 +378,21 @@ struct CreateRoom_Previews: PreviewProvider, TestablePreview {
return viewModel return viewModel
}() }()
static let selectedSpaceViewModel = makeViewModel(selectionMode: .preSelected(SpaceServiceRoomMock(.init(name: "Awesome Space", static let selectedSpaceViewModel = makeViewModel(selectionMode: .preSelected(SpaceServiceRoom.mock(name: "Awesome Space",
isSpace: true, isSpace: true,
joinRule: .private)))) joinRule: .private)))
static let selectedSpaceWithListViewModel = { static let selectedSpaceWithListViewModel = {
let viewModel = makeViewModel() let viewModel = makeViewModel()
viewModel.context.selectedSpace = [SpaceServiceRoomProtocol].mockJoinedSpaces2.first viewModel.context.selectedSpace = [SpaceServiceRoom].mockJoinedSpaces2.first
return viewModel return viewModel
}() }()
static let selectedSpaceWithAskToJoinViewModel = { static let selectedSpaceWithAskToJoinViewModel = {
let viewModel = makeViewModel(isKnockingEnabled: true, let viewModel = makeViewModel(isKnockingEnabled: true,
selectionMode: .preSelected(SpaceServiceRoomMock(.init(name: "Awesome Space", selectionMode: .preSelected(SpaceServiceRoom.mock(name: "Awesome Space",
isSpace: true, isSpace: true,
joinRule: .private)))) joinRule: .private)))
viewModel.context.selectedAccessType = .askToJoinWithSpaceMembers viewModel.context.selectedAccessType = .askToJoinWithSpaceMembers
return viewModel return viewModel
}() }()
@@ -469,7 +469,7 @@ struct CreateRoom_Previews: PreviewProvider, TestablePreview {
let clientProxy = ClientProxyMock(.init(userIDServerName: "example.org", let clientProxy = ClientProxyMock(.init(userIDServerName: "example.org",
userID: "@userid:example.com")) userID: "@userid:example.com"))
clientProxy.isAliasAvailableReturnValue = .success(isAliasAvailable) clientProxy.isAliasAvailableReturnValue = .success(isAliasAvailable)
let spaces = [SpaceServiceRoomProtocol].mockJoinedSpaces2 let spaces = [SpaceServiceRoom].mockJoinedSpaces2
clientProxy.spaceService = SpaceServiceProxyMock(.init(editableSpaces: spaces)) clientProxy.spaceService = SpaceServiceProxyMock(.init(editableSpaces: spaces))
let userSession = UserSessionMock(.init(clientProxy: clientProxy)) let userSession = UserSessionMock(.init(clientProxy: clientProxy))
@@ -18,7 +18,7 @@ struct JoinRoomScreenCoordinatorParameters {
enum JoinRoomScreenSource { enum JoinRoomScreenSource {
case generic(roomID: String, via: [String]) case generic(roomID: String, via: [String])
case space(SpaceServiceRoomProtocol) case space(SpaceServiceRoom)
func roomIDAndVia() -> (roomID: String, via: [String]) { func roomIDAndVia() -> (roomID: String, via: [String]) {
switch self { switch self {
@@ -200,7 +200,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
spaceVisibility: nil) spaceVisibility: nil)
} }
private func updateSpaceRoomDetails(spaceServiceRoom: SpaceServiceRoomProtocol, inviter: RoomInviterDetails?) async { private func updateSpaceRoomDetails(spaceServiceRoom: SpaceServiceRoom, inviter: RoomInviterDetails?) async {
state.roomDetails = JoinRoomScreenRoomDetails(name: spaceServiceRoom.name, state.roomDetails = JoinRoomScreenRoomDetails(name: spaceServiceRoom.name,
topic: spaceServiceRoom.topic, topic: spaceServiceRoom.topic,
canonicalAlias: spaceServiceRoom.canonicalAlias, canonicalAlias: spaceServiceRoom.canonicalAlias,
@@ -447,7 +447,7 @@ struct JoinRoomScreenPreviewWrapper: Identifiable {
} }
let source: JoinRoomScreenSource = if isSpace { let source: JoinRoomScreenSource = if isSpace {
.space(SpaceServiceRoomMock(mode: mode)) .space(SpaceServiceRoom.mock(joinRoomScreenMode: mode))
} else { } else {
.generic(roomID: "1", via: []) .generic(roomID: "1", via: [])
} }
@@ -37,7 +37,7 @@ enum ManageAuthorizedSpacesScreenViewAction {
} }
struct AuthorizedSpacesSelection { struct AuthorizedSpacesSelection {
let joinedSpaces: [SpaceServiceRoomProtocol] let joinedSpaces: [SpaceServiceRoom]
let unknownSpacesIDs: [String] let unknownSpacesIDs: [String]
let initialSelectedIDs: Set<String> let initialSelectedIDs: Set<String>
let selectedIDs: PassthroughSubject<Set<String>, Never> = .init() let selectedIDs: PassthroughSubject<Set<String>, Never> = .init()
@@ -77,7 +77,7 @@ struct ManageAuthorizedSpacesScreen: View {
} }
} }
private func avatar(space: SpaceServiceRoomProtocol) -> some View { private func avatar(space: SpaceServiceRoom) -> some View {
RoomAvatarImage(avatar: space.avatar, RoomAvatarImage(avatar: space.avatar,
avatarSize: .room(on: .authorizedSpaces), avatarSize: .room(on: .authorizedSpaces),
mediaProvider: context.mediaProvider) mediaProvider: context.mediaProvider)
@@ -32,7 +32,7 @@ struct SecurityAndPrivacyScreenViewState: BindableState {
var canEditHistoryVisibility = false var canEditHistoryVisibility = false
/// The union of joined parent spaces and the joined spaces in the current access type /// The union of joined parent spaces and the joined spaces in the current access type
var selectableJoinedSpaces: [SpaceServiceRoomProtocol] = [] var selectableJoinedSpaces: [SpaceServiceRoom] = []
/// The count of the intersection between the set of joined parent spaces and the set of spaces in the current access type /// The count of the intersection between the set of joined parent spaces and the set of spaces in the current access type
var selectableSpacesCount: Int { var selectableSpacesCount: Int {
@@ -118,7 +118,7 @@ struct SecurityAndPrivacyScreenViewState: BindableState {
enum SpaceSelection { enum SpaceSelection {
/// There is only one available parent space for selection and is joined by the user /// There is only one available parent space for selection and is joined by the user
case singleJoined(SpaceServiceRoomProtocol) case singleJoined(SpaceServiceRoom)
/// There is only one available space for selection and is unknown to the user /// There is only one available space for selection and is unknown to the user
case singleUnknown(id: String) case singleUnknown(id: String)
/// Multiple spaces are available for selection /// Multiple spaces are available for selection
@@ -305,7 +305,7 @@ class SecurityAndPrivacyScreenViewModel: SecurityAndPrivacyScreenViewModelType,
} }
private func setupSelectableJoinedSpaces() async { private func setupSelectableJoinedSpaces() async {
var joinedParentSpaces: [SpaceServiceRoomProtocol] = [] var joinedParentSpaces: [SpaceServiceRoom] = []
switch await clientProxy.spaceService.joinedParents(childID: roomProxy.id) { switch await clientProxy.spaceService.joinedParents(childID: roomProxy.id) {
case .success(let value): case .success(let value):
joinedParentSpaces = value joinedParentSpaces = value
@@ -313,7 +313,7 @@ class SecurityAndPrivacyScreenViewModel: SecurityAndPrivacyScreenViewModelType,
break break
} }
var nonParentJoinedSpaces: [SpaceServiceRoomProtocol] = [] var nonParentJoinedSpaces: [SpaceServiceRoom] = []
for spaceID in state.currentSettings.accessType.spaceIDs where !joinedParentSpaces.contains(where: { $0.id == spaceID }) { for spaceID in state.currentSettings.accessType.spaceIDs where !joinedParentSpaces.contains(where: { $0.id == spaceID }) {
if case let .success(.some(space)) = await clientProxy.spaceService.spaceForIdentifier(spaceID: spaceID) { if case let .success(.some(space)) = await clientProxy.spaceService.spaceForIdentifier(spaceID: spaceID) {
nonParentJoinedSpaces.append(space) nonParentJoinedSpaces.append(space)
@@ -269,7 +269,7 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
AppSettings.resetAllSettings() AppSettings.resetAllSettings()
let appSettings = AppSettings() let appSettings = AppSettings()
appSettings.spaceSettingsEnabled = true appSettings.spaceSettingsEnabled = true
let space = [SpaceServiceRoomProtocol].mockSingleRoom[0] let space = [SpaceServiceRoom].mockSingleRoom[0]
return SecurityAndPrivacyScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(isEncrypted: false, return SecurityAndPrivacyScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(isEncrypted: false,
canonicalAlias: "#room:matrix.org", canonicalAlias: "#room:matrix.org",
@@ -286,7 +286,7 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
AppSettings.resetAllSettings() AppSettings.resetAllSettings()
let appSettings = AppSettings() let appSettings = AppSettings()
appSettings.spaceSettingsEnabled = true appSettings.spaceSettingsEnabled = true
let spaces = [SpaceServiceRoomProtocol].mockJoinedSpaces let spaces = [SpaceServiceRoom].mockJoinedSpaces
return SecurityAndPrivacyScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(isEncrypted: false, return SecurityAndPrivacyScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(isEncrypted: false,
canonicalAlias: "#room:matrix.org", canonicalAlias: "#room:matrix.org",
@@ -319,7 +319,7 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
let appSettings = AppSettings() let appSettings = AppSettings()
appSettings.spaceSettingsEnabled = true appSettings.spaceSettingsEnabled = true
appSettings.knockingEnabled = true appSettings.knockingEnabled = true
let space = [SpaceServiceRoomProtocol].mockSingleRoom[0] let space = [SpaceServiceRoom].mockSingleRoom[0]
return SecurityAndPrivacyScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(isEncrypted: false, return SecurityAndPrivacyScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(isEncrypted: false,
canonicalAlias: "#room:matrix.org", canonicalAlias: "#room:matrix.org",
@@ -337,7 +337,7 @@ struct SecurityAndPrivacyScreen_Previews: PreviewProvider, TestablePreview {
let appSettings = AppSettings() let appSettings = AppSettings()
appSettings.spaceSettingsEnabled = true appSettings.spaceSettingsEnabled = true
appSettings.knockingEnabled = true appSettings.knockingEnabled = true
let spaces = [SpaceServiceRoomProtocol].mockJoinedSpaces let spaces = [SpaceServiceRoom].mockJoinedSpaces
return SecurityAndPrivacyScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(isEncrypted: false, return SecurityAndPrivacyScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(isEncrypted: false,
canonicalAlias: "#room:matrix.org", canonicalAlias: "#room:matrix.org",
@@ -10,7 +10,7 @@ import Compound
import SwiftUI import SwiftUI
struct SpaceHeaderView: View { struct SpaceHeaderView: View {
let spaceServiceRoom: SpaceServiceRoomProtocol let spaceServiceRoom: SpaceServiceRoom
let mediaProvider: MediaProviderProtocol? let mediaProvider: MediaProviderProtocol?
@State private var isPresentingTopic = false @State private var isPresentingTopic = false
@@ -112,14 +112,14 @@ struct SpaceHeaderView_Previews: PreviewProvider, TestablePreview {
} }
} }
static func makeSpaceRooms() -> [SpaceServiceRoomMock] { static func makeSpaceRooms() -> [SpaceServiceRoom] {
[ [
SpaceServiceRoomMock(.init(id: "!space1:matrix.org", SpaceServiceRoom.mock(id: "!space1:matrix.org",
name: "Company Space", name: "Company Space",
isSpace: true, isSpace: true,
childrenCount: 10, childrenCount: 10,
joinedMembersCount: 50)), joinedMembersCount: 50),
SpaceServiceRoomMock(.init(id: "!space2:matrix.org", SpaceServiceRoom.mock(id: "!space2:matrix.org",
name: "Community Space", name: "Community Space",
avatarURL: .mockMXCAvatar, avatarURL: .mockMXCAvatar,
isSpace: true, isSpace: true,
@@ -127,8 +127,8 @@ struct SpaceHeaderView_Previews: PreviewProvider, TestablePreview {
joinedMembersCount: 78, joinedMembersCount: 78,
topic: "Description of the space goes right here.", topic: "Description of the space goes right here.",
canonicalAlias: "#space:matrix.org", canonicalAlias: "#space:matrix.org",
joinRule: .public)), joinRule: .public),
SpaceServiceRoomMock(.init(id: "!space3:matrix.org", SpaceServiceRoom.mock(id: "!space3:matrix.org",
name: "Subspace", name: "Subspace",
isSpace: true, isSpace: true,
childrenCount: 30, childrenCount: 30,
@@ -141,7 +141,7 @@ struct SpaceHeaderView_Previews: PreviewProvider, TestablePreview {
"Interdum mauris ultrices tincidunt proin morbi erat aenean risus nibh.", "Interdum mauris ultrices tincidunt proin morbi erat aenean risus nibh.",
"Diam amet sit fermentum vulputate faucibus."].joined(separator: " "), "Diam amet sit fermentum vulputate faucibus."].joined(separator: " "),
canonicalAlias: "#subspace:matrix.org", canonicalAlias: "#subspace:matrix.org",
joinRule: .knockRestricted(rules: [.roomMembership(roomId: "")]))) joinRule: .knockRestricted(rules: [.roomMembership(roomId: "")]))
] ]
} }
} }
@@ -14,12 +14,12 @@ struct SpaceRoomCell: View {
@Environment(\.dynamicTypeSize) private var dynamicTypeSize @Environment(\.dynamicTypeSize) private var dynamicTypeSize
@Environment(\.editMode) private var editMode @Environment(\.editMode) private var editMode
let spaceServiceRoom: SpaceServiceRoomProtocol let spaceServiceRoom: SpaceServiceRoom
let isSelected: Bool let isSelected: Bool
var isJoining = false var isJoining = false
let mediaProvider: MediaProviderProtocol! let mediaProvider: MediaProviderProtocol!
enum Action { case select(SpaceServiceRoomProtocol), join(SpaceServiceRoomProtocol) } enum Action { case select(SpaceServiceRoom), join(SpaceServiceRoom) }
let action: (Action) -> Void let action: (Action) -> Void
private let verticalInsets = 12.0 private let verticalInsets = 12.0
@@ -179,7 +179,7 @@ struct SpaceRoomCellButtonStyle: ButtonStyle {
struct SpaceRoomCell_Previews: PreviewProvider, TestablePreview { struct SpaceRoomCell_Previews: PreviewProvider, TestablePreview {
static let mediaProvider = MediaProviderMock(configuration: .init()) static let mediaProvider = MediaProviderMock(configuration: .init())
static let spaces = [SpaceServiceRoomProtocol].mockSpaceList static let spaces = [SpaceServiceRoom].mockSpaceList
static var previews: some View { static var previews: some View {
ScrollView { ScrollView {
@@ -190,21 +190,21 @@ struct SpaceRoomCell_Previews: PreviewProvider, TestablePreview {
mediaProvider: mediaProvider) { _ in } mediaProvider: mediaProvider) { _ in }
} }
SpaceRoomCell(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "Space being joined", isSpace: true)), SpaceRoomCell(spaceServiceRoom: SpaceServiceRoom.mock(id: "Space being joined", isSpace: true),
isSelected: false, isSelected: false,
isJoining: true, isJoining: true,
mediaProvider: mediaProvider) { _ in } mediaProvider: mediaProvider) { _ in }
SpaceRoomCell(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "Room being joined", isSpace: false)), SpaceRoomCell(spaceServiceRoom: SpaceServiceRoom.mock(id: "Room being joined", isSpace: false),
isSelected: false, isSelected: false,
isJoining: true, isJoining: true,
mediaProvider: mediaProvider) { _ in } mediaProvider: mediaProvider) { _ in }
SpaceRoomCell(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "Selected", isSpace: false, state: .joined)), SpaceRoomCell(spaceServiceRoom: SpaceServiceRoom.mock(id: "Selected", isSpace: false, state: .joined),
isSelected: true, isSelected: true,
isJoining: false, isJoining: false,
mediaProvider: mediaProvider) { _ in } mediaProvider: mediaProvider) { _ in }
.environment(\.editMode, .constant(.active)) .environment(\.editMode, .constant(.active))
SpaceRoomCell(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "Unselected", isSpace: false, state: .joined)), SpaceRoomCell(spaceServiceRoom: SpaceServiceRoom.mock(id: "Unselected", isSpace: false, state: .joined),
isSelected: false, isSelected: false,
isJoining: false, isJoining: false,
mediaProvider: mediaProvider) { _ in } mediaProvider: mediaProvider) { _ in }
@@ -91,45 +91,45 @@ struct LeaveSpaceRoomDetailsCell: View {
struct LeaveSpaceRoomDetailsCell_Previews: PreviewProvider, TestablePreview { struct LeaveSpaceRoomDetailsCell_Previews: PreviewProvider, TestablePreview {
static var previews: some View { static var previews: some View {
VStack(spacing: 0) { VStack(spacing: 0) {
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "1", LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "1",
name: "Space", name: "Space",
isSpace: true)), isSpace: true),
isLastOwner: false, isLastOwner: false,
areCreatorsPrivileged: false, areCreatorsPrivileged: false,
isSelected: true), isSelected: true),
mediaProvider: MediaProviderMock(configuration: .init())) { } mediaProvider: MediaProviderMock(configuration: .init())) { }
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "2", LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "2",
name: "My Space", name: "My Space",
isSpace: true)), isSpace: true),
isLastOwner: true, isLastOwner: true,
areCreatorsPrivileged: false, areCreatorsPrivileged: false,
isSelected: false), isSelected: false),
mediaProvider: MediaProviderMock(configuration: .init())) { } mediaProvider: MediaProviderMock(configuration: .init())) { }
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "2", LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "2",
name: "My Space", name: "My Space",
isSpace: true)), isSpace: true),
isLastOwner: true, isLastOwner: true,
areCreatorsPrivileged: false, areCreatorsPrivileged: false,
isSelected: false), isSelected: false),
hideSelection: true, hideSelection: true,
mediaProvider: MediaProviderMock(configuration: .init())) { } mediaProvider: MediaProviderMock(configuration: .init())) { }
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "3", LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "3",
name: "Room", name: "Room",
isSpace: false)), isSpace: false),
isLastOwner: false, isLastOwner: false,
areCreatorsPrivileged: false, areCreatorsPrivileged: false,
isSelected: true), isSelected: true),
mediaProvider: MediaProviderMock(configuration: .init())) { } mediaProvider: MediaProviderMock(configuration: .init())) { }
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "4", LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "4",
name: "My Room", name: "My Room",
isSpace: false)), isSpace: false),
isLastOwner: true, isLastOwner: true,
areCreatorsPrivileged: false, areCreatorsPrivileged: false,
isSelected: false), isSelected: false),
mediaProvider: MediaProviderMock(configuration: .init())) { } mediaProvider: MediaProviderMock(configuration: .init())) { }
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "4", LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "4",
name: "My Room", name: "My Room",
isSpace: false)), isSpace: false),
isLastOwner: true, isLastOwner: true,
areCreatorsPrivileged: false, areCreatorsPrivileged: false,
isSelected: false), isSelected: false),
@@ -136,14 +136,14 @@ struct LeaveSpaceView_Previews: PreviewProvider, TestablePreview {
.previewDisplayName("Last Space Admin") .previewDisplayName("Last Space Admin")
} }
static let spaceServiceRoom = SpaceServiceRoomMock(.init(id: "!eng-space:matrix.org", static let spaceServiceRoom = SpaceServiceRoom.mock(id: "!eng-space:matrix.org",
name: "Engineering Team", name: "Engineering Team",
isSpace: true, isSpace: true,
childrenCount: 30, childrenCount: 30,
joinedMembersCount: 76, joinedMembersCount: 76,
heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose], heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose],
topic: "Description of the space goes right here. Lorem ipsum dolor sit amet consectetur. Leo viverra morbi habitant in.", topic: "Description of the space goes right here. Lorem ipsum dolor sit amet consectetur. Leo viverra morbi habitant in.",
joinRule: .knockRestricted(rules: [.roomMembership(roomId: "")]))) joinRule: .knockRestricted(rules: [.roomMembership(roomId: "")]))
static func makeViewModel(mode: LeaveSpaceHandleProxy.Mode) -> LeaveSpaceViewModel { static func makeViewModel(mode: LeaveSpaceHandleProxy.Mode) -> LeaveSpaceViewModel {
let rooms: [LeaveSpaceRoom] = switch mode { let rooms: [LeaveSpaceRoom] = switch mode {
@@ -184,7 +184,7 @@ struct SpaceAddRoomsScreen_Previews: PreviewProvider, TestablePreview {
} }
static func makeViewModel(searchQuery: String? = nil, hasSelection: Bool = false) -> SpaceAddRoomsScreenViewModel { static func makeViewModel(searchQuery: String? = nil, hasSelection: Bool = false) -> SpaceAddRoomsScreenViewModel {
let spaceRoomListProxy = SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoomMock(.init(isSpace: true)))) let spaceRoomListProxy = SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoom.mock(isSpace: true)))
let clientProxy = ClientProxyMock(.init()) let clientProxy = ClientProxyMock(.init())
clientProxy.recentlyVisitedRoomsFilterReturnValue = .mockRooms clientProxy.recentlyVisitedRoomsFilterReturnValue = .mockRooms
@@ -22,14 +22,14 @@ struct SpaceScreenCoordinatorParameters {
enum SpaceScreenCoordinatorAction { enum SpaceScreenCoordinatorAction {
case selectSpace(SpaceRoomListProxyProtocol) case selectSpace(SpaceRoomListProxyProtocol)
case selectUnjoinedSpace(SpaceServiceRoomProtocol) case selectUnjoinedSpace(SpaceServiceRoom)
case selectRoom(roomID: String) case selectRoom(roomID: String)
case leftSpace case leftSpace
case displayMembers(roomProxy: JoinedRoomProxyProtocol) case displayMembers(roomProxy: JoinedRoomProxyProtocol)
case displaySpaceSettings(roomProxy: JoinedRoomProxyProtocol) case displaySpaceSettings(roomProxy: JoinedRoomProxyProtocol)
case displayRolesAndPermissions(roomProxy: JoinedRoomProxyProtocol) case displayRolesAndPermissions(roomProxy: JoinedRoomProxyProtocol)
case addExistingChildren case addExistingChildren
case displayCreateChildRoomFlow(space: SpaceServiceRoomProtocol) case displayCreateChildRoomFlow(space: SpaceServiceRoom)
} }
final class SpaceScreenCoordinator: CoordinatorProtocol { final class SpaceScreenCoordinator: CoordinatorProtocol {
@@ -10,24 +10,24 @@ import SwiftUI
enum SpaceScreenViewModelAction { enum SpaceScreenViewModelAction {
case selectSpace(SpaceRoomListProxyProtocol) case selectSpace(SpaceRoomListProxyProtocol)
case selectUnjoinedSpace(SpaceServiceRoomProtocol) case selectUnjoinedSpace(SpaceServiceRoom)
case selectRoom(roomID: String) case selectRoom(roomID: String)
case leftSpace case leftSpace
case presentRolesAndPermissions(roomProxy: JoinedRoomProxyProtocol) case presentRolesAndPermissions(roomProxy: JoinedRoomProxyProtocol)
case displayMembers(roomProxy: JoinedRoomProxyProtocol) case displayMembers(roomProxy: JoinedRoomProxyProtocol)
case displaySpaceSettings(roomProxy: JoinedRoomProxyProtocol) case displaySpaceSettings(roomProxy: JoinedRoomProxyProtocol)
case addExistingChildren case addExistingChildren
case displayCreateChildRoomFlow(space: SpaceServiceRoomProtocol) case displayCreateChildRoomFlow(space: SpaceServiceRoom)
} }
struct SpaceScreenViewState: BindableState { struct SpaceScreenViewState: BindableState {
var space: SpaceServiceRoomProtocol var space: SpaceServiceRoom
var permalink: URL? var permalink: URL?
var roomProxy: JoinedRoomProxyProtocol? var roomProxy: JoinedRoomProxyProtocol?
var paginationState: PaginationState = .idle var paginationState: PaginationState = .idle
var rooms: [SpaceServiceRoomProtocol] var rooms: [SpaceServiceRoom]
var selectedSpaceRoomID: String? var selectedSpaceRoomID: String?
var joiningRoomIDs: Set<String> = [] var joiningRoomIDs: Set<String> = []
@@ -47,7 +47,7 @@ struct SpaceScreenViewState: BindableState {
rooms.isEmpty && paginationState == .endReached && canEditChildren rooms.isEmpty && paginationState == .endReached && canEditChildren
} }
var visibleRooms: [SpaceServiceRoomProtocol] { var visibleRooms: [SpaceServiceRoom] {
if editMode == .inactive { if editMode == .inactive {
rooms rooms
} else { } else {
@@ -182,7 +182,7 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
} }
} }
private func join(_ spaceServiceRoom: SpaceServiceRoomProtocol) async { private func join(_ spaceServiceRoom: SpaceServiceRoom) async {
state.joiningRoomIDs.insert(spaceServiceRoom.id) state.joiningRoomIDs.insert(spaceServiceRoom.id)
defer { state.joiningRoomIDs.remove(spaceServiceRoom.id) } defer { state.joiningRoomIDs.remove(spaceServiceRoom.id) }
@@ -194,7 +194,7 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
// We don't want to show the space room after joining it this way 🤷‍♂️ // We don't want to show the space room after joining it this way 🤷‍♂️
} }
private func selectSpace(_ spaceServiceRoom: SpaceServiceRoomProtocol) async { private func selectSpace(_ spaceServiceRoom: SpaceServiceRoom) async {
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceServiceRoom.id) { switch await spaceServiceProxy.spaceRoomList(spaceID: spaceServiceRoom.id) {
case .success(let spaceRoomListProxy): case .success(let spaceRoomListProxy):
actionsSubject.send(.selectSpace(spaceRoomListProxy)) actionsSubject.send(.selectSpace(spaceRoomListProxy))
@@ -210,7 +210,7 @@ struct SpaceScreen_Previews: PreviewProvider, TestablePreview {
appSettings.spaceSettingsEnabled = true appSettings.spaceSettingsEnabled = true
appSettings.createSpaceEnabled = true appSettings.createSpaceEnabled = true
let spaceServiceRoom = SpaceServiceRoomMock(.init(id: "!eng-space:matrix.org", let spaceServiceRoom = SpaceServiceRoom.mock(id: "!eng-space:matrix.org",
name: "Engineering Team", name: "Engineering Team",
isSpace: true, isSpace: true,
childrenCount: 30, childrenCount: 30,
@@ -218,7 +218,7 @@ struct SpaceScreen_Previews: PreviewProvider, TestablePreview {
heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose], heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose],
topic: "Description of the space goes right here. Lorem ipsum dolor sit amet consectetur. Leo viverra morbi habitant in.", topic: "Description of the space goes right here. Lorem ipsum dolor sit amet consectetur. Leo viverra morbi habitant in.",
canonicalAlias: "#engineering-team:element.io", canonicalAlias: "#engineering-team:element.io",
joinRule: .knockRestricted(rules: [.roomMembership(roomId: "")]))) joinRule: .knockRestricted(rules: [.roomMembership(roomId: "")]))
let spaceRoomListProxy = SpaceRoomListProxyMock(.init(spaceServiceRoom: spaceServiceRoom, let spaceRoomListProxy = SpaceRoomListProxyMock(.init(spaceServiceRoom: spaceServiceRoom,
initialSpaceRooms: isNewSpace ? [] : .mockSpaceList)) initialSpaceRooms: isNewSpace ? [] : .mockSpaceList))
@@ -19,7 +19,7 @@ struct SpacesScreenViewState: BindableState {
var userDisplayName: String? var userDisplayName: String?
var userAvatarURL: URL? var userAvatarURL: URL?
var topLevelSpaces: [SpaceServiceRoomProtocol] var topLevelSpaces: [SpaceServiceRoom]
var selectedSpaceID: String? var selectedSpaceID: String?
var isCreateSpaceEnabled: Bool var isCreateSpaceEnabled: Bool
@@ -85,7 +85,7 @@ class SpacesScreenViewModel: SpacesScreenViewModelType, SpacesScreenViewModelPro
// MARK: - Private // MARK: - Private
private func selectSpace(_ spaceServiceRoom: SpaceServiceRoomProtocol) async { private func selectSpace(_ spaceServiceRoom: SpaceServiceRoom) async {
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceServiceRoom.id) { switch await spaceServiceProxy.spaceRoomList(spaceID: spaceServiceRoom.id) {
case .success(let spaceRoomListProxy): case .success(let spaceRoomListProxy):
actionsSubject.send(.selectSpace(spaceRoomListProxy)) actionsSubject.send(.selectSpace(spaceRoomListProxy))
@@ -87,12 +87,12 @@ final class LeaveSpaceHandleProxy {
} }
@Observable class LeaveSpaceRoomDetails { @Observable class LeaveSpaceRoomDetails {
let spaceServiceRoom: SpaceServiceRoomProtocol let spaceServiceRoom: SpaceServiceRoom
let canLeave: Bool let canLeave: Bool
let areCreatorsPrivileged: Bool let areCreatorsPrivileged: Bool
var isSelected: Bool var isSelected: Bool
init(spaceServiceRoom: SpaceServiceRoomProtocol, isLastOwner: Bool, areCreatorsPrivileged: Bool, isSelected: Bool) { init(spaceServiceRoom: SpaceServiceRoom, isLastOwner: Bool, areCreatorsPrivileged: Bool, isSelected: Bool) {
self.spaceServiceRoom = spaceServiceRoom self.spaceServiceRoom = spaceServiceRoom
canLeave = !isLastOwner || spaceServiceRoom.joinedMembersCount == 1 canLeave = !isLastOwner || spaceServiceRoom.joinedMembersCount == 1
self.isSelected = isSelected self.isSelected = isSelected
@@ -15,14 +15,14 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
private let spaceRoomList: SpaceRoomListProtocol private let spaceRoomList: SpaceRoomListProtocol
private var spaceServiceRoomHandle: TaskHandle? private var spaceServiceRoomHandle: TaskHandle?
private let spaceServiceRoomSubject: CurrentValueSubject<SpaceServiceRoomProtocol, Never> private let spaceServiceRoomSubject: CurrentValueSubject<SpaceServiceRoom, Never>
var spaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoomProtocol, Never> { var spaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoom, Never> {
spaceServiceRoomSubject.asCurrentValuePublisher() spaceServiceRoomSubject.asCurrentValuePublisher()
} }
private var spaceRoomsHandle: TaskHandle? private var spaceRoomsHandle: TaskHandle?
private let spaceRoomsSubject = CurrentValueSubject<[SpaceServiceRoomProtocol], Never>([]) private let spaceRoomsSubject = CurrentValueSubject<[SpaceServiceRoom], Never>([])
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> { var spaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoom], Never> {
spaceRoomsSubject.asCurrentValuePublisher() spaceRoomsSubject.asCurrentValuePublisher()
} }
@@ -17,8 +17,8 @@ enum SpaceRoomListProxyError: Error {
protocol SpaceRoomListProxyProtocol { protocol SpaceRoomListProxyProtocol {
var id: String { get } var id: String { get }
var spaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoomProtocol, Never> { get } var spaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoom, Never> { get }
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> { get } var spaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoom], Never> { get }
var paginationStatePublisher: CurrentValuePublisher<SpaceRoomListPaginationState, Never> { get } var paginationStatePublisher: CurrentValuePublisher<SpaceRoomListPaginationState, Never> { get }
func paginate() async func paginate() async
@@ -14,8 +14,8 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
private let spaceService: SpaceServiceProtocol private let spaceService: SpaceServiceProtocol
private var topLevelSpacesHandle: TaskHandle? private var topLevelSpacesHandle: TaskHandle?
private let spacesSubject = CurrentValueSubject<[SpaceServiceRoomProtocol], Never>([]) private let spacesSubject = CurrentValueSubject<[SpaceServiceRoom], Never>([])
var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> { var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoom], Never> {
spacesSubject.asCurrentValuePublisher() spacesSubject.asCurrentValuePublisher()
} }
@@ -50,7 +50,7 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
} }
} }
func spaceForIdentifier(spaceID: String) async -> Result<SpaceServiceRoomProtocol?, SpaceServiceProxyError> { func spaceForIdentifier(spaceID: String) async -> Result<SpaceServiceRoom?, SpaceServiceProxyError> {
do { do {
return try await .success(spaceService.getSpaceRoom(roomId: spaceID).map(SpaceServiceRoom.init)) return try await .success(spaceService.getSpaceRoom(roomId: spaceID).map(SpaceServiceRoom.init))
} catch { } catch {
@@ -68,7 +68,7 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
} }
} }
func joinedParents(childID: String) async -> Result<[SpaceServiceRoomProtocol], SpaceServiceProxyError> { func joinedParents(childID: String) async -> Result<[SpaceServiceRoom], SpaceServiceProxyError> {
do { do {
return try await .success(spaceService.joinedParentsOfChild(childId: childID).map(SpaceServiceRoom.init)) return try await .success(spaceService.joinedParentsOfChild(childId: childID).map(SpaceServiceRoom.init))
} catch { } catch {
@@ -77,7 +77,7 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
} }
} }
func editableSpaces() async -> [SpaceServiceRoomProtocol] { func editableSpaces() async -> [SpaceServiceRoom] {
await spaceService.editableSpaces().map(SpaceServiceRoom.init) await spaceService.editableSpaces().map(SpaceServiceRoom.init)
} }
@@ -15,11 +15,11 @@ enum SpaceServiceProxyError: Error {
} }
struct SpaceServiceFilter: Identifiable, Equatable { struct SpaceServiceFilter: Identifiable, Equatable {
let room: SpaceServiceRoomProtocol let room: SpaceServiceRoom
let level: UInt let level: UInt
let descendants: Set<String> let descendants: Set<String>
init(room: SpaceServiceRoomProtocol, level: UInt, descendants: Set<String>) { init(room: SpaceServiceRoom, level: UInt, descendants: Set<String>) {
self.room = room self.room = room
self.level = level self.level = level
self.descendants = descendants self.descendants = descendants
@@ -43,17 +43,17 @@ struct SpaceServiceFilter: Identifiable, Equatable {
// sourcery: AutoMockable // sourcery: AutoMockable
protocol SpaceServiceProxyProtocol { protocol SpaceServiceProxyProtocol {
var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> { get } var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoom], Never> { get }
var spaceFilterPublisher: CurrentValuePublisher<[SpaceServiceFilter], Never> { get } var spaceFilterPublisher: CurrentValuePublisher<[SpaceServiceFilter], Never> { get }
func spaceRoomList(spaceID: String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> func spaceRoomList(spaceID: String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>
/// Returns a joined space given its identifier /// Returns a joined space given its identifier
func spaceForIdentifier(spaceID: String) async -> Result<SpaceServiceRoomProtocol?, SpaceServiceProxyError> func spaceForIdentifier(spaceID: String) async -> Result<SpaceServiceRoom?, SpaceServiceProxyError>
func leaveSpace(spaceID: String) async -> Result<LeaveSpaceHandleProxy, SpaceServiceProxyError> func leaveSpace(spaceID: String) async -> Result<LeaveSpaceHandleProxy, SpaceServiceProxyError>
/// Returns all the parent spaces of a child that user has joined. /// Returns all the parent spaces of a child that user has joined.
func joinedParents(childID: String) async -> Result<[SpaceServiceRoomProtocol], SpaceServiceProxyError> func joinedParents(childID: String) async -> Result<[SpaceServiceRoom], SpaceServiceProxyError>
/// Returns all the joined spaces that can be edited by the user /// Returns all the joined spaces that can be edited by the user
func editableSpaces() async -> [SpaceServiceRoomProtocol] func editableSpaces() async -> [SpaceServiceRoom]
/// Adds a room (or space) as a child of another space. /// Adds a room (or space) as a child of another space.
func addChild(_ childID: String, to spaceID: String) async -> Result<Void, SpaceServiceProxyError> func addChild(_ childID: String, to spaceID: String) async -> Result<Void, SpaceServiceProxyError>
@@ -9,7 +9,14 @@
import Foundation import Foundation
import MatrixRustSDK import MatrixRustSDK
struct SpaceServiceRoom: SpaceServiceRoomProtocol { enum SpaceServiceRoomVisibility: Equatable {
case `public`
case `private`
case restricted
// We can add the external case in here eventually.
}
struct SpaceServiceRoom {
var id: String var id: String
var name: String var name: String
var rawName: String? var rawName: String?
@@ -30,6 +37,31 @@ struct SpaceServiceRoom: SpaceServiceRoomProtocol {
var state: Membership? var state: Membership?
var via: [String] var via: [String]
var avatar: RoomAvatar {
if isSpace {
.space(id: id, name: name, avatarURL: avatarURL)
} else if isDirect == true, avatarURL == nil, heroes.count == 1 {
.heroes(heroes)
} else {
.room(id: id, name: name, avatarURL: avatarURL)
}
}
var visibility: SpaceServiceRoomVisibility? {
switch joinRule {
case .public:
.public
case .restricted, .knockRestricted:
.restricted
case .invite, .knock, .private, .custom:
.private
case .none:
.none
}
}
}
extension SpaceServiceRoom {
init(spaceRoom: SpaceRoom) { init(spaceRoom: SpaceRoom) {
id = spaceRoom.roomId id = spaceRoom.roomId
name = spaceRoom.displayName name = spaceRoom.displayName
@@ -51,4 +83,193 @@ struct SpaceServiceRoom: SpaceServiceRoomProtocol {
state = spaceRoom.state state = spaceRoom.state
via = spaceRoom.via via = spaceRoom.via
} }
// MARK: - Mocks
static func mock(id: String = UUID().uuidString,
name: String? = nil,
rawName: String? = nil,
avatarURL: URL? = nil,
isSpace: Bool,
isDirect: Bool? = nil,
childrenCount: Int = 0,
joinedMembersCount: Int = 0,
heroes: [UserProfileProxy] = [],
topic: String? = nil,
canonicalAlias: String? = nil,
joinRule: JoinRule? = nil,
worldReadable: Bool? = nil,
guestCanJoin: Bool = true,
state: Membership? = nil,
via: [String] = []) -> Self {
SpaceServiceRoom(id: id,
name: name ?? id,
rawName: rawName,
avatarURL: avatarURL,
isSpace: isSpace,
isDirect: isDirect,
childrenCount: childrenCount,
joinedMembersCount: joinedMembersCount,
heroes: heroes,
topic: topic,
canonicalAlias: canonicalAlias,
joinRule: joinRule,
worldReadable: worldReadable,
guestCanJoin: guestCanJoin,
state: state,
via: via)
}
static func mock(joinRoomScreenMode: JoinRoomScreenMode) -> Self {
var state: Membership?
var joinRule: JoinRule?
switch joinRoomScreenMode {
case .joinable:
joinRule = .public
case .restricted:
joinRule = .restricted(rules: [])
case .inviteRequired:
joinRule = .private
case .invited:
state = .invited
joinRule = .private
case .knockable:
joinRule = .knock
case .knocked:
state = .knocked
joinRule = .knock
case .banned:
state = .banned
case .loading, .unknown, .forbidden:
break
}
return SpaceServiceRoom.mock(id: "1",
name: "The Three-Body Problem",
avatarURL: .mockMXCAvatar,
isSpace: true,
childrenCount: 100,
joinedMembersCount: 123,
heroes: [.mockAlice, .mockBob, .mockCharlie],
topic: "“Science and technology were the only keys to opening the door to the future, and people approached science with the faith and sincerity of elementary school students.”",
canonicalAlias: "#3-body-problem:matrix.org",
joinRule: joinRule,
state: state)
}
}
extension [SpaceServiceRoom] {
static var mockJoinedSpaces: [SpaceServiceRoom] {
[
SpaceServiceRoom.mock(id: "space1",
name: "The Foundation",
isSpace: true,
childrenCount: 1,
joinedMembersCount: 500,
canonicalAlias: "#the-foundation:matrix.org",
state: .joined),
SpaceServiceRoom.mock(id: "space2",
name: "The Second Foundation",
isSpace: true,
childrenCount: 1,
joinedMembersCount: 100,
state: .joined),
SpaceServiceRoom.mock(id: "space3",
name: "The Galactic Empire",
isSpace: true,
childrenCount: 25000,
joinedMembersCount: 1_000_000_000,
canonicalAlias: "#the-galactic-empire:matrix.org",
state: .joined),
SpaceServiceRoom.mock(id: "space4",
name: "The Korellians",
isSpace: true,
childrenCount: 27,
joinedMembersCount: 2_000_000,
state: .joined),
SpaceServiceRoom.mock(id: "space5",
name: "The Luminists",
isSpace: true,
childrenCount: 1,
joinedMembersCount: 100_000,
state: .joined),
SpaceServiceRoom.mock(id: "space6",
name: "The Anacreons",
isSpace: true,
childrenCount: 25,
joinedMembersCount: 400_000,
state: .joined),
SpaceServiceRoom.mock(id: "space7",
name: "The Thespians",
isSpace: true,
childrenCount: 15,
joinedMembersCount: 300_000,
state: .joined)
]
}
static var mockJoinedSpaces2: [SpaceServiceRoom] {
[
SpaceServiceRoom.mock(id: "space1",
name: "The Foundation",
avatarURL: .mockMXCAvatar,
isSpace: true,
childrenCount: 1,
joinedMembersCount: 500,
canonicalAlias: "#the-foundation:matrix.org",
joinRule: .private,
state: .joined),
SpaceServiceRoom.mock(id: "space2",
name: "The Second Foundation",
isSpace: true,
childrenCount: 1,
joinedMembersCount: 100,
state: .joined),
SpaceServiceRoom.mock(id: "space3",
name: "The Galactic Empire",
isSpace: true,
childrenCount: 25000,
joinedMembersCount: 1_000_000_000,
canonicalAlias: "#the-galactic-empire:matrix.org",
state: .joined)
]
}
static var mockSpaceList: [SpaceServiceRoom] {
makeSpaceRooms(isSpace: true) + makeSpaceRooms(isSpace: false)
}
static var mockSingleRoom: [SpaceServiceRoom] {
[SpaceServiceRoom.mock(id: "!spaceroom:matrix.org",
name: "Management",
isSpace: false,
joinedMembersCount: 12,
topic: "This is where everything gets organised 📋.",
state: .joined)]
}
private static func makeSpaceRooms(isSpace: Bool) -> [SpaceServiceRoom] {
let typeName = isSpace ? "Space" : "Room"
return [
SpaceServiceRoom.mock(id: "!\(typeName.lowercased())1:matrix.org",
name: "Company \(typeName)",
isSpace: isSpace),
SpaceServiceRoom.mock(id: "!\(typeName.lowercased())2:matrix.org",
name: "Public \(typeName)",
avatarURL: .mockMXCAvatar,
isSpace: isSpace,
joinedMembersCount: 78,
topic: "Discussion on specific topic goes here.",
joinRule: .public),
SpaceServiceRoom.mock(id: "!\(typeName.lowercased())3:matrix.org",
name: "Joined \(typeName)",
isSpace: isSpace,
joinedMembersCount: 123,
topic: "Discussion on specific topic goes here.",
joinRule: .restricted(rules: []),
state: .joined)
]
}
} }
@@ -1,65 +0,0 @@
//
// Copyright 2025 Element Creations Ltd.
// Copyright 2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import Foundation
import MatrixRustSDK
enum SpaceServiceRoomVisibility: Equatable {
case `public`
case `private`
case restricted
// We can add the external case in here eventually.
}
// sourcery: AutoMockable
protocol SpaceServiceRoomProtocol {
var id: String { get }
var name: String { get }
var rawName: String? { get }
var avatarURL: URL? { get }
var isSpace: Bool { get }
var isDirect: Bool? { get }
var childrenCount: Int { get }
var joinedMembersCount: Int { get }
var heroes: [UserProfileProxy] { get }
var topic: String? { get }
var canonicalAlias: String? { get }
var joinRule: JoinRule? { get }
var worldReadable: Bool? { get }
var guestCanJoin: Bool { get }
var state: Membership? { get }
var via: [String] { get }
}
extension SpaceServiceRoomProtocol {
var avatar: RoomAvatar {
if isSpace {
.space(id: id, name: name, avatarURL: avatarURL)
} else if isDirect == true, avatarURL == nil, heroes.count == 1 {
.heroes(heroes)
} else {
.room(id: id, name: name, avatarURL: avatarURL)
}
}
var visibility: SpaceServiceRoomVisibility? {
switch joinRule {
case .public:
.public
case .restricted, .knockRestricted:
.restricted
case .invite, .knock, .private, .custom:
.private
case .none:
.none
}
}
}
@@ -598,7 +598,7 @@ class MockScreen: Identifiable {
deviceID: "MOCKCLIENT", deviceID: "MOCKCLIENT",
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(roomSummaries))), roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(roomSummaries))),
spaceServiceConfiguration: .init(topLevelSpaces: .mockSpaceList.filter(\.isSpace) + .mockSingleRoom), spaceServiceConfiguration: .init(topLevelSpaces: .mockSpaceList.filter(\.isSpace) + .mockSingleRoom),
roomPreviews: [SpaceServiceRoomProtocol].mockSpaceList.map(RoomPreviewProxyMock.init), roomPreviews: [SpaceServiceRoom].mockSpaceList.map(RoomPreviewProxyMock.init),
defaultRoomMembers: .allMembersAsAdmin)) defaultRoomMembers: .allMembersAsAdmin))
clientProxy.recentlyVisitedRoomsFilterReturnValue = .mockRooms clientProxy.recentlyVisitedRoomsFilterReturnValue = .mockRooms
@@ -223,7 +223,7 @@ class CreateRoomScreenViewModelTests: XCTestCase {
} }
func testCreateRoomInASelectedSpaceFromTheList() async throws { func testCreateRoomInASelectedSpaceFromTheList() async throws {
let spaces = [SpaceServiceRoomProtocol].mockJoinedSpaces2 let spaces = [SpaceServiceRoom].mockJoinedSpaces2
setup() setup()
context.send(viewAction: .updateRoomName("A")) context.send(viewAction: .updateRoomName("A"))
@@ -272,7 +272,7 @@ class CreateRoomScreenViewModelTests: XCTestCase {
} }
func testCreateRoomInAnAlreadySelectedSpace() async throws { func testCreateRoomInAnAlreadySelectedSpace() async throws {
let space = SpaceServiceRoomMock(.init(isSpace: true, joinRule: .private)) let space = SpaceServiceRoom.mock(isSpace: true, joinRule: .private)
setup(spacesSelectionMode: .preSelected(space)) setup(spacesSelectionMode: .preSelected(space))
context.send(viewAction: .updateRoomName("A")) context.send(viewAction: .updateRoomName("A"))
@@ -307,7 +307,7 @@ class CreateRoomScreenViewModelTests: XCTestCase {
} }
func testCreateRoomInAnPublicSpaceAvailableTypes() async throws { func testCreateRoomInAnPublicSpaceAvailableTypes() async throws {
let space = SpaceServiceRoomMock(.init(isSpace: true, joinRule: .public)) let space = SpaceServiceRoom.mock(isSpace: true, joinRule: .public)
setup(spacesSelectionMode: .preSelected(space)) setup(spacesSelectionMode: .preSelected(space))
// Given a form with a blank topic. // Given a form with a blank topic.
@@ -311,7 +311,7 @@ class HomeScreenViewModelTests: XCTestCase {
XCTAssertEqual(invitedRoomIDs.count, 2) XCTAssertEqual(invitedRoomIDs.count, 2)
let deferred = deferFulfillment(viewModel.actions) { let deferred = deferFulfillment(viewModel.actions) {
$0 == .presentSpace(SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: invitedRoomIDs[0], isSpace: true))))) $0 == .presentSpace(SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoom.mock(id: invitedRoomIDs[0], isSpace: true))))
} }
context.send(viewAction: .acceptInvite(roomIdentifier: invitedRoomIDs[0])) context.send(viewAction: .acceptInvite(roomIdentifier: invitedRoomIDs[0]))
try await deferred.fulfill() try await deferred.fulfill()
@@ -408,7 +408,7 @@ class HomeScreenViewModelTests: XCTestCase {
let spaceServiceProxy = SpaceServiceProxyMock(.init()) let spaceServiceProxy = SpaceServiceProxyMock(.init())
spaceServiceProxy.spaceRoomListSpaceIDClosure = { spaceID in spaceServiceProxy.spaceRoomListSpaceIDClosure = { spaceID in
.success(SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: spaceID, isSpace: true))))) .success(SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoom.mock(id: spaceID, isSpace: true))))
} }
clientProxy.underlyingSpaceService = spaceServiceProxy clientProxy.underlyingSpaceService = spaceServiceProxy
case nil: case nil:
@@ -29,7 +29,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
} }
func testSetSingleJoinedSpaceMembersAccess() async throws { func testSetSingleJoinedSpaceMembersAccess() async throws {
let singleRoom = [SpaceServiceRoomProtocol].mockSingleRoom let singleRoom = [SpaceServiceRoom].mockSingleRoom
let space = singleRoom[0] let space = singleRoom[0]
setupViewModel(joinedParentSpaces: singleRoom, joinRule: .public) setupViewModel(joinedParentSpaces: singleRoom, joinRule: .public)
@@ -60,7 +60,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
} }
func testSetSingleJoinedAskToJoinWithSpaceMembersAccess() async throws { func testSetSingleJoinedAskToJoinWithSpaceMembersAccess() async throws {
let singleRoom = [SpaceServiceRoomProtocol].mockSingleRoom let singleRoom = [SpaceServiceRoom].mockSingleRoom
let space = singleRoom[0] let space = singleRoom[0]
setupViewModel(joinedParentSpaces: singleRoom, joinRule: .public) setupViewModel(joinedParentSpaces: singleRoom, joinRule: .public)
@@ -91,7 +91,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
} }
func testSingleUnknownSpaceMembersAccessCanBeReselected() async throws { func testSingleUnknownSpaceMembersAccessCanBeReselected() async throws {
let singleRoom = [SpaceServiceRoomProtocol].mockSingleRoom let singleRoom = [SpaceServiceRoom].mockSingleRoom
let space = singleRoom[0] let space = singleRoom[0]
setupViewModel(joinedParentSpaces: [], joinRule: .restricted(rules: [.roomMembership(roomId: space.id)])) setupViewModel(joinedParentSpaces: [], joinRule: .restricted(rules: [.roomMembership(roomId: space.id)]))
@@ -122,7 +122,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
} }
func testMultipleKnownSpacesMembersSelection() async throws { func testMultipleKnownSpacesMembersSelection() async throws {
let spaces = [SpaceServiceRoomProtocol].mockJoinedSpaces2 let spaces = [SpaceServiceRoom].mockJoinedSpaces2
setupViewModel(joinedParentSpaces: spaces, joinRule: .public) setupViewModel(joinedParentSpaces: spaces, joinRule: .public)
let deferred = deferFulfillment(context.$viewState) { $0.selectableJoinedSpaces.count == 3 } let deferred = deferFulfillment(context.$viewState) { $0.selectableJoinedSpaces.count == 3 }
@@ -166,7 +166,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
} }
func testMultipleKnownAskToJoinSpacesMembersSelection() async throws { func testMultipleKnownAskToJoinSpacesMembersSelection() async throws {
let spaces = [SpaceServiceRoomProtocol].mockJoinedSpaces2 let spaces = [SpaceServiceRoom].mockJoinedSpaces2
setupViewModel(joinedParentSpaces: spaces, joinRule: .public) setupViewModel(joinedParentSpaces: spaces, joinRule: .public)
let deferred = deferFulfillment(context.$viewState) { $0.selectableJoinedSpaces.count == 3 } let deferred = deferFulfillment(context.$viewState) { $0.selectableJoinedSpaces.count == 3 }
@@ -210,7 +210,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
} }
func testMultipleSpacesMembersSelection() async throws { func testMultipleSpacesMembersSelection() async throws {
let spaces = [SpaceServiceRoomProtocol].mockJoinedSpaces2 let spaces = [SpaceServiceRoom].mockJoinedSpaces2
setupViewModel(joinedParentSpaces: spaces, setupViewModel(joinedParentSpaces: spaces,
joinRule: .restricted(rules: [.roomMembership(roomId: "unknownSpaceID")])) joinRule: .restricted(rules: [.roomMembership(roomId: "unknownSpaceID")]))
@@ -256,8 +256,8 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
} }
func testMultipleSpacesMembersSelectionWithAnExistingNonParentButJoinedSpace() async throws { func testMultipleSpacesMembersSelectionWithAnExistingNonParentButJoinedSpace() async throws {
let joinedParentSpaces = [SpaceServiceRoomProtocol].mockJoinedSpaces2 let joinedParentSpaces = [SpaceServiceRoom].mockJoinedSpaces2
let singleRoom = [SpaceServiceRoomProtocol].mockSingleRoom let singleRoom = [SpaceServiceRoom].mockSingleRoom
let space = singleRoom[0] let space = singleRoom[0]
let allSpaces = joinedParentSpaces + singleRoom let allSpaces = joinedParentSpaces + singleRoom
setupViewModel(joinedParentSpaces: joinedParentSpaces, setupViewModel(joinedParentSpaces: joinedParentSpaces,
@@ -319,7 +319,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
func testEmptySpaceMembersSelectionWithJoinedParentEdgeCase() async throws { func testEmptySpaceMembersSelectionWithJoinedParentEdgeCase() async throws {
// Edge case where there is one available joined parent but the room has a restricted join rule. // Edge case where there is one available joined parent but the room has a restricted join rule.
// With no space ids in it // With no space ids in it
let singleRoom = [SpaceServiceRoomProtocol].mockSingleRoom let singleRoom = [SpaceServiceRoom].mockSingleRoom
setupViewModel(joinedParentSpaces: singleRoom, setupViewModel(joinedParentSpaces: singleRoom,
joinRule: .restricted(rules: [])) joinRule: .restricted(rules: []))
@@ -424,8 +424,8 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
// MARK: - Helpers // MARK: - Helpers
private func setupViewModel(joinedParentSpaces: [SpaceServiceRoomProtocol], private func setupViewModel(joinedParentSpaces: [SpaceServiceRoom],
topLevelSpaces: [SpaceServiceRoomProtocol] = [], topLevelSpaces: [SpaceServiceRoom] = [],
joinRule: JoinRule) { joinRule: JoinRule) {
let appSettings = AppSettings() let appSettings = AppSettings()
appSettings.spaceSettingsEnabled = true appSettings.spaceSettingsEnabled = true
@@ -93,7 +93,7 @@ class SpaceAddRoomsScreenViewModelTests: XCTestCase {
func setupViewModel() { func setupViewModel() {
let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))) let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
spaceRoomListProxy = SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoomMock(.init(isSpace: true)))) spaceRoomListProxy = SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoom.mock(isSpace: true)))
let clientProxy = ClientProxyMock(.init()) let clientProxy = ClientProxyMock(.init())
clientProxy.recentlyVisitedRoomsFilterReturnValue = .init(repeating: JoinedRoomProxyMock(.init()), count: 5) clientProxy.recentlyVisitedRoomsFilterReturnValue = .init(repeating: JoinedRoomProxyMock(.init()), count: 5)
@@ -13,7 +13,7 @@ import XCTest
@MainActor @MainActor
class SpacesScreenViewModelTests: XCTestCase { class SpacesScreenViewModelTests: XCTestCase {
var topLevelSpacesSubject: CurrentValueSubject<[SpaceServiceRoomProtocol], Never>! var topLevelSpacesSubject: CurrentValueSubject<[SpaceServiceRoom], Never>!
var spaceServiceProxy: SpaceServiceProxyMock! var spaceServiceProxy: SpaceServiceProxyMock!
var appSettings: AppSettings! var appSettings: AppSettings!
@@ -47,7 +47,7 @@ class SpacesScreenViewModelTests: XCTestCase {
deferred = deferFulfillment(context.observe(\.viewState.topLevelSpaces)) { $0.count == 1 } deferred = deferFulfillment(context.observe(\.viewState.topLevelSpaces)) { $0.count == 1 }
topLevelSpacesSubject.send([ topLevelSpacesSubject.send([
SpaceServiceRoomMock(.init(isSpace: true)) SpaceServiceRoom.mock(isSpace: true)
]) ])
try await deferred.fulfill() try await deferred.fulfill()
XCTAssertEqual(context.viewState.topLevelSpaces.count, 1) XCTAssertEqual(context.viewState.topLevelSpaces.count, 1)
@@ -97,9 +97,9 @@ class SpacesScreenViewModelTests: XCTestCase {
let userSession = UserSessionMock(.init(clientProxy: clientProxy)) let userSession = UserSessionMock(.init(clientProxy: clientProxy))
topLevelSpacesSubject = .init([ topLevelSpacesSubject = .init([
SpaceServiceRoomMock(.init(id: "space1", isSpace: true)), SpaceServiceRoom.mock(id: "space1", isSpace: true),
SpaceServiceRoomMock(.init(id: "space2", isSpace: true)), SpaceServiceRoom.mock(id: "space2", isSpace: true),
SpaceServiceRoomMock(.init(id: "space3", isSpace: true)) SpaceServiceRoom.mock(id: "space3", isSpace: true)
]) ])
spaceServiceProxy = SpaceServiceProxyMock(.init()) spaceServiceProxy = SpaceServiceProxyMock(.init())
spaceServiceProxy.topLevelSpacesPublisher = topLevelSpacesSubject.asCurrentValuePublisher() spaceServiceProxy.topLevelSpacesPublisher = topLevelSpacesSubject.asCurrentValuePublisher()
@@ -17,7 +17,7 @@ import MatrixRustSDKMocks
class SpaceScreenViewModelTests: XCTestCase { class SpaceScreenViewModelTests: XCTestCase {
var spaceRoomListProxy: SpaceRoomListProxyMock! var spaceRoomListProxy: SpaceRoomListProxyMock!
var spaceServiceProxy: SpaceServiceProxyMock! var spaceServiceProxy: SpaceServiceProxyMock!
let mockSpaceRooms = [SpaceServiceRoomProtocol].mockSpaceList let mockSpaceRooms = [SpaceServiceRoom].mockSpaceList
var clientProxy: ClientProxyMock! var clientProxy: ClientProxyMock!
var paginationStateSubject: CurrentValueSubject<SpaceRoomListPaginationState, Never> = .init(.idle(endReached: true)) var paginationStateSubject: CurrentValueSubject<SpaceRoomListPaginationState, Never> = .init(.idle(endReached: true))
var rustLeaveHandle: LeaveSpaceHandleSDKMock! var rustLeaveHandle: LeaveSpaceHandleSDKMock!
@@ -308,8 +308,8 @@ class SpaceScreenViewModelTests: XCTestCase {
// MARK: - Helpers // MARK: - Helpers
private func setupViewModel(initialSpaceRooms: [SpaceServiceRoomProtocol] = [], paginationResponses: [[SpaceServiceRoomProtocol]] = []) { private func setupViewModel(initialSpaceRooms: [SpaceServiceRoom] = [], paginationResponses: [[SpaceServiceRoom]] = []) {
spaceRoomListProxy = SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoomMock(.init(isSpace: true)), spaceRoomListProxy = SpaceRoomListProxyMock(.init(spaceServiceRoom: SpaceServiceRoom.mock(isSpace: true),
initialSpaceRooms: initialSpaceRooms, initialSpaceRooms: initialSpaceRooms,
paginationStateSubject: paginationStateSubject, paginationStateSubject: paginationStateSubject,
paginationResponses: paginationResponses)) paginationResponses: paginationResponses))