Initial implementation of the JoinRoomScreen. (#2684)

* Update Compound and use super button for room directory.
This commit is contained in:
Doug
2024-04-12 13:13:22 +01:00
committed by GitHub
parent 25e94d9d7f
commit 54c0ed0816
37 changed files with 605 additions and 68 deletions

View File

@@ -446,6 +446,7 @@
69C7B956B74BEC3DB88224EA /* NavigationSplitCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78913D6E120D46138E97C107 /* NavigationSplitCoordinatorTests.swift */; }; 69C7B956B74BEC3DB88224EA /* NavigationSplitCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78913D6E120D46138E97C107 /* NavigationSplitCoordinatorTests.swift */; };
69DE29C3E3180BB17D840690 /* ProgressCursorModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C8E13A1FBA717B0C277ECC /* ProgressCursorModifier.swift */; }; 69DE29C3E3180BB17D840690 /* ProgressCursorModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C8E13A1FBA717B0C277ECC /* ProgressCursorModifier.swift */; };
6A0E7551E0D1793245F34CDD /* ClientError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09A267106B9585D3D0CFC0D /* ClientError.swift */; }; 6A0E7551E0D1793245F34CDD /* ClientError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09A267106B9585D3D0CFC0D /* ClientError.swift */; };
6A54F52443EC52AC5CD772C0 /* JoinRoomScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 869A8A4632E511351BFE2EC4 /* JoinRoomScreen.swift */; };
6AD722DD92E465E56D2885AB /* BugReportScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA919F521E9F0EE3638AFC85 /* BugReportScreen.swift */; }; 6AD722DD92E465E56D2885AB /* BugReportScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA919F521E9F0EE3638AFC85 /* BugReportScreen.swift */; };
6AEB650311F694A5702255C9 /* UserProfileScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B4932E4EFBC8FAC10972CD /* UserProfileScreenCoordinator.swift */; }; 6AEB650311F694A5702255C9 /* UserProfileScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B4932E4EFBC8FAC10972CD /* UserProfileScreenCoordinator.swift */; };
6AECC84BE14A13440120FED8 /* NSESettingsProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FB4F169D653296023ED65E6 /* NSESettingsProtocol.swift */; }; 6AECC84BE14A13440120FED8 /* NSESettingsProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FB4F169D653296023ED65E6 /* NSESettingsProtocol.swift */; };
@@ -516,8 +517,10 @@
7A71AEF419904209BB8C2833 /* UserAgentBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F2529D434C750ED78ADF1ED /* UserAgentBuilder.swift */; }; 7A71AEF419904209BB8C2833 /* UserAgentBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F2529D434C750ED78ADF1ED /* UserAgentBuilder.swift */; };
7B1605C6FFD4D195F264A684 /* RoomPollsHistoryScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40233F2989AD49906BB310D /* RoomPollsHistoryScreenViewModelTests.swift */; }; 7B1605C6FFD4D195F264A684 /* RoomPollsHistoryScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40233F2989AD49906BB310D /* RoomPollsHistoryScreenViewModelTests.swift */; };
7B5DAB915357BE596529BF25 /* MapTilerStaticMapProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20872C3887F835958CE2F1D0 /* MapTilerStaticMapProtocol.swift */; }; 7B5DAB915357BE596529BF25 /* MapTilerStaticMapProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20872C3887F835958CE2F1D0 /* MapTilerStaticMapProtocol.swift */; };
7B66DA4E7E5FE4D1A0FCEAA4 /* JoinRoomScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEAB5662310AE73D93815134 /* JoinRoomScreenViewModelProtocol.swift */; };
7BB31E67648CF32D2AB5E502 /* RoomScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CE3C90E487B255B735D73C8 /* RoomScreenViewModel.swift */; }; 7BB31E67648CF32D2AB5E502 /* RoomScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CE3C90E487B255B735D73C8 /* RoomScreenViewModel.swift */; };
7BF368A78E6D9AFD222F25AF /* SecureBackupScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE094FCB6387D268C436161 /* SecureBackupScreenViewModel.swift */; }; 7BF368A78E6D9AFD222F25AF /* SecureBackupScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE094FCB6387D268C436161 /* SecureBackupScreenViewModel.swift */; };
7C0E29E0279866C62EC67A28 /* JoinRoomScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5127D6EA05B2E45D0A7D59 /* JoinRoomScreenViewModelTests.swift */; };
7C1A7B594B2F8143F0DD0005 /* ElementXAttributeScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = C024C151639C4E1B91FCC68B /* ElementXAttributeScope.swift */; }; 7C1A7B594B2F8143F0DD0005 /* ElementXAttributeScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = C024C151639C4E1B91FCC68B /* ElementXAttributeScope.swift */; };
7C384A8E54A4B60A14CDE8E5 /* WaitlistScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12F1E7F9C2BE8BB751037826 /* WaitlistScreenCoordinator.swift */; }; 7C384A8E54A4B60A14CDE8E5 /* WaitlistScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12F1E7F9C2BE8BB751037826 /* WaitlistScreenCoordinator.swift */; };
7C6376192F578E0BA801BFEC /* AnalyticsSettingsScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C64A14EE89928207E3B42B /* AnalyticsSettingsScreenModels.swift */; }; 7C6376192F578E0BA801BFEC /* AnalyticsSettingsScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C64A14EE89928207E3B42B /* AnalyticsSettingsScreenModels.swift */; };
@@ -739,6 +742,7 @@
AF33B9044498211C3D82F1E1 /* UNTextInputNotificationResponse+Creator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 130ED565A078F7E0B59D9D25 /* UNTextInputNotificationResponse+Creator.swift */; }; AF33B9044498211C3D82F1E1 /* UNTextInputNotificationResponse+Creator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 130ED565A078F7E0B59D9D25 /* UNTextInputNotificationResponse+Creator.swift */; };
AF8BFA37791E1756EE243E08 /* SettingsScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8F0ED874DF8C9A51B0AB6F /* SettingsScreenCoordinator.swift */; }; AF8BFA37791E1756EE243E08 /* SettingsScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8F0ED874DF8C9A51B0AB6F /* SettingsScreenCoordinator.swift */; };
AFA1F2543DFF7B45DF68ACD6 /* CompletionSuggestionModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170BF6F7923A5C3792442F27 /* CompletionSuggestionModels.swift */; }; AFA1F2543DFF7B45DF68ACD6 /* CompletionSuggestionModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170BF6F7923A5C3792442F27 /* CompletionSuggestionModels.swift */; };
AFE2AB612A1460E49578D746 /* JoinRoomScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BDCCD2F6B405C14B9BCE94E /* JoinRoomScreenCoordinator.swift */; };
B04E9EB589CE99C3929E817A /* HomeScreenRecoveryKeyConfirmationBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05512FB13987D221B7205DE0 /* HomeScreenRecoveryKeyConfirmationBanner.swift */; }; B04E9EB589CE99C3929E817A /* HomeScreenRecoveryKeyConfirmationBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05512FB13987D221B7205DE0 /* HomeScreenRecoveryKeyConfirmationBanner.swift */; };
B0CB16349B96262AA65A04AF /* Version in Frameworks */ = {isa = PBXBuildFile; productRef = A05AF81DDD14AD58CB0E1B9B /* Version */; }; B0CB16349B96262AA65A04AF /* Version in Frameworks */ = {isa = PBXBuildFile; productRef = A05AF81DDD14AD58CB0E1B9B /* Version */; };
B1069F361E604D5436AE9FFD /* StaticLocationScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B06663F7858E45882E63471 /* StaticLocationScreen.swift */; }; B1069F361E604D5436AE9FFD /* StaticLocationScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B06663F7858E45882E63471 /* StaticLocationScreen.swift */; };
@@ -925,6 +929,7 @@
DDE7B4771452300C103B1EB8 /* RoomDirectoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F6210134203BE1F2DD5C679 /* RoomDirectoryCell.swift */; }; DDE7B4771452300C103B1EB8 /* RoomDirectoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F6210134203BE1F2DD5C679 /* RoomDirectoryCell.swift */; };
DDFBDEE1DC32BDD5488F898C /* ClientProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F96CCBEAAA7F2185BFA354 /* ClientProxyMock.swift */; }; DDFBDEE1DC32BDD5488F898C /* ClientProxyMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2F96CCBEAAA7F2185BFA354 /* ClientProxyMock.swift */; };
DE4F8C4E0F1DB4832F09DE97 /* HomeScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D6764D6976D235926FE5FC /* HomeScreenViewModel.swift */; }; DE4F8C4E0F1DB4832F09DE97 /* HomeScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D6764D6976D235926FE5FC /* HomeScreenViewModel.swift */; };
DEDBD3E9CFCC9F20CAC79881 /* JoinRoomScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 136F80A613B55BDD071DCEA5 /* JoinRoomScreenModels.swift */; };
DF004A5B2EABBD0574D06A04 /* SplashScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854BCEAF2A832176FAACD2CB /* SplashScreenCoordinator.swift */; }; DF004A5B2EABBD0574D06A04 /* SplashScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854BCEAF2A832176FAACD2CB /* SplashScreenCoordinator.swift */; };
DF05F9C9D3D977EB77E13692 /* DeviceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 385D4C28F9DC5CF53BD9ECDB /* DeviceKit */; }; DF05F9C9D3D977EB77E13692 /* DeviceKit in Frameworks */ = {isa = PBXBuildFile; productRef = 385D4C28F9DC5CF53BD9ECDB /* DeviceKit */; };
DF504B10A4918F971A57BEF2 /* PostHogAnalyticsClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1715E3D7F53C0748AA50C91C /* PostHogAnalyticsClient.swift */; }; DF504B10A4918F971A57BEF2 /* PostHogAnalyticsClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1715E3D7F53C0748AA50C91C /* PostHogAnalyticsClient.swift */; };
@@ -1000,6 +1005,7 @@
EEB9C1555C63B93CA9C372C2 /* EmojiPickerScreenHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B5E29E9A22F45534FBD5B58 /* EmojiPickerScreenHeaderView.swift */; }; EEB9C1555C63B93CA9C372C2 /* EmojiPickerScreenHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B5E29E9A22F45534FBD5B58 /* EmojiPickerScreenHeaderView.swift */; };
EEC40663922856C65D1E0DF5 /* KeychainControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDB9C37196A4C79F24CE80C6 /* KeychainControllerTests.swift */; }; EEC40663922856C65D1E0DF5 /* KeychainControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDB9C37196A4C79F24CE80C6 /* KeychainControllerTests.swift */; };
EF0D0155DD104C7A41A2EB0E /* PlainMentionBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE78FA0011E07920AE83135 /* PlainMentionBuilder.swift */; }; EF0D0155DD104C7A41A2EB0E /* PlainMentionBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE78FA0011E07920AE83135 /* PlainMentionBuilder.swift */; };
EF47D802A404A53F15D5D4B6 /* JoinRoomScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD7C0A2750998C2D77AD00F /* JoinRoomScreenViewModel.swift */; };
EF5009AC03212227131C8AF2 /* RoomNotificationSettingsProxyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E55B5EA766E89FF1F87C3ACB /* RoomNotificationSettingsProxyProtocol.swift */; }; EF5009AC03212227131C8AF2 /* RoomNotificationSettingsProxyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = E55B5EA766E89FF1F87C3ACB /* RoomNotificationSettingsProxyProtocol.swift */; };
EF7924005216B8189898F370 /* BackgroundTaskProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CA028DCD4157F9A1F999827 /* BackgroundTaskProtocol.swift */; }; EF7924005216B8189898F370 /* BackgroundTaskProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CA028DCD4157F9A1F999827 /* BackgroundTaskProtocol.swift */; };
EF890DEF0479E66548F2BA23 /* AppLockTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 490BEADEFB2D6B7C9F618AE8 /* AppLockTimer.swift */; }; EF890DEF0479E66548F2BA23 /* AppLockTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 490BEADEFB2D6B7C9F618AE8 /* AppLockTimer.swift */; };
@@ -1205,6 +1211,7 @@
12F1E7F9C2BE8BB751037826 /* WaitlistScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistScreenCoordinator.swift; sourceTree = "<group>"; }; 12F1E7F9C2BE8BB751037826 /* WaitlistScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistScreenCoordinator.swift; sourceTree = "<group>"; };
1304D9191300873EADA52D6E /* IntegrationTests.xctestplan */ = {isa = PBXFileReference; path = IntegrationTests.xctestplan; sourceTree = "<group>"; }; 1304D9191300873EADA52D6E /* IntegrationTests.xctestplan */ = {isa = PBXFileReference; path = IntegrationTests.xctestplan; sourceTree = "<group>"; };
130ED565A078F7E0B59D9D25 /* UNTextInputNotificationResponse+Creator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNTextInputNotificationResponse+Creator.swift"; sourceTree = "<group>"; }; 130ED565A078F7E0B59D9D25 /* UNTextInputNotificationResponse+Creator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNTextInputNotificationResponse+Creator.swift"; sourceTree = "<group>"; };
136F80A613B55BDD071DCEA5 /* JoinRoomScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreenModels.swift; sourceTree = "<group>"; };
13802897C7AFA360EA74C0B0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = "<group>"; }; 13802897C7AFA360EA74C0B0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
1423AB065857FA546444DB15 /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = "<group>"; }; 1423AB065857FA546444DB15 /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = "<group>"; };
142808B69851451AC32A2CEA /* RoomSummaryDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSummaryDetails.swift; sourceTree = "<group>"; }; 142808B69851451AC32A2CEA /* RoomSummaryDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSummaryDetails.swift; sourceTree = "<group>"; };
@@ -1244,6 +1251,7 @@
1C21A715237F2B6D6E80998C /* SecureBackupControllerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupControllerProtocol.swift; sourceTree = "<group>"; }; 1C21A715237F2B6D6E80998C /* SecureBackupControllerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupControllerProtocol.swift; sourceTree = "<group>"; };
1C7F63EB1525E697CAEB002B /* BlankFormCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlankFormCoordinator.swift; sourceTree = "<group>"; }; 1C7F63EB1525E697CAEB002B /* BlankFormCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlankFormCoordinator.swift; sourceTree = "<group>"; };
1CC575D1895FA62591451A93 /* RoomMemberDetailsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsScreen.swift; sourceTree = "<group>"; }; 1CC575D1895FA62591451A93 /* RoomMemberDetailsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMemberDetailsScreen.swift; sourceTree = "<group>"; };
1CD7C0A2750998C2D77AD00F /* JoinRoomScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreenViewModel.swift; sourceTree = "<group>"; };
1D56469A9EE0CFA2B7BA9760 /* SessionVerificationControllerProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationControllerProxyProtocol.swift; sourceTree = "<group>"; }; 1D56469A9EE0CFA2B7BA9760 /* SessionVerificationControllerProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationControllerProxyProtocol.swift; sourceTree = "<group>"; };
1D652E78832289CD9EB64488 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 1D652E78832289CD9EB64488 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = "<group>"; };
1D67E616BCA82D8A1258D488 /* NetworkMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = "<group>"; }; 1D67E616BCA82D8A1258D488 /* NetworkMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = "<group>"; };
@@ -1365,6 +1373,7 @@
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>"; };
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>"; };
3BC1B7CB061C9865B2B91B56 /* QRCodeLoginScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeLoginScreenViewModel.swift; sourceTree = "<group>"; }; 3BC1B7CB061C9865B2B91B56 /* QRCodeLoginScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeLoginScreenViewModel.swift; sourceTree = "<group>"; };
3BDCCD2F6B405C14B9BCE94E /* JoinRoomScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreenCoordinator.swift; sourceTree = "<group>"; };
3C1A3D524D63815B28FA4D62 /* EmojiCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiCategory.swift; sourceTree = "<group>"; }; 3C1A3D524D63815B28FA4D62 /* EmojiCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiCategory.swift; sourceTree = "<group>"; };
3C368CAB3063EF275357ECD4 /* LoginScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginScreenViewModel.swift; sourceTree = "<group>"; }; 3C368CAB3063EF275357ECD4 /* LoginScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginScreenViewModel.swift; sourceTree = "<group>"; };
3C3E67E09FE5A35D73818C39 /* AppLockScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockScreenModels.swift; sourceTree = "<group>"; }; 3C3E67E09FE5A35D73818C39 /* AppLockScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockScreenModels.swift; sourceTree = "<group>"; };
@@ -1653,6 +1662,7 @@
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>"; }; 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>"; };
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>"; };
88410BD213FDF9B28E8B671F /* UserDetailsEditScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDetailsEditScreen.swift; sourceTree = "<group>"; }; 88410BD213FDF9B28E8B671F /* UserDetailsEditScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDetailsEditScreen.swift; sourceTree = "<group>"; };
@@ -2001,6 +2011,7 @@
DC528B3764E3CF7FCFEF40E7 /* PollInteractionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollInteractionHandler.swift; sourceTree = "<group>"; }; DC528B3764E3CF7FCFEF40E7 /* PollInteractionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollInteractionHandler.swift; sourceTree = "<group>"; };
DCF239C619971FDE48132550 /* SecureBackupLogoutConfirmationScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupLogoutConfirmationScreenModels.swift; sourceTree = "<group>"; }; DCF239C619971FDE48132550 /* SecureBackupLogoutConfirmationScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupLogoutConfirmationScreenModels.swift; sourceTree = "<group>"; };
DD97F9661ABF08CE002054A2 /* AppLockServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockServiceTests.swift; sourceTree = "<group>"; }; DD97F9661ABF08CE002054A2 /* AppLockServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockServiceTests.swift; sourceTree = "<group>"; };
DE5127D6EA05B2E45D0A7D59 /* JoinRoomScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreenViewModelTests.swift; sourceTree = "<group>"; };
DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundedLabelItem.swift; sourceTree = "<group>"; }; DE7C80EF77AD102053D3646E /* RoundedLabelItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundedLabelItem.swift; sourceTree = "<group>"; };
DEC1D382565A4E9CAC2F14EA /* MediaFileHandleProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaFileHandleProxy.swift; sourceTree = "<group>"; }; DEC1D382565A4E9CAC2F14EA /* MediaFileHandleProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaFileHandleProxy.swift; sourceTree = "<group>"; };
DF05DA24F71B455E8EFEBC3B /* SessionVerificationViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationViewModelTests.swift; sourceTree = "<group>"; }; DF05DA24F71B455E8EFEBC3B /* SessionVerificationViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationViewModelTests.swift; sourceTree = "<group>"; };
@@ -2073,6 +2084,7 @@
EE378083653EF0C9B5E9D580 /* EmoteRoomTimelineItemContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmoteRoomTimelineItemContent.swift; sourceTree = "<group>"; }; EE378083653EF0C9B5E9D580 /* EmoteRoomTimelineItemContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmoteRoomTimelineItemContent.swift; sourceTree = "<group>"; };
EE6BFF453838CF6C3982C5A3 /* RoomDirectorySearchScreenScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDirectorySearchScreenScreenViewModelTests.swift; sourceTree = "<group>"; }; EE6BFF453838CF6C3982C5A3 /* RoomDirectorySearchScreenScreenViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDirectorySearchScreenScreenViewModelTests.swift; sourceTree = "<group>"; };
EEAA2832D93EC7D2608703FB /* NSEUserSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSEUserSession.swift; sourceTree = "<group>"; }; EEAA2832D93EC7D2608703FB /* NSEUserSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSEUserSession.swift; sourceTree = "<group>"; };
EEAB5662310AE73D93815134 /* JoinRoomScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRoomScreenViewModelProtocol.swift; sourceTree = "<group>"; };
EF13BFD415CA84B1272E94F8 /* PINTextFieldTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PINTextFieldTests.swift; sourceTree = "<group>"; }; EF13BFD415CA84B1272E94F8 /* PINTextFieldTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PINTextFieldTests.swift; sourceTree = "<group>"; };
EF1593DD87F974F8509BB619 /* ElementAnimations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementAnimations.swift; sourceTree = "<group>"; }; EF1593DD87F974F8509BB619 /* ElementAnimations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementAnimations.swift; sourceTree = "<group>"; };
EF98A02DED04075F7CF0C721 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = "<group>"; }; EF98A02DED04075F7CF0C721 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -3373,6 +3385,14 @@
path = SupportingFiles; path = SupportingFiles;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
6792D400AF30A6F2ACD426E4 /* View */ = {
isa = PBXGroup;
children = (
869A8A4632E511351BFE2EC4 /* JoinRoomScreen.swift */,
);
path = View;
sourceTree = "<group>";
};
679E9837ECA8D6776079D16E /* RoomScreen */ = { 679E9837ECA8D6776079D16E /* RoomScreen */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -3549,6 +3569,7 @@
505208F28007C0FEC14E1FF0 /* HomeScreenViewModelTests.swift */, 505208F28007C0FEC14E1FF0 /* HomeScreenViewModelTests.swift */,
CC14E5209C262530E19BC4C1 /* InvitesScreenViewModelTests.swift */, CC14E5209C262530E19BC4C1 /* InvitesScreenViewModelTests.swift */,
845DDBDE5A0887E73D38B826 /* InviteUsersViewModelTests.swift */, 845DDBDE5A0887E73D38B826 /* InviteUsersViewModelTests.swift */,
DE5127D6EA05B2E45D0A7D59 /* JoinRoomScreenViewModelTests.swift */,
FDB9C37196A4C79F24CE80C6 /* KeychainControllerTests.swift */, FDB9C37196A4C79F24CE80C6 /* KeychainControllerTests.swift */,
6E5725BC6C63604CB769145B /* LegalInformationScreenViewModelTests.swift */, 6E5725BC6C63604CB769145B /* LegalInformationScreenViewModelTests.swift */,
C070FD43DC6BF4E50217965A /* LocalizationTests.swift */, C070FD43DC6BF4E50217965A /* LocalizationTests.swift */,
@@ -4880,6 +4901,7 @@
B53CA9BECD3F97805E1432D0 /* HomeScreen */, B53CA9BECD3F97805E1432D0 /* HomeScreen */,
E3EA13D6E41AD76151C2D100 /* InvitesScreen */, E3EA13D6E41AD76151C2D100 /* InvitesScreen */,
F12966DF3DA87FEF21348D60 /* InviteUsersScreen */, F12966DF3DA87FEF21348D60 /* InviteUsersScreen */,
FFD7C58CA6A7D6BBC2F584B5 /* JoinRoomScreen */,
948DD12A5533BE1BC260E437 /* LocationSharing */, 948DD12A5533BE1BC260E437 /* LocationSharing */,
73E032ADD008D63812791D97 /* LogViewerScreen */, 73E032ADD008D63812791D97 /* LogViewerScreen */,
87E2774157D9C4894BCFF3F8 /* MediaPickerScreen */, 87E2774157D9C4894BCFF3F8 /* MediaPickerScreen */,
@@ -5165,6 +5187,18 @@
path = Audio; path = Audio;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
FFD7C58CA6A7D6BBC2F584B5 /* JoinRoomScreen */ = {
isa = PBXGroup;
children = (
3BDCCD2F6B405C14B9BCE94E /* JoinRoomScreenCoordinator.swift */,
136F80A613B55BDD071DCEA5 /* JoinRoomScreenModels.swift */,
1CD7C0A2750998C2D77AD00F /* JoinRoomScreenViewModel.swift */,
EEAB5662310AE73D93815134 /* JoinRoomScreenViewModelProtocol.swift */,
6792D400AF30A6F2ACD426E4 /* View */,
);
path = JoinRoomScreen;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@@ -5722,6 +5756,7 @@
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 */, 266C4DF893F2947DCCEF327B /* InvitesScreenViewModelTests.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 */,
8AC256AF0EC54658321C9241 /* LegalInformationScreenViewModelTests.swift in Sources */, 8AC256AF0EC54658321C9241 /* LegalInformationScreenViewModelTests.swift in Sources */,
@@ -6070,6 +6105,11 @@
2AD59AD5B09498EF8B3B04EC /* InvitesScreenModels.swift in Sources */, 2AD59AD5B09498EF8B3B04EC /* InvitesScreenModels.swift in Sources */,
C287BE1802AD432F3D848D8E /* InvitesScreenViewModel.swift in Sources */, C287BE1802AD432F3D848D8E /* InvitesScreenViewModel.swift in Sources */,
BD6D98676111DA8FC2BE4908 /* InvitesScreenViewModelProtocol.swift in Sources */, BD6D98676111DA8FC2BE4908 /* InvitesScreenViewModelProtocol.swift in Sources */,
6A54F52443EC52AC5CD772C0 /* JoinRoomScreen.swift in Sources */,
AFE2AB612A1460E49578D746 /* JoinRoomScreenCoordinator.swift in Sources */,
DEDBD3E9CFCC9F20CAC79881 /* JoinRoomScreenModels.swift in Sources */,
EF47D802A404A53F15D5D4B6 /* JoinRoomScreenViewModel.swift in Sources */,
7B66DA4E7E5FE4D1A0FCEAA4 /* JoinRoomScreenViewModelProtocol.swift in Sources */,
E3CA565A4B9704F191B191F0 /* JoinedRoomSize+MemberCount.swift in Sources */, E3CA565A4B9704F191B191F0 /* JoinedRoomSize+MemberCount.swift in Sources */,
1FE593ECEC40A43789105D80 /* KeychainController.swift in Sources */, 1FE593ECEC40A43789105D80 /* KeychainController.swift in Sources */,
FD29471C72872F8B7580E3E1 /* KeychainControllerMock.swift in Sources */, FD29471C72872F8B7580E3E1 /* KeychainControllerMock.swift in Sources */,
@@ -7434,7 +7474,7 @@
repositoryURL = "https://github.com/element-hq/compound-ios"; repositoryURL = "https://github.com/element-hq/compound-ios";
requirement = { requirement = {
kind = revision; kind = revision;
revision = ed63ed56655956c950a3b9c55e2010fdf1a2d11d; revision = 43310aaaced1a0861c39894bb1086067375326be;
}; };
}; };
F76A08D0EA29A07A54F4EB4D /* XCRemoteSwiftPackageReference "swift-collections" */ = { F76A08D0EA29A07A54F4EB4D /* XCRemoteSwiftPackageReference "swift-collections" */ = {

View File

@@ -14,7 +14,7 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/element-hq/compound-ios", "location" : "https://github.com/element-hq/compound-ios",
"state" : { "state" : {
"revision" : "ed63ed56655956c950a3b9c55e2010fdf1a2d11d" "revision" : "43310aaaced1a0861c39894bb1086067375326be"
} }
}, },
{ {

View File

@@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "join-room-graphic.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@@ -0,0 +1,47 @@
<svg width="199" height="144" viewBox="0 0 199 144" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="32.5" cy="32" r="32" fill="url(#paint0_linear_570_20378)" fill-opacity="0.9"/>
<circle cx="32.5" cy="32" r="32" fill="url(#paint1_linear_570_20378)" fill-opacity="0.2"/>
<circle cx="32.5" cy="32" r="32" fill="url(#paint2_linear_570_20378)" fill-opacity="0.6"/>
<rect x="80.5" y="11.7856" width="88" height="16" rx="8" fill="url(#paint3_linear_570_20378)" fill-opacity="0.9"/>
<rect x="80.5" y="11.7856" width="88" height="16" rx="8" fill="url(#paint4_linear_570_20378)" fill-opacity="0.8"/>
<rect x="80.5" y="36.2141" width="68" height="16" rx="8" fill="#E3E8F0"/>
<rect x="152.5" y="36.2141" width="46" height="16" rx="8" fill="#E3E8F0"/>
<circle cx="32.5" cy="112" r="32" fill="#AC3BA8" fill-opacity="0.3"/>
<circle cx="32.5" cy="112" r="32" fill="url(#paint5_linear_570_20378)" fill-opacity="0.5"/>
<rect x="80.5" y="94" width="88" height="16" rx="8" fill="#AC3BA8" fill-opacity="0.3"/>
<rect x="80.5" y="94" width="88" height="16" rx="8" fill="url(#paint6_linear_570_20378)" fill-opacity="0.25"/>
<rect x="72.5" y="102" width="44" height="28" rx="14" fill="#F4F6FA"/>
<circle cx="84.5001" cy="114.964" r="4" fill="#C1C6CD"/>
<circle cx="94.4997" cy="116.964" r="4" fill="#C1C6CD"/>
<circle cx="104.5" cy="116.964" r="4" fill="#C1C6CD"/>
<defs>
<linearGradient id="paint0_linear_570_20378" x1="32.5" y1="0" x2="32.5" y2="64" gradientUnits="userSpaceOnUse">
<stop stop-color="#0D5CBD"/>
<stop offset="1" stop-color="#0DBDA8"/>
</linearGradient>
<linearGradient id="paint1_linear_570_20378" x1="32.5" y1="0" x2="32.5" y2="64" gradientUnits="userSpaceOnUse">
<stop offset="0.535" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint2_linear_570_20378" x1="32.5" y1="7.45058e-09" x2="33" y2="144.5" gradientUnits="userSpaceOnUse">
<stop offset="0.085" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint3_linear_570_20378" x1="124.5" y1="11.7856" x2="124.5" y2="27.7856" gradientUnits="userSpaceOnUse">
<stop stop-color="#0D5CBD"/>
<stop offset="1" stop-color="#0DBDA8"/>
</linearGradient>
<linearGradient id="paint4_linear_570_20378" x1="124.5" y1="11.7856" x2="125" y2="42.9999" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint5_linear_570_20378" x1="32.5" y1="80" x2="32.5" y2="144" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<linearGradient id="paint6_linear_570_20378" x1="124.5" y1="94" x2="124.5" y2="110" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -196,6 +196,7 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
case .roomMemberDetails: case .roomMemberDetails:
userSessionFlowCoordinator?.handleAppRoute(route, animated: true) userSessionFlowCoordinator?.handleAppRoute(route, animated: true)
case .room(let roomID): case .room(let roomID):
// check that the room is joined here, if not use a joinRoom route.
if isExternalURL { if isExternalURL {
userSessionFlowCoordinator?.handleAppRoute(route, animated: true) userSessionFlowCoordinator?.handleAppRoute(route, animated: true)
} else { } else {

View File

@@ -39,6 +39,7 @@ internal enum Asset {
internal static let stopRecording = ImageAsset(name: "images/stop-recording") internal static let stopRecording = ImageAsset(name: "images/stop-recording")
internal static let settingsIconWithBadge = ImageAsset(name: "images/settings-icon-with-badge") internal static let settingsIconWithBadge = ImageAsset(name: "images/settings-icon-with-badge")
internal static let joinRoomBackground = ImageAsset(name: "images/join-room-background") internal static let joinRoomBackground = ImageAsset(name: "images/join-room-background")
internal static let joinRoomGraphic = ImageAsset(name: "images/join-room-graphic")
internal static let launchBackground = ImageAsset(name: "images/launch-background") internal static let launchBackground = ImageAsset(name: "images/launch-background")
internal static let locationMarkerShape = ImageAsset(name: "images/location-marker-shape") internal static let locationMarkerShape = ImageAsset(name: "images/location-marker-shape")
internal static let mediaPause = ImageAsset(name: "images/media-pause") internal static let mediaPause = ImageAsset(name: "images/media-pause")

View File

@@ -93,6 +93,7 @@ enum RoomAvatarSizeOnScreen {
case details case details
case notificationSettings case notificationSettings
case roomDirectorySearch case roomDirectorySearch
case joinRoom
var value: CGFloat { var value: CGFloat {
switch self { switch self {
@@ -110,6 +111,8 @@ enum RoomAvatarSizeOnScreen {
return 52 return 52
case .details: case .details:
return 70 return 70
case .joinRoom:
return 96
} }
} }
} }

View File

@@ -24,7 +24,7 @@ struct RoomDirectorySearchView: View {
Button(action: onTap) { Button(action: onTap) {
Label(L10n.screenRoomlistRoomDirectoryButtonTitle, icon: \.listBulleted) Label(L10n.screenRoomlistRoomDirectoryButtonTitle, icon: \.listBulleted)
} }
.buttonStyle(.compound(.secondary)) .buttonStyle(.compound(.super))
.padding(.horizontal, 16) .padding(.horizontal, 16)
.padding(.vertical, 8) .padding(.vertical, 8)
} }

View File

@@ -0,0 +1,72 @@
//
// 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 JoinRoomScreenCoordinatorParameters {
let roomID: String
let roomName: String
let avatarURL: URL?
let interaction: JoinRoomScreenInteraction
let clientProxy: ClientProxyProtocol
}
enum JoinRoomScreenCoordinatorAction {
case joined
case cancelled
}
final class JoinRoomScreenCoordinator: CoordinatorProtocol {
private let parameters: JoinRoomScreenCoordinatorParameters
private let viewModel: JoinRoomScreenViewModelProtocol
private var cancellables = Set<AnyCancellable>()
private let actionsSubject: PassthroughSubject<JoinRoomScreenCoordinatorAction, Never> = .init()
var actionsPublisher: AnyPublisher<JoinRoomScreenCoordinatorAction, Never> {
actionsSubject.eraseToAnyPublisher()
}
init(parameters: JoinRoomScreenCoordinatorParameters) {
self.parameters = parameters
viewModel = JoinRoomScreenViewModel(roomID: parameters.roomID,
roomName: parameters.roomName,
avatarURL: parameters.avatarURL,
interaction: parameters.interaction,
clientProxy: parameters.clientProxy)
}
func start() {
viewModel.actionsPublisher.sink { [weak self] action in
MXLog.info("Coordinator: received view model action: \(action)")
guard let self else { return }
switch action {
case .joined:
actionsSubject.send(.joined)
case .cancelled:
actionsSubject.send(.cancelled)
}
}
.store(in: &cancellables)
}
func toPresentable() -> AnyView {
AnyView(JoinRoomScreen(context: viewModel.context))
}
}

View File

@@ -0,0 +1,74 @@
//
// 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 Foundation
enum JoinRoomScreenViewModelAction {
case joined
case cancelled
}
struct JoinRoomScreenViewState: BindableState {
// Maybe use room summary details or similar here??
let roomID: String
let roomName: String
let avatarURL: URL?
let interaction: JoinRoomScreenInteraction
var isJoining = false
var bindings = JoinRoomScreenViewStateBindings()
var title: String {
switch interaction {
case .knock:
L10n.screenJoinRoomTitleKnock
case .join, .invited:
L10n.screenJoinRoomTitleNoPreview
}
}
var subtitle: String {
switch interaction {
case .knock:
L10n.screenJoinRoomSubtitleKnock
case .join, .invited:
L10n.screenJoinRoomSubtitleNoPreview
}
}
}
struct JoinRoomScreenViewStateBindings {
var alertInfo: AlertInfo<JoinRoomScreenAlertType>?
}
enum JoinRoomScreenAlertType {
case joinFailed
}
enum JoinRoomScreenInteraction {
case knock
case join
case invited
}
enum JoinRoomScreenViewAction {
case knock
case join
case acceptInvite
case declineInvite
}

View File

@@ -0,0 +1,67 @@
//
// 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 JoinRoomScreenViewModelType = StateStoreViewModel<JoinRoomScreenViewState, JoinRoomScreenViewAction>
class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewModelProtocol {
private let clientProxy: ClientProxyProtocol
private let actionsSubject: PassthroughSubject<JoinRoomScreenViewModelAction, Never> = .init()
var actionsPublisher: AnyPublisher<JoinRoomScreenViewModelAction, Never> {
actionsSubject.eraseToAnyPublisher()
}
init(roomID: String, roomName: String, avatarURL: URL?, interaction: JoinRoomScreenInteraction, clientProxy: ClientProxyProtocol) {
self.clientProxy = clientProxy
super.init(initialViewState: JoinRoomScreenViewState(roomID: roomID,
roomName: roomName,
avatarURL: avatarURL,
interaction: interaction))
}
// MARK: - Public
override func process(viewAction: JoinRoomScreenViewAction) {
MXLog.info("View model: received view action: \(viewAction)")
switch viewAction {
case .knock:
break
case .join:
Task { await joinRoom() }
case .acceptInvite:
break
case .declineInvite:
break
}
}
// MARK: - Private
private func joinRoom() async {
state.isJoining = true
switch await clientProxy.joinRoom(state.roomID) {
case .success:
actionsSubject.send(.joined)
case .failure(let error):
state.bindings.alertInfo = .init(id: .joinFailed)
}
}
}

View File

@@ -0,0 +1,23 @@
//
// 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 JoinRoomScreenViewModelProtocol {
var actionsPublisher: AnyPublisher<JoinRoomScreenViewModelAction, Never> { get }
var context: JoinRoomScreenViewModelType.Context { get }
}

View File

@@ -0,0 +1,130 @@
//
// 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 Compound
import SwiftUI
struct JoinRoomScreen: View {
@Environment(\.dynamicTypeSize) private var dynamicTypeSize
@ObservedObject var context: JoinRoomScreenViewModel.Context
var body: some View {
FullscreenDialog(topPadding: 80, background: .bloom) {
mainContent
} bottomContent: {
buttons
}
.background()
.backgroundStyle(.compound.bgCanvasDefault)
.navigationBarTitleDisplayMode(.inline)
.toolbar { toolbar }
}
var mainContent: some View {
VStack(spacing: 16) {
LoadableAvatarImage(url: context.viewState.avatarURL,
name: context.viewState.roomName,
contentID: context.viewState.roomID,
avatarSize: .room(on: .joinRoom),
imageProvider: context.imageProvider)
.dynamicTypeSize(dynamicTypeSize < .accessibility1 ? dynamicTypeSize : .accessibility1)
VStack(spacing: 8) {
Text(context.viewState.title)
.font(.compound.headingMDBold)
.foregroundStyle(.compound.textPrimary)
.multilineTextAlignment(.center)
Text(context.viewState.subtitle)
.font(.compound.bodyMD)
.foregroundStyle(.compound.textSecondary)
.multilineTextAlignment(.center)
}
Image(asset: Asset.Images.joinRoomGraphic)
.padding(.top, 40)
}
}
@ViewBuilder
var buttons: some View {
switch context.viewState.interaction {
case .knock:
Button(L10n.screenJoinRoomKnockAction) { context.send(viewAction: .knock) }
.buttonStyle(.compound(.primary))
case .join:
Button(L10n.screenJoinRoomJoinAction) { context.send(viewAction: .join) }
.buttonStyle(.compound(.super))
case .invited:
ViewThatFits {
HStack(spacing: 8) { inviteButtons }
VStack(spacing: 16) { inviteButtons }
}
}
}
@ViewBuilder
var inviteButtons: some View {
Button(L10n.actionDecline) { context.send(viewAction: .acceptInvite) }
.buttonStyle(.compound(.secondary))
Button(L10n.actionAccept) { context.send(viewAction: .declineInvite) }
.buttonStyle(.compound(.primary))
}
@ToolbarContentBuilder
var toolbar: some ToolbarContent {
ToolbarItem(placement: .principal) {
RoomHeaderView(roomID: context.viewState.roomID,
roomName: context.viewState.roomName,
avatarURL: context.viewState.avatarURL,
imageProvider: context.imageProvider)
}
}
}
// MARK: - Previews
struct JoinRoomScreen_Previews: PreviewProvider, TestablePreview {
static let knockViewModel = makeViewModel(interaction: .knock)
static let joinViewModel = makeViewModel(interaction: .join)
static let inviteViewModel = makeViewModel(interaction: .invited)
static var previews: some View {
NavigationStack {
JoinRoomScreen(context: knockViewModel.context)
}
.previewDisplayName("Knock")
NavigationStack {
JoinRoomScreen(context: joinViewModel.context)
}
.previewDisplayName("Join")
NavigationStack {
JoinRoomScreen(context: inviteViewModel.context)
}
.previewDisplayName("Invite")
}
static func makeViewModel(interaction: JoinRoomScreenInteraction) -> JoinRoomScreenViewModel {
JoinRoomScreenViewModel(roomID: "6",
roomName: "Room Name",
avatarURL: nil,
interaction: interaction,
clientProxy: ClientProxyMock(.init()))
}
}

View File

@@ -19,72 +19,47 @@ import Foundation
import SwiftUI import SwiftUI
struct RoomHeaderView: View { struct RoomHeaderView: View {
@ObservedObject var context: RoomScreenViewModel.Context let roomID: String
let roomName: String
let avatarURL: URL?
let imageProvider: ImageProviderProtocol?
var body: some View { var body: some View {
HStack(spacing: 12) { HStack(spacing: 12) {
roomAvatar roomAvatar
.accessibilityHidden(true) .accessibilityHidden(true)
Text(context.viewState.roomTitle) Text(roomName)
.font(.compound.bodyLGSemibold) .font(.compound.bodyLGSemibold)
.accessibilityIdentifier(A11yIdentifiers.roomScreen.name) .accessibilityIdentifier(A11yIdentifiers.roomScreen.name)
} }
// Leading align whilst using the principal toolbar position. // Leading align whilst using the principal toolbar position.
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
// Using a button stops it from getting truncated in the navigation bar
.onTapGesture {
context.send(viewAction: .displayRoomDetails)
}
} }
@ViewBuilder private var roomAvatar: some View { private var roomAvatar: some View {
LoadableAvatarImage(url: context.viewState.roomAvatarURL, LoadableAvatarImage(url: avatarURL,
name: context.viewState.roomTitle, name: roomName,
contentID: context.viewState.roomID, contentID: roomID,
avatarSize: .room(on: .timeline), avatarSize: .room(on: .timeline),
imageProvider: context.imageProvider) imageProvider: imageProvider)
.accessibilityIdentifier(A11yIdentifiers.roomScreen.avatar) .accessibilityIdentifier(A11yIdentifiers.roomScreen.avatar)
} }
} }
struct RoomHeaderView_Previews: PreviewProvider, TestablePreview { struct RoomHeaderView_Previews: PreviewProvider, TestablePreview {
static var previews: some View { static var previews: some View {
bodyPlain RoomHeaderView(roomID: "1",
bodyEncrypted roomName: "Some Room name",
} avatarURL: URL.picturesDirectory,
imageProvider: MockMediaProvider())
@ViewBuilder
static var bodyPlain: some View {
let viewModel = RoomScreenViewModel(roomProxy: RoomProxyMock(with: .init(name: "Some Room name", avatarURL: URL.picturesDirectory)),
timelineController: MockRoomTimelineController(),
mediaProvider: MockMediaProvider(),
mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController,
application: ApplicationMock.default,
appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics,
notificationCenter: NotificationCenterMock())
RoomHeaderView(context: viewModel.context)
.previewLayout(.sizeThatFits) .previewLayout(.sizeThatFits)
.padding() .padding()
}
RoomHeaderView(roomID: "1",
@ViewBuilder roomName: "Some Room name",
static var bodyEncrypted: some View { avatarURL: nil,
let viewModel = RoomScreenViewModel(roomProxy: RoomProxyMock(with: .init(name: "Some Room name")), imageProvider: MockMediaProvider())
timelineController: MockRoomTimelineController(),
mediaProvider: MockMediaProvider(),
mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController,
application: ApplicationMock.default,
appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics,
notificationCenter: NotificationCenterMock())
RoomHeaderView(context: viewModel.context)
.previewLayout(.sizeThatFits) .previewLayout(.sizeThatFits)
.padding() .padding()
} }

View File

@@ -139,7 +139,14 @@ struct RoomScreen: View {
// .principal + .primaryAction works better than .navigation leading + trailing // .principal + .primaryAction works better than .navigation leading + trailing
// as the latter disables interaction in the action button for rooms with long names // as the latter disables interaction in the action button for rooms with long names
ToolbarItem(placement: .principal) { ToolbarItem(placement: .principal) {
RoomHeaderView(context: context) RoomHeaderView(roomID: context.viewState.roomID,
roomName: context.viewState.roomTitle,
avatarURL: context.viewState.roomAvatarURL,
imageProvider: context.imageProvider)
// Using a button stops it from getting truncated in the navigation bar
.onTapGesture {
context.send(viewAction: .displayRoomDetails)
}
} }
if !ProcessInfo.processInfo.isiOSAppOnMac { if !ProcessInfo.processInfo.isiOSAppOnMac {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:4268ac08be6b463369ec4e0c934231e997b033e45baed23df03cb35869007272 oid sha256:74663f8e4eb478dd77a5776fae6c8e7cf5669afefdbe3d81d645f5149a7c369b
size 82475 size 102035

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e267a3678f60b674ec7078a2f5c2ccec2c54c5d18fed5954f0abe00f4fa6aee4 oid sha256:bd608f8bbc19d99aae193cefeffea78a18fe7f90f7cf36954c7eaf17be1101e3
size 88868 size 107314

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:e0d8ffab7621673199dc80f52821ba7777e889454b530d95da212a929aefbca3 oid sha256:9d8f2fe2b6221152af219876bae7f5eea2ef13b80a6a361737e2e65000bef447
size 40309 size 51457

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fbdc78f06c3ea80474b399722c2bbfd31cfd4ff79cb7e0b0729e87a41587b3be oid sha256:83833e81ea928633b3ddbb2df6933093c49f9008f4520fd7d02def0b60588d9c
size 47531 size 58896

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3a78eb43053c130a296430bc9c26a6e1f51cd90854f28f65822980a21a9c69fd oid sha256:0d8b960df58dfcceddd04e6b738b0470fed90b5094241bfc908edf445aede761
size 17056 size 17145

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3a78eb43053c130a296430bc9c26a6e1f51cd90854f28f65822980a21a9c69fd oid sha256:0d8b960df58dfcceddd04e6b738b0470fed90b5094241bfc908edf445aede761
size 17056 size 17145

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:caa01deca1c554a2809eaef83a5bac2a19018d3bf9ed023da26bc822d2af80f4 oid sha256:b1c69feb82dedba852ca45ca32e927ca8df49fb6aafbdbef9fdd3c5daebf5d4f
size 12731 size 12770

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:caa01deca1c554a2809eaef83a5bac2a19018d3bf9ed023da26bc822d2af80f4 oid sha256:b1c69feb82dedba852ca45ca32e927ca8df49fb6aafbdbef9fdd3c5daebf5d4f
size 12731 size 12770

View File

@@ -0,0 +1,46 @@
//
// 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
@testable import ElementX
@MainActor
class JoinRoomScreenViewModelTests: XCTestCase {
var viewModel: JoinRoomScreenViewModelProtocol!
var context: JoinRoomScreenViewModelType.Context {
viewModel.context
}
func testInteraction() async throws {
setupViewModel()
let deferred = deferFulfillment(viewModel.actionsPublisher) { $0 == .joined }
context.send(viewAction: .join)
try await deferred.fulfill()
}
private func setupViewModel(throwing: Bool = false) {
let clientProxy = ClientProxyMock(.init())
clientProxy.joinRoomReturnValue = throwing ? .failure(.sdkError(ClientProxyMockError.generic)) : .success(())
viewModel = JoinRoomScreenViewModel(roomID: "1",
roomName: "Room Name",
avatarURL: nil,
interaction: .join,
clientProxy: clientProxy)
}
}

View File

@@ -53,7 +53,7 @@ packages:
# path: ../matrix-rust-sdk # path: ../matrix-rust-sdk
Compound: Compound:
url: https://github.com/element-hq/compound-ios url: https://github.com/element-hq/compound-ios
revision: ed63ed56655956c950a3b9c55e2010fdf1a2d11d revision: 43310aaaced1a0861c39894bb1086067375326be
# path: ../compound-ios # path: ../compound-ios
AnalyticsEvents: AnalyticsEvents:
url: https://github.com/matrix-org/matrix-analytics-events url: https://github.com/matrix-org/matrix-analytics-events