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

import SignalServiceKit
public import SignalUI

class UsernameLinkScanQRCodeSheet: UsernameLinkScanQRCodeViewController {
    override var preferredNavigationBarStyle: OWSNavigationBarStyle { .solid }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = CommonStrings.scanQRCodeTitle
        navigationItem.rightBarButtonItem = .doneButton(dismissingFrom: self)
    }
}

// MARK: RecipientPickerDelegate + UsernameLinkScanDelegate

extension RecipientPickerDelegate where Self: UIViewController & UsernameLinkScanDelegate {
    var shouldShowQRCodeButton: Bool { true }

    func openUsernameQRCodeScanner() {
        presentUsernameQRCodeScanner()
    }

    func presentUsernameQRCodeScanner() {
        let scanner = UsernameLinkScanQRCodeSheet(scanDelegate: self)
        let navigationController = OWSNavigationController(rootViewController: scanner)
        self.present(navigationController, animated: true)
    }
}

extension BaseMemberViewController: @retroactive MemberViewUsernameQRCodeScannerPresenter {
    public func presentUsernameQRCodeScannerFromMemberView() {
        presentUsernameQRCodeScanner()
    }
}

// MARK: UsernameLinkScanDelegate + RecipientPickerDelegate

extension BaseMemberViewController: UsernameLinkScanDelegate {}

extension UsernameLinkScanDelegate where Self: RecipientPickerDelegate & RecipientPickerContainerViewController {
    func usernameLinkScanned(_ usernameLink: Usernames.UsernameLink) {
        dismiss(animated: true) { [self] in
            Task { @MainActor in
                guard
                    let (_, aci) = await UsernameQuerier().queryForUsernameLink(
                        link: usernameLink,
                        fromViewController: self,
                    )
                else {
                    return
                }

                recipientPicker(
                    recipientPicker,
                    didSelectRecipient: .for(address: SignalServiceAddress(aci)),
                )
            }
        }
    }
}