183 lines
6.2 KiB
Swift
183 lines
6.2 KiB
Swift
//
|
|
// Copyright 2024 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import SafariServices
|
|
import SignalServiceKit
|
|
import SignalUI
|
|
import SwiftUI
|
|
|
|
protocol RegistrationEnterAccountEntropyPoolPresenter: AnyObject {
|
|
func next(accountEntropyPool: AccountEntropyPool)
|
|
func cancelKeyEntry()
|
|
func forgotKeyAction()
|
|
}
|
|
|
|
public struct RegistrationEnterAccountEntropyPoolState: Equatable {
|
|
let canShowBackButton: Bool
|
|
let canShowNoKeyHelpButton: Bool
|
|
}
|
|
|
|
class RegistrationEnterAccountEntropyPoolViewController: EnterAccountEntropyPoolViewController, OWSNavigationChildController {
|
|
init(
|
|
state: RegistrationEnterAccountEntropyPoolState,
|
|
presenter: RegistrationEnterAccountEntropyPoolPresenter,
|
|
) {
|
|
super.init()
|
|
|
|
var footerButtonConfig: FooterButtonConfig?
|
|
if state.canShowNoKeyHelpButton {
|
|
footerButtonConfig = FooterButtonConfig(
|
|
title: OWSLocalizedString(
|
|
"REGISTRATION_NO_BACKUP_KEY_BUTTON_TITLE",
|
|
comment: "Title of button to tap if you do not have a recovery key during registration.",
|
|
),
|
|
action: { [weak self, weak presenter] in
|
|
guard let self, let presenter else { return }
|
|
presentNoKeyHeroSheet(presenter: presenter)
|
|
},
|
|
)
|
|
}
|
|
|
|
configure(
|
|
aepValidationPolicy: .acceptAnyWellFormed,
|
|
colorConfig: ColorConfig(
|
|
background: UIColor.Signal.background,
|
|
aepEntryBackground: UIColor.Signal.quaternaryFill,
|
|
),
|
|
headerStrings: HeaderStrings(
|
|
title: OWSLocalizedString(
|
|
"REGISTRATION_ENTER_BACKUP_KEY_TITLE",
|
|
comment: "Title for the screen that allows users to enter their recovery key.",
|
|
),
|
|
subtitle: OWSLocalizedString(
|
|
"REGISTRATION_ENTER_BACKUP_KEY_DESCRIPTION",
|
|
comment: "Description for the screen that allows users to enter their recovery key.",
|
|
),
|
|
),
|
|
footerButtonConfig: footerButtonConfig,
|
|
onEntryConfirmed: { [weak presenter] aep in
|
|
presenter?.next(accountEntropyPool: aep)
|
|
},
|
|
)
|
|
|
|
navigationItem.hidesBackButton = true
|
|
if state.canShowBackButton {
|
|
navigationItem.leftBarButtonItem = UIBarButtonItem(
|
|
image: UIImage(named: "chevron-left-bold-28"),
|
|
primaryAction: UIAction { [weak presenter] _ in
|
|
presenter?.cancelKeyEntry()
|
|
},
|
|
)
|
|
}
|
|
}
|
|
|
|
// MARK: OWSNavigationChildController
|
|
|
|
var preferredNavigationBarStyle: OWSNavigationBarStyle { .solid }
|
|
|
|
var navbarBackgroundColorOverride: UIColor? { .clear }
|
|
|
|
// MARK: UI
|
|
|
|
private func presentNoKeyHeroSheet(
|
|
presenter: RegistrationEnterAccountEntropyPoolPresenter,
|
|
) {
|
|
let sheet = HeroSheetViewController(
|
|
hero: .circleIcon(
|
|
icon: UIImage(named: "key")!,
|
|
iconSize: 35,
|
|
tintColor: UIColor.Signal.label,
|
|
backgroundColor: UIColor.Signal.background,
|
|
),
|
|
title: OWSLocalizedString(
|
|
"REGISTRATION_NO_BACKUP_KEY_SHEET_TITLE",
|
|
comment: "Title for sheet with info for what to do if you don't have a recovery key",
|
|
),
|
|
body: OWSLocalizedString(
|
|
"REGISTRATION_NO_BACKUP_KEY_SHEET_BODY",
|
|
comment: "Body text on a sheet with info for what to do if you don't have a recovery key",
|
|
),
|
|
primaryButton: .init(title: OWSLocalizedString(
|
|
"REGISTRATION_NO_BACKUP_KEY_SKIP_RESTORE_BUTTON_TITLE",
|
|
comment: "Title for button on sheet for when you don't have a recovery key",
|
|
)) { [weak self] _ in
|
|
self?.dismiss(animated: true) { [weak presenter] in
|
|
presenter?.forgotKeyAction()
|
|
}
|
|
},
|
|
secondaryButton: .init(title: CommonStrings.learnMore, style: .secondary, action: .custom({ [weak self] sheet in
|
|
guard let self else { return }
|
|
let vc = SFSafariViewController(url: URL.Support.backups)
|
|
self.dismiss(animated: true) {
|
|
self.present(vc, animated: true, completion: nil)
|
|
}
|
|
})),
|
|
)
|
|
self.present(sheet, animated: true)
|
|
}
|
|
}
|
|
|
|
// MARK: -
|
|
|
|
#if DEBUG
|
|
|
|
private class PreviewRegistrationEnterAccountEntropyPoolPresenter: RegistrationEnterAccountEntropyPoolPresenter {
|
|
func next(accountEntropyPool: AccountEntropyPool) {
|
|
print("next")
|
|
}
|
|
|
|
func cancelKeyEntry() {
|
|
print("cancel")
|
|
}
|
|
|
|
func forgotKeyAction() {
|
|
print("forgotKeyAction")
|
|
}
|
|
}
|
|
|
|
@available(iOS 17, *)
|
|
#Preview("Default") {
|
|
let presenter = PreviewRegistrationEnterAccountEntropyPoolPresenter()
|
|
return UINavigationController(
|
|
rootViewController: RegistrationEnterAccountEntropyPoolViewController(
|
|
state: RegistrationEnterAccountEntropyPoolState(
|
|
canShowBackButton: true,
|
|
canShowNoKeyHelpButton: true,
|
|
),
|
|
presenter: presenter,
|
|
),
|
|
)
|
|
}
|
|
|
|
@available(iOS 17, *)
|
|
#Preview("No Help") {
|
|
let presenter = PreviewRegistrationEnterAccountEntropyPoolPresenter()
|
|
return UINavigationController(
|
|
rootViewController: RegistrationEnterAccountEntropyPoolViewController(
|
|
state: RegistrationEnterAccountEntropyPoolState(
|
|
canShowBackButton: true,
|
|
canShowNoKeyHelpButton: false,
|
|
),
|
|
presenter: presenter,
|
|
),
|
|
)
|
|
}
|
|
|
|
@available(iOS 17, *)
|
|
#Preview("No Back") {
|
|
let presenter = PreviewRegistrationEnterAccountEntropyPoolPresenter()
|
|
return UINavigationController(
|
|
rootViewController: RegistrationEnterAccountEntropyPoolViewController(
|
|
state: RegistrationEnterAccountEntropyPoolState(
|
|
canShowBackButton: false,
|
|
canShowNoKeyHelpButton: true,
|
|
),
|
|
presenter: presenter,
|
|
),
|
|
)
|
|
}
|
|
|
|
#endif
|