Path: blob/main/Signal/Calls/UserInterface/CreateCallLinkViewController.swift
1 views
//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
import SignalRingRTC
import SignalServiceKit
import SignalUI
import UIKit
class CreateCallLinkViewController: InteractiveSheetViewController {
private lazy var _navigationController = OWSNavigationController()
private let _callLinkViewController: CallLinkViewController
override var interactiveScrollViews: [UIScrollView] { [self._callLinkViewController.tableView] }
override var sheetBackgroundColor: UIColor { Theme.tableView2PresentedBackgroundColor }
// MARK: -
init(callLink: CallLink, adminPasskey: Data, callLinkState: SignalServiceKit.CallLinkState) {
self._callLinkViewController = CallLinkViewController.forJustCreated(
callLink: callLink,
adminPasskey: adminPasskey,
callLinkState: callLinkState,
)
super.init()
self.allowsExpansion = false
}
override func viewDidLoad() {
super.viewDidLoad()
self._navigationController.viewControllers = [self._callLinkViewController]
self.addChild(self._navigationController)
self._navigationController.didMove(toParent: self)
self.contentView.addSubview(self._navigationController.view)
self._navigationController.view.autoPinEdgesToSuperviewEdges()
self._callLinkViewController.navigationItem.rightBarButtonItem = .doneButton(
action: { [unowned self] in
self._callLinkViewController.persistIfNeeded()
self.dismiss(animated: true)
},
)
}
override func viewIsAppearing(_ animated: Bool) {
super.viewIsAppearing(animated)
self.view.layoutIfNeeded()
// InteractiveSheetViewController doesn't work with adjustedContentInset.
self._callLinkViewController.tableView.contentInsetAdjustmentBehavior = .never
self._callLinkViewController.tableView.contentInset = UIEdgeInsets(
top: self._navigationController.navigationBar.bounds.size.height,
left: 0,
bottom: self.view.safeAreaInsets.bottom,
right: 0,
)
self.minimizedHeight = (
self._callLinkViewController.tableView.contentSize.height
+ self._callLinkViewController.tableView.contentInset.totalHeight
+ InteractiveSheetViewController.Constants.handleHeight,
)
}
// MARK: - Create & Present
static func createCallLinkOnServerAndPresent(from viewController: UIViewController) {
ModalActivityIndicatorViewController.present(
fromViewController: viewController,
title: OWSLocalizedString(
"CALL_LINK_CREATING_MODAL",
comment: "Displayed in a full screen modal view when creating a Call Link",
),
canCancel: true,
presentationDelay: 0.25,
asyncBlock: { modal in
do {
let rootKey = CallLinkRootKey.generate()
let callService = AppEnvironment.shared.callService!
let createResult = try await callService.callLinkManager.createCallLink(rootKey: rootKey)
let callLink = CallLink(rootKey: createResult.callLinkState.rootKey)
modal.dismissIfNotCanceled {
viewController.present(CreateCallLinkViewController(
callLink: callLink,
adminPasskey: createResult.adminPasskey,
callLinkState: createResult.callLinkState,
), animated: true)
}
} catch {
Logger.warn("Call link creation failed: \(error)")
modal.dismissIfNotCanceled {
OWSActionSheets.showActionSheet(
title: CallStrings.callLinkErrorSheetTitle,
message: OWSLocalizedString(
"CALL_LINK_CREATION_FAILURE_SHEET_DESCRIPTION",
comment: "Description of sheet presented when call link creation fails.",
),
)
}
}
},
)
}
}