Skip to content

Instantly share code, notes, and snippets.

@ksmandersen
Last active April 2, 2021 14:21
Show Gist options
  • Save ksmandersen/54c5b39d31342ec4d066f5b19d893cd9 to your computer and use it in GitHub Desktop.
Save ksmandersen/54c5b39d31342ec4d066f5b19d893cd9 to your computer and use it in GitHub Desktop.
import UIKit
import GenericViewKit
public class StateView: GenericView {
public enum State {
case Loading
case Loaded
case Error
}
public var state: State = .Loading {
didSet { didUpdateState() }
}
public var style: ContentStyle = .Dark {
didSet {
errorView.style = style
activityIndicator.color = style.primaryColor
}
}
public var minimumIntrinsicContentHeight: CGFloat = 0 {
didSet { invalidateIntrinsicContentSize() }
}
public let errorView = ErrorView()
public let contentView = UIView().then {
$0.backgroundColor = .blackColor()
$0.hidden = true
}
private let activityIndicator = (UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge).then {
$0.hidesWhenStopped = true
}
public override func intrinsicContentSize() -> CGSize {
let size: CGSize
switch state {
case .Loading: size = activityIndicator.intrinsicContentSize()
case .Loaded: size = contentView.intrinsicContentSize()
case .Error: size = errorView.intrinsicContentSize()
}
return CGSize(width: size.width, height: max(minimumIntrinsicContentHeight, size.height))
}
public override func configureView() {
super.configureView()
addSubview(contentView)
addSubview(activityIndicator)
addSubview(errorView)
contentView.setEdgesEqualToSuperview()
activityIndicator.setCenterInSuperview()
errorView.setCenterInSuperview()
errorView.setWidthEqual(self, multiplier: 2/3)
didUpdateState()
translatesAutoresizingMaskIntoConstraints = true
}
public func showError(message: String?) {
let fallbackError = R.string.localizable.genericErrorSomethingWrong()
errorView.errorLabel.text = message ?? fallbackError
state = .Error
}
private func didUpdateState() {
switch state {
case .Loading:
contentView.hidden = false
errorView.hidden = true
activityIndicator.startAnimating()
case .Loaded:
contentView.hidden = false
errorView.hidden = true
activityIndicator.stopAnimating()
case .Error:
contentView.hidden = true
errorView.hidden = false
activityIndicator.stopAnimating()
}
invalidateIntrinsicContentSize()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment