mobile-ios/CovidSafe/Feedback/Sources/PresentFeedbackExtensions.swift

149 lines
4.3 KiB
Swift
Raw Permalink Normal View History

2020-05-08 07:49:14 +00:00
// Copyright © 2020 Australian Government All rights reserved.
import UIKit
private var feedbackNotOnScreen = true
extension UIWindow {
public func presentFeedback(_ promptUser: Bool = false, settings: FeedbackSettings? = nil) {
guard let presentedViewController = rootViewController?.topmostPresentedViewController else {
print("\(self), Cannot present feedback prompt because window does not have a presented view controller.".formattedLoggingStatement)
return
}
guard feedbackNotOnScreen else {
return
}
presentedViewController.presentFeedback( promptUser, settings: settings)
}
}
extension UIViewController {
func presentFeedbackWithPromptAndScreenshotTransition(_ settings: FeedbackSettings? = nil) {
guard feedbackNotOnScreen else {
return
}
let vc = ViewControllerFactory().createPropmtController(true, settings: settings)
self.topmostPresentedViewController.present(vc, animated: true, completion: nil)
}
func presentNewFeedbackFlowWithScreenshotTransition(_ settings: FeedbackSettings? = nil) {
guard let window = view.window else {
return
}
guard feedbackNotOnScreen else {
return
}
feedbackNotOnScreen = false
ViewControllerFactory().createNewFeedbackFlowControllerForScreenshotView(window, settings: settings, onFlowDidFinish: { [weak self] in
self?.flowDidFinish()
}) { flowController in
self.topmostPresentedViewController.present(flowController, animated: true) {
if !flowController.shouldUseCustomTransition {
flowController.presentKeyboard()
}
}
}
}
@objc // This method should only be used from ObjC
public func presentFeedback(
_ promptUser: Bool = false,
issueType: String? = nil,
issueComponents: [String]? = nil,
reporterAvatarImage: CGImage? = nil,
reporterUsernameOrEmail: String? = nil
) {
guard let settings = try? FeedbackSettings(
issueType: issueType,
issueComponents: issueComponents,
reporterAvatarImage:
reporterAvatarImage,
reporterUsernameOrEmail:
reporterUsernameOrEmail
) else {
return
}
guard feedbackNotOnScreen else {
return
}
presentFeedback( promptUser, settings: settings)
}
public func presentFeedback(_ promptUser: Bool = false, settings: FeedbackSettings? = nil) {
guard feedbackNotOnScreen else {
return
}
if promptUser {
let vc = ViewControllerFactory().createPropmtController(false, settings: settings)
self.topmostPresentedViewController.present(vc, animated: true, completion: nil)
} else {
self.presentNewFeedbackFlow(settings)
}
}
func presentNewFeedbackFlow(_ settings: FeedbackSettings? = nil) {
guard feedbackNotOnScreen else {
return
}
feedbackNotOnScreen = false
ViewControllerFactory().createNewFeedbackFlowController(settings, onFlowDidFinish: { [weak self] in
self?.flowDidFinish()
}) { flowController in
self.topmostPresentedViewController.present(flowController, animated: true) {
flowController.presentKeyboard()
}
}
}
private func flowDidFinish() {
guard Thread.isMainThread else {
DispatchQueue.main.async(execute: flowDidFinish)
return
}
feedbackNotOnScreen = true
}
}
extension AlertController {
func addNewFeedbackFlowAction() {
2020-06-19 07:43:33 +00:00
let title = "entryPrompt_newFeedback_button_title".localizedString(
2020-05-08 07:49:14 +00:00
comment: "Button title for button that launches new feedback flow"
)
self.addDefaultAction(localizedTitle: title) { [weak self] _ in
if let strongSelf = self {
if strongSelf.useCustomTransition {
strongSelf.presentNewFeedbackFlowWithScreenshotTransition_1()
} else {
strongSelf.presentNewFeedbackFlow_1()
}
}
}
}
func presentNewFeedbackFlowWithScreenshotTransition_1() {
guard let presentingViewController = self.lastPresentingViewController else {
return
}
presentingViewController.presentNewFeedbackFlowWithScreenshotTransition(self.feedbackSettings)
}
func presentNewFeedbackFlow_1() {
guard let presentingViewController = self.lastPresentingViewController else {
return
}
presentingViewController.presentNewFeedbackFlow(self.feedbackSettings)
}
}