diff --git a/Package.swift b/Package.swift index 0cbf7ccf58cd4fa36720aad8b6050d0aed6c073f..326adb3368fa6e61172e1c5cc0c910e1d189298a 100644 --- a/Package.swift +++ b/Package.swift @@ -68,7 +68,7 @@ let package = Package( .package(url: "https://github.com/pointfreeco/combine-schedulers", from: "0.5.0"), .package(url: "https://github.com/kishikawakatsumi/KeychainAccess", from: "4.2.1"), .package(url: "https://github.com/google/google-api-objectivec-client-for-rest", from: "1.6.0"), - .package(url: "https://git.xx.network/elixxir/client-ios-db.git", .upToNextMajor(from: "1.0.5")), + .package(url: "https://git.xx.network/elixxir/client-ios-db.git", .upToNextMajor(from: "1.0.7")), .package(url: "https://github.com/firebase/firebase-ios-sdk.git", .upToNextMajor(from: "8.10.0")), .package(url: "https://github.com/darrarski/Shout.git", revision: "df5a662293f0ac15eeb4f2fd3ffd0c07b73d0de0"), .package(url: "https://github.com/pointfreeco/swift-composable-architecture.git",.upToNextMajor(from: "0.32.0")), diff --git a/Sources/App/DependencyRegistrator.swift b/Sources/App/DependencyRegistrator.swift index 2d5abdec492a39f9eac25be51fddcafa11a7d0e7..14a7b7bdb482974cff2b5b2be573d3f5fb1a33fc 100644 --- a/Sources/App/DependencyRegistrator.swift +++ b/Sources/App/DependencyRegistrator.swift @@ -104,7 +104,7 @@ struct DependencyRegistrator { // MARK: Isolated - container.register(HUD() as HUDType) + container.register(HUD()) container.register(ThemeController() as ThemeControlling) container.register(ToastController()) container.register(StatusBarController() as StatusBarStyleControlling) diff --git a/Sources/BackupFeature/Controllers/BackupController.swift b/Sources/BackupFeature/Controllers/BackupController.swift index a01ff0caa91be5ffdfa55e6fe9fe8ea7ebab41bf..a9942d8c03466fe8b620d156c9eb1cc02f2ef70a 100644 --- a/Sources/BackupFeature/Controllers/BackupController.swift +++ b/Sources/BackupFeature/Controllers/BackupController.swift @@ -6,7 +6,7 @@ import Combine import DependencyInjection public final class BackupController: UIViewController { - @Dependency private var hud: HUDType + @Dependency var hud: HUD private let viewModel = BackupViewModel.live() private var cancellables = Set<AnyCancellable>() @@ -14,7 +14,7 @@ public final class BackupController: UIViewController { public override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = Asset.neutralWhite.color - hud.update(with: .on(nil)) + hud.update(with: .on) setupNavigationBar() setupBindings() diff --git a/Sources/BackupFeature/ViewModels/BackupConfigViewModel.swift b/Sources/BackupFeature/ViewModels/BackupConfigViewModel.swift index f136ca8c15c83578636ed3ef00643817d73b8de9..0731bc4a94f5be17d6e224d5f67573ea68ea608f 100644 --- a/Sources/BackupFeature/ViewModels/BackupConfigViewModel.swift +++ b/Sources/BackupFeature/ViewModels/BackupConfigViewModel.swift @@ -30,7 +30,7 @@ struct BackupConfigViewModel { extension BackupConfigViewModel { static func live() -> Self { class Context { - @Dependency var hud: HUDType + @Dependency var hud: HUD @Dependency var service: BackupService @Dependency var coordinator: BackupCoordinating } @@ -40,7 +40,7 @@ extension BackupConfigViewModel { return .init( didTapBackupNow: { context.service.performBackup() - context.hud.update(with: .on(nil)) + context.hud.update(with: .on) DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { context.hud.update(with: .none) } @@ -57,7 +57,7 @@ extension BackupConfigViewModel { context.service.toggle(service: service, enabling: false) }, passphraseClosure: { passphrase in context.service.passphrase = passphrase - context.hud.update(with: .on("Initializing and securing your backup file will take few seconds, please keep the app open.")) + context.hud.update(with: .onTitle("Initializing and securing your backup file will take few seconds, please keep the app open.")) DispatchQueue.global().async { context.service.toggle(service: service, enabling: enabling) diff --git a/Sources/ChatFeature/Controllers/SingleChatController.swift b/Sources/ChatFeature/Controllers/SingleChatController.swift index b35d314725ea97149e84edb8b9525e1fc010d4f6..f34be438f7df3afd84d5ba7c6db04612bc891cc6 100644 --- a/Sources/ChatFeature/Controllers/SingleChatController.swift +++ b/Sources/ChatFeature/Controllers/SingleChatController.swift @@ -24,7 +24,7 @@ extension Message: Differentiable { } public final class SingleChatController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var logger: XXLogger @Dependency private var voxophone: Voxophone @Dependency private var coordinator: ChatCoordinating diff --git a/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift b/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift index cd78765910d84d7242ee96ff145c3cd612c2492d..f51a893610402c317f938f0b29445317de9bb6d4 100644 --- a/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift +++ b/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift @@ -107,7 +107,7 @@ final class SingleChatViewModel { func didSend(image: UIImage) { guard let imageData = image.orientedUp().jpegData(compressionQuality: 1.0) else { return } - hudRelay.send(.on(nil)) + hudRelay.send(.on) session.send(imageData: imageData, to: contact) { [weak self] in switch $0 { diff --git a/Sources/ChatListFeature/ViewModel/ChatListViewModel.swift b/Sources/ChatListFeature/ViewModel/ChatListViewModel.swift index 98febff09e352ff1e0ff495c032f1e7d1ec1613a..f481b96fb7e3e14b74096919090bf1df8c96c840 100644 --- a/Sources/ChatListFeature/ViewModel/ChatListViewModel.swift +++ b/Sources/ChatListFeature/ViewModel/ChatListViewModel.swift @@ -147,7 +147,7 @@ final class ChatListViewModel { } func leave(_ group: Group) { - hudSubject.send(.on(nil)) + hudSubject.send(.on) do { try session.leave(group: group) diff --git a/Sources/ContactFeature/Controllers/ContactController.swift b/Sources/ContactFeature/Controllers/ContactController.swift index cf64268edbdd1cad2986105c38d72a74b2273499..02859bab60bf861a5615795a016352a4f4509900 100644 --- a/Sources/ContactFeature/Controllers/ContactController.swift +++ b/Sources/ContactFeature/Controllers/ContactController.swift @@ -10,7 +10,7 @@ import DependencyInjection import ScrollViewController public final class ContactController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: ContactCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/ContactFeature/ViewModels/ContactViewModel.swift b/Sources/ContactFeature/ViewModels/ContactViewModel.swift index 67005d4b9d01cbc493ead72d8f6b89e42e64535e..5e6e06698cbfeb359a79ce231dde08f37c03ee6a 100644 --- a/Sources/ContactFeature/ViewModels/ContactViewModel.swift +++ b/Sources/ContactFeature/ViewModels/ContactViewModel.swift @@ -62,7 +62,7 @@ final class ContactViewModel { } func didTapDelete() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) do { try session.deleteContact(contact) @@ -91,7 +91,7 @@ final class ContactViewModel { } func didTapResend() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } @@ -107,7 +107,7 @@ final class ContactViewModel { } func didTapRequest(with nickname: String) { - hudRelay.send(.on(nil)) + hudRelay.send(.on) contact.nickname = nickname backgroundScheduler.schedule { [weak self] in @@ -124,7 +124,7 @@ final class ContactViewModel { } func didTapAccept(_ nickname: String) { - hudRelay.send(.on(nil)) + hudRelay.send(.on) contact.nickname = nickname backgroundScheduler.schedule { [weak self] in diff --git a/Sources/ContactListFeature/Controllers/CreateGroupController.swift b/Sources/ContactListFeature/Controllers/CreateGroupController.swift index c2944d3a749bac28a690c0b1aab7221fb7291699..a9559f5c3c38ccdf7a90543a9963748155e6fa6b 100644 --- a/Sources/ContactListFeature/Controllers/CreateGroupController.swift +++ b/Sources/ContactListFeature/Controllers/CreateGroupController.swift @@ -7,7 +7,7 @@ import XXModels import DependencyInjection public final class CreateGroupController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: ContactListCoordinating lazy private var titleLabel = UILabel() diff --git a/Sources/ContactListFeature/ViewModels/CreateGroupViewModel.swift b/Sources/ContactListFeature/ViewModels/CreateGroupViewModel.swift index 67e70645ed6c0d00f02862bdb02f199d3d735d9d..a8f94de8042f3cd7f7d0da14a9de703f217f573b 100644 --- a/Sources/ContactListFeature/ViewModels/CreateGroupViewModel.swift +++ b/Sources/ContactListFeature/ViewModels/CreateGroupViewModel.swift @@ -76,7 +76,7 @@ final class CreateGroupViewModel { } func create(name: String, welcome: String?, members: [Contact]) { - hudRelay.send(.on(nil)) + hudRelay.send(.on) session.createGroup(name: name, welcome: welcome, members: members) { [weak self] in guard let self = self else { return } diff --git a/Sources/HUD/HUD.swift b/Sources/HUD/HUD.swift index 9f45b18078d75a2d11654f99a9bd2d1b2746f4ee..9809909262a8ec26c64e23a3d421d54b20ac28f1 100644 --- a/Sources/HUD/HUD.swift +++ b/Sources/HUD/HUD.swift @@ -10,15 +10,17 @@ private enum Constants { } public enum HUDStatus: Equatable { - case on(String?) case none + case on + case onTitle(String) + case onAction(String) case error(HUDError) var isPresented: Bool { switch self { case .none: return false - case .on, .error: + case .on, .error, .onTitle, .onAction: return true } } @@ -50,15 +52,12 @@ public struct HUDError: Equatable { } } -public protocol HUDType { - func update(with status: HUDStatus) -} - -public final class HUD: HUDType { +public final class HUD { private(set) var window: UIWindow? private(set) var errorView: ErrorView? private(set) var titleLabel: UILabel? private(set) var animation: DotAnimation? + public var actionButton: CapsuleButton? private var cancellables = Set<AnyCancellable>() private var status: HUDStatus = .none { @@ -70,13 +69,19 @@ public final class HUD: HUDType { self.titleLabel = nil switch status { - case .on(let text): + case .on: + animation = DotAnimation() + + case .onTitle(let text): animation = DotAnimation() + titleLabel = UILabel() + titleLabel!.text = text + + case .onAction(let title): + animation = DotAnimation() + actionButton = CapsuleButton() + actionButton!.set(style: .seeThroughWhite, title: title) - if let text = text { - titleLabel = UILabel() - titleLabel!.text = text - } case .error(let error): errorView = ErrorView(with: error) case .none: @@ -88,13 +93,19 @@ public final class HUD: HUDType { if oldValue.isPresented == false && status.isPresented == true { switch status { - case .on(let text): + case .on: animation = DotAnimation() - if let text = text { - titleLabel = UILabel() - titleLabel!.text = text - } + case .onTitle(let text): + animation = DotAnimation() + titleLabel = UILabel() + titleLabel!.text = text + + case .onAction(let title): + animation = DotAnimation() + actionButton = CapsuleButton() + actionButton!.set(style: .seeThroughWhite, title: title) + case .error(let error): errorView = ErrorView(with: error) case .none: @@ -118,7 +129,7 @@ public final class HUD: HUDType { private func showWindow() { window = Window() - window?.backgroundColor = UIColor.black.withAlphaComponent(0.5) + window?.backgroundColor = UIColor.black.withAlphaComponent(0.8) window?.rootViewController = StatusBarViewController(nil) if let animation = animation { @@ -138,6 +149,15 @@ public final class HUD: HUDType { } } + if let actionButton = actionButton { + window?.addSubview(actionButton) + actionButton.snp.makeConstraints { + $0.left.equalToSuperview().offset(18) + $0.right.equalToSuperview().offset(-18) + $0.bottom.equalToSuperview().offset(-50) + } + } + if let errorView = errorView { window?.addSubview(errorView) errorView.snp.makeConstraints { make in @@ -166,6 +186,7 @@ public final class HUD: HUDType { self.cancellables.removeAll() self.errorView = nil self.animation = nil + self.actionButton = nil self.titleLabel = nil self.window = nil } diff --git a/Sources/LaunchFeature/LaunchController.swift b/Sources/LaunchFeature/LaunchController.swift index 33c2f8dad55d29d02a7e74b3d70437fbaea4aa6f..2eb373f55784bed3e9a11293acc7cca9aee2fc08 100644 --- a/Sources/LaunchFeature/LaunchController.swift +++ b/Sources/LaunchFeature/LaunchController.swift @@ -7,7 +7,7 @@ import DependencyInjection public final class LaunchController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: LaunchCoordinating lazy private var screenView = LaunchView() diff --git a/Sources/LaunchFeature/LaunchViewModel.swift b/Sources/LaunchFeature/LaunchViewModel.swift index 4e1b25ea61eb4475c9849f1873482b8a6eec3b25..fefbe7cf6035b19d804febd7e544e22166d11bf8 100644 --- a/Sources/LaunchFeature/LaunchViewModel.swift +++ b/Sources/LaunchFeature/LaunchViewModel.swift @@ -58,7 +58,7 @@ final class LaunchViewModel { func viewDidAppear() { DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in - self?.hudSubject.send(.on(nil)) + self?.hudSubject.send(.on) self?.checkVersion() } } diff --git a/Sources/OnboardingFeature/Controllers/OnboardingEmailConfirmationController.swift b/Sources/OnboardingFeature/Controllers/OnboardingEmailConfirmationController.swift index 75b7d0ffb081bec57a2c8cf06d0fa6915fd07092..90c210569b58b904473f5c2e2020740e2945a09d 100644 --- a/Sources/OnboardingFeature/Controllers/OnboardingEmailConfirmationController.swift +++ b/Sources/OnboardingFeature/Controllers/OnboardingEmailConfirmationController.swift @@ -9,7 +9,7 @@ import ScrollViewController import Models public final class OnboardingEmailConfirmationController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: OnboardingCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/OnboardingFeature/Controllers/OnboardingEmailController.swift b/Sources/OnboardingFeature/Controllers/OnboardingEmailController.swift index 68b10159a32ab4e5167d10ba98d993f453fdf24d..54fb8cf4efcf4cd29489729598ed22144b918f65 100644 --- a/Sources/OnboardingFeature/Controllers/OnboardingEmailController.swift +++ b/Sources/OnboardingFeature/Controllers/OnboardingEmailController.swift @@ -8,7 +8,7 @@ import DependencyInjection import ScrollViewController public final class OnboardingEmailController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: OnboardingCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/OnboardingFeature/Controllers/OnboardingPhoneConfirmationController.swift b/Sources/OnboardingFeature/Controllers/OnboardingPhoneConfirmationController.swift index dbef5be43b8314ffcc71a2481bb4bcc0d67a5e6d..0017798bc5fc2a4703a56cf6b4fc2a45fbcffa55 100644 --- a/Sources/OnboardingFeature/Controllers/OnboardingPhoneConfirmationController.swift +++ b/Sources/OnboardingFeature/Controllers/OnboardingPhoneConfirmationController.swift @@ -9,7 +9,7 @@ import ScrollViewController import Models public final class OnboardingPhoneConfirmationController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: OnboardingCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/OnboardingFeature/Controllers/OnboardingPhoneController.swift b/Sources/OnboardingFeature/Controllers/OnboardingPhoneController.swift index b935ae07434e90d94818a2ea400202924323ea32..8793508fe6ec8d94e3ee00ff5f3052031c70ee53 100644 --- a/Sources/OnboardingFeature/Controllers/OnboardingPhoneController.swift +++ b/Sources/OnboardingFeature/Controllers/OnboardingPhoneController.swift @@ -8,7 +8,7 @@ import DependencyInjection import ScrollViewController public final class OnboardingPhoneController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: OnboardingCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/OnboardingFeature/Controllers/OnboardingStartController.swift b/Sources/OnboardingFeature/Controllers/OnboardingStartController.swift index 2ed639b116b86ab36b2cdf8924b63626bd653d0c..d95169bbd9c5ce078687a77c96768d91e9d2336d 100644 --- a/Sources/OnboardingFeature/Controllers/OnboardingStartController.swift +++ b/Sources/OnboardingFeature/Controllers/OnboardingStartController.swift @@ -6,7 +6,7 @@ import Combine import DependencyInjection public final class OnboardingStartController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: OnboardingCoordinating lazy private var screenView = OnboardingStartView() diff --git a/Sources/OnboardingFeature/Controllers/OnboardingUsernameController.swift b/Sources/OnboardingFeature/Controllers/OnboardingUsernameController.swift index d25db4581f5c5dbd3083515b1828433494631e45..3bc4493ebd99899a4b9ea646964816ff0140009e 100644 --- a/Sources/OnboardingFeature/Controllers/OnboardingUsernameController.swift +++ b/Sources/OnboardingFeature/Controllers/OnboardingUsernameController.swift @@ -8,7 +8,7 @@ import DependencyInjection import ScrollViewController public final class OnboardingUsernameController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: OnboardingCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/OnboardingFeature/ViewModels/OnboardingEmailConfirmationViewModel.swift b/Sources/OnboardingFeature/ViewModels/OnboardingEmailConfirmationViewModel.swift index 1263fc26efb0f01d50f00a25e8b4b27e3b821b81..b3871d6234517f1d493ab61da1466bc754446fd7 100644 --- a/Sources/OnboardingFeature/ViewModels/OnboardingEmailConfirmationViewModel.swift +++ b/Sources/OnboardingFeature/ViewModels/OnboardingEmailConfirmationViewModel.swift @@ -58,7 +58,7 @@ final class OnboardingEmailConfirmationViewModel { } func didTapNext() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/OnboardingFeature/ViewModels/OnboardingEmailViewModel.swift b/Sources/OnboardingFeature/ViewModels/OnboardingEmailViewModel.swift index 618a903459267835ea47210d17ab0e5f763ac68e..c3cbbb897840964e15f908b9fa83d5d6537f7b23 100644 --- a/Sources/OnboardingFeature/ViewModels/OnboardingEmailViewModel.swift +++ b/Sources/OnboardingFeature/ViewModels/OnboardingEmailViewModel.swift @@ -38,7 +38,7 @@ final class OnboardingEmailViewModel { } func didTapNext() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/OnboardingFeature/ViewModels/OnboardingPhoneConfirmationViewModel.swift b/Sources/OnboardingFeature/ViewModels/OnboardingPhoneConfirmationViewModel.swift index 0af84d605d2c56a938e474d27fd79ad324943ee3..2bd5a7ae35fbca7bf871479f998abeef9e4ce625 100644 --- a/Sources/OnboardingFeature/ViewModels/OnboardingPhoneConfirmationViewModel.swift +++ b/Sources/OnboardingFeature/ViewModels/OnboardingPhoneConfirmationViewModel.swift @@ -58,7 +58,7 @@ final class OnboardingPhoneConfirmationViewModel { } func didTapNext() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/OnboardingFeature/ViewModels/OnboardingPhoneViewModel.swift b/Sources/OnboardingFeature/ViewModels/OnboardingPhoneViewModel.swift index 4698673d45cbe3b05f73fb3b1943f598f1c9655e..0aff02f402420b959d03f166ba4eb456d1098bea 100644 --- a/Sources/OnboardingFeature/ViewModels/OnboardingPhoneViewModel.swift +++ b/Sources/OnboardingFeature/ViewModels/OnboardingPhoneViewModel.swift @@ -47,7 +47,7 @@ final class OnboardingPhoneViewModel { } func didTapNext() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/OnboardingFeature/ViewModels/OnboardingUsernameViewModel.swift b/Sources/OnboardingFeature/ViewModels/OnboardingUsernameViewModel.swift index 8766aac8e7629e4bdb9079cd8a3774aa2d1989a2..ecb64035e73e259bf147ce4ee7f427723d40b3f3 100644 --- a/Sources/OnboardingFeature/ViewModels/OnboardingUsernameViewModel.swift +++ b/Sources/OnboardingFeature/ViewModels/OnboardingUsernameViewModel.swift @@ -42,7 +42,7 @@ final class OnboardingUsernameViewModel { } func didTapRegister() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/ProfileFeature/Controllers/ProfileCodeController.swift b/Sources/ProfileFeature/Controllers/ProfileCodeController.swift index d909662aa961fda594217d71d4dd940bd0cf80af..c005b0bf9c10daa6db1f8521799da86bbfad26a4 100644 --- a/Sources/ProfileFeature/Controllers/ProfileCodeController.swift +++ b/Sources/ProfileFeature/Controllers/ProfileCodeController.swift @@ -10,7 +10,7 @@ import ScrollViewController public typealias ControllerClosure = (UIViewController, AttributeConfirmation) -> Void public final class ProfileCodeController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD lazy private var screenView = ProfileCodeView() lazy private var scrollViewController = ScrollViewController() diff --git a/Sources/ProfileFeature/Controllers/ProfileController.swift b/Sources/ProfileFeature/Controllers/ProfileController.swift index 62a2c90ee9bfb56674f8601bb1007d62c5f3323d..e3138f275dd967d73d58548649e4156409178e57 100644 --- a/Sources/ProfileFeature/Controllers/ProfileController.swift +++ b/Sources/ProfileFeature/Controllers/ProfileController.swift @@ -7,7 +7,7 @@ import Combine import DependencyInjection public final class ProfileController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: ProfileCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/ProfileFeature/Controllers/ProfileEmailController.swift b/Sources/ProfileFeature/Controllers/ProfileEmailController.swift index fb85221449bea9ecd89b1a9507db4182b7365622..97ced65c65a10b7d4ac8033a5b2c0d80cf959997 100644 --- a/Sources/ProfileFeature/Controllers/ProfileEmailController.swift +++ b/Sources/ProfileFeature/Controllers/ProfileEmailController.swift @@ -7,7 +7,7 @@ import DependencyInjection import ScrollViewController public final class ProfileEmailController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: ProfileCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/ProfileFeature/Controllers/ProfilePhoneController.swift b/Sources/ProfileFeature/Controllers/ProfilePhoneController.swift index b6ddaffb5574bdb44f70994fe2ce2c7b0e98b3c0..eb77fd14d36bce3960f30a73aa4ac7c117e453e7 100644 --- a/Sources/ProfileFeature/Controllers/ProfilePhoneController.swift +++ b/Sources/ProfileFeature/Controllers/ProfilePhoneController.swift @@ -9,7 +9,7 @@ import ScrollViewController #warning("TODO: Merge ProfilePhoneController/ProfileEmailController") public final class ProfilePhoneController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: ProfileCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/ProfileFeature/ViewModels/ProfileCodeViewModel.swift b/Sources/ProfileFeature/ViewModels/ProfileCodeViewModel.swift index 0cc8f60cfaea6921d99a90ccbba74a0cdfc322c2..d9763e989e23e37c9736582a41fcf1b63aef03b2 100644 --- a/Sources/ProfileFeature/ViewModels/ProfileCodeViewModel.swift +++ b/Sources/ProfileFeature/ViewModels/ProfileCodeViewModel.swift @@ -57,7 +57,7 @@ final class ProfileCodeViewModel { } func didTapNext() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/ProfileFeature/ViewModels/ProfileEmailViewModel.swift b/Sources/ProfileFeature/ViewModels/ProfileEmailViewModel.swift index df2bb28cdaa889462d1db1eb506cb14129567312..6b57bc81fe4040faaccaeefff057a275a90deaac 100644 --- a/Sources/ProfileFeature/ViewModels/ProfileEmailViewModel.swift +++ b/Sources/ProfileFeature/ViewModels/ProfileEmailViewModel.swift @@ -40,7 +40,7 @@ final class ProfileEmailViewModel { } func didTapNext() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/ProfileFeature/ViewModels/ProfilePhoneViewModel.swift b/Sources/ProfileFeature/ViewModels/ProfilePhoneViewModel.swift index 9bf5da6e11788124e2bba6b04ba05f2f64b7f033..1013725b419a118c4e437d3e8959c50748447d72 100644 --- a/Sources/ProfileFeature/ViewModels/ProfilePhoneViewModel.swift +++ b/Sources/ProfileFeature/ViewModels/ProfilePhoneViewModel.swift @@ -47,7 +47,7 @@ final class ProfilePhoneViewModel { } func didTapNext() { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/ProfileFeature/ViewModels/ProfileViewModel.swift b/Sources/ProfileFeature/ViewModels/ProfileViewModel.swift index 8f03379f02adde54606a70e4bd7c76f3e1fea87d..a7066eccfaada6e74960beb7a5b3b8b7e72548cb 100644 --- a/Sources/ProfileFeature/ViewModels/ProfileViewModel.swift +++ b/Sources/ProfileFeature/ViewModels/ProfileViewModel.swift @@ -83,7 +83,7 @@ final class ProfileViewModel { } func didTapDelete(isEmail: Bool) { - hudRelay.send(.on(nil)) + hudRelay.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/RequestsFeature/Controllers/RequestsFailedController.swift b/Sources/RequestsFeature/Controllers/RequestsFailedController.swift index c166da6b2c97b01f38e273b2a1a91ccbed475055..c0af65d5f83a4bc1528065eef1551e597a52f6c9 100644 --- a/Sources/RequestsFeature/Controllers/RequestsFailedController.swift +++ b/Sources/RequestsFeature/Controllers/RequestsFailedController.swift @@ -5,7 +5,7 @@ import Combine import DependencyInjection final class RequestsFailedController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD lazy private var screenView = RequestsFailedView() private var cancellables = Set<AnyCancellable>() diff --git a/Sources/RequestsFeature/Controllers/RequestsReceivedController.swift b/Sources/RequestsFeature/Controllers/RequestsReceivedController.swift index 5edb77726fa6d43ba7d4e2a816192fcadd39303b..0a30d05fb32b5ec4d3eb54b1fdeb9ced674a17ac 100644 --- a/Sources/RequestsFeature/Controllers/RequestsReceivedController.swift +++ b/Sources/RequestsFeature/Controllers/RequestsReceivedController.swift @@ -10,7 +10,7 @@ import DrawerFeature import DependencyInjection final class RequestsReceivedController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var toaster: ToastController @Dependency private var coordinator: RequestsCoordinating diff --git a/Sources/RequestsFeature/Controllers/RequestsSentController.swift b/Sources/RequestsFeature/Controllers/RequestsSentController.swift index 36c245f4476fdd8795a6c0c38612f86c1ec6953e..ceed2cc28989b51d72d0191e63e81ade2f930bdd 100644 --- a/Sources/RequestsFeature/Controllers/RequestsSentController.swift +++ b/Sources/RequestsFeature/Controllers/RequestsSentController.swift @@ -5,7 +5,7 @@ import Combine import DependencyInjection final class RequestsSentController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD var connectionsPublisher: AnyPublisher<Void, Never> { connectionSubject.eraseToAnyPublisher() diff --git a/Sources/RequestsFeature/ViewModels/RequestsFailedViewModel.swift b/Sources/RequestsFeature/ViewModels/RequestsFailedViewModel.swift index 9214c9ef3f19d337ae66f0f9a6c8368741ff1096..b7d81db3a65b791e001a897506418295b56f8b3a 100644 --- a/Sources/RequestsFeature/ViewModels/RequestsFailedViewModel.swift +++ b/Sources/RequestsFeature/ViewModels/RequestsFailedViewModel.swift @@ -38,7 +38,7 @@ final class RequestsFailedViewModel { func didTapStateButtonFor(request: Request) { guard case let .contact(contact) = request, request.status == .failedToRequest else { return } - hudSubject.send(.on(nil)) + hudSubject.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/RequestsFeature/ViewModels/RequestsReceivedViewModel.swift b/Sources/RequestsFeature/ViewModels/RequestsReceivedViewModel.swift index 7dd9e8c1d07c9b15d9829803be59c55c0955fd12..ded18f77a4da0d956d2bdb0b1779495c818d41f5 100644 --- a/Sources/RequestsFeature/ViewModels/RequestsReceivedViewModel.swift +++ b/Sources/RequestsFeature/ViewModels/RequestsReceivedViewModel.swift @@ -150,7 +150,7 @@ final class RequestsReceivedViewModel { } func didRequestAccept(group: Group) { - hudSubject.send(.on(nil)) + hudSubject.send(.on) backgroundScheduler.schedule { [weak self] in do { @@ -208,7 +208,7 @@ final class RequestsReceivedViewModel { } func didRequestAccept(contact: Contact, nickname: String? = nil) { - hudSubject.send(.on(nil)) + hudSubject.send(.on) var contact = contact contact.nickname = nickname ?? contact.username diff --git a/Sources/RequestsFeature/ViewModels/RequestsSentViewModel.swift b/Sources/RequestsFeature/ViewModels/RequestsSentViewModel.swift index 9732c4c94d016ae3cd2a6ea35b98477b06160e0b..f94ed8f5164de5c5a419a9b9271499ae7daa4952 100644 --- a/Sources/RequestsFeature/ViewModels/RequestsSentViewModel.swift +++ b/Sources/RequestsFeature/ViewModels/RequestsSentViewModel.swift @@ -53,7 +53,7 @@ final class RequestsSentViewModel { func didTapStateButtonFor(request item: RequestSent) { guard case let .contact(contact) = item.request, item.request.status == .requested else { return } - hudSubject.send(.on(nil)) + hudSubject.send(.on) backgroundScheduler.schedule { [weak self] in guard let self = self else { return } diff --git a/Sources/RestoreFeature/Controllers/RestoreListController.swift b/Sources/RestoreFeature/Controllers/RestoreListController.swift index c73e94edec314484dc06307f84e9e528f66bcc2a..b396d1069df7008772290e5c9e2f275adb5ccf4b 100644 --- a/Sources/RestoreFeature/Controllers/RestoreListController.swift +++ b/Sources/RestoreFeature/Controllers/RestoreListController.swift @@ -6,7 +6,7 @@ import DrawerFeature import DependencyInjection public final class RestoreListController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: RestoreCoordinating lazy private var screenView = RestoreListView() diff --git a/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift b/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift index a4c2402e819c0576afdacc501c4550cd3656269f..438207bb1cc5df10104d3be19029ef01cc7d3c19 100644 --- a/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift +++ b/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift @@ -47,7 +47,7 @@ final class RestoreListViewModel { guard let self = self else { return } controller.navigationController?.popViewController(animated: true) - self.hudSubject.send(.on(nil)) + self.hudSubject.send(.on) self.sftpService.fetchMetadata{ result in switch result { @@ -72,7 +72,7 @@ final class RestoreListViewModel { googleDriveService.authorize(presenting: controller) { authResult in switch authResult { case .success: - self.hudSubject.send(.on(nil)) + self.hudSubject.send(.on) self.googleDriveService.downloadMetadata { downloadResult in switch downloadResult { case .success(let metadata): @@ -97,7 +97,7 @@ final class RestoreListViewModel { private func didRequestICloudAuthorization() { if icloudService.isAuthorized() { - self.hudSubject.send(.on(nil)) + self.hudSubject.send(.on) icloudService.downloadMetadata { result in switch result { @@ -129,7 +129,7 @@ final class RestoreListViewModel { case .success(let bool): guard bool == true else { return } - self.hudSubject.send(.on(nil)) + self.hudSubject.send(.on) dropboxService.downloadMetadata { metadataResult in switch metadataResult { case .success(let metadata): diff --git a/Sources/SFTPFeature/SFTPController.swift b/Sources/SFTPFeature/SFTPController.swift index 0a8c8d38ed8dbd9d802d58962b468b11f4c57431..f80908b9cdf6106bacef3c2fa9f6c4eac46e8145 100644 --- a/Sources/SFTPFeature/SFTPController.swift +++ b/Sources/SFTPFeature/SFTPController.swift @@ -5,7 +5,7 @@ import DependencyInjection import ScrollViewController public final class SFTPController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD lazy private var screenView = SFTPView() lazy private var scrollViewController = ScrollViewController() diff --git a/Sources/SFTPFeature/SFTPViewModel.swift b/Sources/SFTPFeature/SFTPViewModel.swift index dcf397a1da1c474681001b87df0d148ae26b2706..e64536bfd96277642d25ddb13f5c81570836a22b 100644 --- a/Sources/SFTPFeature/SFTPViewModel.swift +++ b/Sources/SFTPFeature/SFTPViewModel.swift @@ -45,7 +45,7 @@ final class SFTPViewModel { } func didTapLogin() { - hudSubject.send(.on(nil)) + hudSubject.send(.on) let host = stateSubject.value.host let username = stateSubject.value.username diff --git a/Sources/SearchFeature/Controllers/SearchLeftController.swift b/Sources/SearchFeature/Controllers/SearchLeftController.swift index 747705915b1aae3f2f05e1d1a8ebad13b4ff2bd6..0ca4f4b05c0d464f16b57a3dd6d74acfde177ca4 100644 --- a/Sources/SearchFeature/Controllers/SearchLeftController.swift +++ b/Sources/SearchFeature/Controllers/SearchLeftController.swift @@ -9,7 +9,7 @@ import DrawerFeature import DependencyInjection final class SearchLeftController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: SearchCoordinating @KeyObject(.email, defaultValue: nil) var email: String? @@ -19,12 +19,14 @@ final class SearchLeftController: UIViewController { lazy private var screenView = SearchLeftView() - private var cancellables = Set<AnyCancellable>() private var dataSource: SearchDiffableDataSource! private(set) var viewModel = SearchLeftViewModel() private var drawerCancellables = Set<AnyCancellable>() private let adrpURLString = "https://links.xx.network/adrp" + private var cancellables = Set<AnyCancellable>() + private var hudCancellables = Set<AnyCancellable>() + override func loadView() { view = screenView } @@ -75,10 +77,24 @@ final class SearchLeftController: UIViewController { private func setupBindings() { viewModel.hudPublisher + .removeDuplicates() .receive(on: DispatchQueue.main) - .sink { [hud] in hud.update(with: $0) } + .sink { [unowned self] in + hud.update(with: $0) + + if case .onAction = $0, let hudBtn = hud.actionButton { + hudBtn.publisher(for: .touchUpInside) + .receive(on: DispatchQueue.main) + .sink { [unowned self] in viewModel.didTapCancelSearch() } + .store(in: &self.hudCancellables) + } else { + hudCancellables.forEach { $0.cancel() } + hudCancellables.removeAll() + } + } .store(in: &cancellables) + viewModel.statePublisher .map(\.item) .removeDuplicates() diff --git a/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift b/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift index d1c01dfa76a8bc0ec7d1619f5378a3977715eb1d..92336ef7dc570e2817a539e058736be54bfcf986 100644 --- a/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift +++ b/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift @@ -1,5 +1,6 @@ import HUD import UIKit +import Shared import Combine import XXModels import Countries @@ -56,7 +57,7 @@ final class SearchLeftViewModel { func didStartSearching() { guard stateSubject.value.input.isEmpty == false else { return } - hudSubject.send(.on(nil)) + hudSubject.send(.onAction(Localized.Ud.Search.cancel)) var content = stateSubject.value.input let prefix = stateSubject.value.item.written.first!.uppercased() @@ -78,7 +79,7 @@ final class SearchLeftViewModel { } func didTapRequest(contact: Contact) { - hudSubject.send(.on(nil)) + hudSubject.send(.on) var contact = contact contact.nickname = contact.username diff --git a/Sources/SettingsFeature/Controllers/AccountDeleteController.swift b/Sources/SettingsFeature/Controllers/AccountDeleteController.swift index 7eae36405a3bf673064d10fd743b648d99d0fc28..1dc36e2ef958cc0c7fba6177e621915d96cfc4cc 100644 --- a/Sources/SettingsFeature/Controllers/AccountDeleteController.swift +++ b/Sources/SettingsFeature/Controllers/AccountDeleteController.swift @@ -10,7 +10,7 @@ import DependencyInjection public final class AccountDeleteController: UIViewController { @KeyObject(.username, defaultValue: "") var username: String - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: SettingsCoordinating lazy private var screenView = AccountDeleteView() diff --git a/Sources/SettingsFeature/Controllers/SettingsController.swift b/Sources/SettingsFeature/Controllers/SettingsController.swift index e12674906cde540f35bbff5741f3ec5e816b4507..52e78e17a42c3933f671917aca89b186362f349a 100644 --- a/Sources/SettingsFeature/Controllers/SettingsController.swift +++ b/Sources/SettingsFeature/Controllers/SettingsController.swift @@ -8,7 +8,7 @@ import DependencyInjection import ScrollViewController public final class SettingsController: UIViewController { - @Dependency private var hud: HUDType + @Dependency private var hud: HUD @Dependency private var coordinator: SettingsCoordinating @Dependency private var statusBarController: StatusBarStyleControlling diff --git a/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift b/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift index 0547bbbce7fd175563e525276af29f27c2a2df6c..db7e64016a317b8fe74fa496102437c771f500db 100644 --- a/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift +++ b/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift @@ -17,7 +17,7 @@ final class AccountDeleteViewModel { deleting = true DispatchQueue.main.async { [weak self] in - self?.hudRelay.send(.on(nil)) + self?.hudRelay.send(.on) } do { diff --git a/Sources/SettingsFeature/ViewModels/SettingsViewModel.swift b/Sources/SettingsFeature/ViewModels/SettingsViewModel.swift index 97c146a6aa7645ef12298e8bcc2dae2edf2072e2..9b985922329599ac17010bdd2d16c43dec81a454 100644 --- a/Sources/SettingsFeature/ViewModels/SettingsViewModel.swift +++ b/Sources/SettingsFeature/ViewModels/SettingsViewModel.swift @@ -110,7 +110,7 @@ final class SettingsViewModel { } private func pushNotifications(enable: Bool) { - hudRelay.send(.on(nil)) + hudRelay.send(.on) if enable == true { pushHandler.requestAuthorization { [weak self] result in diff --git a/Sources/Shared/AutoGenerated/Strings.swift b/Sources/Shared/AutoGenerated/Strings.swift index 6e3ada55daa0f34b8285e1cd708d93a70f17e32f..4cb0e5a1f0b0e3e69e37a82b032e842997c45399 100644 --- a/Sources/Shared/AutoGenerated/Strings.swift +++ b/Sources/Shared/AutoGenerated/Strings.swift @@ -1238,6 +1238,8 @@ public enum Localized { public static let title = Localized.tr("Localizable", "ud.requestDrawer.title") } public enum Search { + /// Cancel search + public static let cancel = Localized.tr("Localizable", "ud.search.cancel") /// There are no users with that %@. public static func empty(_ p1: Any) -> String { return Localized.tr("Localizable", "ud.search.empty", String(describing: p1)) diff --git a/Sources/Shared/Resources/en.lproj/Localizable.strings b/Sources/Shared/Resources/en.lproj/Localizable.strings index c50b6c120e8a8cbd10b128fbbfff708683510bfc..5a0f72415ed3fa5cd9de68498a19611923abf112 100644 --- a/Sources/Shared/Resources/en.lproj/Localizable.strings +++ b/Sources/Shared/Resources/en.lproj/Localizable.strings @@ -987,6 +987,8 @@ = "Search by %@"; "ud.search.empty" = "There are no users with that %@."; +"ud.search.cancel" += "Cancel search"; "ud.search.placeholder.title" = "Search for #friends# anonymously, add them to your #connections# to start a completely private messaging channel."; diff --git a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved index f9de6930fb00ffc8a1befdc355e207f45741c671..99b1d0645e06574ecc16a85e101052402e9e6996 100644 --- a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://git.xx.network/elixxir/client-ios-db.git", "state" : { - "revision" : "adf3c4b906870ecbd0d1d7208f0666939fd08665", - "version" : "1.0.5" + "revision" : "c0ef6d7d25a6dac4668e684ec155cf0e1eb90617", + "version" : "1.0.7" } }, {