Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/Backups/BackupConfirmKeyViewController.swift
1 views
//
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit
import SignalUI

class BackupConfirmKeyViewController: EnterAccountEntropyPoolViewController, OWSNavigationChildController {
    private let aep: AccountEntropyPool

    private let onBackPressed: (() -> Void)?
    var shouldCancelNavigationBack: Bool {
        onBackPressed != nil
    }

    init(
        aep: AccountEntropyPool,
        onContinue: @escaping (BackupConfirmKeyViewController) -> Void,
        onSeeKeyAgain: @escaping () -> Void,
        onBackPressed: (() -> Void)? = nil,
    ) {
        self.aep = aep
        self.onBackPressed = onBackPressed

        super.init()

        OWSTableViewController2.removeBackButtonText(viewController: self)

        if let onBackPressed {
            navigationItem.hidesBackButton = true
            navigationItem.leftBarButtonItem = .init(
                image: UIImage(named: "chevron-left-bold-28"),
                primaryAction: UIAction { _ in
                    onBackPressed()
                },
            )

            isModalInPresentation = true
        }

        let seeKeyAgainButtonTitle = OWSLocalizedString(
            "BACKUP_ONBOARDING_CONFIRM_KEY_SEE_KEY_AGAIN_BUTTON_TITLE",
            comment: "Title for a button offering to let users see their 'Recovery Key'.",
        )

        configure(
            aepValidationPolicy: .acceptOnly(aep),
            colorConfig: ColorConfig(
                background: UIColor.Signal.groupedBackground,
                aepEntryBackground: UIColor.Signal.secondaryGroupedBackground,
            ),
            headerStrings: HeaderStrings(
                title: OWSLocalizedString(
                    "BACKUP_ONBOARDING_CONFIRM_KEY_TITLE",
                    comment: "Title for a view asking users to confirm their 'Recovery Key'.",
                ),
                subtitle: OWSLocalizedString(
                    "BACKUP_ONBOARDING_CONFIRM_KEY_SUBTITLE",
                    comment: "Subtitle for a view asking users to confirm their 'Recovery Key'.",
                ),
            ),
            footerButtonConfig: FooterButtonConfig(
                title: seeKeyAgainButtonTitle,
                action: {
                    onSeeKeyAgain()
                },
            ),
            onEntryConfirmed: { [weak self] aep in
                guard let self else { return }

                present(
                    BackupKeepKeySafeSheet(
                        onContinue: { onContinue(self) },
                        secondaryButton: HeroSheetViewController.Button(
                            title: seeKeyAgainButtonTitle,
                            style: .secondary,
                            action: .custom({ sheet in
                                sheet.dismiss(animated: true) {
                                    onSeeKeyAgain()
                                }
                            }),
                        ),
                    ),
                    animated: true,
                )
            },
        )
    }

    // MARK: OWSNavigationChildController

    var navbarBackgroundColorOverride: UIColor? {
        .Signal.groupedBackground
    }
}

// MARK: -

#if DEBUG

@available(iOS 17, *)
#Preview {
    let aep = try! AccountEntropyPool(key: String(
        repeating: "a",
        count: AccountEntropyPool.Constants.byteLength,
    ))

    return UINavigationController(
        rootViewController: BackupConfirmKeyViewController(
            aep: aep,
            onContinue: { _ in print("Continuing...!") },
            onSeeKeyAgain: { print("Seeing key again...!") },
        ),
    )
}

#endif