diff --git a/Sources/App/AppDelegate.swift b/Sources/App/AppDelegate.swift index e3dadaeee45e42c7a4c7ff5338773abbb9027198..00b8875eaf650d668ae4541fb254fc52c2c50980 100644 --- a/Sources/App/AppDelegate.swift +++ b/Sources/App/AppDelegate.swift @@ -143,8 +143,8 @@ public class AppDelegate: UIResponder, UIApplicationDelegate { open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:] ) -> Bool { - if let username = getUsernameFromInvitationDeepLink(url), - let router = try? DependencyInjection.Container.shared.resolve() as PushRouter { + if let username = getUsernameFromInvitationDeepLink(url) { + let router = try! DependencyInjection.Container.shared.resolve() as PushRouter invitation = username router.navigateTo(.search, {}) diff --git a/Sources/App/DependencyRegistrator.swift b/Sources/App/DependencyRegistrator.swift index 4466aea4744e5585fb3e69bce23c33939d04320a..05d03f78e33764ef8a3f3cd325b5fa1b9d958c18 100644 --- a/Sources/App/DependencyRegistrator.swift +++ b/Sources/App/DependencyRegistrator.swift @@ -251,46 +251,3 @@ struct DependencyRegistrator { ) as ChatListCoordinating) } } - -extension PushRouter { - static func live(navigationController: UINavigationController) -> PushRouter { - PushRouter { route, completion in - if let launchController = navigationController.viewControllers.last as? LaunchController { - launchController.pendingPushRoute = route - } else { - switch route { - case .search: - if (navigationController.viewControllers.last as? SearchContainerController) == nil { - navigationController.setViewControllers([ - ChatListController(), - SearchContainerController() - ], animated: true) - } - - case .requests: - if (navigationController.viewControllers.last as? RequestsContainerController) == nil { - navigationController.setViewControllers([RequestsContainerController()], animated: true) - } - case .contactChat(id: let id): - if let session = try? DependencyInjection.Container.shared.resolve() as SessionType, - let contact = try? session.dbManager.fetchContacts(.init(id: [id])).first { - navigationController.setViewControllers([ - ChatListController(), - SingleChatController(contact) - ], animated: true) - } - case .groupChat(id: let id): - if let session = try? DependencyInjection.Container.shared.resolve() as SessionType, - let info = try? session.dbManager.fetchGroupInfos(.init(groupId: id)).first { - navigationController.setViewControllers([ - ChatListController(), - GroupChatController(info) - ], animated: true) - } - } - } - - completion() - } - } -} diff --git a/Sources/App/PushRouter.swift b/Sources/App/PushRouter.swift new file mode 100644 index 0000000000000000000000000000000000000000..d81f841fc2c8b28a0380da507e37208c0bf2faf9 --- /dev/null +++ b/Sources/App/PushRouter.swift @@ -0,0 +1,51 @@ +import UIKit +import PushFeature +import Integration +import ChatFeature +import SearchFeature +import LaunchFeature +import ChatListFeature +import RequestsFeature +import DependencyInjection + +extension PushRouter { + static func live(navigationController: UINavigationController) -> PushRouter { + PushRouter { route, completion in + if let launchController = navigationController.viewControllers.last as? LaunchController { + launchController.pendingPushRoute = route + } else { + switch route { + case .search: + if !(navigationController.viewControllers.last is SearchContainerController) { + navigationController.setViewControllers([ + ChatListController(), + SearchContainerController() + ], animated: true) + } + case .requests: + if !(navigationController.viewControllers.last is RequestsContainerController) { + navigationController.setViewControllers([RequestsContainerController()], animated: true) + } + case .contactChat(id: let id): + if let session = try? DependencyInjection.Container.shared.resolve() as SessionType, + let contact = try? session.dbManager.fetchContacts(.init(id: [id])).first { + navigationController.setViewControllers([ + ChatListController(), + SingleChatController(contact) + ], animated: true) + } + case .groupChat(id: let id): + if let session = try? DependencyInjection.Container.shared.resolve() as SessionType, + let info = try? session.dbManager.fetchGroupInfos(.init(groupId: id)).first { + navigationController.setViewControllers([ + ChatListController(), + GroupChatController(info) + ], animated: true) + } + } + } + + completion() + } + } +} diff --git a/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift b/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift index cab4842ca9f44ca0f8985f941387bd5692bc155a..8206e136f89d0068432458ccac97d8ebe544c2da 100644 --- a/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift +++ b/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift @@ -48,6 +48,8 @@ final class SearchLeftViewModel { stateSubject.value.input = pendingInvitation hudSubject.send(.onAction(Localized.Ud.Search.cancel)) + networkCancellable.removeAll() + networkMonitor.statusPublisher .first { $0 == .available } .eraseToAnyPublisher() diff --git a/Tests/AppTests/General/InvitationTests.swift b/Tests/AppTests/General/InvitationTests.swift index bbd80d6e2e1507fb35fd4751fa087fa4be687788..146c885afab3c85686cc5f216c8e85ff851911b5 100644 --- a/Tests/AppTests/General/InvitationTests.swift +++ b/Tests/AppTests/General/InvitationTests.swift @@ -4,18 +4,18 @@ import XCTest final class AppDelegateTests: XCTestCase { func test_invitationDeeplink() { - let host = "messenger" - let query = "invitation" - let scheme = "xxnetwork" - let username = "john_doe" + XCTAssertNil( + getUsernameFromInvitationDeepLink(URL(string: "http://messenger?invitation=john_doe")!) + ) - let url = URL(string: "\(scheme)://\(host)?\(query)=\(username)")! - XCTAssertEqual(getUsernameFromInvitationDeepLink(url), username) + XCTAssertNotEqual( + getUsernameFromInvitationDeepLink(URL(string: "xxnetwork://messenger?invitation=the_rock")!), + "john_doe" + ) - let malformedURL = URL(string: "\(scheme)\(host)\(query)\(username)")! - XCTAssertNil(getUsernameFromInvitationDeepLink(malformedURL)) - - let urlAnotherUsername = URL(string: "\(scheme)://\(host)?\(query)=asdfg")! - XCTAssertNotEqual(getUsernameFromInvitationDeepLink(urlAnotherUsername), username) + XCTAssertEqual( + getUsernameFromInvitationDeepLink(URL(string: "xxnetwork://messenger?invitation=john_doe")!), + "john_doe" + ) } }