Enable room list invites by default and remove old code paths
This commit is contained in:
committed by
Stefan Ceriu
parent
4e670d1502
commit
0548450b6b
@@ -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 */,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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 }
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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 { }
|
||||||
|
|||||||
@@ -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") {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
|||||||
@@ -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>)
|
||||||
|
|||||||
@@ -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"))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:a0f00be8a14448432947a50f186c604768a598f4e4d2bfe5d4e6024790bed522
|
|
||||||
size 70435
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:b0c157ddedf5adce004f7dc0f4326a0199ee3cf335a13b9808325f0aebed3990
|
|
||||||
size 72403
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:812f7ad00fd1df7aeb71449b7f2620cdcbd9cd06e2c54d4a86a200073bf105e7
|
|
||||||
size 70581
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:a0f00be8a14448432947a50f186c604768a598f4e4d2bfe5d4e6024790bed522
|
|
||||||
size 70435
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:b0c157ddedf5adce004f7dc0f4326a0199ee3cf335a13b9808325f0aebed3990
|
|
||||||
size 72403
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:812f7ad00fd1df7aeb71449b7f2620cdcbd9cd06e2c54d4a86a200073bf105e7
|
|
||||||
size 70581
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:a391ebad76f9d3bf55c2d06d5b636c914c2e125c6b2f9427e84e01618cf016e9
|
|
||||||
size 29296
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:8e58e17fb86a2a54979b563e6de7e5d214a6e9a20553de00eec4ccb76c244277
|
|
||||||
size 32162
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:ab43e3ed28753e635fa8a905ee551a7cacbadbfb217da04953ffa12a8d5dd892
|
|
||||||
size 29745
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:a391ebad76f9d3bf55c2d06d5b636c914c2e125c6b2f9427e84e01618cf016e9
|
|
||||||
size 29296
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:8e58e17fb86a2a54979b563e6de7e5d214a6e9a20553de00eec4ccb76c244277
|
|
||||||
size 32162
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:ab43e3ed28753e635fa8a905ee551a7cacbadbfb217da04953ffa12a8d5dd892
|
|
||||||
size 29745
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:b9cefbc733c37d289bd2d63f880b1391240cb0ae3f136769d5eba9dffc5b52e1
|
|
||||||
size 88322
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:a7f1bf498727b6594400f9acfcb084aca07a12744bab996a764f3a5342df3e40
|
|
||||||
size 173918
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:a7bd7f1286f891862133005326471099f222de1b36a799d5d320d4d4a27e7174
|
|
||||||
size 99767
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:f66907b24744f7167753227827d1dbd37ec74d1a1fb131e353db1c4c85dec88c
|
|
||||||
size 216505
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:390345d133272067289a58522f4ea5b83cc940efc76e731234e4d59fa638a2f7
|
|
||||||
size 37192
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:390345d133272067289a58522f4ea5b83cc940efc76e731234e4d59fa638a2f7
|
|
||||||
size 37192
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:116023146686c16ef0e0f4768e9299454d3d6c2543ce107da5f58d4ba4f9c139
|
|
||||||
size 45385
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:116023146686c16ef0e0f4768e9299454d3d6c2543ce107da5f58d4ba4f9c139
|
|
||||||
size 45385
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:99df5d696b1f0064e53886cdda824df0a99c16d1ca6624fca3712d3e42e72326
|
|
||||||
size 325132
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:6e19c9262c97fc2ad72d060e356b871d6f82c37fdeab0052da09febc8b9a7efd
|
|
||||||
size 411798
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:5a83d630743821735b30f729e75abcffe45c93a3ab65ea7bd61269c50e24bd6b
|
|
||||||
size 257864
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:651b87198b55d13f1b27612fa52629017e50b286d1c043a3ba595a11d27e9977
|
|
||||||
size 297049
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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])
|
||||||
|
|||||||
Reference in New Issue
Block a user