mirror of
https://github.com/element-hq/element-x-ios.git
synced 2025-03-10 21:39:12 +00:00
Knocked Preview implementation (#3426)
* JoinRoomScreen ui for knocking * code improvement * updated previews * added knocked state with tests * send knock request * Apply suggestions from code review Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com> * pr comments * update tests * new API * knock implementation and cancel knock * update strings * added a knocked cell in the home screen * design update * updated SDK * simplified the invite case code * pr comments * updated previews * added message as reason * updated strings * fixing tests --------- Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>
This commit is contained in:
parent
7d373c07a3
commit
2511c98090
@ -34,7 +34,6 @@
|
|||||||
03CDCA6243F89B194E3FAD17 /* EncryptionAuthenticity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955336CBD5ED73C792D1F580 /* EncryptionAuthenticity.swift */; };
|
03CDCA6243F89B194E3FAD17 /* EncryptionAuthenticity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955336CBD5ED73C792D1F580 /* EncryptionAuthenticity.swift */; };
|
||||||
0437765FF480249486893CC7 /* ScreenTrackerViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196004E7695FBA292A7944AF /* ScreenTrackerViewModifier.swift */; };
|
0437765FF480249486893CC7 /* ScreenTrackerViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196004E7695FBA292A7944AF /* ScreenTrackerViewModifier.swift */; };
|
||||||
044DD8F80231BC30570F7965 /* UserDiscoveryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65AAD845E53B0C8B5E0812C2 /* UserDiscoveryService.swift */; };
|
044DD8F80231BC30570F7965 /* UserDiscoveryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65AAD845E53B0C8B5E0812C2 /* UserDiscoveryService.swift */; };
|
||||||
04A16B45228F7678A027C079 /* RoomHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 422724361B6555364C43281E /* RoomHeaderView.swift */; };
|
|
||||||
04F17DE71A50206336749BAC /* UserPreferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA241DEEF7C8A7181C0AEDC9 /* UserPreferenceTests.swift */; };
|
04F17DE71A50206336749BAC /* UserPreferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA241DEEF7C8A7181C0AEDC9 /* UserPreferenceTests.swift */; };
|
||||||
053B8BD2496207838878C6C9 /* PinnedItemsBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60C9BAE9F9436B14E4E22E8F /* PinnedItemsBannerView.swift */; };
|
053B8BD2496207838878C6C9 /* PinnedItemsBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60C9BAE9F9436B14E4E22E8F /* PinnedItemsBannerView.swift */; };
|
||||||
059173B3C77056C406906B6D /* target.yml in Resources */ = {isa = PBXBuildFile; fileRef = D4DA544B2520BFA65D6DB4BB /* target.yml */; };
|
059173B3C77056C406906B6D /* target.yml in Resources */ = {isa = PBXBuildFile; fileRef = D4DA544B2520BFA65D6DB4BB /* target.yml */; };
|
||||||
@ -46,6 +45,7 @@
|
|||||||
06D3942496E9E0E655F14D21 /* NotificationManagerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A057F2FDC14866C3026A89A4 /* NotificationManagerProtocol.swift */; };
|
06D3942496E9E0E655F14D21 /* NotificationManagerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A057F2FDC14866C3026A89A4 /* NotificationManagerProtocol.swift */; };
|
||||||
06F8EDF52E33A2D36BCC1161 /* AppLockScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D6F88FE35A0979D2821E06 /* AppLockScreen.swift */; };
|
06F8EDF52E33A2D36BCC1161 /* AppLockScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D6F88FE35A0979D2821E06 /* AppLockScreen.swift */; };
|
||||||
071A017E415AD378F2961B11 /* URL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 227AC5D71A4CE43512062243 /* URL.swift */; };
|
071A017E415AD378F2961B11 /* URL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 227AC5D71A4CE43512062243 /* URL.swift */; };
|
||||||
|
07376A5274822EB45CC320C7 /* InvitedRoomProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A21027F05874B1BCC3E452B /* InvitedRoomProxyMock.swift */; };
|
||||||
07756D532EFE33DD1FA258E5 /* GeoURITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7ED2EF5BDBAD2A7DBC4636 /* GeoURITests.swift */; };
|
07756D532EFE33DD1FA258E5 /* GeoURITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7ED2EF5BDBAD2A7DBC4636 /* GeoURITests.swift */; };
|
||||||
077CB230153E072C94B1E6C3 /* AppAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D65BCC659FD9087E49B3C25 /* AppAppearance.swift */; };
|
077CB230153E072C94B1E6C3 /* AppAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D65BCC659FD9087E49B3C25 /* AppAppearance.swift */; };
|
||||||
07CC13C5729C24255348CBBD /* ElementCallWidgetDriver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 309AD8BAE6437C31BA7157BF /* ElementCallWidgetDriver.swift */; };
|
07CC13C5729C24255348CBBD /* ElementCallWidgetDriver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 309AD8BAE6437C31BA7157BF /* ElementCallWidgetDriver.swift */; };
|
||||||
@ -611,6 +611,7 @@
|
|||||||
865DD5CA474C6AE6C2BC008E /* NetworkMonitorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1575947B7A6FE08C57FE5EE4 /* NetworkMonitorProtocol.swift */; };
|
865DD5CA474C6AE6C2BC008E /* NetworkMonitorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1575947B7A6FE08C57FE5EE4 /* NetworkMonitorProtocol.swift */; };
|
||||||
86675910612A12409262DFBD /* SessionVerificationStateMachineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C22B1B5FA3A765EADB2CC9 /* SessionVerificationStateMachineTests.swift */; };
|
86675910612A12409262DFBD /* SessionVerificationStateMachineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C22B1B5FA3A765EADB2CC9 /* SessionVerificationStateMachineTests.swift */; };
|
||||||
8691186F9B99BCDDB7CACDD8 /* KeychainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E36CB905A2B9EC2C92A2DA7C /* KeychainController.swift */; };
|
8691186F9B99BCDDB7CACDD8 /* KeychainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E36CB905A2B9EC2C92A2DA7C /* KeychainController.swift */; };
|
||||||
|
86DFA58FBBEB0AF671D2A1E1 /* HomeScreenKnockedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A103580EBA06155B1343EF16 /* HomeScreenKnockedCell.swift */; };
|
||||||
86F9D3028A1F4AE819D75560 /* RoomChangePermissionsScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D879FC4E881E748BB9B34DC /* RoomChangePermissionsScreenCoordinator.swift */; };
|
86F9D3028A1F4AE819D75560 /* RoomChangePermissionsScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D879FC4E881E748BB9B34DC /* RoomChangePermissionsScreenCoordinator.swift */; };
|
||||||
872A6457DF573AF8CEAE927A /* LoginHomeserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9349F590E35CE514A71E6764 /* LoginHomeserver.swift */; };
|
872A6457DF573AF8CEAE927A /* LoginHomeserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9349F590E35CE514A71E6764 /* LoginHomeserver.swift */; };
|
||||||
874FEFB9D4A4AF447E0E086E /* AuthenticationStartScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0F7CCC4A9D1927223F559D5 /* AuthenticationStartScreenViewModelProtocol.swift */; };
|
874FEFB9D4A4AF447E0E086E /* AuthenticationStartScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0F7CCC4A9D1927223F559D5 /* AuthenticationStartScreenViewModelProtocol.swift */; };
|
||||||
@ -716,6 +717,7 @@
|
|||||||
9BD3A773186291560DF92B62 /* RoomTimelineProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F2402D738694F98729A441 /* RoomTimelineProvider.swift */; };
|
9BD3A773186291560DF92B62 /* RoomTimelineProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F2402D738694F98729A441 /* RoomTimelineProvider.swift */; };
|
||||||
9C4EC28A921486B1775D7F8C /* IdentityConfirmedScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307702DD66E7DDCDD9214784 /* IdentityConfirmedScreen.swift */; };
|
9C4EC28A921486B1775D7F8C /* IdentityConfirmedScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307702DD66E7DDCDD9214784 /* IdentityConfirmedScreen.swift */; };
|
||||||
9C55746D8F6A3E35CFCF4A7A /* AuthenticationStartLogo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 598F01EBD0C4CC550C644418 /* AuthenticationStartLogo.swift */; };
|
9C55746D8F6A3E35CFCF4A7A /* AuthenticationStartLogo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 598F01EBD0C4CC550C644418 /* AuthenticationStartLogo.swift */; };
|
||||||
|
9C63171267E22FEB288EC860 /* RoomHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1627F2D56477BD331F6D732C /* RoomHeaderView.swift */; };
|
||||||
9CBB04365408F9D6F46BA3A7 /* PinnedEventsTimelineFlowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54AAF72E821B4084B7E4298 /* PinnedEventsTimelineFlowCoordinator.swift */; };
|
9CBB04365408F9D6F46BA3A7 /* PinnedEventsTimelineFlowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54AAF72E821B4084B7E4298 /* PinnedEventsTimelineFlowCoordinator.swift */; };
|
||||||
9D2E03DB175A6AB14589076D /* AnalyticsEvents in Frameworks */ = {isa = PBXBuildFile; productRef = 2A3F7BCCB18C15B30CCA39A9 /* AnalyticsEvents */; };
|
9D2E03DB175A6AB14589076D /* AnalyticsEvents in Frameworks */ = {isa = PBXBuildFile; productRef = 2A3F7BCCB18C15B30CCA39A9 /* AnalyticsEvents */; };
|
||||||
9D79B94493FB32249F7E472F /* PlaceholderAvatarImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C705E605EF57C19DBE86FFA1 /* PlaceholderAvatarImage.swift */; };
|
9D79B94493FB32249F7E472F /* PlaceholderAvatarImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C705E605EF57C19DBE86FFA1 /* PlaceholderAvatarImage.swift */; };
|
||||||
@ -1301,6 +1303,7 @@
|
|||||||
1575947B7A6FE08C57FE5EE4 /* NetworkMonitorProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitorProtocol.swift; sourceTree = "<group>"; };
|
1575947B7A6FE08C57FE5EE4 /* NetworkMonitorProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitorProtocol.swift; sourceTree = "<group>"; };
|
||||||
15A657D96779D1DEB8EF1327 /* CreateRoomViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateRoomViewModel.swift; sourceTree = "<group>"; };
|
15A657D96779D1DEB8EF1327 /* CreateRoomViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateRoomViewModel.swift; sourceTree = "<group>"; };
|
||||||
161CD412E75F4086F422AE39 /* SessionVerificationScreenStateMachine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationScreenStateMachine.swift; sourceTree = "<group>"; };
|
161CD412E75F4086F422AE39 /* SessionVerificationScreenStateMachine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationScreenStateMachine.swift; sourceTree = "<group>"; };
|
||||||
|
1627F2D56477BD331F6D732C /* RoomHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomHeaderView.swift; sourceTree = "<group>"; };
|
||||||
16D09C79746BDCD9173EB3A7 /* RoomDetailsEditScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDetailsEditScreenModels.swift; sourceTree = "<group>"; };
|
16D09C79746BDCD9173EB3A7 /* RoomDetailsEditScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDetailsEditScreenModels.swift; sourceTree = "<group>"; };
|
||||||
1715E3D7F53C0748AA50C91C /* PostHogAnalyticsClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogAnalyticsClient.swift; sourceTree = "<group>"; };
|
1715E3D7F53C0748AA50C91C /* PostHogAnalyticsClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogAnalyticsClient.swift; sourceTree = "<group>"; };
|
||||||
1734A445A58ED855B977A0A8 /* TracingConfigurationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TracingConfigurationTests.swift; sourceTree = "<group>"; };
|
1734A445A58ED855B977A0A8 /* TracingConfigurationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TracingConfigurationTests.swift; sourceTree = "<group>"; };
|
||||||
@ -1465,6 +1468,7 @@
|
|||||||
398817652FA8ABAE0A31AC6D /* ReadableFrameModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadableFrameModifier.swift; sourceTree = "<group>"; };
|
398817652FA8ABAE0A31AC6D /* ReadableFrameModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadableFrameModifier.swift; sourceTree = "<group>"; };
|
||||||
39C0D861FC397AC34BCF089E /* KeychainControllerMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainControllerMock.swift; sourceTree = "<group>"; };
|
39C0D861FC397AC34BCF089E /* KeychainControllerMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainControllerMock.swift; sourceTree = "<group>"; };
|
||||||
3A12D3D8138F1B71AFA7C858 /* CompletionSuggestionService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompletionSuggestionService.swift; sourceTree = "<group>"; };
|
3A12D3D8138F1B71AFA7C858 /* CompletionSuggestionService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompletionSuggestionService.swift; sourceTree = "<group>"; };
|
||||||
|
3A21027F05874B1BCC3E452B /* InvitedRoomProxyMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitedRoomProxyMock.swift; sourceTree = "<group>"; };
|
||||||
3AD253E7EFF88F308D644272 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/SAS.strings"; sourceTree = "<group>"; };
|
3AD253E7EFF88F308D644272 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/SAS.strings"; sourceTree = "<group>"; };
|
||||||
3B5E97E9615A158C76B2AB77 /* DateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTests.swift; sourceTree = "<group>"; };
|
3B5E97E9615A158C76B2AB77 /* DateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTests.swift; sourceTree = "<group>"; };
|
||||||
3BAC027034248429A438886B /* AppMediatorMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppMediatorMock.swift; sourceTree = "<group>"; };
|
3BAC027034248429A438886B /* AppMediatorMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppMediatorMock.swift; sourceTree = "<group>"; };
|
||||||
@ -1504,7 +1508,6 @@
|
|||||||
421E716C521F96D24ECE69B3 /* NoticeRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeRoomTimelineItem.swift; sourceTree = "<group>"; };
|
421E716C521F96D24ECE69B3 /* NoticeRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeRoomTimelineItem.swift; sourceTree = "<group>"; };
|
||||||
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>"; };
|
|
||||||
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>"; };
|
||||||
436A0D98D372B17EAE9AA999 /* GlobalSearchScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalSearchScreenModels.swift; sourceTree = "<group>"; };
|
436A0D98D372B17EAE9AA999 /* GlobalSearchScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalSearchScreenModels.swift; sourceTree = "<group>"; };
|
||||||
@ -1901,6 +1904,7 @@
|
|||||||
A019A12C866D64CF072024B9 /* AppLockSetupPINScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupPINScreenViewModel.swift; sourceTree = "<group>"; };
|
A019A12C866D64CF072024B9 /* AppLockSetupPINScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupPINScreenViewModel.swift; sourceTree = "<group>"; };
|
||||||
A02D1A490944BF01A37586E1 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/SAS.strings; sourceTree = "<group>"; };
|
A02D1A490944BF01A37586E1 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/SAS.strings; sourceTree = "<group>"; };
|
||||||
A057F2FDC14866C3026A89A4 /* NotificationManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManagerProtocol.swift; sourceTree = "<group>"; };
|
A057F2FDC14866C3026A89A4 /* NotificationManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManagerProtocol.swift; sourceTree = "<group>"; };
|
||||||
|
A103580EBA06155B1343EF16 /* HomeScreenKnockedCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenKnockedCell.swift; sourceTree = "<group>"; };
|
||||||
A12D3B1BCF920880CA8BBB6B /* UserIndicatorControllerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserIndicatorControllerProtocol.swift; sourceTree = "<group>"; };
|
A12D3B1BCF920880CA8BBB6B /* UserIndicatorControllerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserIndicatorControllerProtocol.swift; sourceTree = "<group>"; };
|
||||||
A130A2251A15A7AACC84FD37 /* RoomPollsHistoryScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomPollsHistoryScreenViewModelProtocol.swift; sourceTree = "<group>"; };
|
A130A2251A15A7AACC84FD37 /* RoomPollsHistoryScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomPollsHistoryScreenViewModelProtocol.swift; sourceTree = "<group>"; };
|
||||||
A16CD2C62CB7DB78A4238485 /* ReportContentScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportContentScreenCoordinator.swift; sourceTree = "<group>"; };
|
A16CD2C62CB7DB78A4238485 /* ReportContentScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportContentScreenCoordinator.swift; sourceTree = "<group>"; };
|
||||||
@ -2915,6 +2919,7 @@
|
|||||||
4E600B315B920B9687F8EE1B /* ComposerDraftServiceMock.swift */,
|
4E600B315B920B9687F8EE1B /* ComposerDraftServiceMock.swift */,
|
||||||
E321E840DCC63790049984F4 /* ElementCallServiceMock.swift */,
|
E321E840DCC63790049984F4 /* ElementCallServiceMock.swift */,
|
||||||
1B10423B9102086A2D9BFCBA /* EventTimelineItem.swift */,
|
1B10423B9102086A2D9BFCBA /* EventTimelineItem.swift */,
|
||||||
|
3A21027F05874B1BCC3E452B /* InvitedRoomProxyMock.swift */,
|
||||||
867DC9530C42F7B5176BE465 /* JoinedRoomProxyMock.swift */,
|
867DC9530C42F7B5176BE465 /* JoinedRoomProxyMock.swift */,
|
||||||
9E8F4D7D61B80EBD5CB92F8A /* KnockedRoomProxyMock.swift */,
|
9E8F4D7D61B80EBD5CB92F8A /* KnockedRoomProxyMock.swift */,
|
||||||
6F65E4BB9E82EB8373207CF8 /* MediaProviderMock.swift */,
|
6F65E4BB9E82EB8373207CF8 /* MediaProviderMock.swift */,
|
||||||
@ -2964,6 +2969,7 @@
|
|||||||
648DD1C10E4957CB791FE0B8 /* OverridableAvatarImage.swift */,
|
648DD1C10E4957CB791FE0B8 /* OverridableAvatarImage.swift */,
|
||||||
C705E605EF57C19DBE86FFA1 /* PlaceholderAvatarImage.swift */,
|
C705E605EF57C19DBE86FFA1 /* PlaceholderAvatarImage.swift */,
|
||||||
BEF5FE93A06F563B477F024A /* RoomAvatarImage.swift */,
|
BEF5FE93A06F563B477F024A /* RoomAvatarImage.swift */,
|
||||||
|
1627F2D56477BD331F6D732C /* RoomHeaderView.swift */,
|
||||||
7EB58E4E8D6D634C246AD5C2 /* RoomInviterLabel.swift */,
|
7EB58E4E8D6D634C246AD5C2 /* RoomInviterLabel.swift */,
|
||||||
839E2C35DF3F9C7B54C3CE49 /* RoundedCornerShape.swift */,
|
839E2C35DF3F9C7B54C3CE49 /* RoundedCornerShape.swift */,
|
||||||
DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */,
|
DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */,
|
||||||
@ -3425,6 +3431,7 @@
|
|||||||
A3B4B58B79A6FA250B24A1EC /* HomeScreenContent.swift */,
|
A3B4B58B79A6FA250B24A1EC /* HomeScreenContent.swift */,
|
||||||
C0FEA560929DD73FFEF8C3DF /* HomeScreenEmptyStateView.swift */,
|
C0FEA560929DD73FFEF8C3DF /* HomeScreenEmptyStateView.swift */,
|
||||||
D8FC33C3F6BF597E095CE9FA /* HomeScreenInviteCell.swift */,
|
D8FC33C3F6BF597E095CE9FA /* HomeScreenInviteCell.swift */,
|
||||||
|
A103580EBA06155B1343EF16 /* HomeScreenKnockedCell.swift */,
|
||||||
05512FB13987D221B7205DE0 /* HomeScreenRecoveryKeyConfirmationBanner.swift */,
|
05512FB13987D221B7205DE0 /* HomeScreenRecoveryKeyConfirmationBanner.swift */,
|
||||||
ED044D00F2176681CC02CD54 /* HomeScreenRoomCell.swift */,
|
ED044D00F2176681CC02CD54 /* HomeScreenRoomCell.swift */,
|
||||||
C7661EFFCAA307A97D71132A /* HomeScreenRoomList.swift */,
|
C7661EFFCAA307A97D71132A /* HomeScreenRoomList.swift */,
|
||||||
@ -4036,7 +4043,6 @@
|
|||||||
79023E5904B155E8E2B8B502 /* View */ = {
|
79023E5904B155E8E2B8B502 /* View */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
422724361B6555364C43281E /* RoomHeaderView.swift */,
|
|
||||||
5221DFDF809142A2D6AC82B9 /* RoomScreen.swift */,
|
5221DFDF809142A2D6AC82B9 /* RoomScreen.swift */,
|
||||||
4137900E28201C314C835C11 /* RoomScreenFooterView.swift */,
|
4137900E28201C314C835C11 /* RoomScreenFooterView.swift */,
|
||||||
4552D3466B1453F287223ADA /* SwipeRightAction.swift */,
|
4552D3466B1453F287223ADA /* SwipeRightAction.swift */,
|
||||||
@ -6501,6 +6507,7 @@
|
|||||||
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 */,
|
||||||
|
86DFA58FBBEB0AF671D2A1E1 /* HomeScreenKnockedCell.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 */,
|
||||||
@ -6532,6 +6539,7 @@
|
|||||||
F519DE17A3A0F760307B2E6D /* InviteUsersScreenViewModel.swift in Sources */,
|
F519DE17A3A0F760307B2E6D /* InviteUsersScreenViewModel.swift in Sources */,
|
||||||
A17FAD2EBC53E17B5FD384DB /* InviteUsersScreenViewModelProtocol.swift in Sources */,
|
A17FAD2EBC53E17B5FD384DB /* InviteUsersScreenViewModelProtocol.swift in Sources */,
|
||||||
89B909AC66B96FA054EF3C14 /* InvitedRoomProxy.swift in Sources */,
|
89B909AC66B96FA054EF3C14 /* InvitedRoomProxy.swift in Sources */,
|
||||||
|
07376A5274822EB45CC320C7 /* InvitedRoomProxyMock.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 */,
|
||||||
@ -6770,7 +6778,7 @@
|
|||||||
2814E7075BF3A5C0CCBC9F90 /* RoomDirectorySearchView.swift in Sources */,
|
2814E7075BF3A5C0CCBC9F90 /* RoomDirectorySearchView.swift in Sources */,
|
||||||
42F1C8731166633E35A6D7E6 /* RoomEventStringBuilder.swift in Sources */,
|
42F1C8731166633E35A6D7E6 /* RoomEventStringBuilder.swift in Sources */,
|
||||||
D55AF9B5B55FEED04771A461 /* RoomFlowCoordinator.swift in Sources */,
|
D55AF9B5B55FEED04771A461 /* RoomFlowCoordinator.swift in Sources */,
|
||||||
04A16B45228F7678A027C079 /* RoomHeaderView.swift in Sources */,
|
9C63171267E22FEB288EC860 /* RoomHeaderView.swift in Sources */,
|
||||||
8A83D715940378B9BA9F739E /* RoomInviterLabel.swift in Sources */,
|
8A83D715940378B9BA9F739E /* RoomInviterLabel.swift in Sources */,
|
||||||
F4996C82A4B3A5FF0C8EDD03 /* RoomListFilterModels.swift in Sources */,
|
F4996C82A4B3A5FF0C8EDD03 /* RoomListFilterModels.swift in Sources */,
|
||||||
4A9CEEE612D6D8B3DDBD28BA /* RoomListFilterView.swift in Sources */,
|
4A9CEEE612D6D8B3DDBD28BA /* RoomListFilterView.swift in Sources */,
|
||||||
|
@ -371,6 +371,7 @@
|
|||||||
"screen_room_pinned_banner_loading_description" = "Loading message…";
|
"screen_room_pinned_banner_loading_description" = "Loading message…";
|
||||||
"screen_room_pinned_banner_view_all_button_title" = "View All";
|
"screen_room_pinned_banner_view_all_button_title" = "View All";
|
||||||
"screen_room_details_pinned_events_row_title" = "Pinned messages";
|
"screen_room_details_pinned_events_row_title" = "Pinned messages";
|
||||||
|
"screen_roomlist_knock_event_sent_description" = "Request to join sent";
|
||||||
"screen_timeline_item_menu_send_failure_changed_identity" = "Message not sent because %1$@’s verified identity has changed.";
|
"screen_timeline_item_menu_send_failure_changed_identity" = "Message not sent because %1$@’s verified identity has changed.";
|
||||||
"screen_timeline_item_menu_send_failure_unsigned_device" = "Message not sent because %1$@ has not verified all devices.";
|
"screen_timeline_item_menu_send_failure_unsigned_device" = "Message not sent because %1$@ has not verified all devices.";
|
||||||
"screen_timeline_item_menu_send_failure_you_unsigned_device" = "Message not sent because you have not verified one or more of your devices.";
|
"screen_timeline_item_menu_send_failure_you_unsigned_device" = "Message not sent because you have not verified one or more of your devices.";
|
||||||
@ -822,12 +823,16 @@
|
|||||||
"screen_session_verification_open_existing_session_title" = "Open an existing session";
|
"screen_session_verification_open_existing_session_title" = "Open an existing session";
|
||||||
"screen_session_verification_positive_button_canceled" = "Retry verification";
|
"screen_session_verification_positive_button_canceled" = "Retry verification";
|
||||||
"screen_session_verification_positive_button_initial" = "I am ready";
|
"screen_session_verification_positive_button_initial" = "I am ready";
|
||||||
"screen_session_verification_positive_button_verifying_ongoing" = "Waiting to match";
|
"screen_session_verification_positive_button_verifying_ongoing" = "Waiting to match…";
|
||||||
"screen_session_verification_ready_subtitle" = "Compare a unique set of emojis.";
|
"screen_session_verification_ready_subtitle" = "Compare a unique set of emojis.";
|
||||||
"screen_session_verification_request_accepted_subtitle" = "Compare the unique emoji, ensuring they appear in the same order.";
|
"screen_session_verification_request_accepted_subtitle" = "Compare the unique emoji, ensuring they appear in the same order.";
|
||||||
"screen_session_verification_request_details_timestamp" = "Signed in";
|
"screen_session_verification_request_details_timestamp" = "Signed in";
|
||||||
|
"screen_session_verification_request_failure_subtitle" = "Either the request timed out, the request was denied, or there was a verification mismatch.";
|
||||||
|
"screen_session_verification_request_failure_title" = "Verification failed";
|
||||||
"screen_session_verification_request_footer" = "Only continue if you initiated this verification.";
|
"screen_session_verification_request_footer" = "Only continue if you initiated this verification.";
|
||||||
"screen_session_verification_request_subtitle" = "Verify the other device to keep your message history secure.";
|
"screen_session_verification_request_subtitle" = "Verify the other device to keep your message history secure.";
|
||||||
|
"screen_session_verification_request_success_subtitle" = "Now you can read or send messages securely on your other device.";
|
||||||
|
"screen_session_verification_request_success_title" = "Device verified";
|
||||||
"screen_session_verification_request_title" = "Verification requested";
|
"screen_session_verification_request_title" = "Verification requested";
|
||||||
"screen_session_verification_they_dont_match" = "They don’t match";
|
"screen_session_verification_they_dont_match" = "They don’t match";
|
||||||
"screen_session_verification_they_match" = "They match";
|
"screen_session_verification_they_match" = "They match";
|
||||||
|
@ -1965,6 +1965,8 @@ internal enum L10n {
|
|||||||
/// Congrats!
|
/// Congrats!
|
||||||
/// You don’t have any unread messages!
|
/// You don’t have any unread messages!
|
||||||
internal static var screenRoomlistFilterUnreadsEmptyStateTitle: String { return L10n.tr("Localizable", "screen_roomlist_filter_unreads_empty_state_title") }
|
internal static var screenRoomlistFilterUnreadsEmptyStateTitle: String { return L10n.tr("Localizable", "screen_roomlist_filter_unreads_empty_state_title") }
|
||||||
|
/// Request to join sent
|
||||||
|
internal static var screenRoomlistKnockEventSentDescription: String { return L10n.tr("Localizable", "screen_roomlist_knock_event_sent_description") }
|
||||||
/// Chats
|
/// Chats
|
||||||
internal static var screenRoomlistMainSpaceTitle: String { return L10n.tr("Localizable", "screen_roomlist_main_space_title") }
|
internal static var screenRoomlistMainSpaceTitle: String { return L10n.tr("Localizable", "screen_roomlist_main_space_title") }
|
||||||
/// Mark as read
|
/// Mark as read
|
||||||
@ -2013,7 +2015,7 @@ internal enum L10n {
|
|||||||
internal static var screenSessionVerificationPositiveButtonCanceled: String { return L10n.tr("Localizable", "screen_session_verification_positive_button_canceled") }
|
internal static var screenSessionVerificationPositiveButtonCanceled: String { return L10n.tr("Localizable", "screen_session_verification_positive_button_canceled") }
|
||||||
/// I am ready
|
/// I am ready
|
||||||
internal static var screenSessionVerificationPositiveButtonInitial: String { return L10n.tr("Localizable", "screen_session_verification_positive_button_initial") }
|
internal static var screenSessionVerificationPositiveButtonInitial: String { return L10n.tr("Localizable", "screen_session_verification_positive_button_initial") }
|
||||||
/// Waiting to match
|
/// Waiting to match…
|
||||||
internal static var screenSessionVerificationPositiveButtonVerifyingOngoing: String { return L10n.tr("Localizable", "screen_session_verification_positive_button_verifying_ongoing") }
|
internal static var screenSessionVerificationPositiveButtonVerifyingOngoing: String { return L10n.tr("Localizable", "screen_session_verification_positive_button_verifying_ongoing") }
|
||||||
/// Compare a unique set of emojis.
|
/// Compare a unique set of emojis.
|
||||||
internal static var screenSessionVerificationReadySubtitle: String { return L10n.tr("Localizable", "screen_session_verification_ready_subtitle") }
|
internal static var screenSessionVerificationReadySubtitle: String { return L10n.tr("Localizable", "screen_session_verification_ready_subtitle") }
|
||||||
@ -2021,10 +2023,18 @@ internal enum L10n {
|
|||||||
internal static var screenSessionVerificationRequestAcceptedSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_request_accepted_subtitle") }
|
internal static var screenSessionVerificationRequestAcceptedSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_request_accepted_subtitle") }
|
||||||
/// Signed in
|
/// Signed in
|
||||||
internal static var screenSessionVerificationRequestDetailsTimestamp: String { return L10n.tr("Localizable", "screen_session_verification_request_details_timestamp") }
|
internal static var screenSessionVerificationRequestDetailsTimestamp: String { return L10n.tr("Localizable", "screen_session_verification_request_details_timestamp") }
|
||||||
|
/// Either the request timed out, the request was denied, or there was a verification mismatch.
|
||||||
|
internal static var screenSessionVerificationRequestFailureSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_request_failure_subtitle") }
|
||||||
|
/// Verification failed
|
||||||
|
internal static var screenSessionVerificationRequestFailureTitle: String { return L10n.tr("Localizable", "screen_session_verification_request_failure_title") }
|
||||||
/// Only continue if you initiated this verification.
|
/// Only continue if you initiated this verification.
|
||||||
internal static var screenSessionVerificationRequestFooter: String { return L10n.tr("Localizable", "screen_session_verification_request_footer") }
|
internal static var screenSessionVerificationRequestFooter: String { return L10n.tr("Localizable", "screen_session_verification_request_footer") }
|
||||||
/// Verify the other device to keep your message history secure.
|
/// Verify the other device to keep your message history secure.
|
||||||
internal static var screenSessionVerificationRequestSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_request_subtitle") }
|
internal static var screenSessionVerificationRequestSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_request_subtitle") }
|
||||||
|
/// Now you can read or send messages securely on your other device.
|
||||||
|
internal static var screenSessionVerificationRequestSuccessSubtitle: String { return L10n.tr("Localizable", "screen_session_verification_request_success_subtitle") }
|
||||||
|
/// Device verified
|
||||||
|
internal static var screenSessionVerificationRequestSuccessTitle: String { return L10n.tr("Localizable", "screen_session_verification_request_success_title") }
|
||||||
/// Verification requested
|
/// Verification requested
|
||||||
internal static var screenSessionVerificationRequestTitle: String { return L10n.tr("Localizable", "screen_session_verification_request_title") }
|
internal static var screenSessionVerificationRequestTitle: String { return L10n.tr("Localizable", "screen_session_verification_request_title") }
|
||||||
/// They don’t match
|
/// They don’t match
|
||||||
|
31
ElementX/Sources/Mocks/InvitedRoomProxyMock.swift
Normal file
31
ElementX/Sources/Mocks/InvitedRoomProxyMock.swift
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2024 New Vector Ltd.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
// Please see LICENSE in the repository root for full details.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Combine
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
struct InvitedRoomProxyMockConfiguration {
|
||||||
|
var id = UUID().uuidString
|
||||||
|
var name: String?
|
||||||
|
var avatarURL: URL?
|
||||||
|
var members: [RoomMemberProxyMock] = .allMembers
|
||||||
|
var inviter: RoomMemberProxyMock = .mockAlice
|
||||||
|
}
|
||||||
|
|
||||||
|
extension InvitedRoomProxyMock {
|
||||||
|
@MainActor
|
||||||
|
convenience init(_ configuration: InvitedRoomProxyMockConfiguration) {
|
||||||
|
self.init()
|
||||||
|
id = configuration.id
|
||||||
|
name = configuration.name
|
||||||
|
avatarURL = configuration.avatarURL
|
||||||
|
avatar = .room(id: configuration.id, name: configuration.name, avatarURL: configuration.avatarURL) // Note: This doesn't replicate the real proxy logic.
|
||||||
|
underlyingInviter = configuration.inviter
|
||||||
|
activeMembersCount = configuration.members.filter { $0.membership == .join || $0.membership == .invite }.count
|
||||||
|
}
|
||||||
|
}
|
@ -71,8 +71,7 @@ extension Array where Element == RoomSummary {
|
|||||||
static let mockRooms: [Element] = [
|
static let mockRooms: [Element] = [
|
||||||
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "1",
|
id: "1",
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: "Foundation 🔭🪐🌌",
|
name: "Foundation 🔭🪐🌌",
|
||||||
isDirect: false,
|
isDirect: false,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
@ -89,8 +88,7 @@ extension Array where Element == RoomSummary {
|
|||||||
isFavourite: false),
|
isFavourite: false),
|
||||||
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "2",
|
id: "2",
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: "Foundation and Empire",
|
name: "Foundation and Empire",
|
||||||
isDirect: false,
|
isDirect: false,
|
||||||
avatarURL: URL.picturesDirectory,
|
avatarURL: URL.picturesDirectory,
|
||||||
@ -107,8 +105,7 @@ extension Array where Element == RoomSummary {
|
|||||||
isFavourite: false),
|
isFavourite: false),
|
||||||
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "3",
|
id: "3",
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: "Second Foundation",
|
name: "Second Foundation",
|
||||||
isDirect: false,
|
isDirect: false,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
@ -125,8 +122,7 @@ extension Array where Element == RoomSummary {
|
|||||||
isFavourite: false),
|
isFavourite: false),
|
||||||
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "4",
|
id: "4",
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: "Foundation's Edge",
|
name: "Foundation's Edge",
|
||||||
isDirect: false,
|
isDirect: false,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
@ -143,8 +139,7 @@ extension Array where Element == RoomSummary {
|
|||||||
isFavourite: false),
|
isFavourite: false),
|
||||||
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "5",
|
id: "5",
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: "Foundation and Earth",
|
name: "Foundation and Earth",
|
||||||
isDirect: true,
|
isDirect: true,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
@ -161,8 +156,7 @@ extension Array where Element == RoomSummary {
|
|||||||
isFavourite: false),
|
isFavourite: false),
|
||||||
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "6",
|
id: "6",
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: "Prelude to Foundation",
|
name: "Prelude to Foundation",
|
||||||
isDirect: true,
|
isDirect: true,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
@ -179,8 +173,7 @@ extension Array where Element == RoomSummary {
|
|||||||
isFavourite: false),
|
isFavourite: false),
|
||||||
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "0",
|
id: "0",
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: "Unknown",
|
name: "Unknown",
|
||||||
isDirect: false,
|
isDirect: false,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
@ -230,8 +223,7 @@ extension Array where Element == RoomSummary {
|
|||||||
static let mockInvites: [Element] = [
|
static let mockInvites: [Element] = [
|
||||||
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "someAwesomeRoomId1",
|
id: "someAwesomeRoomId1",
|
||||||
isInvite: false,
|
joinRequestType: .invite(inviter: RoomMemberProxyMock.mockCharlie),
|
||||||
inviter: RoomMemberProxyMock.mockCharlie,
|
|
||||||
name: "First room",
|
name: "First room",
|
||||||
isDirect: false,
|
isDirect: false,
|
||||||
avatarURL: URL.picturesDirectory,
|
avatarURL: URL.picturesDirectory,
|
||||||
@ -248,8 +240,7 @@ extension Array where Element == RoomSummary {
|
|||||||
isFavourite: false),
|
isFavourite: false),
|
||||||
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "someAwesomeRoomId2",
|
id: "someAwesomeRoomId2",
|
||||||
isInvite: false,
|
joinRequestType: .invite(inviter: RoomMemberProxyMock.mockCharlie),
|
||||||
inviter: RoomMemberProxyMock.mockCharlie,
|
|
||||||
name: "Second room",
|
name: "Second room",
|
||||||
isDirect: true,
|
isDirect: true,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
|
@ -127,10 +127,11 @@ struct HomeScreenViewStateBindings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct HomeScreenRoom: Identifiable, Equatable {
|
struct HomeScreenRoom: Identifiable, Equatable {
|
||||||
enum RoomType {
|
enum RoomType: Equatable {
|
||||||
case placeholder
|
case placeholder
|
||||||
case room
|
case room
|
||||||
case invite
|
case invite(inviterDetails: RoomInviterDetails?)
|
||||||
|
case knock
|
||||||
}
|
}
|
||||||
|
|
||||||
static let placeholderLastMessage = AttributedString("Hidden last message")
|
static let placeholderLastMessage = AttributedString("Hidden last message")
|
||||||
@ -143,6 +144,13 @@ struct HomeScreenRoom: Identifiable, Equatable {
|
|||||||
|
|
||||||
let type: RoomType
|
let type: RoomType
|
||||||
|
|
||||||
|
var inviter: RoomInviterDetails? {
|
||||||
|
if case .invite(let inviter) = type {
|
||||||
|
return inviter
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
let badges: Badges
|
let badges: Badges
|
||||||
struct Badges: Equatable {
|
struct Badges: Equatable {
|
||||||
let isDotShown: Bool
|
let isDotShown: Bool
|
||||||
@ -165,8 +173,6 @@ struct HomeScreenRoom: Identifiable, Equatable {
|
|||||||
|
|
||||||
let avatar: RoomAvatar
|
let avatar: RoomAvatar
|
||||||
|
|
||||||
let inviter: RoomInviterDetails?
|
|
||||||
|
|
||||||
let canonicalAlias: String?
|
let canonicalAlias: String?
|
||||||
|
|
||||||
static func placeholder() -> HomeScreenRoom {
|
static func placeholder() -> HomeScreenRoom {
|
||||||
@ -181,7 +187,6 @@ struct HomeScreenRoom: Identifiable, Equatable {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
lastMessage: placeholderLastMessage,
|
lastMessage: placeholderLastMessage,
|
||||||
avatar: .room(id: "", name: "", avatarURL: nil),
|
avatar: .room(id: "", name: "", avatarURL: nil),
|
||||||
inviter: nil,
|
|
||||||
canonicalAlias: nil)
|
canonicalAlias: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -192,17 +197,21 @@ extension HomeScreenRoom {
|
|||||||
|
|
||||||
let hasUnreadMessages = hideUnreadMessagesBadge ? false : summary.hasUnreadMessages
|
let hasUnreadMessages = hideUnreadMessagesBadge ? false : summary.hasUnreadMessages
|
||||||
|
|
||||||
let isDotShown = hasUnreadMessages || summary.hasUnreadMentions || summary.hasUnreadNotifications || summary.isMarkedUnread
|
let isDotShown = hasUnreadMessages || summary.hasUnreadMentions || summary.hasUnreadNotifications || summary.isMarkedUnread || summary.joinRequestType?.isKnock == true
|
||||||
let isMentionShown = summary.hasUnreadMentions && !summary.isMuted
|
let isMentionShown = summary.hasUnreadMentions && !summary.isMuted
|
||||||
let isMuteShown = summary.isMuted
|
let isMuteShown = summary.isMuted
|
||||||
let isCallShown = summary.hasOngoingCall
|
let isCallShown = summary.hasOngoingCall
|
||||||
let isHighlighted = summary.isMarkedUnread || (!summary.isMuted && (summary.hasUnreadNotifications || summary.hasUnreadMentions))
|
let isHighlighted = summary.isMarkedUnread || (!summary.isMuted && (summary.hasUnreadNotifications || summary.hasUnreadMentions)) || summary.joinRequestType?.isKnock == true
|
||||||
|
|
||||||
let inviter = summary.inviter.map(RoomInviterDetails.init)
|
let type: HomeScreenRoom.RoomType = switch summary.joinRequestType {
|
||||||
|
case .invite(let inviter): .invite(inviterDetails: inviter.map(RoomInviterDetails.init))
|
||||||
|
case .knock: .knock
|
||||||
|
case .none: .room
|
||||||
|
}
|
||||||
|
|
||||||
self.init(id: identifier,
|
self.init(id: identifier,
|
||||||
roomID: summary.id,
|
roomID: summary.id,
|
||||||
type: summary.isInvite ? .invite : .room,
|
type: type,
|
||||||
badges: .init(isDotShown: isDotShown,
|
badges: .init(isDotShown: isDotShown,
|
||||||
isMentionShown: isMentionShown,
|
isMentionShown: isMentionShown,
|
||||||
isMuteShown: isMuteShown,
|
isMuteShown: isMuteShown,
|
||||||
@ -214,7 +223,6 @@ extension HomeScreenRoom {
|
|||||||
timestamp: summary.lastMessageFormattedTimestamp,
|
timestamp: summary.lastMessageFormattedTimestamp,
|
||||||
lastMessage: summary.lastMessage,
|
lastMessage: summary.lastMessage,
|
||||||
avatar: summary.avatar,
|
avatar: summary.avatar,
|
||||||
inviter: inviter,
|
|
||||||
canonicalAlias: summary.canonicalAlias)
|
canonicalAlias: summary.canonicalAlias)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,8 @@ struct HomeScreenInviteCell: View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var inviterView: some View {
|
private var inviterView: some View {
|
||||||
if let inviter = room.inviter, !room.isDirect {
|
if let inviter = room.inviter,
|
||||||
|
!room.isDirect {
|
||||||
RoomInviterLabel(inviter: inviter, mediaProvider: context.mediaProvider)
|
RoomInviterLabel(inviter: inviter, mediaProvider: context.mediaProvider)
|
||||||
.font(.compound.bodyMD)
|
.font(.compound.bodyMD)
|
||||||
.foregroundStyle(.compound.textPlaceholder)
|
.foregroundStyle(.compound.textPlaceholder)
|
||||||
@ -177,8 +178,7 @@ private extension HomeScreenRoom {
|
|||||||
|
|
||||||
let summary = RoomSummary(roomListItem: RoomListItemSDKMock(),
|
let summary = RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "@someone:somewhere.com",
|
id: "@someone:somewhere.com",
|
||||||
isInvite: false,
|
joinRequestType: .invite(inviter: inviter),
|
||||||
inviter: inviter,
|
|
||||||
name: "Some Guy",
|
name: "Some Guy",
|
||||||
isDirect: true,
|
isDirect: true,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
@ -205,8 +205,7 @@ private extension HomeScreenRoom {
|
|||||||
|
|
||||||
let summary = RoomSummary(roomListItem: RoomListItemSDKMock(),
|
let summary = RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
id: "@someone:somewhere.com",
|
id: "@someone:somewhere.com",
|
||||||
isInvite: false,
|
joinRequestType: .invite(inviter: inviter),
|
||||||
inviter: inviter,
|
|
||||||
name: "Awesome Room",
|
name: "Awesome Room",
|
||||||
isDirect: false,
|
isDirect: false,
|
||||||
avatarURL: avatarURL,
|
avatarURL: avatarURL,
|
||||||
|
@ -0,0 +1,200 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2024 New Vector Ltd.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
// Please see LICENSE in the repository root for full details.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Combine
|
||||||
|
import Compound
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
struct HomeScreenKnockedCell: View {
|
||||||
|
@Environment(\.dynamicTypeSize) var dynamicTypeSize
|
||||||
|
|
||||||
|
let room: HomeScreenRoom
|
||||||
|
let context: HomeScreenViewModel.Context
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
HStack(alignment: .top, spacing: 16) {
|
||||||
|
if dynamicTypeSize < .accessibility3 {
|
||||||
|
RoomAvatarImage(avatar: room.avatar,
|
||||||
|
avatarSize: .custom(52),
|
||||||
|
mediaProvider: context.mediaProvider)
|
||||||
|
.dynamicTypeSize(dynamicTypeSize < .accessibility1 ? dynamicTypeSize : .accessibility1)
|
||||||
|
.accessibilityHidden(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
mainContent
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
.padding(.bottom, 16)
|
||||||
|
.padding(.trailing, 16)
|
||||||
|
.multilineTextAlignment(.leading)
|
||||||
|
.overlay(alignment: .bottom) {
|
||||||
|
separator
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding(.top, 12)
|
||||||
|
.padding(.leading, 16)
|
||||||
|
.onTapGesture {
|
||||||
|
if let roomID = room.roomID {
|
||||||
|
context.send(viewAction: .selectRoom(roomIdentifier: roomID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Private
|
||||||
|
|
||||||
|
private var mainContent: some View {
|
||||||
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
|
HStack(alignment: .firstTextBaseline, spacing: 16) {
|
||||||
|
textualContent
|
||||||
|
badge
|
||||||
|
}
|
||||||
|
|
||||||
|
Text(L10n.screenRoomlistKnockEventSentDescription)
|
||||||
|
.font(.compound.bodyMD)
|
||||||
|
.foregroundStyle(.compound.textPlaceholder)
|
||||||
|
.padding(.top, room.canonicalAlias == nil ? 0 : 4)
|
||||||
|
.padding(.trailing, 16)
|
||||||
|
}
|
||||||
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
|
.accessibilityElement(children: .combine)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@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 separator: some View {
|
||||||
|
Rectangle()
|
||||||
|
.fill(Color.compound.borderDisabled)
|
||||||
|
.frame(height: 1 / UIScreen.main.scale)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var title: String {
|
||||||
|
room.name
|
||||||
|
}
|
||||||
|
|
||||||
|
private var subtitle: String? {
|
||||||
|
room.canonicalAlias
|
||||||
|
}
|
||||||
|
|
||||||
|
private var badge: some View {
|
||||||
|
Circle()
|
||||||
|
.scaledFrame(size: 12)
|
||||||
|
.foregroundColor(.compound.iconAccentTertiary)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct HomeScreenKnockedCell_Previews: PreviewProvider, TestablePreview {
|
||||||
|
static var previews: some View {
|
||||||
|
ScrollView {
|
||||||
|
VStack(spacing: 0) {
|
||||||
|
HomeScreenKnockedCell(room: .dmInvite,
|
||||||
|
context: viewModel().context)
|
||||||
|
|
||||||
|
HomeScreenKnockedCell(room: .dmInvite,
|
||||||
|
context: viewModel().context)
|
||||||
|
|
||||||
|
HomeScreenKnockedCell(room: .roomKnocked(),
|
||||||
|
context: viewModel().context)
|
||||||
|
|
||||||
|
HomeScreenKnockedCell(room: .roomKnocked(),
|
||||||
|
context: viewModel().context)
|
||||||
|
|
||||||
|
HomeScreenKnockedCell(room: .roomKnocked(alias: "#footest:somewhere.org", avatarURL: .picturesDirectory),
|
||||||
|
context: viewModel().context)
|
||||||
|
|
||||||
|
HomeScreenKnockedCell(room: .roomKnocked(alias: "#footest:somewhere.org"),
|
||||||
|
context: viewModel().context)
|
||||||
|
.dynamicTypeSize(.accessibility1)
|
||||||
|
.previewDisplayName("Aliased room (AX1)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static func viewModel() -> HomeScreenViewModel {
|
||||||
|
let clientProxy = ClientProxyMock(.init())
|
||||||
|
|
||||||
|
let userSession = UserSessionMock(.init(clientProxy: clientProxy))
|
||||||
|
|
||||||
|
return HomeScreenViewModel(userSession: userSession,
|
||||||
|
analyticsService: ServiceLocator.shared.analytics,
|
||||||
|
appSettings: ServiceLocator.shared.settings,
|
||||||
|
selectedRoomPublisher: CurrentValueSubject<String?, Never>(nil).asCurrentValuePublisher(),
|
||||||
|
userIndicatorController: ServiceLocator.shared.userIndicatorController)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
private extension HomeScreenRoom {
|
||||||
|
static var dmInvite: HomeScreenRoom {
|
||||||
|
let inviter = RoomMemberProxyMock()
|
||||||
|
inviter.displayName = "Jack"
|
||||||
|
inviter.userID = "@jack:somewhere.com"
|
||||||
|
|
||||||
|
let summary = RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
|
id: "@someone:somewhere.com",
|
||||||
|
joinRequestType: .invite(inviter: inviter),
|
||||||
|
name: "Some Guy",
|
||||||
|
isDirect: true,
|
||||||
|
avatarURL: nil,
|
||||||
|
heroes: [.init(userID: "@someone:somewhere.com")],
|
||||||
|
lastMessage: nil,
|
||||||
|
lastMessageFormattedTimestamp: nil,
|
||||||
|
unreadMessagesCount: 0,
|
||||||
|
unreadMentionsCount: 0,
|
||||||
|
unreadNotificationsCount: 0,
|
||||||
|
notificationMode: nil,
|
||||||
|
canonicalAlias: "#footest:somewhere.org",
|
||||||
|
hasOngoingCall: false,
|
||||||
|
isMarkedUnread: false,
|
||||||
|
isFavourite: false)
|
||||||
|
|
||||||
|
return .init(summary: summary, hideUnreadMessagesBadge: false)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func roomKnocked(alias: String? = nil, avatarURL: URL? = nil) -> HomeScreenRoom {
|
||||||
|
let inviter = RoomMemberProxyMock()
|
||||||
|
inviter.displayName = "Luca"
|
||||||
|
inviter.userID = "@jack:somewhi.nl"
|
||||||
|
inviter.avatarURL = avatarURL
|
||||||
|
|
||||||
|
let summary = RoomSummary(roomListItem: RoomListItemSDKMock(),
|
||||||
|
id: "@someone:somewhere.com",
|
||||||
|
joinRequestType: .invite(inviter: inviter),
|
||||||
|
name: "Awesome Room",
|
||||||
|
isDirect: false,
|
||||||
|
avatarURL: avatarURL,
|
||||||
|
heroes: [.init(userID: "@someone:somewhere.com")],
|
||||||
|
lastMessage: nil,
|
||||||
|
lastMessageFormattedTimestamp: nil,
|
||||||
|
unreadMessagesCount: 0,
|
||||||
|
unreadMentionsCount: 0,
|
||||||
|
unreadNotificationsCount: 0,
|
||||||
|
notificationMode: nil,
|
||||||
|
canonicalAlias: alias,
|
||||||
|
hasOngoingCall: false,
|
||||||
|
isMarkedUnread: false,
|
||||||
|
isFavourite: false)
|
||||||
|
|
||||||
|
return .init(summary: summary, hideUnreadMessagesBadge: false)
|
||||||
|
}
|
||||||
|
}
|
@ -32,6 +32,8 @@ struct HomeScreenRoomList: View {
|
|||||||
.redacted(reason: .placeholder)
|
.redacted(reason: .placeholder)
|
||||||
case .invite:
|
case .invite:
|
||||||
HomeScreenInviteCell(room: room, context: context)
|
HomeScreenInviteCell(room: room, context: context)
|
||||||
|
case .knock:
|
||||||
|
HomeScreenKnockedCell(room: room, context: context)
|
||||||
case .room:
|
case .room:
|
||||||
let isSelected = context.viewState.selectedRoomID == room.id
|
let isSelected = context.viewState.selectedRoomID == room.id
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ final class JoinRoomScreenCoordinator: CoordinatorProtocol {
|
|||||||
switch action {
|
switch action {
|
||||||
case .joined:
|
case .joined:
|
||||||
actionsSubject.send(.joined)
|
actionsSubject.send(.joined)
|
||||||
case .cancelled:
|
case .dismiss:
|
||||||
actionsSubject.send(.cancelled)
|
actionsSubject.send(.cancelled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import Foundation
|
|||||||
|
|
||||||
enum JoinRoomScreenViewModelAction {
|
enum JoinRoomScreenViewModelAction {
|
||||||
case joined
|
case joined
|
||||||
case cancelled
|
case dismiss
|
||||||
}
|
}
|
||||||
|
|
||||||
enum JoinRoomScreenInteractionMode {
|
enum JoinRoomScreenInteractionMode {
|
||||||
@ -65,6 +65,7 @@ struct JoinRoomScreenViewStateBindings {
|
|||||||
|
|
||||||
enum JoinRoomScreenAlertType {
|
enum JoinRoomScreenAlertType {
|
||||||
case declineInvite
|
case declineInvite
|
||||||
|
case cancelKnock
|
||||||
}
|
}
|
||||||
|
|
||||||
enum JoinRoomScreenViewAction {
|
enum JoinRoomScreenViewAction {
|
||||||
|
@ -59,8 +59,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
|
|||||||
case .declineInvite:
|
case .declineInvite:
|
||||||
showDeclineInviteConfirmationAlert()
|
showDeclineInviteConfirmationAlert()
|
||||||
case .cancelKnock:
|
case .cancelKnock:
|
||||||
// TODO: implement once available
|
showCancelKnockConfirmationAlert()
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,15 +77,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
|
|||||||
Task { await updateRoomDetails() }
|
Task { await updateRoomDetails() }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Using only the preview API isn't enough as it's not capable
|
await updateRoom()
|
||||||
// of giving us information for non-joined rooms (at least not on synapse)
|
|
||||||
// See if we known about the room locally and, if so, have that
|
|
||||||
// take priority over the preview one.
|
|
||||||
|
|
||||||
if let room = await clientProxy.roomForIdentifier(roomID) {
|
|
||||||
self.room = room
|
|
||||||
await updateRoomDetails()
|
|
||||||
}
|
|
||||||
|
|
||||||
switch await clientProxy.roomPreviewForIdentifier(roomID, via: via) {
|
switch await clientProxy.roomPreviewForIdentifier(roomID, via: via) {
|
||||||
case .success(let roomPreviewDetails):
|
case .success(let roomPreviewDetails):
|
||||||
@ -99,6 +90,17 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func updateRoom() async {
|
||||||
|
// Using only the preview API isn't enough as it's not capable
|
||||||
|
// of giving us information for non-joined rooms (at least not on synapse)
|
||||||
|
// See if we known about the room locally and, if so, have that
|
||||||
|
// take priority over the preview one.
|
||||||
|
if let room = await clientProxy.roomForIdentifier(roomID) {
|
||||||
|
self.room = room
|
||||||
|
await updateRoomDetails()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func updateRoomDetails() async {
|
private func updateRoomDetails() async {
|
||||||
var roomProxy: RoomProxyProtocol?
|
var roomProxy: RoomProxyProtocol?
|
||||||
var inviter: RoomInviterDetails?
|
var inviter: RoomInviterDetails?
|
||||||
@ -188,7 +190,8 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
|
|||||||
switch await clientProxy.knockRoomAlias(alias,
|
switch await clientProxy.knockRoomAlias(alias,
|
||||||
message: state.bindings.knockMessage.isBlank ? nil : state.bindings.knockMessage) {
|
message: state.bindings.knockMessage.isBlank ? nil : state.bindings.knockMessage) {
|
||||||
case .success:
|
case .success:
|
||||||
state.mode = .knocked
|
// The room should become knocked through the sync
|
||||||
|
await updateRoom()
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
MXLog.error("Failed knocking room alias: \(alias) with error: \(error)")
|
MXLog.error("Failed knocking room alias: \(alias) with error: \(error)")
|
||||||
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
|
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
|
||||||
@ -198,7 +201,8 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
|
|||||||
via: via,
|
via: via,
|
||||||
message: state.bindings.knockMessage.isBlank ? nil : state.bindings.knockMessage) {
|
message: state.bindings.knockMessage.isBlank ? nil : state.bindings.knockMessage) {
|
||||||
case .success:
|
case .success:
|
||||||
state.mode = .knocked
|
// The room should become knocked through the sync
|
||||||
|
await updateRoom()
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
MXLog.error("Failed knocking room id: \(roomID) with error: \(error)")
|
MXLog.error("Failed knocking room id: \(roomID) with error: \(error)")
|
||||||
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
|
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
|
||||||
@ -220,6 +224,14 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
|
|||||||
secondaryButton: .init(title: L10n.actionDecline, role: .destructive, action: { Task { await self.declineInvite() } }))
|
secondaryButton: .init(title: L10n.actionDecline, role: .destructive, action: { Task { await self.declineInvite() } }))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func showCancelKnockConfirmationAlert() {
|
||||||
|
state.bindings.alertInfo = .init(id: .cancelKnock,
|
||||||
|
title: L10n.screenJoinRoomCancelKnockAlertTitle,
|
||||||
|
message: L10n.screenJoinRoomCancelKnockAlertDescription,
|
||||||
|
primaryButton: .init(title: L10n.actionNo, role: .cancel, action: nil),
|
||||||
|
secondaryButton: .init(title: L10n.screenJoinRoomCancelKnockAlertConfirmation, role: .destructive, action: { Task { await self.cancelKnock() } }))
|
||||||
|
}
|
||||||
|
|
||||||
private func declineInvite() async {
|
private func declineInvite() async {
|
||||||
defer {
|
defer {
|
||||||
userIndicatorController.retractIndicatorWithId(roomID)
|
userIndicatorController.retractIndicatorWithId(roomID)
|
||||||
@ -236,6 +248,29 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
|
|||||||
|
|
||||||
if case .failure = result {
|
if case .failure = result {
|
||||||
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
|
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
|
||||||
|
} else {
|
||||||
|
actionsSubject.send(.dismiss)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func cancelKnock() async {
|
||||||
|
defer {
|
||||||
|
userIndicatorController.retractIndicatorWithId(roomID)
|
||||||
|
}
|
||||||
|
|
||||||
|
userIndicatorController.submitIndicator(UserIndicator(id: roomID, type: .modal, title: L10n.commonLoading, persistent: true))
|
||||||
|
|
||||||
|
guard case let .knocked(roomProxy) = room else {
|
||||||
|
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = await roomProxy.cancelKnock()
|
||||||
|
|
||||||
|
if case .failure = result {
|
||||||
|
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
|
||||||
|
} else {
|
||||||
|
actionsSubject.send(.dismiss)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ struct JoinRoomScreen: View {
|
|||||||
@ObservedObject var context: JoinRoomScreenViewModel.Context
|
@ObservedObject var context: JoinRoomScreenViewModel.Context
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
FullscreenDialog(topPadding: 80, background: .bloom) {
|
FullscreenDialog(topPadding: context.viewState.mode == .knocked ? 151 : 35, background: .bloom) {
|
||||||
if context.viewState.mode == .loading {
|
if context.viewState.mode == .loading {
|
||||||
EmptyView()
|
EmptyView()
|
||||||
} else {
|
} else {
|
||||||
@ -27,13 +27,15 @@ struct JoinRoomScreen: View {
|
|||||||
.background()
|
.background()
|
||||||
.backgroundStyle(.compound.bgCanvasDefault)
|
.backgroundStyle(.compound.bgCanvasDefault)
|
||||||
.navigationBarTitleDisplayMode(.inline)
|
.navigationBarTitleDisplayMode(.inline)
|
||||||
|
.toolbar { toolbar }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
var mainContent: some View {
|
var mainContent: some View {
|
||||||
if context.viewState.mode == .knocked {
|
switch context.viewState.mode {
|
||||||
|
case .knocked:
|
||||||
knockedView
|
knockedView
|
||||||
} else {
|
default:
|
||||||
defaultView
|
defaultView
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -54,7 +56,7 @@ struct JoinRoomScreen: View {
|
|||||||
|
|
||||||
if let subtitle = context.viewState.subtitle {
|
if let subtitle = context.viewState.subtitle {
|
||||||
Text(subtitle)
|
Text(subtitle)
|
||||||
.font(.compound.bodyMD)
|
.font(.compound.bodyLG)
|
||||||
.foregroundStyle(.compound.textSecondary)
|
.foregroundStyle(.compound.textSecondary)
|
||||||
.multilineTextAlignment(.center)
|
.multilineTextAlignment(.center)
|
||||||
}
|
}
|
||||||
@ -158,6 +160,17 @@ struct JoinRoomScreen: View {
|
|||||||
Button(L10n.actionAccept) { context.send(viewAction: .acceptInvite) }
|
Button(L10n.actionAccept) { context.send(viewAction: .acceptInvite) }
|
||||||
.buttonStyle(.compound(.primary))
|
.buttonStyle(.compound(.primary))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ToolbarContentBuilder
|
||||||
|
private var toolbar: some ToolbarContent {
|
||||||
|
if context.viewState.mode == .knocked {
|
||||||
|
ToolbarItem(placement: .principal) {
|
||||||
|
RoomHeaderView(roomName: context.viewState.title,
|
||||||
|
roomAvatar: context.viewState.avatar,
|
||||||
|
mediaProvider: context.mediaProvider)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Previews
|
// MARK: - Previews
|
||||||
@ -221,10 +234,17 @@ struct JoinRoomScreen_Previews: PreviewProvider, TestablePreview {
|
|||||||
if mode == .unknown {
|
if mode == .unknown {
|
||||||
clientProxy.roomPreviewForIdentifierViaReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
|
clientProxy.roomPreviewForIdentifierViaReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
|
||||||
} else {
|
} else {
|
||||||
if mode == .knocked {
|
switch mode {
|
||||||
|
case .knocked:
|
||||||
clientProxy.roomForIdentifierClosure = { _ in
|
clientProxy.roomForIdentifierClosure = { _ in
|
||||||
.knocked(KnockedRoomProxyMock(.init()))
|
.knocked(KnockedRoomProxyMock(.init(avatarURL: URL.homeDirectory)))
|
||||||
}
|
}
|
||||||
|
case .invited:
|
||||||
|
clientProxy.roomForIdentifierClosure = { _ in
|
||||||
|
.invited(InvitedRoomProxyMock(.init(avatarURL: URL.homeDirectory)))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break
|
||||||
}
|
}
|
||||||
clientProxy.roomPreviewForIdentifierViaReturnValue = .success(.init(roomID: "1",
|
clientProxy.roomPreviewForIdentifierViaReturnValue = .success(.init(roomID: "1",
|
||||||
name: "The Three-Body Problem - 三体",
|
name: "The Three-Body Problem - 三体",
|
||||||
|
@ -417,7 +417,7 @@ class ClientProxy: ClientProxyProtocol {
|
|||||||
|
|
||||||
func knockRoom(_ roomID: String, via: [String], message: String?) async -> Result<Void, ClientProxyError> {
|
func knockRoom(_ roomID: String, via: [String], message: String?) async -> Result<Void, ClientProxyError> {
|
||||||
do {
|
do {
|
||||||
let _ = try await client.knock(roomIdOrAlias: roomID, reason: nil, serverNames: via)
|
let _ = try await client.knock(roomIdOrAlias: roomID, reason: message, serverNames: via)
|
||||||
await waitForRoomToSync(roomID: roomID, timeout: .seconds(30))
|
await waitForRoomToSync(roomID: roomID, timeout: .seconds(30))
|
||||||
return .success(())
|
return .success(())
|
||||||
} catch {
|
} catch {
|
||||||
@ -428,7 +428,7 @@ class ClientProxy: ClientProxyProtocol {
|
|||||||
|
|
||||||
func knockRoomAlias(_ roomAlias: String, message: String?) async -> Result<Void, ClientProxyError> {
|
func knockRoomAlias(_ roomAlias: String, message: String?) async -> Result<Void, ClientProxyError> {
|
||||||
do {
|
do {
|
||||||
let room = try await client.knock(roomIdOrAlias: roomAlias, reason: nil, serverNames: [])
|
let room = try await client.knock(roomIdOrAlias: roomAlias, reason: message, serverNames: [])
|
||||||
await waitForRoomToSync(roomID: room.id(), timeout: .seconds(30))
|
await waitForRoomToSync(roomID: room.id(), timeout: .seconds(30))
|
||||||
return .success(())
|
return .success(())
|
||||||
} catch {
|
} catch {
|
||||||
|
@ -76,7 +76,11 @@ class KnockedRoomProxy: KnockedRoomProxyProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func cancelKnock() async -> Result<Void, RoomProxyError> {
|
func cancelKnock() async -> Result<Void, RoomProxyError> {
|
||||||
// TODO: Implement this once the API is available
|
do {
|
||||||
.failure(.invalidURL)
|
return try await .success(room.leave())
|
||||||
|
} catch {
|
||||||
|
MXLog.error("Failed cancelling the knock with error: \(error)")
|
||||||
|
return .failure(.sdkError(error))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,32 @@ import Foundation
|
|||||||
import MatrixRustSDK
|
import MatrixRustSDK
|
||||||
|
|
||||||
struct RoomSummary {
|
struct RoomSummary {
|
||||||
|
enum JoinRequestType {
|
||||||
|
case invite(inviter: RoomMemberProxyProtocol?)
|
||||||
|
case knock
|
||||||
|
|
||||||
|
var isInvite: Bool {
|
||||||
|
if case .invite = self {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var isKnock: Bool {
|
||||||
|
if case .knock = self {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let roomListItem: RoomListItem
|
let roomListItem: RoomListItem
|
||||||
|
|
||||||
let id: String
|
let id: String
|
||||||
|
|
||||||
let isInvite: Bool
|
let joinRequestType: JoinRequestType?
|
||||||
let inviter: RoomMemberProxyProtocol?
|
|
||||||
|
|
||||||
let name: String
|
let name: String
|
||||||
let isDirect: Bool
|
let isDirect: Bool
|
||||||
@ -67,10 +87,9 @@ extension RoomSummary {
|
|||||||
unreadNotificationsCount = hasUnreadNotifications ? 1 : 0
|
unreadNotificationsCount = hasUnreadNotifications ? 1 : 0
|
||||||
notificationMode = settingsMode
|
notificationMode = settingsMode
|
||||||
canonicalAlias = nil
|
canonicalAlias = nil
|
||||||
inviter = nil
|
|
||||||
hasOngoingCall = false
|
hasOngoingCall = false
|
||||||
|
|
||||||
isInvite = false
|
joinRequestType = nil
|
||||||
isMarkedUnread = false
|
isMarkedUnread = false
|
||||||
isFavourite = false
|
isFavourite = false
|
||||||
}
|
}
|
||||||
|
@ -255,10 +255,15 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
|
|||||||
|
|
||||||
let notificationMode = roomInfo.cachedUserDefinedNotificationMode.flatMap { RoomNotificationModeProxy.from(roomNotificationMode: $0) }
|
let notificationMode = roomInfo.cachedUserDefinedNotificationMode.flatMap { RoomNotificationModeProxy.from(roomNotificationMode: $0) }
|
||||||
|
|
||||||
|
let joinRequestType: RoomSummary.JoinRequestType? = switch roomInfo.membership {
|
||||||
|
case .invited: .invite(inviter: inviterProxy)
|
||||||
|
case .knocked: .knock
|
||||||
|
default: nil
|
||||||
|
}
|
||||||
|
|
||||||
return RoomSummary(roomListItem: roomListItem,
|
return RoomSummary(roomListItem: roomListItem,
|
||||||
id: roomInfo.id,
|
id: roomInfo.id,
|
||||||
isInvite: roomInfo.membership == .invited,
|
joinRequestType: joinRequestType,
|
||||||
inviter: inviterProxy,
|
|
||||||
name: roomInfo.displayName ?? roomInfo.id,
|
name: roomInfo.displayName ?? roomInfo.id,
|
||||||
isDirect: roomInfo.isDirect,
|
isDirect: roomInfo.isDirect,
|
||||||
avatarURL: roomInfo.avatarUrl.flatMap(URL.init(string:)),
|
avatarURL: roomInfo.avatarUrl.flatMap(URL.init(string:)),
|
||||||
|
@ -18,7 +18,6 @@ enum TimelineKind {
|
|||||||
enum TimelineProxyError: Error {
|
enum TimelineProxyError: Error {
|
||||||
case sdkError(Error)
|
case sdkError(Error)
|
||||||
|
|
||||||
case failedEditing
|
|
||||||
case failedRedacting
|
case failedRedacting
|
||||||
case failedPaginatingEndReached
|
case failedPaginatingEndReached
|
||||||
}
|
}
|
||||||
|
@ -245,6 +245,12 @@ extension PreviewTests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func test_homeScreenKnockedCell() {
|
||||||
|
for preview in HomeScreenKnockedCell_Previews._allPreviews {
|
||||||
|
assertSnapshots(matching: preview)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func test_homeScreenRecoveryKeyConfirmationBanner() {
|
func test_homeScreenRecoveryKeyConfirmationBanner() {
|
||||||
for preview in HomeScreenRecoveryKeyConfirmationBanner_Previews._allPreviews {
|
for preview in HomeScreenRecoveryKeyConfirmationBanner_Previews._allPreviews {
|
||||||
assertSnapshots(matching: preview)
|
assertSnapshots(matching: preview)
|
||||||
|
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_homeScreenKnockedCell-iPad-en-GB.1.png
(Stored with Git LFS)
Normal file
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_homeScreenKnockedCell-iPad-en-GB.1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_homeScreenKnockedCell-iPad-pseudo.1.png
(Stored with Git LFS)
Normal file
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_homeScreenKnockedCell-iPad-pseudo.1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_homeScreenKnockedCell-iPhone-16-en-GB.1.png
(Stored with Git LFS)
Normal file
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_homeScreenKnockedCell-iPhone-16-en-GB.1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_homeScreenKnockedCell-iPhone-16-pseudo.1.png
(Stored with Git LFS)
Normal file
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_homeScreenKnockedCell-iPhone-16-pseudo.1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Invite.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Invite.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Join.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Join.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Knock.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Knock.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Knocked.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Knocked.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Unknown.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Unknown.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Invite.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Invite.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Join.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Join.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Knock.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Knock.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Knocked.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Knocked.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Unknown.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Unknown.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Invite.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Invite.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Join.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Join.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Knock.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Knock.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Knocked.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Knocked.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Unknown.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-en-GB.Unknown.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Invite.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Invite.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Join.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Join.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Knock.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Knock.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Knocked.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Knocked.png
(Stored with Git LFS)
Binary file not shown.
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Unknown.png
(Stored with Git LFS)
BIN
PreviewTests/Sources/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-16-pseudo.Unknown.png
(Stored with Git LFS)
Binary file not shown.
@ -23,8 +23,7 @@ class HomeScreenRoomTests: XCTestCase {
|
|||||||
hasOngoingCall: Bool) {
|
hasOngoingCall: Bool) {
|
||||||
roomSummary = RoomSummary(roomListItem: .init(noPointer: .init()),
|
roomSummary = RoomSummary(roomListItem: .init(noPointer: .init()),
|
||||||
id: "Test room",
|
id: "Test room",
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: "Test room",
|
name: "Test room",
|
||||||
isDirect: false,
|
isDirect: false,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
|
@ -56,6 +56,23 @@ class JoinRoomScreenViewModelTests: XCTestCase {
|
|||||||
}.fulfill()
|
}.fulfill()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testCancelKnock() async throws {
|
||||||
|
setupViewModel(knocked: true)
|
||||||
|
|
||||||
|
try await deferFulfillment(viewModel.context.$viewState) { state in
|
||||||
|
state.mode == .knocked
|
||||||
|
}.fulfill()
|
||||||
|
|
||||||
|
context.send(viewAction: .cancelKnock)
|
||||||
|
XCTAssertEqual(viewModel.context.alertInfo?.id, .cancelKnock)
|
||||||
|
|
||||||
|
let deferred = deferFulfillment(viewModel.actionsPublisher) { action in
|
||||||
|
action == .dismiss
|
||||||
|
}
|
||||||
|
context.alertInfo?.secondaryButton?.action?()
|
||||||
|
try await deferred.fulfill()
|
||||||
|
}
|
||||||
|
|
||||||
private func setupViewModel(throwing: Bool = false, knocked: Bool = false) {
|
private func setupViewModel(throwing: Bool = false, knocked: Bool = false) {
|
||||||
let clientProxy = ClientProxyMock(.init())
|
let clientProxy = ClientProxyMock(.init())
|
||||||
|
|
||||||
@ -75,7 +92,10 @@ class JoinRoomScreenViewModelTests: XCTestCase {
|
|||||||
|
|
||||||
if knocked {
|
if knocked {
|
||||||
clientProxy.roomForIdentifierClosure = { _ in
|
clientProxy.roomForIdentifierClosure = { _ in
|
||||||
.knocked(KnockedRoomProxyMock(.init()))
|
let roomProxy = KnockedRoomProxyMock(.init())
|
||||||
|
// to test the cancel knock function
|
||||||
|
roomProxy.cancelKnockUnderlyingReturnValue = .success(())
|
||||||
|
return .knocked(roomProxy)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,8 +80,7 @@ class LoggingTests: XCTestCase {
|
|||||||
let heroName = "Pseudonym"
|
let heroName = "Pseudonym"
|
||||||
let roomSummary = RoomSummary(roomListItem: .init(noPointer: .init()),
|
let roomSummary = RoomSummary(roomListItem: .init(noPointer: .init()),
|
||||||
id: "myroomid",
|
id: "myroomid",
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: roomName,
|
name: roomName,
|
||||||
isDirect: true,
|
isDirect: true,
|
||||||
avatarURL: nil,
|
avatarURL: nil,
|
||||||
|
@ -56,8 +56,7 @@ class RoomSummaryTests: XCTestCase {
|
|||||||
func makeSummary(isDirect: Bool, hasRoomAvatar: Bool) -> RoomSummary {
|
func makeSummary(isDirect: Bool, hasRoomAvatar: Bool) -> RoomSummary {
|
||||||
RoomSummary(roomListItem: .init(noPointer: .init()),
|
RoomSummary(roomListItem: .init(noPointer: .init()),
|
||||||
id: roomDetails.id,
|
id: roomDetails.id,
|
||||||
isInvite: false,
|
joinRequestType: nil,
|
||||||
inviter: nil,
|
|
||||||
name: roomDetails.name,
|
name: roomDetails.name,
|
||||||
isDirect: isDirect,
|
isDirect: isDirect,
|
||||||
avatarURL: hasRoomAvatar ? roomDetails.avatarURL : nil,
|
avatarURL: hasRoomAvatar ? roomDetails.avatarURL : nil,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user