Enable room list invites by default and remove old code paths

This commit is contained in:
Stefan Ceriu
2024-05-09 12:05:28 +03:00
committed by Stefan Ceriu
parent 4e670d1502
commit 0548450b6b
60 changed files with 27 additions and 1155 deletions

View File

@@ -158,7 +158,6 @@
256D76972BA3254F7CB7F88B /* LocationAnnotation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAD8234D0E9C9B12BF9F240B /* LocationAnnotation.swift */; }; 256D76972BA3254F7CB7F88B /* LocationAnnotation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAD8234D0E9C9B12BF9F240B /* LocationAnnotation.swift */; };
25C4C1100B6EA79F5CC7CBB5 /* AppLockSetupPINScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 989D7380D9C86B3A10D30B13 /* AppLockSetupPINScreenViewModelTests.swift */; }; 25C4C1100B6EA79F5CC7CBB5 /* AppLockSetupPINScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 989D7380D9C86B3A10D30B13 /* AppLockSetupPINScreenViewModelTests.swift */; };
260FFC1475EE94F641C3F3F9 /* PollFormScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A40F1985065500F0E7F61A27 /* PollFormScreenViewModelProtocol.swift */; }; 260FFC1475EE94F641C3F3F9 /* PollFormScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A40F1985065500F0E7F61A27 /* PollFormScreenViewModelProtocol.swift */; };
266C4DF893F2947DCCEF327B /* InvitesScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC14E5209C262530E19BC4C1 /* InvitesScreenViewModelTests.swift */; };
2689D22EF1D10D22B0A4DAEA /* NotificationContentBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7BB243B26D54EF1A0C422C0 /* NotificationContentBuilder.swift */; }; 2689D22EF1D10D22B0A4DAEA /* NotificationContentBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7BB243B26D54EF1A0C422C0 /* NotificationContentBuilder.swift */; };
273AB64B9A26B61C51858867 /* AsyncSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = A73A07BAEDD74C48795A996A /* AsyncSequence.swift */; }; 273AB64B9A26B61C51858867 /* AsyncSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = A73A07BAEDD74C48795A996A /* AsyncSequence.swift */; };
274CE3C986841D15FD530BF5 /* ShimmerModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97CE98208321C4D66E363612 /* ShimmerModifier.swift */; }; 274CE3C986841D15FD530BF5 /* ShimmerModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97CE98208321C4D66E363612 /* ShimmerModifier.swift */; };
@@ -178,7 +177,6 @@
2A90DD14DE5C891BFA433950 /* TimelineReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE0E6043EFCF6FD2A341861 /* TimelineReplyView.swift */; }; 2A90DD14DE5C891BFA433950 /* TimelineReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE0E6043EFCF6FD2A341861 /* TimelineReplyView.swift */; };
2AAB2A77F1762A2648078A30 /* InteractiveQuickLook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 638A81B97D51591D0FCFA598 /* InteractiveQuickLook.swift */; }; 2AAB2A77F1762A2648078A30 /* InteractiveQuickLook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 638A81B97D51591D0FCFA598 /* InteractiveQuickLook.swift */; };
2ABF11717C64054CEF2819A3 /* RoomTimelineController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F85164F9475FF2867F71AAA /* RoomTimelineController.swift */; }; 2ABF11717C64054CEF2819A3 /* RoomTimelineController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F85164F9475FF2867F71AAA /* RoomTimelineController.swift */; };
2AD59AD5B09498EF8B3B04EC /* InvitesScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E1BBA73B611EDEEA6E20E05 /* InvitesScreenModels.swift */; };
2B1E080B32167AE9EFC763A2 /* TimelineTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27B8315A340B46F98B9C5AF0 /* TimelineTableViewController.swift */; }; 2B1E080B32167AE9EFC763A2 /* TimelineTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27B8315A340B46F98B9C5AF0 /* TimelineTableViewController.swift */; };
2B97BCE72D86645F1485C976 /* RoomDirectorySearchMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 894EE8F5B399A165BA2A6634 /* RoomDirectorySearchMock.swift */; }; 2B97BCE72D86645F1485C976 /* RoomDirectorySearchMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 894EE8F5B399A165BA2A6634 /* RoomDirectorySearchMock.swift */; };
2BA59D0AEFB4B82A2EC2A326 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 50009897F60FAE7D63EF5E5B /* Kingfisher */; }; 2BA59D0AEFB4B82A2EC2A326 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 50009897F60FAE7D63EF5E5B /* Kingfisher */; };
@@ -406,7 +404,6 @@
642DF13C49ED4121C148230E /* TestablePreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1E227F34BE43B08E098796E /* TestablePreview.swift */; }; 642DF13C49ED4121C148230E /* TestablePreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1E227F34BE43B08E098796E /* TestablePreview.swift */; };
6448F8D1D3CA4CD27BB4CADD /* RoomMemberProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F36C5D9B37E50915ECBD3EE /* RoomMemberProxy.swift */; }; 6448F8D1D3CA4CD27BB4CADD /* RoomMemberProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F36C5D9B37E50915ECBD3EE /* RoomMemberProxy.swift */; };
64AB99285DC4437C0DDE9585 /* MenuSheetLabelStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49ABAB186CF00B15C5521D04 /* MenuSheetLabelStyle.swift */; }; 64AB99285DC4437C0DDE9585 /* MenuSheetLabelStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49ABAB186CF00B15C5521D04 /* MenuSheetLabelStyle.swift */; };
64C373ACCFA26D42BA45CFAD /* HomeScreenInvitesButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24227FF9A2797F6EA7F69CDD /* HomeScreenInvitesButton.swift */; };
64D05250CEDE8B604119F6E6 /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981663D961C94270FA035FD0 /* Alert.swift */; }; 64D05250CEDE8B604119F6E6 /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981663D961C94270FA035FD0 /* Alert.swift */; };
64E541F88F35BD126C4AFCA1 /* AppLockScreenPINKeypad.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38345442415E07A931197C55 /* AppLockScreenPINKeypad.swift */; }; 64E541F88F35BD126C4AFCA1 /* AppLockScreenPINKeypad.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38345442415E07A931197C55 /* AppLockScreenPINKeypad.swift */; };
64F43D7390DA2A0AFD6BA911 /* VideoRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1941C8817E6B6971BA4415F5 /* VideoRoomTimelineView.swift */; }; 64F43D7390DA2A0AFD6BA911 /* VideoRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1941C8817E6B6971BA4415F5 /* VideoRoomTimelineView.swift */; };
@@ -416,7 +413,6 @@
6530865EB9A8C0F0AF0216DA /* ServerSelectionScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9501D11B4258DFA33BA3B40F /* ServerSelectionScreenModels.swift */; }; 6530865EB9A8C0F0AF0216DA /* ServerSelectionScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9501D11B4258DFA33BA3B40F /* ServerSelectionScreenModels.swift */; };
654E802C127B84554042903E /* AnalyticsSettingsScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECD5FCBA169B6A82F501CA1B /* AnalyticsSettingsScreenViewModelProtocol.swift */; }; 654E802C127B84554042903E /* AnalyticsSettingsScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECD5FCBA169B6A82F501CA1B /* AnalyticsSettingsScreenViewModelProtocol.swift */; };
659E5B766F76FDEC1BF393A4 /* RoomDetailsEditScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E413F4CBD7BF0588F394A9DD /* RoomDetailsEditScreenViewModel.swift */; }; 659E5B766F76FDEC1BF393A4 /* RoomDetailsEditScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E413F4CBD7BF0588F394A9DD /* RoomDetailsEditScreenViewModel.swift */; };
65EDA77363BEDC40CDE43B43 /* InvitesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42ADEA322D2089391E049535 /* InvitesScreen.swift */; };
663E198678778F7426A9B27D /* Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9FAFE1C2149E6AC8156ED2B /* Collection.swift */; }; 663E198678778F7426A9B27D /* Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9FAFE1C2149E6AC8156ED2B /* Collection.swift */; };
67160204A8D362BB7D4AD259 /* Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 693E16574C6F7F9FA1015A8C /* Search.swift */; }; 67160204A8D362BB7D4AD259 /* Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 693E16574C6F7F9FA1015A8C /* Search.swift */; };
6786C4B0936AC84D993B20BF /* NotificationSettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5F06F2F09B2EDD067DC2174 /* NotificationSettingsScreen.swift */; }; 6786C4B0936AC84D993B20BF /* NotificationSettingsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5F06F2F09B2EDD067DC2174 /* NotificationSettingsScreen.swift */; };
@@ -490,7 +486,6 @@
764AFCC225B044CF5F9B41E5 /* PaginationIndicatorRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42EEA67A6796BDC2761619C5 /* PaginationIndicatorRoomTimelineView.swift */; }; 764AFCC225B044CF5F9B41E5 /* PaginationIndicatorRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42EEA67A6796BDC2761619C5 /* PaginationIndicatorRoomTimelineView.swift */; };
767D366C40F1311CFA333763 /* PillContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86376BEE425704AEE197CA54 /* PillContext.swift */; }; 767D366C40F1311CFA333763 /* PillContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86376BEE425704AEE197CA54 /* PillContext.swift */; };
7691233E3572A9173FD96CB3 /* SecureBackupKeyBackupScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E88534A39781D76487D59DF /* SecureBackupKeyBackupScreenViewModelTests.swift */; }; 7691233E3572A9173FD96CB3 /* SecureBackupKeyBackupScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E88534A39781D76487D59DF /* SecureBackupKeyBackupScreenViewModelTests.swift */; };
76BA28216FBAF83B2D86A027 /* InvitesScreenCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2A71915C1F075E403F559C /* InvitesScreenCell.swift */; };
7708976CEE6AFB5CFAEFBA68 /* PillTextAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CF1EE0AA78470C674554262 /* PillTextAttachment.swift */; }; 7708976CEE6AFB5CFAEFBA68 /* PillTextAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CF1EE0AA78470C674554262 /* PillTextAttachment.swift */; };
7756C4E90CABE6F14F7920A0 /* BugReportUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6FEA87EA3752203065ECE27 /* BugReportUITests.swift */; }; 7756C4E90CABE6F14F7920A0 /* BugReportUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6FEA87EA3752203065ECE27 /* BugReportUITests.swift */; };
77574A519A4E484880053EAD /* IdentityConfirmationScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FDF541AE914059942B575B4 /* IdentityConfirmationScreenModels.swift */; }; 77574A519A4E484880053EAD /* IdentityConfirmationScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FDF541AE914059942B575B4 /* IdentityConfirmationScreenModels.swift */; };
@@ -502,7 +497,6 @@
77FACC29F98FE2E65BBB6A5F /* ServerSelectionUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054F469E433864CC6FE6EE8E /* ServerSelectionUITests.swift */; }; 77FACC29F98FE2E65BBB6A5F /* ServerSelectionUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054F469E433864CC6FE6EE8E /* ServerSelectionUITests.swift */; };
7807B1DEE32617896886A8E5 /* FormattingToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1E6FAA3719E9B7A2D5510B /* FormattingToolbar.swift */; }; 7807B1DEE32617896886A8E5 /* FormattingToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1E6FAA3719E9B7A2D5510B /* FormattingToolbar.swift */; };
784592335560C2E91D32D177 /* DeveloperOptionsScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B098A612DCB5A7358EECD5 /* DeveloperOptionsScreenModels.swift */; }; 784592335560C2E91D32D177 /* DeveloperOptionsScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B098A612DCB5A7358EECD5 /* DeveloperOptionsScreenModels.swift */; };
78A3392047E9D1C6FEA659B6 /* InvitesScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33649299575BADC34924ABC6 /* InvitesScreenCoordinator.swift */; };
795A854F63301DC6B46217B9 /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BB8DDE245ED86C489BA983 /* AccessibilityIdentifiers.swift */; }; 795A854F63301DC6B46217B9 /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BB8DDE245ED86C489BA983 /* AccessibilityIdentifiers.swift */; };
79741C1953269FF1A211D246 /* RoomPollsHistoryScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E14FF533D25A0692F7CEB0 /* RoomPollsHistoryScreenViewModel.swift */; }; 79741C1953269FF1A211D246 /* RoomPollsHistoryScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E14FF533D25A0692F7CEB0 /* RoomPollsHistoryScreenViewModel.swift */; };
7A02EB29F3B993AB20E0A198 /* RoomPollsHistoryScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C8C368A611B9CB79C7F5FA /* RoomPollsHistoryScreen.swift */; }; 7A02EB29F3B993AB20E0A198 /* RoomPollsHistoryScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C8C368A611B9CB79C7F5FA /* RoomPollsHistoryScreen.swift */; };
@@ -751,7 +745,6 @@
B3EDDEC1839BB5A3747624BB /* FormButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A1CCDEE545CB6453B084BF /* FormButtonStyles.swift */; }; B3EDDEC1839BB5A3747624BB /* FormButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A1CCDEE545CB6453B084BF /* FormButtonStyles.swift */; };
B402708F8728DD0DB7C324E2 /* StartChatScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78910787F967CBC6042A101E /* StartChatScreenViewModelProtocol.swift */; }; B402708F8728DD0DB7C324E2 /* StartChatScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78910787F967CBC6042A101E /* StartChatScreenViewModelProtocol.swift */; };
B444F9C184A377C1B481F07F /* XCUIElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = E992D7B8BE54B2AB454613AF /* XCUIElement.swift */; }; B444F9C184A377C1B481F07F /* XCUIElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = E992D7B8BE54B2AB454613AF /* XCUIElement.swift */; };
B45F20A1C3F1CE19D5B8BA74 /* InvitesScreenUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F61A0DD8243B395499C99A2 /* InvitesScreenUITests.swift */; };
B4A0C69370E6008A971463E7 /* BugReportScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4C89820BB2B88D4EA28131C /* BugReportScreenViewModelProtocol.swift */; }; B4A0C69370E6008A971463E7 /* BugReportScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4C89820BB2B88D4EA28131C /* BugReportScreenViewModelProtocol.swift */; };
B4AAB3257A83B73F53FB2689 /* StateStoreViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F3DFE5B444F131648066F05 /* StateStoreViewModel.swift */; }; B4AAB3257A83B73F53FB2689 /* StateStoreViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F3DFE5B444F131648066F05 /* StateStoreViewModel.swift */; };
B5321A1F5B26A0F3EC54909E /* CollapsibleFlowLayoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC5F5209279A752D98AAC4B2 /* CollapsibleFlowLayoutTests.swift */; }; B5321A1F5B26A0F3EC54909E /* CollapsibleFlowLayoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC5F5209279A752D98AAC4B2 /* CollapsibleFlowLayoutTests.swift */; };
@@ -796,7 +789,6 @@
BD11E639CF566A9DA8FCA717 /* RoundedLabelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */; }; BD11E639CF566A9DA8FCA717 /* RoundedLabelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */; };
BD203FC6A7AE7637EA003643 /* RoomProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ABDE6F66532CBEB0E016F94 /* RoomProxyMock.swift */; }; BD203FC6A7AE7637EA003643 /* RoomProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ABDE6F66532CBEB0E016F94 /* RoomProxyMock.swift */; };
BD6685592716CA957D7BAAC4 /* RoomChangeRolesScreenSelectedItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9B45D584D232CB9E5C7734 /* RoomChangeRolesScreenSelectedItem.swift */; }; BD6685592716CA957D7BAAC4 /* RoomChangeRolesScreenSelectedItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9B45D584D232CB9E5C7734 /* RoomChangeRolesScreenSelectedItem.swift */; };
BD6D98676111DA8FC2BE4908 /* InvitesScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86873A768B13069BB5CAECF6 /* InvitesScreenViewModelProtocol.swift */; };
BD782053BE4C3D2F0BDE5699 /* ServiceLocator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F95CADD0A5DBD76B990FCB /* ServiceLocator.swift */; }; BD782053BE4C3D2F0BDE5699 /* ServiceLocator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F95CADD0A5DBD76B990FCB /* ServiceLocator.swift */; };
BDA68E8D95B2B24B28825B8B /* LoginScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C368CAB3063EF275357ECD4 /* LoginScreenViewModel.swift */; }; BDA68E8D95B2B24B28825B8B /* LoginScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C368CAB3063EF275357ECD4 /* LoginScreenViewModel.swift */; };
BDC4EB54CC3036730475CB8B /* QRCodeLoginScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E7E9B7FEAB6169D960C206 /* QRCodeLoginScreenViewModelTests.swift */; }; BDC4EB54CC3036730475CB8B /* QRCodeLoginScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E7E9B7FEAB6169D960C206 /* QRCodeLoginScreenViewModelTests.swift */; };
@@ -814,7 +806,6 @@
C1D0AB8222D7BAFC9AF9C8C0 /* MapLibreMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 622D09D4ECE759189009AEAF /* MapLibreMapView.swift */; }; C1D0AB8222D7BAFC9AF9C8C0 /* MapLibreMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 622D09D4ECE759189009AEAF /* MapLibreMapView.swift */; };
C26DB49C06C00B5DF1A991A5 /* InviteUsersScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1454CF3AABD242F55C8A2615 /* InviteUsersScreenModels.swift */; }; C26DB49C06C00B5DF1A991A5 /* InviteUsersScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1454CF3AABD242F55C8A2615 /* InviteUsersScreenModels.swift */; };
C2879369106A419A5071F1F8 /* VoiceMessageRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B0A96B8FE4849227945067 /* VoiceMessageRecorder.swift */; }; C2879369106A419A5071F1F8 /* VoiceMessageRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B0A96B8FE4849227945067 /* VoiceMessageRecorder.swift */; };
C287BE1802AD432F3D848D8E /* InvitesScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DF81D7F2A6BA9DE3F6F8D9D /* InvitesScreenViewModel.swift */; };
C32765D740C81AD4C42E8F50 /* CreateRoomFlowParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 935C2FB18EFB8EEE96B26330 /* CreateRoomFlowParameters.swift */; }; C32765D740C81AD4C42E8F50 /* CreateRoomFlowParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 935C2FB18EFB8EEE96B26330 /* CreateRoomFlowParameters.swift */; };
C3317EF833AB4060988DF098 /* SAS.strings in Resources */ = {isa = PBXBuildFile; fileRef = 135FC689EA39AE1D34153B58 /* SAS.strings */; }; C3317EF833AB4060988DF098 /* SAS.strings in Resources */ = {isa = PBXBuildFile; fileRef = 135FC689EA39AE1D34153B58 /* SAS.strings */; };
C3522917C0C367C403429EEC /* CoordinatorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B251F5B4511D1CA0BA8361FE /* CoordinatorProtocol.swift */; }; C3522917C0C367C403429EEC /* CoordinatorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B251F5B4511D1CA0BA8361FE /* CoordinatorProtocol.swift */; };
@@ -1278,7 +1269,6 @@
23E6EB7960BC9D0F7396B3BD /* RoomChangeRolesScreenRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChangeRolesScreenRow.swift; sourceTree = "<group>"; }; 23E6EB7960BC9D0F7396B3BD /* RoomChangeRolesScreenRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChangeRolesScreenRow.swift; sourceTree = "<group>"; };
23EE69982BBA18C6D51AD08E /* UserProfileScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfileScreen.swift; sourceTree = "<group>"; }; 23EE69982BBA18C6D51AD08E /* UserProfileScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfileScreen.swift; sourceTree = "<group>"; };
240610DF32F3213BEC5611D7 /* BlockedUsersScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUsersScreenViewModelTests.swift; sourceTree = "<group>"; }; 240610DF32F3213BEC5611D7 /* BlockedUsersScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUsersScreenViewModelTests.swift; sourceTree = "<group>"; };
24227FF9A2797F6EA7F69CDD /* HomeScreenInvitesButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenInvitesButton.swift; sourceTree = "<group>"; };
2429224EB0EEA34D35CE9249 /* UserIndicatorControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserIndicatorControllerTests.swift; sourceTree = "<group>"; }; 2429224EB0EEA34D35CE9249 /* UserIndicatorControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserIndicatorControllerTests.swift; sourceTree = "<group>"; };
2441E2424E78A40FC95DBA76 /* AudioRecorderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecorderTests.swift; sourceTree = "<group>"; }; 2441E2424E78A40FC95DBA76 /* AudioRecorderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecorderTests.swift; sourceTree = "<group>"; };
248649EBA5BC33DB93698734 /* SessionVerificationControllerProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationControllerProxyMock.swift; sourceTree = "<group>"; }; 248649EBA5BC33DB93698734 /* SessionVerificationControllerProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationControllerProxyMock.swift; sourceTree = "<group>"; };
@@ -1338,7 +1328,6 @@
32B5E17028C02DFA7DDA3931 /* RoomMemberProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberProxyProtocol.swift; sourceTree = "<group>"; }; 32B5E17028C02DFA7DDA3931 /* RoomMemberProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberProxyProtocol.swift; sourceTree = "<group>"; };
32C5DAA1773F57653BF1C4F9 /* SoftLogoutViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftLogoutViewModelTests.swift; sourceTree = "<group>"; }; 32C5DAA1773F57653BF1C4F9 /* SoftLogoutViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftLogoutViewModelTests.swift; sourceTree = "<group>"; };
330AF4D121C3396F7A14B21D /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/SAS.strings; sourceTree = "<group>"; }; 330AF4D121C3396F7A14B21D /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/SAS.strings; sourceTree = "<group>"; };
33649299575BADC34924ABC6 /* InvitesScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreenCoordinator.swift; sourceTree = "<group>"; };
3368395F06AA180138E185B6 /* PollFormScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollFormScreenUITests.swift; sourceTree = "<group>"; }; 3368395F06AA180138E185B6 /* PollFormScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollFormScreenUITests.swift; sourceTree = "<group>"; };
33E49C5C6F802B4D94CA78D1 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = "<group>"; }; 33E49C5C6F802B4D94CA78D1 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = "<group>"; };
340179A0FC1AD4AEDA7FC134 /* CreateRoomViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateRoomViewModelProtocol.swift; sourceTree = "<group>"; }; 340179A0FC1AD4AEDA7FC134 /* CreateRoomViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateRoomViewModelProtocol.swift; sourceTree = "<group>"; };
@@ -1401,7 +1390,6 @@
421FA93BCC2840E66E4F306F /* NotificationSettingsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsScreenViewModelProtocol.swift; sourceTree = "<group>"; }; 421FA93BCC2840E66E4F306F /* NotificationSettingsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsScreenViewModelProtocol.swift; sourceTree = "<group>"; };
42236480CF0431535EBE8387 /* CustomLayoutLabelStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomLayoutLabelStyle.swift; sourceTree = "<group>"; }; 42236480CF0431535EBE8387 /* CustomLayoutLabelStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomLayoutLabelStyle.swift; sourceTree = "<group>"; };
422724361B6555364C43281E /* RoomHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomHeaderView.swift; sourceTree = "<group>"; }; 422724361B6555364C43281E /* RoomHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomHeaderView.swift; sourceTree = "<group>"; };
42ADEA322D2089391E049535 /* InvitesScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreen.swift; sourceTree = "<group>"; };
42C64A14EE89928207E3B42B /* AnalyticsSettingsScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsSettingsScreenModels.swift; sourceTree = "<group>"; }; 42C64A14EE89928207E3B42B /* AnalyticsSettingsScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsSettingsScreenModels.swift; sourceTree = "<group>"; };
42C8C368A611B9CB79C7F5FA /* RoomPollsHistoryScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomPollsHistoryScreen.swift; sourceTree = "<group>"; }; 42C8C368A611B9CB79C7F5FA /* RoomPollsHistoryScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomPollsHistoryScreen.swift; sourceTree = "<group>"; };
42EEA67A6796BDC2761619C5 /* PaginationIndicatorRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationIndicatorRoomTimelineView.swift; sourceTree = "<group>"; }; 42EEA67A6796BDC2761619C5 /* PaginationIndicatorRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationIndicatorRoomTimelineView.swift; sourceTree = "<group>"; };
@@ -1559,7 +1547,6 @@
6D4777F0142E330A75C46FE4 /* SessionVerificationUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationUITests.swift; sourceTree = "<group>"; }; 6D4777F0142E330A75C46FE4 /* SessionVerificationUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationUITests.swift; sourceTree = "<group>"; };
6DC30DEC0097B9D217493007 /* ResetRecoveryKeyScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetRecoveryKeyScreen.swift; sourceTree = "<group>"; }; 6DC30DEC0097B9D217493007 /* ResetRecoveryKeyScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetRecoveryKeyScreen.swift; sourceTree = "<group>"; };
6DF438EAFC732D2D95D34BF6 /* StartChatViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartChatViewModelTests.swift; sourceTree = "<group>"; }; 6DF438EAFC732D2D95D34BF6 /* StartChatViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartChatViewModelTests.swift; sourceTree = "<group>"; };
6DF81D7F2A6BA9DE3F6F8D9D /* InvitesScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreenViewModel.swift; sourceTree = "<group>"; };
6E2656184491C505700D2405 /* CollapsibleRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollapsibleRoomTimelineView.swift; sourceTree = "<group>"; }; 6E2656184491C505700D2405 /* CollapsibleRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollapsibleRoomTimelineView.swift; sourceTree = "<group>"; };
6E5725BC6C63604CB769145B /* LegalInformationScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegalInformationScreenViewModelTests.swift; sourceTree = "<group>"; }; 6E5725BC6C63604CB769145B /* LegalInformationScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegalInformationScreenViewModelTests.swift; sourceTree = "<group>"; };
6E5E9C044BEB7C70B1378E91 /* UserSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSession.swift; sourceTree = "<group>"; }; 6E5E9C044BEB7C70B1378E91 /* UserSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSession.swift; sourceTree = "<group>"; };
@@ -1661,7 +1648,6 @@
8610C1D21565C950BCA6A454 /* AppLockSetupSettingsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupSettingsScreenViewModelProtocol.swift; sourceTree = "<group>"; }; 8610C1D21565C950BCA6A454 /* AppLockSetupSettingsScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupSettingsScreenViewModelProtocol.swift; sourceTree = "<group>"; };
86376BEE425704AEE197CA54 /* PillContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillContext.swift; sourceTree = "<group>"; }; 86376BEE425704AEE197CA54 /* PillContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillContext.swift; sourceTree = "<group>"; };
8642512079EEFD622E3AA66B /* BlockedUsersScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUsersScreenModels.swift; sourceTree = "<group>"; }; 8642512079EEFD622E3AA66B /* BlockedUsersScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUsersScreenModels.swift; sourceTree = "<group>"; };
86873A768B13069BB5CAECF6 /* InvitesScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreenViewModelProtocol.swift; sourceTree = "<group>"; };
869A8A4632E511351BFE2EC4 /* JoinRoomScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreen.swift; sourceTree = "<group>"; }; 869A8A4632E511351BFE2EC4 /* JoinRoomScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreen.swift; sourceTree = "<group>"; };
86A6F283BC574FDB96ABBB07 /* DeveloperOptionsScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperOptionsScreenViewModel.swift; sourceTree = "<group>"; }; 86A6F283BC574FDB96ABBB07 /* DeveloperOptionsScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperOptionsScreenViewModel.swift; sourceTree = "<group>"; };
86C8CE2630F54D5FE1591786 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 86C8CE2630F54D5FE1591786 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -1687,9 +1673,7 @@
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>"; };
8DC2C9E0E15C79BBDA80F0A2 /* TimelineStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineStyle.swift; sourceTree = "<group>"; }; 8DC2C9E0E15C79BBDA80F0A2 /* TimelineStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineStyle.swift; sourceTree = "<group>"; };
8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; path = UITests.xctestplan; sourceTree = "<group>"; }; 8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; path = UITests.xctestplan; sourceTree = "<group>"; };
8E1BBA73B611EDEEA6E20E05 /* InvitesScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreenModels.swift; sourceTree = "<group>"; };
8F21ED7205048668BEB44A38 /* AppActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppActivityView.swift; sourceTree = "<group>"; }; 8F21ED7205048668BEB44A38 /* AppActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppActivityView.swift; sourceTree = "<group>"; };
8F61A0DD8243B395499C99A2 /* InvitesScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreenUITests.swift; sourceTree = "<group>"; };
8F6210134203BE1F2DD5C679 /* RoomDirectoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDirectoryCell.swift; sourceTree = "<group>"; }; 8F6210134203BE1F2DD5C679 /* RoomDirectoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDirectoryCell.swift; sourceTree = "<group>"; };
8F841F219ACDFC1D3F42FEFB /* RoomChangeRolesScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChangeRolesScreenViewModelTests.swift; sourceTree = "<group>"; }; 8F841F219ACDFC1D3F42FEFB /* RoomChangeRolesScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChangeRolesScreenViewModelTests.swift; sourceTree = "<group>"; };
8FB89DC7F9A4A91020037001 /* AuthenticationStartScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationStartScreenViewModelTests.swift; sourceTree = "<group>"; }; 8FB89DC7F9A4A91020037001 /* AuthenticationStartScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationStartScreenViewModelTests.swift; sourceTree = "<group>"; };
@@ -1934,7 +1918,6 @@
C9F893F4A111CB7BA5C96949 /* AppLockSetupBiometricsScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupBiometricsScreenViewModel.swift; sourceTree = "<group>"; }; C9F893F4A111CB7BA5C96949 /* AppLockSetupBiometricsScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupBiometricsScreenViewModel.swift; sourceTree = "<group>"; };
CA28F29C9F93E93CC3C2C715 /* NavigationRootCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationRootCoordinator.swift; sourceTree = "<group>"; }; CA28F29C9F93E93CC3C2C715 /* NavigationRootCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationRootCoordinator.swift; sourceTree = "<group>"; };
CA29952595B804DA221A0C1D /* ComposerToolbarViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerToolbarViewModelTests.swift; sourceTree = "<group>"; }; CA29952595B804DA221A0C1D /* ComposerToolbarViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerToolbarViewModelTests.swift; sourceTree = "<group>"; };
CA2A71915C1F075E403F559C /* InvitesScreenCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreenCell.swift; sourceTree = "<group>"; };
CA89A2DD51B6BBE1DA55E263 /* Application.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = "<group>"; }; CA89A2DD51B6BBE1DA55E263 /* Application.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = "<group>"; };
CA8F098AE48D958B4257EB24 /* CallInviteRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallInviteRoomTimelineView.swift; sourceTree = "<group>"; }; CA8F098AE48D958B4257EB24 /* CallInviteRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallInviteRoomTimelineView.swift; sourceTree = "<group>"; };
CA90BD288E5AE6BC643AFDDF /* TemplateScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateScreenCoordinator.swift; sourceTree = "<group>"; }; CA90BD288E5AE6BC643AFDDF /* TemplateScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateScreenCoordinator.swift; sourceTree = "<group>"; };
@@ -1944,7 +1927,6 @@
CBBCC6E74774E79B599625D0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; }; CBBCC6E74774E79B599625D0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
CBF9AEA706926DD0DA2B954C /* JoinedRoomSize+MemberCount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JoinedRoomSize+MemberCount.swift"; sourceTree = "<group>"; }; CBF9AEA706926DD0DA2B954C /* JoinedRoomSize+MemberCount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JoinedRoomSize+MemberCount.swift"; sourceTree = "<group>"; };
CC03209FDE8CE0810617BFFF /* RoomMembersListScreenMemberCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersListScreenMemberCell.swift; sourceTree = "<group>"; }; CC03209FDE8CE0810617BFFF /* RoomMembersListScreenMemberCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersListScreenMemberCell.swift; sourceTree = "<group>"; };
CC14E5209C262530E19BC4C1 /* InvitesScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreenViewModelTests.swift; sourceTree = "<group>"; };
CC1DDB2293A51EA4C2739351 /* RoomListFiltersEmptyStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomListFiltersEmptyStateView.swift; sourceTree = "<group>"; }; CC1DDB2293A51EA4C2739351 /* RoomListFiltersEmptyStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomListFiltersEmptyStateView.swift; sourceTree = "<group>"; };
CC680E0E79D818706CB28CF8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; }; CC680E0E79D818706CB28CF8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; };
CC743C7A85E3171BCBF0A653 /* AvatarHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarHeaderView.swift; sourceTree = "<group>"; }; CC743C7A85E3171BCBF0A653 /* AvatarHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarHeaderView.swift; sourceTree = "<group>"; };
@@ -2883,15 +2865,6 @@
path = SecureBackupScreen; path = SecureBackupScreen;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
3D22B0A4FC9008F7E353D0EA /* View */ = {
isa = PBXGroup;
children = (
42ADEA322D2089391E049535 /* InvitesScreen.swift */,
CA2A71915C1F075E403F559C /* InvitesScreenCell.swift */,
);
path = View;
sourceTree = "<group>";
};
3D733E8352DD4C461CFD8B8A /* QRCodeLoginScreen */ = { 3D733E8352DD4C461CFD8B8A /* QRCodeLoginScreen */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -3164,7 +3137,6 @@
A3B4B58B79A6FA250B24A1EC /* HomeScreenContent.swift */, A3B4B58B79A6FA250B24A1EC /* HomeScreenContent.swift */,
C0FEA560929DD73FFEF8C3DF /* HomeScreenEmptyStateView.swift */, C0FEA560929DD73FFEF8C3DF /* HomeScreenEmptyStateView.swift */,
D8FC33C3F6BF597E095CE9FA /* HomeScreenInviteCell.swift */, D8FC33C3F6BF597E095CE9FA /* HomeScreenInviteCell.swift */,
24227FF9A2797F6EA7F69CDD /* HomeScreenInvitesButton.swift */,
05512FB13987D221B7205DE0 /* HomeScreenRecoveryKeyConfirmationBanner.swift */, 05512FB13987D221B7205DE0 /* HomeScreenRecoveryKeyConfirmationBanner.swift */,
ED044D00F2176681CC02CD54 /* HomeScreenRoomCell.swift */, ED044D00F2176681CC02CD54 /* HomeScreenRoomCell.swift */,
C7661EFFCAA307A97D71132A /* HomeScreenRoomList.swift */, C7661EFFCAA307A97D71132A /* HomeScreenRoomList.swift */,
@@ -3552,7 +3524,6 @@
EA4D639E27D5882A6A71AECF /* GlobalSearchScreenViewModelTests.swift */, EA4D639E27D5882A6A71AECF /* GlobalSearchScreenViewModelTests.swift */,
B73587C2E3CF5998361AE516 /* HomeScreenRoomTests.swift */, B73587C2E3CF5998361AE516 /* HomeScreenRoomTests.swift */,
505208F28007C0FEC14E1FF0 /* HomeScreenViewModelTests.swift */, 505208F28007C0FEC14E1FF0 /* HomeScreenViewModelTests.swift */,
CC14E5209C262530E19BC4C1 /* InvitesScreenViewModelTests.swift */,
845DDBDE5A0887E73D38B826 /* InviteUsersViewModelTests.swift */, 845DDBDE5A0887E73D38B826 /* InviteUsersViewModelTests.swift */,
DE5127D6EA05B2E45D0A7D59 /* JoinRoomScreenViewModelTests.swift */, DE5127D6EA05B2E45D0A7D59 /* JoinRoomScreenViewModelTests.swift */,
FDB9C37196A4C79F24CE80C6 /* KeychainControllerTests.swift */, FDB9C37196A4C79F24CE80C6 /* KeychainControllerTests.swift */,
@@ -4100,7 +4071,6 @@
295E28C3B9EAADF519BF2F44 /* AuthenticationFlowCoordinatorUITests.swift */, 295E28C3B9EAADF519BF2F44 /* AuthenticationFlowCoordinatorUITests.swift */,
C6FEA87EA3752203065ECE27 /* BugReportUITests.swift */, C6FEA87EA3752203065ECE27 /* BugReportUITests.swift */,
F8CEB4634C0DD7779C4AB504 /* CreateRoomScreenUITests.swift */, F8CEB4634C0DD7779C4AB504 /* CreateRoomScreenUITests.swift */,
8F61A0DD8243B395499C99A2 /* InvitesScreenUITests.swift */,
1DB34B0C74CD242FED9DD069 /* LoginScreenUITests.swift */, 1DB34B0C74CD242FED9DD069 /* LoginScreenUITests.swift */,
3368395F06AA180138E185B6 /* PollFormScreenUITests.swift */, 3368395F06AA180138E185B6 /* PollFormScreenUITests.swift */,
C5B7A755E985FA14469E86B2 /* RoomMembersListScreenUITests.swift */, C5B7A755E985FA14469E86B2 /* RoomMembersListScreenUITests.swift */,
@@ -4865,18 +4835,6 @@
path = Animation; path = Animation;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
E3EA13D6E41AD76151C2D100 /* InvitesScreen */ = {
isa = PBXGroup;
children = (
33649299575BADC34924ABC6 /* InvitesScreenCoordinator.swift */,
8E1BBA73B611EDEEA6E20E05 /* InvitesScreenModels.swift */,
6DF81D7F2A6BA9DE3F6F8D9D /* InvitesScreenViewModel.swift */,
86873A768B13069BB5CAECF6 /* InvitesScreenViewModelProtocol.swift */,
3D22B0A4FC9008F7E353D0EA /* View */,
);
path = InvitesScreen;
sourceTree = "<group>";
};
E4E42F93A69AE52E6FAE9412 /* Users */ = { E4E42F93A69AE52E6FAE9412 /* Users */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -4903,7 +4861,6 @@
448435400B561C40E514BE1C /* FilePreviewScreen */, 448435400B561C40E514BE1C /* FilePreviewScreen */,
8A4738BBA7C7A299BAD70372 /* GlobalSearchScreen */, 8A4738BBA7C7A299BAD70372 /* GlobalSearchScreen */,
B53CA9BECD3F97805E1432D0 /* HomeScreen */, B53CA9BECD3F97805E1432D0 /* HomeScreen */,
E3EA13D6E41AD76151C2D100 /* InvitesScreen */,
F12966DF3DA87FEF21348D60 /* InviteUsersScreen */, F12966DF3DA87FEF21348D60 /* InviteUsersScreen */,
FFD7C58CA6A7D6BBC2F584B5 /* JoinRoomScreen */, FFD7C58CA6A7D6BBC2F584B5 /* JoinRoomScreen */,
948DD12A5533BE1BC260E437 /* LocationSharing */, 948DD12A5533BE1BC260E437 /* LocationSharing */,
@@ -5745,7 +5702,6 @@
F6F49E37272AD7397CD29A01 /* HomeScreenViewModelTests.swift in Sources */, F6F49E37272AD7397CD29A01 /* HomeScreenViewModelTests.swift in Sources */,
A23B8B27A1436A1049EEF68E /* InfoPlistReader.swift in Sources */, A23B8B27A1436A1049EEF68E /* InfoPlistReader.swift in Sources */,
A216C83ADCF32BA5EF8A6FBC /* InviteUsersViewModelTests.swift in Sources */, A216C83ADCF32BA5EF8A6FBC /* InviteUsersViewModelTests.swift in Sources */,
266C4DF893F2947DCCEF327B /* InvitesScreenViewModelTests.swift in Sources */,
7C0E29E0279866C62EC67A28 /* JoinRoomScreenViewModelTests.swift in Sources */, 7C0E29E0279866C62EC67A28 /* JoinRoomScreenViewModelTests.swift in Sources */,
EEC40663922856C65D1E0DF5 /* KeychainControllerTests.swift in Sources */, EEC40663922856C65D1E0DF5 /* KeychainControllerTests.swift in Sources */,
CC961529F9F1854BEC3272C9 /* LayoutMocks.swift in Sources */, CC961529F9F1854BEC3272C9 /* LayoutMocks.swift in Sources */,
@@ -6057,7 +6013,6 @@
8CC12086CBF91A7E10CDC205 /* HomeScreenCoordinator.swift in Sources */, 8CC12086CBF91A7E10CDC205 /* HomeScreenCoordinator.swift in Sources */,
77BB228AEA861E50FFD6A228 /* HomeScreenEmptyStateView.swift in Sources */, 77BB228AEA861E50FFD6A228 /* HomeScreenEmptyStateView.swift in Sources */,
22C5483D01EEB290B8339817 /* HomeScreenInviteCell.swift in Sources */, 22C5483D01EEB290B8339817 /* HomeScreenInviteCell.swift in Sources */,
64C373ACCFA26D42BA45CFAD /* HomeScreenInvitesButton.swift in Sources */,
8810A2A30A68252EBB54EE05 /* HomeScreenModels.swift in Sources */, 8810A2A30A68252EBB54EE05 /* HomeScreenModels.swift in Sources */,
B04E9EB589CE99C3929E817A /* HomeScreenRecoveryKeyConfirmationBanner.swift in Sources */, B04E9EB589CE99C3929E817A /* HomeScreenRecoveryKeyConfirmationBanner.swift in Sources */,
0AE0AB1952F186EB86719B4F /* HomeScreenRoomCell.swift in Sources */, 0AE0AB1952F186EB86719B4F /* HomeScreenRoomCell.swift in Sources */,
@@ -6088,12 +6043,6 @@
61941DEE5F3834765770BE01 /* InviteUsersScreenSelectedItem.swift in Sources */, 61941DEE5F3834765770BE01 /* InviteUsersScreenSelectedItem.swift in Sources */,
F519DE17A3A0F760307B2E6D /* InviteUsersScreenViewModel.swift in Sources */, F519DE17A3A0F760307B2E6D /* InviteUsersScreenViewModel.swift in Sources */,
A17FAD2EBC53E17B5FD384DB /* InviteUsersScreenViewModelProtocol.swift in Sources */, A17FAD2EBC53E17B5FD384DB /* InviteUsersScreenViewModelProtocol.swift in Sources */,
65EDA77363BEDC40CDE43B43 /* InvitesScreen.swift in Sources */,
76BA28216FBAF83B2D86A027 /* InvitesScreenCell.swift in Sources */,
78A3392047E9D1C6FEA659B6 /* InvitesScreenCoordinator.swift in Sources */,
2AD59AD5B09498EF8B3B04EC /* InvitesScreenModels.swift in Sources */,
C287BE1802AD432F3D848D8E /* InvitesScreenViewModel.swift in Sources */,
BD6D98676111DA8FC2BE4908 /* InvitesScreenViewModelProtocol.swift in Sources */,
6A54F52443EC52AC5CD772C0 /* JoinRoomScreen.swift in Sources */, 6A54F52443EC52AC5CD772C0 /* JoinRoomScreen.swift in Sources */,
AFE2AB612A1460E49578D746 /* JoinRoomScreenCoordinator.swift in Sources */, AFE2AB612A1460E49578D746 /* JoinRoomScreenCoordinator.swift in Sources */,
DEDBD3E9CFCC9F20CAC79881 /* JoinRoomScreenModels.swift in Sources */, DEDBD3E9CFCC9F20CAC79881 /* JoinRoomScreenModels.swift in Sources */,
@@ -6619,7 +6568,6 @@
7756C4E90CABE6F14F7920A0 /* BugReportUITests.swift in Sources */, 7756C4E90CABE6F14F7920A0 /* BugReportUITests.swift in Sources */,
94D0F36A87E596A93C0C178A /* Bundle.swift in Sources */, 94D0F36A87E596A93C0C178A /* Bundle.swift in Sources */,
9F19096BFA629C0AC282B1E4 /* CreateRoomScreenUITests.swift in Sources */, 9F19096BFA629C0AC282B1E4 /* CreateRoomScreenUITests.swift in Sources */,
B45F20A1C3F1CE19D5B8BA74 /* InvitesScreenUITests.swift in Sources */,
5C8AFBF168A41E20835F3B86 /* LoginScreenUITests.swift in Sources */, 5C8AFBF168A41E20835F3B86 /* LoginScreenUITests.swift in Sources */,
0CF81807BE5FBFC9E2BBCECF /* PollFormScreenUITests.swift in Sources */, 0CF81807BE5FBFC9E2BBCECF /* PollFormScreenUITests.swift in Sources */,
44121202B4A260C98BF615A7 /* RoomMembersListScreenUITests.swift in Sources */, 44121202B4A260C98BF615A7 /* RoomMembersListScreenUITests.swift in Sources */,

View File

@@ -21,7 +21,6 @@ import SwiftUI
final class AppSettings { final class AppSettings {
private enum UserDefaultsKeys: String { private enum UserDefaultsKeys: String {
case lastVersionLaunched case lastVersionLaunched
case seenInvites
case appLockNumberOfPINAttempts case appLockNumberOfPINAttempts
case appLockNumberOfBiometricAttempts case appLockNumberOfBiometricAttempts
case migratedAccounts case migratedAccounts
@@ -47,7 +46,6 @@ final class AppSettings {
case shouldCollapseRoomStateEvents case shouldCollapseRoomStateEvents
case publicSearchEnabled case publicSearchEnabled
case qrCodeLoginEnabled case qrCodeLoginEnabled
case roomListInvitesEnabled
} }
private static var suiteName: String = InfoPlistReader.main.appGroupIdentifier private static var suiteName: String = InfoPlistReader.main.appGroupIdentifier
@@ -94,12 +92,7 @@ final class AppSettings {
/// deleted between runs so should clear data in the shared container and keychain. /// deleted between runs so should clear data in the shared container and keychain.
@UserPreference(key: UserDefaultsKeys.lastVersionLaunched, storageType: .userDefaults(store)) @UserPreference(key: UserDefaultsKeys.lastVersionLaunched, storageType: .userDefaults(store))
var lastVersionLaunched: String? var lastVersionLaunched: String?
/// The Set of room identifiers of invites that the user already saw in the invites list.
/// This Set is being used to implement badges for unread invites.
@UserPreference(key: UserDefaultsKeys.seenInvites, defaultValue: [], storageType: .userDefaults(store))
var seenInvites: Set<String>
/// The default homeserver address used. This is intentionally a string without a scheme /// The default homeserver address used. This is intentionally a string without a scheme
/// so that it can be passed to Rust as a ServerName for well-known discovery. /// so that it can be passed to Rust as a ServerName for well-known discovery.
let defaultHomeserverAddress = "matrix.org" let defaultHomeserverAddress = "matrix.org"
@@ -271,9 +264,6 @@ final class AppSettings {
@UserPreference(key: UserDefaultsKeys.qrCodeLoginEnabled, defaultValue: false, storageType: .userDefaults(store)) @UserPreference(key: UserDefaultsKeys.qrCodeLoginEnabled, defaultValue: false, storageType: .userDefaults(store))
var qrCodeLoginEnabled var qrCodeLoginEnabled
@UserPreference(key: UserDefaultsKeys.roomListInvitesEnabled, defaultValue: false, storageType: .userDefaults(store))
var roomListInvitesEnabled
#endif #endif
// MARK: - Shared // MARK: - Shared

View File

@@ -286,12 +286,7 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol {
} }
case(.roomList, .deselectRoom, .roomList): case(.roomList, .deselectRoom, .roomList):
dismissRoomFlow(animated: animated) dismissRoomFlow(animated: animated)
case (.invitesScreen, .selectRoom, .invitesScreen):
break
case (.invitesScreen, .deselectRoom, .invitesScreen):
dismissRoomFlow(animated: animated)
case (.roomList, .showSettingsScreen, .settingsScreen): case (.roomList, .showSettingsScreen, .settingsScreen):
break break
case (.settingsScreen, .dismissedSettingsScreen, .roomList): case (.settingsScreen, .dismissedSettingsScreen, .roomList):
@@ -312,13 +307,6 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol {
case (.startChatScreen, .dismissedStartChatScreen, .roomList): case (.startChatScreen, .dismissedStartChatScreen, .roomList):
break break
case (.roomList, .showInvitesScreen, .invitesScreen):
presentInvitesList(animated: animated)
case (.invitesScreen, .showInvitesScreen, .invitesScreen):
break
case (.invitesScreen, .dismissedInvitesScreen, .roomList):
break
case (.roomList, .showLogoutConfirmationScreen, .logoutConfirmationScreen): case (.roomList, .showLogoutConfirmationScreen, .logoutConfirmationScreen):
presentSecureBackupLogoutConfirmationScreen() presentSecureBackupLogoutConfirmationScreen()
case (.logoutConfirmationScreen, .dismissedLogoutConfirmationScreen, .roomList): case (.logoutConfirmationScreen, .dismissedLogoutConfirmationScreen, .roomList):
@@ -389,8 +377,6 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol {
stateMachine.processEvent(.showStartChatScreen) stateMachine.processEvent(.showStartChatScreen)
case .logout: case .logout:
Task { await self.runLogoutFlow() } Task { await self.runLogoutFlow() }
case .presentInvitesScreen:
stateMachine.processEvent(.showInvitesScreen)
case .presentGlobalSearch: case .presentGlobalSearch:
presentGlobalSearch() presentGlobalSearch()
case .presentRoomDirectorySearch: case .presentRoomDirectorySearch:
@@ -493,12 +479,7 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol {
case .roomDetails: case .roomDetails:
coordinator.handleAppRoute(.roomDetails(roomID: roomID), animated: animated) coordinator.handleAppRoute(.roomDetails(roomID: roomID), animated: animated)
} }
let availableInvitesCount = userSession.clientProxy.inviteSummaryProvider?.roomListPublisher.value.count ?? 0
if case .invitesScreen = stateMachine.state, availableInvitesCount == 1 {
dismissInvitesList(animated: true)
}
Task { Task {
let _ = await userSession.clientProxy.trackRecentlyVisitedRoom(roomID) let _ = await userSession.clientProxy.trackRecentlyVisitedRoom(roomID)
@@ -544,38 +525,6 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol {
} }
} }
// MARK: Invites list
private func presentInvitesList(animated: Bool) {
let parameters = InvitesScreenCoordinatorParameters(userSession: userSession)
let coordinator = InvitesScreenCoordinator(parameters: parameters)
coordinator.actions
.sink { [weak self] action in
switch action {
case .openRoom(let roomID):
self?.stateMachine.processEvent(.selectRoom(roomID: roomID, entryPoint: .room))
}
}
.store(in: &cancellables)
sidebarNavigationStackCoordinator.push(coordinator, animated: animated) { [weak self] in
self?.stateMachine.processEvent(.dismissedInvitesScreen)
}
Task {
await notificationManager.removeDeliveredInviteNotifications()
}
}
private func dismissInvitesList(animated: Bool) {
guard case .invitesScreen = stateMachine.state else {
fatalError()
}
sidebarNavigationStackCoordinator.pop(animated: animated)
}
// MARK: Calls // MARK: Calls
private func presentCallScreen(roomProxy: RoomProxyProtocol) { private func presentCallScreen(roomProxy: RoomProxyProtocol) {

View File

@@ -36,9 +36,6 @@ class UserSessionFlowCoordinatorStateMachine {
/// Showing the start chat screen /// Showing the start chat screen
case startChatScreen(selectedRoomID: String?) case startChatScreen(selectedRoomID: String?)
/// Showing invites list screen
case invitesScreen(selectedRoomID: String?)
/// Showing the logout flows /// Showing the logout flows
case logoutConfirmationScreen(selectedRoomID: String?) case logoutConfirmationScreen(selectedRoomID: String?)
@@ -57,7 +54,6 @@ class UserSessionFlowCoordinatorStateMachine {
.feedbackScreen(let selectedRoomID), .feedbackScreen(let selectedRoomID),
.settingsScreen(let selectedRoomID), .settingsScreen(let selectedRoomID),
.startChatScreen(let selectedRoomID), .startChatScreen(let selectedRoomID),
.invitesScreen(let selectedRoomID),
.logoutConfirmationScreen(let selectedRoomID), .logoutConfirmationScreen(let selectedRoomID),
.roomDirectorySearchScreen(let selectedRoomID): .roomDirectorySearchScreen(let selectedRoomID):
selectedRoomID selectedRoomID
@@ -95,12 +91,7 @@ class UserSessionFlowCoordinatorStateMachine {
case showStartChatScreen case showStartChatScreen
/// Start chat has been dismissed /// Start chat has been dismissed
case dismissedStartChatScreen case dismissedStartChatScreen
/// Request presentation of the invites screen
case showInvitesScreen
/// The invites screen has been dismissed
case dismissedInvitesScreen
/// Logout has been requested and this is the last sesion /// Logout has been requested and this is the last sesion
case showLogoutConfirmationScreen case showLogoutConfirmationScreen
/// Logout has been cancelled /// Logout has been cancelled
@@ -140,12 +131,8 @@ class UserSessionFlowCoordinatorStateMachine {
switch (fromState, event) { switch (fromState, event) {
case (.roomList, .selectRoom(let roomID, _)): case (.roomList, .selectRoom(let roomID, _)):
return .roomList(selectedRoomID: roomID) return .roomList(selectedRoomID: roomID)
case (.invitesScreen, .selectRoom(let roomID, _)):
return .invitesScreen(selectedRoomID: roomID)
case (.roomList, .deselectRoom): case (.roomList, .deselectRoom):
return .roomList(selectedRoomID: nil) return .roomList(selectedRoomID: nil)
case (.invitesScreen, .deselectRoom):
return .invitesScreen(selectedRoomID: nil)
case (.roomList(let selectedRoomID), .showSettingsScreen): case (.roomList(let selectedRoomID), .showSettingsScreen):
return .settingsScreen(selectedRoomID: selectedRoomID) return .settingsScreen(selectedRoomID: selectedRoomID)
@@ -161,15 +148,7 @@ class UserSessionFlowCoordinatorStateMachine {
return .startChatScreen(selectedRoomID: selectedRoomID) return .startChatScreen(selectedRoomID: selectedRoomID)
case (.startChatScreen(let selectedRoomID), .dismissedStartChatScreen): case (.startChatScreen(let selectedRoomID), .dismissedStartChatScreen):
return .roomList(selectedRoomID: selectedRoomID) return .roomList(selectedRoomID: selectedRoomID)
case (.roomList(let selectedRoomID), .showInvitesScreen):
return .invitesScreen(selectedRoomID: selectedRoomID)
case (.invitesScreen(let selectedRoomID), .showInvitesScreen):
return .invitesScreen(selectedRoomID: selectedRoomID)
case (.invitesScreen(let selectedRoomID), .dismissedInvitesScreen):
return .roomList(selectedRoomID: selectedRoomID)
case (.roomList(let selectedRoomID), .showLogoutConfirmationScreen): case (.roomList(let selectedRoomID), .showLogoutConfirmationScreen):
return .logoutConfirmationScreen(selectedRoomID: selectedRoomID) return .logoutConfirmationScreen(selectedRoomID: selectedRoomID)
case (.logoutConfirmationScreen(let selectedRoomID), .dismissedLogoutConfirmationScreen): case (.logoutConfirmationScreen(let selectedRoomID), .dismissedLogoutConfirmationScreen):
@@ -224,8 +203,6 @@ class UserSessionFlowCoordinatorStateMachine {
switch stateMachine.state { switch stateMachine.state {
case .roomList(let selectedRoomID): case .roomList(let selectedRoomID):
return roomID == selectedRoomID return roomID == selectedRoomID
case .invitesScreen(let selectedRoomID):
return roomID == selectedRoomID
default: default:
return false return false
} }

View File

@@ -39,7 +39,6 @@ extension ClientProxyMock {
roomSummaryProvider = configuration.roomSummaryProvider roomSummaryProvider = configuration.roomSummaryProvider
alternateRoomSummaryProvider = RoomSummaryProviderMock(.init()) alternateRoomSummaryProvider = RoomSummaryProviderMock(.init())
inviteSummaryProvider = RoomSummaryProviderMock(.init())
roomDirectorySearchProxyReturnValue = configuration.roomDirectorySearchProxy roomDirectorySearchProxyReturnValue = configuration.roomDirectorySearchProxy

View File

@@ -1941,7 +1941,6 @@ class ClientProxyMock: ClientProxyProtocol {
var pusherNotificationClientIdentifier: String? var pusherNotificationClientIdentifier: String?
var roomSummaryProvider: RoomSummaryProviderProtocol? var roomSummaryProvider: RoomSummaryProviderProtocol?
var alternateRoomSummaryProvider: RoomSummaryProviderProtocol? var alternateRoomSummaryProvider: RoomSummaryProviderProtocol?
var inviteSummaryProvider: RoomSummaryProviderProtocol?
var notificationSettings: NotificationSettingsProxyProtocol { var notificationSettings: NotificationSettingsProxyProtocol {
get { return underlyingNotificationSettings } get { return underlyingNotificationSettings }
set(value) { underlyingNotificationSettings = value } set(value) { underlyingNotificationSettings = value }

View File

@@ -40,7 +40,6 @@ enum A11yIdentifiers {
static let startChatScreen = StartChatScreen() static let startChatScreen = StartChatScreen()
static let roomMemberDetailsScreen = RoomMemberDetailsScreen() static let roomMemberDetailsScreen = RoomMemberDetailsScreen()
static let createRoomScreen = CreateRoomScreen() static let createRoomScreen = CreateRoomScreen()
static let invitesScreen = InvitesScreen()
static let inviteUsersScreen = InviteUsersScreen() static let inviteUsersScreen = InviteUsersScreen()
static let migrationScreen = MigrationScreen() static let migrationScreen = MigrationScreen()
static let notificationSettingsScreen = NotificationSettingsScreen() static let notificationSettingsScreen = NotificationSettingsScreen()
@@ -105,12 +104,6 @@ enum A11yIdentifiers {
} }
} }
struct InvitesScreen {
let noInvites = "invites-no_invites"
let accept = "invites-accept"
let decline = "invites-decline"
}
struct InviteUsersScreen { struct InviteUsersScreen {
let proceed = "invite_users-proceed" let proceed = "invite_users-proceed"
let userProfile = "invite_users-user_profile" let userProfile = "invite_users-user_profile"

View File

@@ -33,7 +33,6 @@ enum HomeScreenCoordinatorAction {
case presentFeedbackScreen case presentFeedbackScreen
case presentSecureBackupSettings case presentSecureBackupSettings
case presentStartChatScreen case presentStartChatScreen
case presentInvitesScreen
case presentGlobalSearch case presentGlobalSearch
case presentRoomDirectorySearch case presentRoomDirectorySearch
case logout case logout
@@ -80,8 +79,6 @@ final class HomeScreenCoordinator: CoordinatorProtocol {
actionsSubject.send(.logout) actionsSubject.send(.logout)
case .presentStartChatScreen: case .presentStartChatScreen:
actionsSubject.send(.presentStartChatScreen) actionsSubject.send(.presentStartChatScreen)
case .presentInvitesScreen:
actionsSubject.send(.presentInvitesScreen)
case .presentGlobalSearch: case .presentGlobalSearch:
actionsSubject.send(.presentGlobalSearch) actionsSubject.send(.presentGlobalSearch)
case .presentRoomDirectorySearch: case .presentRoomDirectorySearch:

View File

@@ -26,7 +26,6 @@ enum HomeScreenViewModelAction {
case presentSettingsScreen case presentSettingsScreen
case presentFeedbackScreen case presentFeedbackScreen
case presentStartChatScreen case presentStartChatScreen
case presentInvitesScreen
case presentGlobalSearch case presentGlobalSearch
case presentRoomDirectorySearch case presentRoomDirectorySearch
case logout case logout
@@ -42,7 +41,6 @@ enum HomeScreenViewAction {
case confirmRecoveryKey case confirmRecoveryKey
case skipRecoveryKeyConfirmation case skipRecoveryKeyConfirmation
case updateVisibleItemRange(range: Range<Int>, isScrolling: Bool) case updateVisibleItemRange(range: Range<Int>, isScrolling: Bool)
case selectInvites
case globalSearch case globalSearch
case markRoomAsUnread(roomIdentifier: String) case markRoomAsUnread(roomIdentifier: String)
case markRoomAsRead(roomIdentifier: String) case markRoomAsRead(roomIdentifier: String)
@@ -91,7 +89,6 @@ struct HomeScreenViewState: BindableState {
var roomListMode: HomeScreenRoomListMode = .skeletons var roomListMode: HomeScreenRoomListMode = .skeletons
var hasPendingInvitations = false var hasPendingInvitations = false
var hasUnreadPendingInvitations = false
var isRoomDirectorySearchEnabled = false var isRoomDirectorySearchEnabled = false
@@ -129,10 +126,6 @@ struct HomeScreenViewState: BindableState {
var shouldShowRecoveryKeyConfirmationBanner: Bool { var shouldShowRecoveryKeyConfirmationBanner: Bool {
securityBannerMode == .recoveryKeyConfirmation securityBannerMode == .recoveryKeyConfirmation
} }
var shouldShowInvitesButton: Bool {
!ServiceLocator.shared.settings.roomListInvitesEnabled && hasPendingInvitations && !bindings.isSearchFieldFocused
}
} }
struct HomeScreenViewStateBindings { struct HomeScreenViewStateBindings {

View File

@@ -27,7 +27,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
private let userIndicatorController: UserIndicatorControllerProtocol private let userIndicatorController: UserIndicatorControllerProtocol
private let roomSummaryProvider: RoomSummaryProviderProtocol? private let roomSummaryProvider: RoomSummaryProviderProtocol?
private let inviteSummaryProvider: RoomSummaryProviderProtocol?
private var migrationCancellable: AnyCancellable? private var migrationCancellable: AnyCancellable?
@@ -50,7 +49,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
roomSummaryProvider = userSession.clientProxy.roomSummaryProvider roomSummaryProvider = userSession.clientProxy.roomSummaryProvider
inviteSummaryProvider = userSession.clientProxy.inviteSummaryProvider
super.init(initialViewState: .init(userID: userSession.userID), super.init(initialViewState: .init(userID: userSession.userID),
imageProvider: userSession.mediaProvider) imageProvider: userSession.mediaProvider)
@@ -157,8 +155,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
visibleItemRangePublisher.send((range, isScrolling)) visibleItemRangePublisher.send((range, isScrolling))
case .startChat: case .startChat:
actionsSubject.send(.presentStartChatScreen) actionsSubject.send(.presentStartChatScreen)
case .selectInvites:
actionsSubject.send(.presentInvitesScreen)
case .globalSearch: case .globalSearch:
actionsSubject.send(.presentGlobalSearch) actionsSubject.send(.presentGlobalSearch)
case .markRoomAsUnread(let roomIdentifier): case .markRoomAsUnread(let roomIdentifier):
@@ -233,7 +229,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
} }
private func setupRoomListSubscriptions() { private func setupRoomListSubscriptions() {
guard let roomSummaryProvider, let inviteSummaryProvider else { guard let roomSummaryProvider else {
MXLog.error("Room summary provider unavailable") MXLog.error("Room summary provider unavailable")
return return
} }
@@ -280,28 +276,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
self?.installListRangeModifiers() self?.installListRangeModifiers()
} }
.store(in: &cancellables) .store(in: &cancellables)
inviteSummaryProvider.roomListPublisher
.combineLatest(appSettings.$seenInvites)
.receive(on: DispatchQueue.main)
.sink { [weak self] summaries, seenInvites in
self?.state.hasPendingInvitations = !summaries.isEmpty
let invites = summaries.compactMap(\.id)
let unreadInvites = summaries.filter { summary in
guard let roomID = summary.id else {
return false
}
return !seenInvites.contains(roomID)
}
MXLog.info("Received invite list update - invites: \(invites), seenInvites: \(seenInvites), unreadInvites: \(unreadInvites)")
self?.state.hasUnreadPendingInvitations = !unreadInvites.isEmpty
}
.store(in: &cancellables)
} }
private func updateRoomListMode(with roomSummaryProviderState: RoomSummaryProviderState) { private func updateRoomListMode(with roomSummaryProviderState: RoomSummaryProviderState) {

View File

@@ -32,11 +32,7 @@ enum RoomListFilter: Int, CaseIterable, Identifiable {
case invites case invites
static var availableFilters: [RoomListFilter] { static var availableFilters: [RoomListFilter] {
if ServiceLocator.shared.settings.roomListInvitesEnabled { RoomListFilter.allCases
return RoomListFilter.allCases
} else {
return RoomListFilter.allCases.filter { !($0 == .invites) }
}
} }
var localizedName: String { var localizedName: String {

View File

@@ -111,8 +111,7 @@ struct HomeScreenContent: View {
private var topSection: some View { private var topSection: some View {
// An empty VStack causes glitches within the room list // An empty VStack causes glitches within the room list
if context.viewState.shouldShowFilters || if context.viewState.shouldShowFilters ||
context.viewState.shouldShowRecoveryKeyConfirmationBanner || context.viewState.shouldShowRecoveryKeyConfirmationBanner {
context.viewState.shouldShowInvitesButton {
VStack(spacing: 0) { VStack(spacing: 0) {
if context.viewState.shouldShowFilters { if context.viewState.shouldShowFilters {
RoomListFiltersView(state: $context.filtersState) RoomListFiltersView(state: $context.filtersState)
@@ -121,14 +120,6 @@ struct HomeScreenContent: View {
if context.viewState.shouldShowRecoveryKeyConfirmationBanner { if context.viewState.shouldShowRecoveryKeyConfirmationBanner {
HomeScreenRecoveryKeyConfirmationBanner(context: context) HomeScreenRecoveryKeyConfirmationBanner(context: context)
} }
if context.viewState.shouldShowInvitesButton {
HomeScreenInvitesButton(title: L10n.actionInvitesList, hasBadge: context.viewState.hasUnreadPendingInvitations) {
context.send(viewAction: .selectInvites)
}
.accessibilityIdentifier(A11yIdentifiers.homeScreen.invites)
.frame(maxWidth: .infinity, alignment: .trailing)
}
} }
.background(Color.compound.bgCanvasDefault) .background(Color.compound.bgCanvasDefault)
} }

View File

@@ -112,13 +112,11 @@ struct HomeScreenInviteCell: View {
context.send(viewAction: .declineInvite(roomIdentifier: room.id)) context.send(viewAction: .declineInvite(roomIdentifier: room.id))
} }
.buttonStyle(.compound(.secondary, size: .medium)) .buttonStyle(.compound(.secondary, size: .medium))
.accessibilityIdentifier(A11yIdentifiers.invitesScreen.decline)
Button(L10n.actionAccept) { Button(L10n.actionAccept) {
context.send(viewAction: .acceptInvite(roomIdentifier: room.id)) context.send(viewAction: .acceptInvite(roomIdentifier: room.id))
} }
.buttonStyle(.compound(.primary, size: .medium)) .buttonStyle(.compound(.primary, size: .medium))
.accessibilityIdentifier(A11yIdentifiers.invitesScreen.accept)
} }
} }

View File

@@ -1,62 +0,0 @@
//
// Copyright 2023 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
struct HomeScreenInvitesButton: View {
let title: String
let hasBadge: Bool
let action: () -> Void
var body: some View {
Button(action: action) {
HStack(spacing: 8.0) {
Text(title)
.foregroundColor(.compound.textPrimary)
.font(.compound.bodyMDSemibold)
if hasBadge {
badge
}
}
.padding(.trailing, 16.0)
.padding(.leading, 64.0)
.padding(.vertical, 8.0)
}
}
// MARK: - Private
private var badge: some View {
Circle()
.scaledFrame(size: 12)
.foregroundColor(.compound.iconAccentTertiary)
}
}
struct HomeScreenInvitesButton_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
HomeScreenInvitesButton(title: "Invites", hasBadge: true, action: { })
.previewDisplayName("Badge on")
HomeScreenInvitesButton(title: "Invites", hasBadge: false, action: { })
.previewDisplayName("Badge off")
HomeScreenInvitesButton(title: "Invites", hasBadge: true, action: { })
.previewDisplayName("Badge on (AX1)")
.dynamicTypeSize(.accessibility1)
}
}

View File

@@ -1,59 +0,0 @@
//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Combine
import SwiftUI
struct InvitesScreenCoordinatorParameters {
let userSession: UserSessionProtocol
}
enum InvitesScreenCoordinatorAction {
case openRoom(withIdentifier: String)
}
final class InvitesScreenCoordinator: CoordinatorProtocol {
private var viewModel: InvitesScreenViewModelProtocol
private let actionsSubject: PassthroughSubject<InvitesScreenCoordinatorAction, Never> = .init()
private var cancellables = Set<AnyCancellable>()
var actions: AnyPublisher<InvitesScreenCoordinatorAction, Never> {
actionsSubject.eraseToAnyPublisher()
}
init(parameters: InvitesScreenCoordinatorParameters) {
viewModel = InvitesScreenViewModel(userSession: parameters.userSession,
appSettings: ServiceLocator.shared.settings,
analytics: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController)
}
func start() {
viewModel.actions
.sink { [weak self] action in
guard let self else { return }
switch action {
case .openRoom(let roomID):
self.actionsSubject.send(.openRoom(withIdentifier: roomID))
}
}
.store(in: &cancellables)
}
func toPresentable() -> AnyView {
AnyView(InvitesScreen(context: viewModel.context))
}
}

View File

@@ -1,46 +0,0 @@
//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
enum InvitesScreenViewModelAction {
case openRoom(withIdentifier: String)
}
struct InvitesScreenViewState: BindableState {
var invites: [InvitesScreenRoomDetails] = []
var bindings: InvitesScreenViewStateBindings = .init()
}
struct InvitesScreenViewStateBindings {
var alertInfo: AlertInfo<Bool>?
}
struct InvitesScreenRoomDetails: Identifiable {
let roomDetails: RoomSummaryDetails
var isUnread: Bool
var isDirect: Bool {
roomDetails.isDirect
}
var id: String {
roomDetails.id
}
}
enum InvitesScreenViewAction {
case accept(InvitesScreenRoomDetails)
case decline(InvitesScreenRoomDetails)
}

View File

@@ -1,162 +0,0 @@
//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Combine
import SwiftUI
typealias InvitesScreenViewModelType = StateStoreViewModel<InvitesScreenViewState, InvitesScreenViewAction>
class InvitesScreenViewModel: InvitesScreenViewModelType, InvitesScreenViewModelProtocol {
private let userSession: UserSessionProtocol
private let appSettings: AppSettings
private let analytics: AnalyticsService
private let userIndicatorController: UserIndicatorControllerProtocol
private let notificationCenterProtocol: NotificationCenterProtocol
private let previouslySeenInvites: Set<String>
private let actionsSubject: PassthroughSubject<InvitesScreenViewModelAction, Never> = .init()
var actions: AnyPublisher<InvitesScreenViewModelAction, Never> {
actionsSubject.eraseToAnyPublisher()
}
init(userSession: UserSessionProtocol,
appSettings: AppSettings,
analytics: AnalyticsService,
userIndicatorController: UserIndicatorControllerProtocol,
notificationCenterProtocol: NotificationCenterProtocol = NotificationCenter.default) {
self.userSession = userSession
self.appSettings = appSettings
self.analytics = analytics
self.userIndicatorController = userIndicatorController
self.notificationCenterProtocol = notificationCenterProtocol
previouslySeenInvites = appSettings.seenInvites
super.init(initialViewState: InvitesScreenViewState(), imageProvider: userSession.mediaProvider)
setupSubscriptions()
}
// MARK: - Public
override func process(viewAction: InvitesScreenViewAction) {
switch viewAction {
case .accept(let invite):
accept(invite: invite)
case .decline(let invite):
startDeclineFlow(invite: invite)
}
}
// MARK: - Private
private var clientProxy: ClientProxyProtocol {
userSession.clientProxy
}
private var inviteSummaryProvider: RoomSummaryProviderProtocol? {
clientProxy.inviteSummaryProvider
}
private func setupSubscriptions() {
guard let inviteSummaryProvider else {
MXLog.error("Room summary provider unavailable")
return
}
inviteSummaryProvider.roomListPublisher
.removeDuplicates()
.receive(on: DispatchQueue.main)
.sink { [weak self] roomSummaries in
guard let self else { return }
self.appSettings.seenInvites = Set(roomSummaries.compactMap(\.id))
MXLog.info("Updated seen invites: \(self.appSettings.seenInvites)")
self.state.invites = roomSummaries.compactMap { summary in
guard case .filled(let details) = summary else {
return nil
}
return InvitesScreenRoomDetails(roomDetails: details, isUnread: !self.previouslySeenInvites.contains(details.id))
}
}
.store(in: &cancellables)
}
private func startDeclineFlow(invite: InvitesScreenRoomDetails) {
let roomPlaceholder = invite.isDirect ? (invite.roomDetails.inviter?.displayName ?? invite.roomDetails.name) : invite.roomDetails.name
let title = invite.isDirect ? L10n.screenInvitesDeclineDirectChatTitle : L10n.screenInvitesDeclineChatTitle
let message = invite.isDirect ? L10n.screenInvitesDeclineDirectChatMessage(roomPlaceholder) : L10n.screenInvitesDeclineChatMessage(roomPlaceholder)
state.bindings.alertInfo = .init(id: true,
title: title,
message: message,
primaryButton: .init(title: L10n.actionCancel, role: .cancel, action: nil),
secondaryButton: .init(title: L10n.actionDecline, role: .destructive, action: { self.decline(invite: invite) }))
}
private func accept(invite: InvitesScreenRoomDetails) {
Task {
let roomID = invite.roomDetails.id
defer {
userIndicatorController.retractIndicatorWithId(roomID)
}
userIndicatorController.submitIndicator(UserIndicator(id: roomID, type: .modal, title: L10n.commonLoading, persistent: true))
guard let roomProxy = await clientProxy.roomForIdentifier(roomID) else {
displayError()
return
}
switch await roomProxy.acceptInvitation() {
case .success:
actionsSubject.send(.openRoom(withIdentifier: roomID))
analytics.trackJoinedRoom(isDM: roomProxy.isDirect, isSpace: roomProxy.isSpace, activeMemberCount: UInt(roomProxy.activeMembersCount))
case .failure:
displayError()
}
}
}
private func decline(invite: InvitesScreenRoomDetails) {
Task {
let roomID = invite.roomDetails.id
defer {
userIndicatorController.retractIndicatorWithId(roomID)
}
userIndicatorController.submitIndicator(UserIndicator(id: roomID, type: .modal, title: L10n.commonLoading, persistent: true))
guard let roomProxy = await clientProxy.roomForIdentifier(roomID) else {
displayError()
return
}
let result = await roomProxy.rejectInvitation()
if case .failure = result {
displayError()
}
}
}
private func displayError() {
state.bindings.alertInfo = .init(id: true,
title: L10n.commonError,
message: L10n.errorUnknown)
}
}

View File

@@ -1,23 +0,0 @@
//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Combine
@MainActor
protocol InvitesScreenViewModelProtocol {
var actions: AnyPublisher<InvitesScreenViewModelAction, Never> { get }
var context: InvitesScreenViewModelType.Context { get }
}

View File

@@ -1,103 +0,0 @@
//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
struct InvitesScreen: View {
@ObservedObject var context: InvitesScreenViewModel.Context
var body: some View {
mainContent
.background(Color.compound.bgCanvasDefault.ignoresSafeArea())
.navigationTitle(L10n.actionInvitesList)
.alert(item: $context.alertInfo)
.track(screen: .Invites)
}
// MARK: - Private
@ViewBuilder
private var mainContent: some View {
ScrollView {
if !context.viewState.invites.isEmpty {
LazyVStack(spacing: 0) {
ForEach(context.viewState.invites) { invite in
InvitesScreenCell(invite: invite,
imageProvider: context.imageProvider,
acceptAction: { context.send(viewAction: .accept(invite)) },
declineAction: { context.send(viewAction: .decline(invite)) })
}
}
} else {
noInvitesContent
}
}
}
private var noInvitesContent: some View {
Text(L10n.screenInvitesEmptyList)
.font(.compound.bodyLG)
.foregroundColor(.compound.textSecondary)
.frame(maxWidth: .infinity)
.listRowBackground(Color.clear)
.accessibilityIdentifier(A11yIdentifiers.invitesScreen.noInvites)
.padding(.top, 80)
}
}
// MARK: - Previews
struct InvitesScreen_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
NavigationView {
InvitesScreen(context: InvitesScreenViewModel.noInvites.context)
}
.previewDisplayName("No Invites")
NavigationView {
InvitesScreen(context: InvitesScreenViewModel.someInvite.context)
}
.snapshot(delay: 3.0)
.previewDisplayName("Some Invite")
}
}
private extension InvitesScreenViewModel {
static let noInvites: InvitesScreenViewModel = {
let userSession = MockUserSession(clientProxy: ClientProxyMock(.init(userID: "@userid:example.com")),
mediaProvider: MockMediaProvider(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock())
let regularViewModel = InvitesScreenViewModel(userSession: userSession,
appSettings: ServiceLocator.shared.settings,
analytics: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController)
return regularViewModel
}()
static let someInvite: InvitesScreenViewModel = {
let clientProxy = ClientProxyMock(.init(userID: "@userid:example.com"))
clientProxy.inviteSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockInvites)))
clientProxy.roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockInvites)))
let userSession = MockUserSession(clientProxy: clientProxy,
mediaProvider: MockMediaProvider(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock())
let regularViewModel = InvitesScreenViewModel(userSession: userSession,
appSettings: ServiceLocator.shared.settings,
analytics: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController)
return regularViewModel
}()
}

View File

@@ -1,226 +0,0 @@
//
// Copyright 2023 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
@MainActor
struct InvitesScreenCell: View {
let invite: InvitesScreenRoomDetails
let imageProvider: ImageProviderProtocol?
let acceptAction: () -> Void
let declineAction: () -> Void
var body: some View {
HStack(alignment: .top, spacing: 16) {
LoadableAvatarImage(url: invite.roomDetails.avatarURL,
name: title,
contentID: invite.roomDetails.id,
avatarSize: .custom(52),
imageProvider: imageProvider)
.accessibilityHidden(true)
mainContent
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.bottom, 16)
.padding(.trailing, 16)
.overlay(alignment: .bottom) {
separator
}
}
.padding(.top, 12)
.padding(.leading, 16)
}
// MARK: - Private
private var mainContent: some View {
VStack(alignment: .leading, spacing: 0) {
HStack(alignment: .firstTextBaseline, spacing: 16) {
textualContent
.padding(.trailing, invite.isUnread ? 0 : 16)
if invite.isUnread {
badge
}
}
inviterView
.padding(.top, 6)
.padding(.trailing, 16)
buttons
.padding(.top, 14)
.padding(.trailing, 22)
}
}
@ViewBuilder
private var inviterView: some View {
if let invitedText = attributedInviteText, let name = invite.roomDetails.inviter?.displayName {
HStack(alignment: .firstTextBaseline, spacing: 8) {
LoadableAvatarImage(url: invite.roomDetails.inviter?.avatarURL,
name: name,
contentID: name,
avatarSize: .custom(16),
imageProvider: imageProvider)
.alignmentGuide(.firstTextBaseline) { $0[.bottom] * 0.8 }
Text(invitedText)
}
}
}
@ViewBuilder
private var textualContent: some View {
VStack(alignment: .leading, spacing: 0) {
Text(title)
.font(.compound.bodyLGSemibold)
.foregroundColor(.compound.textPrimary)
.lineLimit(2)
if let subtitle {
Text(subtitle)
.font(.compound.bodyMD)
.foregroundColor(.compound.textPlaceholder)
}
}
.frame(maxWidth: .infinity, alignment: .leading)
}
private var buttons: some View {
HStack(spacing: 12) {
Button(L10n.actionDecline, action: declineAction)
.buttonStyle(.compound(.secondary, size: .medium))
.accessibilityIdentifier(A11yIdentifiers.invitesScreen.decline)
Button(L10n.actionAccept, action: acceptAction)
.buttonStyle(.compound(.primary, size: .medium))
.accessibilityIdentifier(A11yIdentifiers.invitesScreen.accept)
}
}
private var separator: some View {
Rectangle()
.fill(Color.compound.borderDisabled)
.frame(height: 1 / UIScreen.main.scale)
}
private var title: String {
invite.roomDetails.name
}
private var subtitle: String? {
invite.isDirect ? invite.roomDetails.inviter?.userID : invite.roomDetails.canonicalAlias
}
private var attributedInviteText: AttributedString? {
guard
invite.roomDetails.isDirect == false,
let inviterName = invite.roomDetails.inviter?.displayName,
let inviterID = invite.roomDetails.inviter?.userID
else {
return nil
}
let text = L10n.screenInvitesInvitedYou(inviterName, inviterID)
var attributedString = AttributedString(text)
attributedString.font = .compound.bodyMD
attributedString.foregroundColor = .compound.textPlaceholder
if let range = attributedString.range(of: inviterName) {
attributedString[range].foregroundColor = .compound.textPrimary
attributedString[range].font = .compound.bodyMDSemibold
}
return attributedString
}
private var badge: some View {
Circle()
.scaledFrame(size: 12)
.foregroundColor(.compound.iconAccentTertiary)
}
}
struct InvitesScreenCell_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
ScrollView {
VStack(spacing: 0) {
InvitesScreenCell(invite: .dm, imageProvider: MockMediaProvider(), acceptAction: { }, declineAction: { })
InvitesScreenCell(invite: .room(), imageProvider: MockMediaProvider(), acceptAction: { }, declineAction: { })
InvitesScreenCell(invite: .room(isUnread: false), imageProvider: MockMediaProvider(), acceptAction: { }, declineAction: { })
InvitesScreenCell(invite: .room(alias: "#footest:somewhere.org", avatarURL: .picturesDirectory), imageProvider: MockMediaProvider(), acceptAction: { }, declineAction: { })
InvitesScreenCell(invite: .room(alias: "#footest:somewhere.org"), imageProvider: MockMediaProvider(), acceptAction: { }, declineAction: { })
.dynamicTypeSize(.accessibility1)
.previewDisplayName("Aliased room (AX1)")
}
}
}
}
@MainActor
private extension InvitesScreenRoomDetails {
static var dm: InvitesScreenRoomDetails {
let inviter = RoomMemberProxyMock()
inviter.displayName = "Jack"
inviter.userID = "@jack:somewhere.com"
let dmRoom = RoomSummaryDetails(id: "@someone:somewhere.com",
isInvite: false,
inviter: inviter,
name: "Some Guy",
isDirect: true,
avatarURL: nil,
lastMessage: nil,
lastMessageFormattedTimestamp: nil,
unreadMessagesCount: 0,
unreadMentionsCount: 0,
unreadNotificationsCount: 0,
notificationMode: nil,
canonicalAlias: "#footest:somewhere.org",
hasOngoingCall: false,
isMarkedUnread: false,
isFavourite: false)
return .init(roomDetails: dmRoom, isUnread: false)
}
static func room(alias: String? = nil, avatarURL: URL? = nil, isUnread: Bool = true) -> InvitesScreenRoomDetails {
let inviter = RoomMemberProxyMock()
inviter.displayName = "Luca"
inviter.userID = "@jack:somewhi.nl"
inviter.avatarURL = avatarURL
let dmRoom = RoomSummaryDetails(id: "@someone:somewhere.com",
isInvite: false,
inviter: inviter,
name: "Awesome Room",
isDirect: false,
avatarURL: avatarURL,
lastMessage: nil,
lastMessageFormattedTimestamp: nil,
unreadMessagesCount: 0,
unreadMentionsCount: 0,
unreadNotificationsCount: 0,
notificationMode: nil,
canonicalAlias: alias,
hasOngoingCall: false,
isMarkedUnread: false,
isFavourite: false)
return .init(roomDetails: dmRoom, isUnread: isUnread)
}
}

View File

@@ -50,7 +50,6 @@ protocol DeveloperOptionsProtocol: AnyObject {
var elementCallBaseURL: URL { get set } var elementCallBaseURL: URL { get set }
var publicSearchEnabled: Bool { get set } var publicSearchEnabled: Bool { get set }
var qrCodeLoginEnabled: Bool { get set } var qrCodeLoginEnabled: Bool { get set }
var roomListInvitesEnabled: Bool { get set }
} }
extension AppSettings: DeveloperOptionsProtocol { } extension AppSettings: DeveloperOptionsProtocol { }

View File

@@ -31,11 +31,6 @@ struct DeveloperOptionsScreen: View {
Toggle(isOn: $context.hideUnreadMessagesBadge) { Toggle(isOn: $context.hideUnreadMessagesBadge) {
Text("Hide grey dots") Text("Hide grey dots")
} }
Toggle(isOn: $context.roomListInvitesEnabled) {
Text("Room list invites")
Text("Requires app reboot and, after disabling the feature, a cache clear.")
}
} }
Section("Room Directory Search") { Section("Room Directory Search") {

View File

@@ -52,8 +52,6 @@ class ClientProxy: ClientProxyProtocol {
private(set) var roomSummaryProvider: RoomSummaryProviderProtocol? private(set) var roomSummaryProvider: RoomSummaryProviderProtocol?
private(set) var alternateRoomSummaryProvider: RoomSummaryProviderProtocol? private(set) var alternateRoomSummaryProvider: RoomSummaryProviderProtocol?
private(set) var inviteSummaryProvider: RoomSummaryProviderProtocol?
let notificationSettings: NotificationSettingsProxyProtocol let notificationSettings: NotificationSettingsProxyProtocol
let secureBackupController: SecureBackupControllerProtocol let secureBackupController: SecureBackupControllerProtocol
@@ -680,7 +678,7 @@ class ClientProxy: ClientProxyProtocol {
.syncService() .syncService()
.withCrossProcessLock(appIdentifier: "MainApp") .withCrossProcessLock(appIdentifier: "MainApp")
.withUtdHook(delegate: ClientDecryptionErrorDelegate(actionsSubject: actionsSubject)) .withUtdHook(delegate: ClientDecryptionErrorDelegate(actionsSubject: actionsSubject))
.withUnifiedInvitesInRoomList(withUnifiedInvites: appSettings.roomListInvitesEnabled) .withUnifiedInvitesInRoomList(withUnifiedInvites: true)
.finish() .finish()
let roomListService = syncService.roomListService() let roomListService = syncService.roomListService()
@@ -702,13 +700,7 @@ class ClientProxy: ClientProxyProtocol {
name: "MessageForwarding", name: "MessageForwarding",
notificationSettings: notificationSettings) notificationSettings: notificationSettings)
try await alternateRoomSummaryProvider?.setRoomList(roomListService.allRooms()) try await alternateRoomSummaryProvider?.setRoomList(roomListService.allRooms())
inviteSummaryProvider = RoomSummaryProvider(roomListService: roomListService,
eventStringBuilder: eventStringBuilder,
name: "Invites",
notificationSettings: notificationSettings)
try await inviteSummaryProvider?.setRoomList(roomListService.invites())
self.syncService = syncService self.syncService = syncService
self.roomListService = roomListService self.roomListService = roomListService

View File

@@ -109,8 +109,6 @@ protocol ClientProxyProtocol: AnyObject, MediaLoaderProtocol {
/// Used for listing rooms that shouldn't be affected by the main `roomSummaryProvider` filtering /// Used for listing rooms that shouldn't be affected by the main `roomSummaryProvider` filtering
var alternateRoomSummaryProvider: RoomSummaryProviderProtocol? { get } var alternateRoomSummaryProvider: RoomSummaryProviderProtocol? { get }
var inviteSummaryProvider: RoomSummaryProviderProtocol? { get }
var notificationSettings: NotificationSettingsProxyProtocol { get } var notificationSettings: NotificationSettingsProxyProtocol { get }
var secureBackupController: SecureBackupControllerProtocol { get } var secureBackupController: SecureBackupControllerProtocol { get }

View File

@@ -113,8 +113,6 @@ protocol RoomSummaryProviderProtocol {
/// Publishes the current state the summary provider is finding itself in /// Publishes the current state the summary provider is finding itself in
var statePublisher: CurrentValuePublisher<RoomSummaryProviderState, Never> { get } var statePublisher: CurrentValuePublisher<RoomSummaryProviderState, Never> { get }
/// This is outside of the constructor because the invites list is added later on the Rust side.
/// Wanted to be able to build the InvitesSummaryProvider directly instead of having to inform the HomeScreenViewModel about it later
func setRoomList(_ roomList: RoomList) func setRoomList(_ roomList: RoomList)
func updateVisibleRange(_ range: Range<Int>) func updateVisibleRange(_ range: Range<Int>)

View File

@@ -562,28 +562,6 @@ class MockScreen: Identifiable {
userDiscoveryService: userDiscoveryMock)) userDiscoveryService: userDiscoveryMock))
navigationStackCoordinator.setRootCoordinator(coordinator) navigationStackCoordinator.setRootCoordinator(coordinator)
return navigationStackCoordinator return navigationStackCoordinator
case .invites:
ServiceLocator.shared.settings.seenInvites = Set([RoomSummary].mockInvites.compactMap(\.id))
let navigationStackCoordinator = NavigationStackCoordinator()
let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com"))
clientProxy.roomForIdentifierClosure = { identifier in
switch identifier {
case "someAwesomeRoomId1":
return RoomProxyMock(with: .init(name: "First room"))
case "someAwesomeRoomId2":
return RoomProxyMock(with: .init(name: "Second room"))
default:
return nil
}
}
let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockInvites)))
clientProxy.inviteSummaryProvider = summaryProvider
let coordinator = InvitesScreenCoordinator(parameters: .init(userSession: MockUserSession(clientProxy: clientProxy, mediaProvider: MockMediaProvider(), voiceMessageMediaManager: VoiceMessageMediaManagerMock())))
navigationStackCoordinator.setRootCoordinator(coordinator)
return navigationStackCoordinator
case .createRoom: case .createRoom:
let navigationStackCoordinator = NavigationStackCoordinator() let navigationStackCoordinator = NavigationStackCoordinator()
let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com")) let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com"))

View File

@@ -29,7 +29,6 @@ enum UITestsScreenIdentifier: String {
case createPoll case createPoll
case createRoom case createRoom
case createRoomNoUsers case createRoomNoUsers
case invites
case login case login
case roomLayoutBottom case roomLayoutBottom
case roomLayoutMiddle case roomLayoutMiddle

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a6b40715ab40723dfe24a779de84fddba834f898fbc86beca0b86fa2d7987996 oid sha256:83976938fdb2562d69638a210c8ca9259fd7fc476a8a40277f1fbbf20bda5cc2
size 133950 size 134800

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:cf79e9df2e8e87eadfc7740726e025996974e236046b11eb797870ec2f3f4275 oid sha256:fa2a5bff526bc76d1e1d838668a456a4af77dd626f746fad991ad3eb86f76e14
size 373127 size 374036

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:163a9f8f35340ee071eaaceb185d7d0e62105d216ce8d7b8bc5c10b387e21486 oid sha256:a3ab71d0af5e912ab4f1c239e6fdd0db62759b820302e3a38c188b1e43f2008e
size 168751 size 169870

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:6dbf7d469c14f8b33922b5285f47b84474171e430d54b11254ba7063feae0205 oid sha256:e41b327d5f9406d06df99b0be960d1025bc962ef6d9abaf06f0b6e5343ba00a0
size 386208 size 387405

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a0f00be8a14448432947a50f186c604768a598f4e4d2bfe5d4e6024790bed522
size 70435

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b0c157ddedf5adce004f7dc0f4326a0199ee3cf335a13b9808325f0aebed3990
size 72403

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:812f7ad00fd1df7aeb71449b7f2620cdcbd9cd06e2c54d4a86a200073bf105e7
size 70581

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a0f00be8a14448432947a50f186c604768a598f4e4d2bfe5d4e6024790bed522
size 70435

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b0c157ddedf5adce004f7dc0f4326a0199ee3cf335a13b9808325f0aebed3990
size 72403

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:812f7ad00fd1df7aeb71449b7f2620cdcbd9cd06e2c54d4a86a200073bf105e7
size 70581

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a391ebad76f9d3bf55c2d06d5b636c914c2e125c6b2f9427e84e01618cf016e9
size 29296

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8e58e17fb86a2a54979b563e6de7e5d214a6e9a20553de00eec4ccb76c244277
size 32162

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ab43e3ed28753e635fa8a905ee551a7cacbadbfb217da04953ffa12a8d5dd892
size 29745

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a391ebad76f9d3bf55c2d06d5b636c914c2e125c6b2f9427e84e01618cf016e9
size 29296

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8e58e17fb86a2a54979b563e6de7e5d214a6e9a20553de00eec4ccb76c244277
size 32162

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ab43e3ed28753e635fa8a905ee551a7cacbadbfb217da04953ffa12a8d5dd892
size 29745

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b9cefbc733c37d289bd2d63f880b1391240cb0ae3f136769d5eba9dffc5b52e1
size 88322

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a7f1bf498727b6594400f9acfcb084aca07a12744bab996a764f3a5342df3e40
size 173918

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a7bd7f1286f891862133005326471099f222de1b36a799d5d320d4d4a27e7174
size 99767

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f66907b24744f7167753227827d1dbd37ec74d1a1fb131e353db1c4c85dec88c
size 216505

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:390345d133272067289a58522f4ea5b83cc940efc76e731234e4d59fa638a2f7
size 37192

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:390345d133272067289a58522f4ea5b83cc940efc76e731234e4d59fa638a2f7
size 37192

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:116023146686c16ef0e0f4768e9299454d3d6c2543ce107da5f58d4ba4f9c139
size 45385

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:116023146686c16ef0e0f4768e9299454d3d6c2543ce107da5f58d4ba4f9c139
size 45385

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:99df5d696b1f0064e53886cdda824df0a99c16d1ca6624fca3712d3e42e72326
size 325132

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6e19c9262c97fc2ad72d060e356b871d6f82c37fdeab0052da09febc8b9a7efd
size 411798

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5a83d630743821735b30f729e75abcffe45c93a3ab65ea7bd61269c50e24bd6b
size 257864

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:651b87198b55d13f1b27612fa52629017e50b286d1c043a3ba595a11d27e9977
size 297049

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4152ca5e789f0a61c6f1321df5fd54fb3c92ca2b9ce7ee01955f1d5b8ce58f9e oid sha256:c363ee752495faca856955d7e68dc79f68dec25ce7e07daf6de2dff86a741da3
size 77726 size 78439

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:73d74993d6f777a7213c95d5d452027df3ea86b4f339353909a25fcc38ee4bbc oid sha256:1744074f01179ad9df6598251996da13f77db953d68e5b56d8372aa84dc6258c
size 79569 size 80788

View File

@@ -1,34 +0,0 @@
//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import XCTest
@MainActor
class InvitesScreenUITests: XCTestCase {
func testInvitesWithNoBadges() async throws {
let app = Application.launch(.invites)
try await app.assertScreenshot(.invites)
}
func testDeclineInvite() async throws {
let app = Application.launch(.invites)
let declineButton = app.buttons[A11yIdentifiers.invitesScreen.decline].firstMatch
XCTAssert(declineButton.exists)
declineButton.tap()
XCTAssertEqual(app.alerts.count, 1)
try await app.assertScreenshot(.invites, step: 1)
}
}

View File

@@ -1,104 +0,0 @@
//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
@testable import ElementX
import XCTest
@MainActor
class InvitesScreenViewModelTests: XCTestCase {
var viewModel: InvitesScreenViewModelProtocol!
var clientProxy: ClientProxyMock!
var userSession: MockUserSession!
var mockNotificationCenter: NotificationCenterMock!
var context: InvitesScreenViewModelType.Context {
viewModel.context
}
override func setUpWithError() throws {
clientProxy = ClientProxyMock(.init(userID: "@a:b.com"))
userSession = MockUserSession(clientProxy: clientProxy,
mediaProvider: MockMediaProvider(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock())
mockNotificationCenter = NotificationCenterMock()
}
func testEmptyState() async throws {
setupViewModel()
_ = await context.$viewState.values.first()
let invites = try XCTUnwrap(context.viewState.invites)
XCTAssertTrue(invites.isEmpty)
}
func testListState() async throws {
setupViewModel(roomSummaries: .mockInvites)
_ = await context.$viewState.values.first(where: { !$0.invites.isEmpty })
let invites = try XCTUnwrap(context.viewState.invites)
XCTAssertEqual(invites.count, 2)
}
func testAcceptInvite() async throws {
let invites: [RoomSummary] = .mockInvites
guard case .filled(let details) = invites.first else {
XCTFail("No invite found")
return
}
setupViewModel(roomSummaries: invites)
let deferred = deferFulfillment(viewModel.actions) { action in
switch action {
case .openRoom:
return true
}
}
context.send(viewAction: .accept(.init(roomDetails: details, isUnread: false)))
let action = try await deferred.fulfill()
guard case .openRoom(let roomID) = action else {
XCTFail("Wrong view model action")
return
}
XCTAssertEqual(details.id, roomID)
}
func testDeclineInvite() async throws {
let invites: [RoomSummary] = .mockInvites
guard case .filled(let details) = invites.first else {
XCTFail("No invite found")
return
}
setupViewModel(roomSummaries: invites)
context.send(viewAction: .decline(.init(roomDetails: details, isUnread: false)))
XCTAssertNotNil(context.alertInfo)
}
// MARK: - Private
private func setupViewModel(roomSummaries: [RoomSummary]? = nil) {
if let roomSummaries {
let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(roomSummaries)))
clientProxy.inviteSummaryProvider = summaryProvider
clientProxy.roomSummaryProvider = summaryProvider
}
viewModel = InvitesScreenViewModel(userSession: userSession,
appSettings: ServiceLocator.shared.settings,
analytics: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationCenterProtocol: mockNotificationCenter)
}
}

View File

@@ -28,7 +28,7 @@ final class RoomListFiltersStateTests: XCTestCase {
func testInitialState() { func testInitialState() {
XCTAssertFalse(state.isFiltering) XCTAssertFalse(state.isFiltering)
XCTAssertEqual(state.activeFilters, []) XCTAssertEqual(state.activeFilters, [])
XCTAssertEqual(state.availableFilters, RoomListFilter.allCases.filter { $0 != .invites }) XCTAssertEqual(state.availableFilters, RoomListFilter.allCases)
} }
func testSetAndUnsetFilters() { func testSetAndUnsetFilters() {
@@ -39,7 +39,7 @@ final class RoomListFiltersStateTests: XCTestCase {
state.deactivateFilter(.unreads) state.deactivateFilter(.unreads)
XCTAssertFalse(state.isFiltering) XCTAssertFalse(state.isFiltering)
XCTAssertEqual(state.activeFilters, []) XCTAssertEqual(state.activeFilters, [])
XCTAssertEqual(state.availableFilters, RoomListFilter.allCases.filter { $0 != .invites }) XCTAssertEqual(state.availableFilters, RoomListFilter.allCases)
} }
func testMutuallyExclusiveFilters() { func testMutuallyExclusiveFilters() {
@@ -51,7 +51,7 @@ final class RoomListFiltersStateTests: XCTestCase {
state.deactivateFilter(.people) state.deactivateFilter(.people)
XCTAssertFalse(state.isFiltering) XCTAssertFalse(state.isFiltering)
XCTAssertEqual(state.activeFilters, []) XCTAssertEqual(state.activeFilters, [])
XCTAssertEqual(state.availableFilters, RoomListFilter.allCases.filter { $0 != .invites }) XCTAssertEqual(state.availableFilters, RoomListFilter.allCases)
state.activateFilter(.rooms) state.activateFilter(.rooms)
XCTAssertTrue(state.isFiltering) XCTAssertTrue(state.isFiltering)
@@ -80,7 +80,7 @@ final class RoomListFiltersStateTests: XCTestCase {
state.clearFilters() state.clearFilters()
XCTAssertFalse(state.isFiltering) XCTAssertFalse(state.isFiltering)
XCTAssertEqual(state.activeFilters, []) XCTAssertEqual(state.activeFilters, [])
XCTAssertEqual(state.availableFilters, RoomListFilter.allCases.filter { $0 != .invites }) XCTAssertEqual(state.availableFilters, RoomListFilter.allCases)
} }
func testOrder() { func testOrder() {
@@ -90,7 +90,7 @@ final class RoomListFiltersStateTests: XCTestCase {
state.deactivateFilter(.favourites) state.deactivateFilter(.favourites)
XCTAssertEqual(state.activeFilters, []) XCTAssertEqual(state.activeFilters, [])
XCTAssertEqual(state.availableFilters, RoomListFilter.allCases.filter { $0 != .invites }) XCTAssertEqual(state.availableFilters, RoomListFilter.allCases)
state.activateFilter(.rooms) state.activateFilter(.rooms)
XCTAssertEqual(state.activeFilters, [.rooms]) XCTAssertEqual(state.activeFilters, [.rooms])