98 lines
3.6 KiB
Swift
98 lines
3.6 KiB
Swift
//
|
|
// 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)
|
|
}
|
|
|
|
}
|