103 lines
3.3 KiB
Swift
103 lines
3.3 KiB
Swift
//
|
|
// 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),
|
|
])
|
|
}
|
|
|
|
}
|