// // InstanceTimelineViewController.swift // Tusker // // Created by Shadowfacts on 12/19/19. // Copyright © 2019 Shadowfacts. All rights reserved. // import UIKit import Pachyderm protocol InstanceTimelineViewControllerDelegate: AnyObject { func didSaveInstance(url: URL) func didUnsaveInstance(url: URL) } class InstanceTimelineViewController: TimelineViewController { weak var delegate: InstanceTimelineViewControllerDelegate? weak var parentMastodonController: MastodonController? let instanceURL: URL let instanceMastodonController: MastodonController private var toggleSaveButton: UIBarButtonItem! private var isInstanceSaved: Bool { parentMastodonController!.persistentContainer.viewContext.objectExists(for: SavedInstance.fetchRequest(url: instanceURL)) } private var toggleSaveButtonTitle: String { if isInstanceSaved { return NSLocalizedString("Unsave", comment: "unsave instance button") } else { return NSLocalizedString("Save", comment: "save instance button") } } var browsingEnabled = true init(for url: URL, parentMastodonController: MastodonController) { self.parentMastodonController = parentMastodonController self.instanceURL = url // the timeline VC only stores a weak reference to it, so we need to store a strong reference to make sure it's not released immediately instanceMastodonController = MastodonController(instanceURL: url, transient: true) super.init(for: .public(local: true), mastodonController: instanceMastodonController) title = url.host! userActivity = nil // todo: activity for instance-specific timelines } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() toggleSaveButton = UIBarButtonItem(title: toggleSaveButtonTitle, style: .plain, target: self, action: #selector(toggleSaveButtonPressed)) navigationItem.rightBarButtonItem = toggleSaveButton NotificationCenter.default.addObserver(self, selector: #selector(savedInstancesChanged), name: .savedInstancesChanged, object: nil) } @objc func savedInstancesChanged() { toggleSaveButton.title = toggleSaveButtonTitle } override func configureStatusCell(_ cell: TimelineStatusCollectionViewCell, id: String, state: CollapseState, filterResult: Filterer.Result, precomputedContent: NSAttributedString?) { cell.delegate = browsingEnabled ? self : nil cell.overrideMastodonController = mastodonController cell.updateUI(statusID: id, state: state, filterResult: filterResult, precomputedContent: precomputedContent) } override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { guard browsingEnabled else { return } super.collectionView(collectionView, didSelectItemAt: indexPath) } // MARK: - Interaction @objc func toggleSaveButtonPressed() { let context = parentMastodonController!.persistentContainer.viewContext let existing = try? context.fetch(SavedInstance.fetchRequest(url: instanceURL)).first if let existing = existing { context.delete(existing) delegate?.didUnsaveInstance(url: instanceURL) } else { _ = SavedInstance(url: instanceURL, context: context) delegate?.didSaveInstance(url: instanceURL) } mastodonController.persistentContainer.save(context: context) } }