diff --git a/Mail/Views/Unavailable Mailbox/UpdateMailboxPasswordView.swift b/Mail/Views/Unavailable Mailbox/UpdateMailboxPasswordView.swift index edeb297b4..2e29f6dc8 100644 --- a/Mail/Views/Unavailable Mailbox/UpdateMailboxPasswordView.swift +++ b/Mail/Views/Unavailable Mailbox/UpdateMailboxPasswordView.swift @@ -33,6 +33,7 @@ struct UpdateMailboxPasswordView: View { @State private var isShowingError = false @State private var isLoading = false @State private var isShowingDetachMailboxAlertView = false + @State private var snackBarAwareModifier = SnackBarAwareModifier(inset: 0) private var disableButton: Bool { return isLoading || showPasswordLengthWarning @@ -51,13 +52,17 @@ struct UpdateMailboxPasswordView: View { .textStyle(.bodySecondary) Text(MailResourcesStrings.Localizable.enterPasswordDescription2(mailbox.email)) .textStyle(.bodySecondary) - MailButton(label: MailResourcesStrings.Localizable.buttonDetachMailbox) { - matomo.track(eventWithCategory: .invalidPasswordMailbox, name: "detachMailbox") - isShowingDetachMailboxAlertView = true + + HStack(spacing: UIPadding.verySmall) { + Text(MailResourcesStrings.Localizable.enterPasswordOrDescription) + .textStyle(.bodySecondary) + MailButton(label: MailResourcesStrings.Localizable.buttonDetachMailbox) { + matomo.track(eventWithCategory: .invalidPasswordMailbox, name: "detachMailbox") + isShowingDetachMailboxAlertView = true + } + .mailButtonStyle(.link) + .disabled(isLoading) } - .mailButtonStyle(.link) - .mailButtonMinimizeHeight(true) - .disabled(isLoading) } VStack(alignment: .leading) { @@ -87,20 +92,30 @@ struct UpdateMailboxPasswordView: View { } .padding() .safeAreaInset(edge: .bottom) { - MailButton(label: MailResourcesStrings.Localizable.buttonConfirm) { - matomo.track(eventWithCategory: .invalidPasswordMailbox, name: "updatePassword") - updateMailboxPassword() - } - .mailButtonFullWidth(true) - .disabled(disableButton) - .padding(value: .medium) + VStack(spacing: UIPadding.medium) { + MailButton(label: MailResourcesStrings.Localizable.buttonConfirm) { + matomo.track(eventWithCategory: .invalidPasswordMailbox, name: "updatePassword") + updateMailboxPassword() + } + .mailButtonFullWidth(true) + .disabled(disableButton) - MailButton(label: MailResourcesStrings.Localizable.buttonRequestPassword) { - // Empty for now, WIP + MailButton(label: MailResourcesStrings.Localizable.buttonRequestPassword) { + matomo.track(eventWithCategory: .invalidPasswordMailbox, name: "requestPassword") + askMailboxPassword() + } + .mailButtonStyle(.link) + .mailButtonFullWidth(true) } - .mailButtonStyle(.link) - .mailButtonFullWidth(true) - .hidden() + .padding(.horizontal, value: .medium) + .padding(.bottom, value: .regular) + } + .modifier(snackBarAwareModifier) + .overlay { + ViewGeometry(key: BottomSafeAreaKey.self, property: \.safeAreaInsets.bottom) + } + .onPreferenceChange(BottomSafeAreaKey.self) { value in + snackBarAwareModifier.inset = value } .onChange(of: updatedMailboxPassword) { newValue in if !newValue.isEmpty { @@ -136,6 +151,15 @@ struct UpdateMailboxPasswordView: View { isLoading = false } } + + func askMailboxPassword() { + Task { + await tryOrDisplayError { + try await accountManager.askMailboxPassword(mailbox: mailbox) + snackbarPresenter.show(message: MailResourcesStrings.Localizable.snackbarMailboxPasswordRequested) + } + } + } } struct UpdateMailboxPasswordView_Previews: PreviewProvider { diff --git a/MailCore/API/Endpoint.swift b/MailCore/API/Endpoint.swift index d1afb1f8b..177096a9c 100644 --- a/MailCore/API/Endpoint.swift +++ b/MailCore/API/Endpoint.swift @@ -91,6 +91,10 @@ public extension Endpoint { .appending(path: "/securedProxy/cache/invalidation/profile/workspace/mailbox/\(mailboxId)/update_password") } + static func askMailboxPassword(hostingId: Int, mailboxName: String) -> Endpoint { + return .baseManager.appending(path: "/\(hostingId)/mailboxes/\(mailboxName)/ask_password") + } + static func detachMailbox(mailboxId: Int) -> Endpoint { return addMailbox.appending(path: "/\(mailboxId)") } diff --git a/MailCore/API/MailApiFetcher/MailApiFetcher+Common.swift b/MailCore/API/MailApiFetcher/MailApiFetcher+Common.swift index a1a43a667..358574fb3 100644 --- a/MailCore/API/MailApiFetcher/MailApiFetcher+Common.swift +++ b/MailCore/API/MailApiFetcher/MailApiFetcher+Common.swift @@ -45,6 +45,13 @@ public extension MailApiFetcher { )).data } + func askMailboxPassword(mailbox: Mailbox) async throws -> Bool { + try await perform(request: authenticatedRequest( + .askMailboxPassword(hostingId: mailbox.hostingId, mailboxName: mailbox.mailbox), + method: .post + )).data + } + func detachMailbox(mailbox: Mailbox) async throws -> Bool { try await perform(request: authenticatedRequest(.detachMailbox(mailboxId: mailbox.mailboxId), method: .delete)).data } diff --git a/MailCore/Cache/AccountManager.swift b/MailCore/Cache/AccountManager.swift index f8b0de760..6bd4f9fac 100644 --- a/MailCore/Cache/AccountManager.swift +++ b/MailCore/Cache/AccountManager.swift @@ -411,6 +411,11 @@ public final class AccountManager: RefreshTokenDelegate, ObservableObject { try await updateUser(for: currentAccount) } + public func askMailboxPassword(mailbox: Mailbox) async throws { + guard let apiFetcher = currentApiFetcher else { return } + _ = try await apiFetcher.askMailboxPassword(mailbox: mailbox) + } + public func detachMailbox(mailbox: Mailbox) async throws { guard let apiFetcher = currentApiFetcher else { return } _ = try await apiFetcher.detachMailbox(mailbox: mailbox)