lnd-demo-app/wallet/ViewControllers/CustomViewController.swift
2023-06-08 09:36:06 +03:00

126 lines
4.0 KiB
Swift

import UIKit
class CustomViewController<VM: ViewModel>: UIViewController {
private lazy var leftNavigationAction: () -> Void = {
self.navigationController?.popViewController(animated: true)
}
var viewModel: VM! {
didSet {
viewModelDidLoad()
}
}
lazy var loadingView: LoadingView = {
return LoadingView()
}()
lazy var errorView: ErrorView = {
return ErrorView()
}()
override func viewDidLoad() {
super.viewDidLoad()
// Create the view model if needed
if (viewModel == nil) {
viewModel = VM()
}
// setTheme()
}
public func showContentView() {
dropViews([errorView, loadingView])
}
public func showLoadingView() {
dropViews([errorView])
addViewIfNeeded(loadingView)
}
public func showErrorView(error: String = .defaultError) {
dropViews([loadingView])
addViewIfNeeded(errorView)
errorView.title = error
}
private func dropViews(_ views: [UIView]) {
views.forEach { view in
view.removeFromSuperview()
}
}
private func addViewIfNeeded(_ subview: UIView) {
if (!view.subviews.contains(subview)) {
view.addSubviewAndFill(subview)
view.bringSubviewToFront(subview)
}
}
func viewModelDidLoad() {
// Empty
}
@objc private func leftAction() {
leftNavigationAction()
}
func setLeftNavigationButton(_ icon: UIImage, action: (() -> Void)? = nil) {
// Attach left action
// Or fallback with a pop
if let leftAction = action {
leftNavigationAction = leftAction
} else {
leftNavigationAction = {
self.navigationController?.popViewController(animated: true)
}
}
navigationItem.leftBarButtonItem = UIBarButtonItem(
image: .back,
style: .plain,
target: self,
action: #selector(CustomViewController.leftAction)
)
}
func showAlert(title: String, address: String? = nil , errorMsg: String? = nil, description: String? = nil){
let showAlert = UIAlertController(title: title, message: errorMsg, preferredStyle: .alert)
if let address = address {
let imageView = UIImageView(frame: CGRect(x: 10, y: 50, width: 250, height: 250))
imageView.image = generateQRCode(from: address)
imageView.layer.magnificationFilter = CALayerContentsFilter.nearest
showAlert.view.addSubview(imageView)
let height = NSLayoutConstraint(item: showAlert.view as Any, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 400)
let width = NSLayoutConstraint(item: showAlert.view as Any, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant:250)
showAlert.view.addConstraint(height)
showAlert.view.addConstraint(width)
showAlert.addAction(UIAlertAction(title: "Copy Address", style: .default, handler: { action in
UIPasteboard.general.string = address
debugPrint("✅✅ Created Invoice ✅✅", address)
}))
}
if let description = description {
showAlert.message = description
}
showAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
}))
self.present(showAlert, animated: true, completion: nil)
}
func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: String.Encoding.ascii)
if let QRFilter = CIFilter(name: "CIQRCodeGenerator") {
QRFilter.setValue(data, forKey: "inputMessage")
guard let QRImage = QRFilter.outputImage else {return nil}
return UIImage(ciImage: QRImage)
}
return nil
}
}