import UIKit final class RDEPUBReaderAssemblyCoordinator { private unowned let context: RDEPUBReaderContext init(context: RDEPUBReaderContext) { self.context = context } func assembleInterface() { guard let controller = context.controller, let readerView = context.readerView else { return } controller.view.backgroundColor = context.configuration.theme.contentBackgroundColor setupReaderView(readerView, in: controller.view) setupLoadingIndicator(controller.loadingIndicator, in: controller.view) setupErrorLabel(controller.errorLabel, in: controller.view) controller.delegate?.epubReader(controller, configureTopToolView: controller.topToolView) } func finishExternalTextBookLaunchIfNeeded() { guard let runtime = context.runtime, context.isExternalTextBook else { return } let restoreLocation = context.currentBookIdentifier.flatMap { context.persistence?.loadLocation(for: $0) } if let id = context.currentBookIdentifier { context.activeBookmarks = context.persistence?.loadBookmarks(for: id) ?? [] context.activeHighlights = context.persistence?.loadHighlights(for: id) ?? [] } runtime.finishPagination(restoreLocation: restoreLocation) } private func setupReaderView(_ readerView: RDReaderView, in containerView: UIView) { readerView.dataSource = context.controller as? RDReaderDataSource readerView.delegate = context.controller as? RDReaderDelegate readerView.translatesAutoresizingMaskIntoConstraints = false containerView.addSubview(readerView) NSLayoutConstraint.activate([ readerView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), readerView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), readerView.topAnchor.constraint(equalTo: containerView.topAnchor), readerView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor) ]) readerView.register(contentView: RDEPUBTextContentView.self, contentViewWithReuseIdentifier: NSStringFromClass(RDEPUBTextContentView.self)) readerView.register(contentView: RDEPUBWebContentView.self, contentViewWithReuseIdentifier: NSStringFromClass(RDEPUBWebContentView.self)) context.controller?.applyReaderViewConfiguration() } private func setupLoadingIndicator(_ loadingIndicator: UIActivityIndicatorView, in containerView: UIView) { loadingIndicator.hidesWhenStopped = true loadingIndicator.translatesAutoresizingMaskIntoConstraints = false containerView.addSubview(loadingIndicator) NSLayoutConstraint.activate([ loadingIndicator.centerXAnchor.constraint(equalTo: containerView.centerXAnchor), loadingIndicator.centerYAnchor.constraint(equalTo: containerView.centerYAnchor) ]) } private func setupErrorLabel(_ errorLabel: UILabel, in containerView: UIView) { errorLabel.translatesAutoresizingMaskIntoConstraints = false containerView.addSubview(errorLabel) NSLayoutConstraint.activate([ errorLabel.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 24), errorLabel.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -24), errorLabel.centerYAnchor.constraint(equalTo: containerView.centerYAnchor) ]) } }