MyConfirmViewController.swift 4.46 KB
import UIKit
import Photos

public class MyConfirmViewController: UIViewController {
    let imageView = UIImageView()
    var vBoard: Board!
    @IBOutlet weak var cancelButton: UIButton!
    @IBOutlet weak var confirmButton: UIButton!

    public var userData: Any?
    public var onComplete: CameraViewCompletion?
    var asset: PHAsset!

    public init(asset: PHAsset) {
        self.asset = asset
        super.init(nibName: "MyConfirmViewController", bundle: CameraGlobals.shared.bundle)
    }

    public override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.black
        imageView.contentMode = .scaleAspectFit
        view.insertSubview(imageView, at: 0)
        configUserData()

        guard let asset = asset else { return }
        let spinner = showSpinner()
        disable()
        _ = SingleImageFetcher()
                .setAsset(asset)
                .setTargetSize(largestPhotoSize())
                .onSuccess { image in
                    self.configureWithImage(image)
                    self.hideSpinner(spinner)
                    self.enable()
                }
                .onFailure { error in
                    self.hideSpinner(spinner)
                }
                .fetch()
    }

    fileprivate func configUserData() {
        vBoard = Board()
        vBoard.translatesAutoresizingMaskIntoConstraints = false
        self.view.insertSubview(vBoard, at: 1)
        NSLayoutConstraint.activate([vBoard.topAnchor.constraint(equalTo: view.topAnchor),
                                     vBoard.leftAnchor.constraint(equalTo: view.leftAnchor),
                                     vBoard.rightAnchor.constraint(equalTo: view.rightAnchor),
                                     vBoard.bottomAnchor.constraint(equalTo: view.bottomAnchor)])
        vBoard.initData()

        //TODO
//        if let boardObj = userData as? BoardObj {
//
//        }
    }

    public override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        imageView.frame = view.frame
//        vBoard?.frame = view.frame
    }

    //region utils ========
    private func configureWithImage(_ image: UIImage) {
        buttonActions()
        imageView.image = image
        imageView.sizeToFit()
        view.setNeedsLayout()
    }

    private func buttonActions() {
        confirmButton.action = { [weak self] in self?.confirmPhoto() }
        cancelButton.action = { [weak self] in self?.cancel() }
    }

    internal func cancel() {
        onComplete?(nil, nil)
    }

    internal func confirmPhoto() {
        disable()

        imageView.isHidden = true
        let spinner = showSpinner()
        var fetcher = SingleImageFetcher()
                .onSuccess { image in
                    self.onComplete?(image, self.asset)
                    self.hideSpinner(spinner)
                    self.enable()
                }
                .onFailure { error in
                    self.hideSpinner(spinner)
                    self.showNoImageScreen(error)
                }
                .setAsset(asset)

        fetcher = fetcher.fetch()
    }

    func showSpinner() -> UIActivityIndicatorView {
        let spinner = UIActivityIndicatorView()
        spinner.activityIndicatorViewStyle = .white
        spinner.center = view.center
        spinner.startAnimating()

        view.addSubview(spinner)
        view.bringSubview(toFront: spinner)

        return spinner
    }

    func hideSpinner(_ spinner: UIActivityIndicatorView) {
        spinner.stopAnimating()
        spinner.removeFromSuperview()
    }

    func disable() {
        confirmButton.isEnabled = false
    }

    func enable() {
        confirmButton.isEnabled = true
    }

    func showNoImageScreen(_ error: NSError) {
        let permissionsView = PermissionsView(frame: view.bounds)

        let desc = localizedString("error.cant-fetch-photo.description")

        permissionsView.configureInView(view, title: error.localizedDescription, descriptiom: desc, completion: cancel)
    }

    public required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    public override var prefersStatusBarHidden: Bool {
        return true
    }

    public override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
        return UIStatusBarAnimation.slide
    }

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.landscape
    }
    //endregion
}

public class BoardObj {

}