// // LoadingGalleryContentViewController.swift // Tusker // // Created by Shadowfacts on 3/17/24. // Copyright © 2024 Shadowfacts. All rights reserved. // import UIKit import GalleryVC class LoadingGalleryContentViewController: UIViewController, GalleryContentViewController { private let provider: () async -> (any GalleryContentViewController)? private var wrapped: (any GalleryContentViewController)! var container: GalleryContentViewControllerContainer? var contentSize: CGSize { wrapped?.contentSize ?? .zero } var activityItemsForSharing: [Any] { wrapped?.activityItemsForSharing ?? [] } var caption: String? { wrapped?.caption } var canAnimateFromSourceView: Bool { wrapped?.canAnimateFromSourceView ?? true } init(provider: @escaping () async -> (any GalleryContentViewController)?) { self.provider = provider super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() container?.setGalleryContentLoading(true) Task { if let wrapped = await provider() { self.wrapped = wrapped wrapped.container = container addChild(wrapped) wrapped.view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(wrapped.view) NSLayoutConstraint.activate([ wrapped.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), wrapped.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), wrapped.view.topAnchor.constraint(equalTo: view.topAnchor), wrapped.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), ]) wrapped.didMove(toParent: self) container?.galleryContentChanged() } else { showErrorView() } container?.setGalleryContentLoading(false) } } private func showErrorView() { let image = UIImageView(image: UIImage(systemName: "exclamationmark.triangle.fill")!) image.tintColor = .secondaryLabel image.contentMode = .scaleAspectFit let label = UILabel() label.text = "Error Loading" label.font = .preferredFont(forTextStyle: .title1).withTraits(.traitBold)! label.textColor = .secondaryLabel label.adjustsFontForContentSizeCategory = true let stackView = UIStackView(arrangedSubviews: [ image, label, ]) stackView.translatesAutoresizingMaskIntoConstraints = false stackView.axis = .vertical stackView.alignment = .center stackView.spacing = 8 view.addSubview(stackView) NSLayoutConstraint.activate([ image.widthAnchor.constraint(equalToConstant: 64), image.heightAnchor.constraint(equalToConstant: 64), stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor), stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } }