forked from shadowfacts/Tusker
Update status cells on status changes
This commit is contained in:
parent
4d654358d7
commit
b688631937
|
@ -10,8 +10,6 @@ import UIKit
|
||||||
import Pachyderm
|
import Pachyderm
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
import SwiftSoup
|
|
||||||
|
|
||||||
// TODO: gonna need a thing to replicate all of EnhancedTableViewController
|
// TODO: gonna need a thing to replicate all of EnhancedTableViewController
|
||||||
|
|
||||||
class TimelineViewController: UIViewController, TimelineLikeCollectionViewController {
|
class TimelineViewController: UIViewController, TimelineLikeCollectionViewController {
|
||||||
|
@ -91,16 +89,6 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createDataSource() -> UICollectionViewDiffableDataSource<Section, Item> {
|
private func createDataSource() -> UICollectionViewDiffableDataSource<Section, Item> {
|
||||||
// let listCell = UICollectionView.CellRegistration<UICollectionViewListCell, Item> { [unowned self] cell, indexPath, item in
|
|
||||||
// guard case .status(id: let id, state: _) = item,
|
|
||||||
// let status = mastodonController.persistentContainer.status(for: id) else {
|
|
||||||
// fatalError()
|
|
||||||
// }
|
|
||||||
// var config = cell.defaultContentConfiguration()
|
|
||||||
// let doc = try! SwiftSoup.parseBodyFragment(status.content)
|
|
||||||
// config.text = try! doc.text()
|
|
||||||
// cell.contentConfiguration = config
|
|
||||||
// }
|
|
||||||
let statusCell = UICollectionView.CellRegistration<TimelineStatusCollectionViewCell, Item> { [unowned self] cell, indexPath, item in
|
let statusCell = UICollectionView.CellRegistration<TimelineStatusCollectionViewCell, Item> { [unowned self] cell, indexPath, item in
|
||||||
guard case .status(id: let id, state: let state) = item,
|
guard case .status(id: let id, state: let state) = item,
|
||||||
let status = mastodonController.persistentContainer.status(for: id) else {
|
let status = mastodonController.persistentContainer.status(for: id) else {
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import Pachyderm
|
import Pachyderm
|
||||||
|
import Combine
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
protocol StatusCollectionViewCellDelegate: AnyObject, TuskerNavigationDelegate, MenuActionProvider {
|
protocol StatusCollectionViewCellDelegate: AnyObject, TuskerNavigationDelegate, MenuActionProvider {
|
||||||
|
@ -40,6 +41,7 @@ protocol StatusCollectionViewCell: UICollectionViewCell {
|
||||||
var accountID: String! { get set }
|
var accountID: String! { get set }
|
||||||
|
|
||||||
var isGrayscale: Bool { get set }
|
var isGrayscale: Bool { get set }
|
||||||
|
var cancellables: Set<AnyCancellable> { get set }
|
||||||
|
|
||||||
func updateUIForPreferences(status: StatusMO)
|
func updateUIForPreferences(status: StatusMO)
|
||||||
}
|
}
|
||||||
|
@ -48,17 +50,37 @@ protocol StatusCollectionViewCell: UICollectionViewCell {
|
||||||
extension StatusCollectionViewCell {
|
extension StatusCollectionViewCell {
|
||||||
static var avatarImageViewSize: CGFloat { 50 }
|
static var avatarImageViewSize: CGFloat { 50 }
|
||||||
|
|
||||||
|
func baseCreateObservers() {
|
||||||
|
mastodonController.persistentContainer.statusSubject
|
||||||
|
.receive(on: DispatchQueue.main)
|
||||||
|
.filter { [unowned self] in $0 == self.statusID }
|
||||||
|
.sink { [unowned self] in
|
||||||
|
if let mastodonController = self.mastodonController,
|
||||||
|
let status = mastodonController.persistentContainer.status(for: $0) {
|
||||||
|
self.updateStatusState(status: status)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.store(in: &cancellables)
|
||||||
|
|
||||||
|
mastodonController.persistentContainer.accountSubject
|
||||||
|
.receive(on: DispatchQueue.main)
|
||||||
|
.filter { [unowned self] in $0 == self.accountID }
|
||||||
|
.sink { [unowned self] in
|
||||||
|
if let mastodonController = self.mastodonController,
|
||||||
|
let account = mastodonController.persistentContainer.account(for: $0) {
|
||||||
|
self.updateAccountUI(account: account)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.store(in: &cancellables)
|
||||||
|
}
|
||||||
|
|
||||||
func doUpdateUI(status: StatusMO) {
|
func doUpdateUI(status: StatusMO) {
|
||||||
statusID = status.id
|
statusID = status.id
|
||||||
accountID = status.account.id
|
accountID = status.account.id
|
||||||
|
|
||||||
let account = status.account
|
updateAccountUI(account: status.account)
|
||||||
avatarImageView.update(for: account.avatar)
|
|
||||||
displayNameLabel.updateForAccountDisplayName(account: account)
|
|
||||||
usernameLabel.text = "@\(account.acct)"
|
|
||||||
contentContainer.contentTextView.setTextFrom(status: status)
|
|
||||||
|
|
||||||
updateUIForPreferences(status: status)
|
updateUIForPreferences(status: status)
|
||||||
|
contentContainer.contentTextView.setTextFrom(status: status)
|
||||||
|
|
||||||
contentContainer.cardView.card = status.card
|
contentContainer.cardView.card = status.card
|
||||||
contentContainer.cardView.isHidden = status.card == nil
|
contentContainer.cardView.isHidden = status.card == nil
|
||||||
|
@ -105,6 +127,12 @@ extension StatusCollectionViewCell {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func updateAccountUI(account: AccountMO) {
|
||||||
|
avatarImageView.update(for: account.avatar)
|
||||||
|
displayNameLabel.updateForAccountDisplayName(account: account)
|
||||||
|
usernameLabel.text = "@\(account.acct)"
|
||||||
|
}
|
||||||
|
|
||||||
func baseUpdateUIForPreferences(status: StatusMO) {
|
func baseUpdateUIForPreferences(status: StatusMO) {
|
||||||
avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadiusFraction * Self.avatarImageViewSize
|
avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadiusFraction * Self.avatarImageViewSize
|
||||||
contentContainer.attachmentsView.contentHidden = Preferences.shared.blurAllMedia || status.sensitive
|
contentContainer.attachmentsView.contentHidden = Preferences.shared.blurAllMedia || status.sensitive
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import Pachyderm
|
import Pachyderm
|
||||||
|
import Combine
|
||||||
|
|
||||||
class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollectionViewCell {
|
class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollectionViewCell {
|
||||||
|
|
||||||
|
@ -238,8 +239,9 @@ class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollecti
|
||||||
|
|
||||||
private var firstLayout = true
|
private var firstLayout = true
|
||||||
var isGrayscale = false
|
var isGrayscale = false
|
||||||
|
|
||||||
private var updateTimestampWorkItem: DispatchWorkItem?
|
private var updateTimestampWorkItem: DispatchWorkItem?
|
||||||
|
private var hasCreatedObservers = false
|
||||||
|
var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
override init(frame: CGRect) {
|
override init(frame: CGRect) {
|
||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
|
@ -336,6 +338,8 @@ class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollecti
|
||||||
fatalError()
|
fatalError()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createObservers()
|
||||||
|
|
||||||
self.statusState = state
|
self.statusState = state
|
||||||
|
|
||||||
if let rebloggedStatus = status.reblog {
|
if let rebloggedStatus = status.reblog {
|
||||||
|
@ -362,6 +366,25 @@ class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollecti
|
||||||
pinImageView.isHidden = !showPinned
|
pinImageView.isHidden = !showPinned
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createObservers() {
|
||||||
|
guard !hasCreatedObservers else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
hasCreatedObservers = true
|
||||||
|
baseCreateObservers()
|
||||||
|
|
||||||
|
mastodonController.persistentContainer.accountSubject
|
||||||
|
.receive(on: DispatchQueue.main)
|
||||||
|
.filter { [unowned self] in $0 == self.rebloggerID }
|
||||||
|
.sink { [unowned self] in
|
||||||
|
if let mastodonController = self.mastodonController,
|
||||||
|
let reblogger = mastodonController.persistentContainer.account(for: $0) {
|
||||||
|
self.updateRebloggerLabel(reblogger: reblogger)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.store(in: &cancellables)
|
||||||
|
}
|
||||||
|
|
||||||
func updateUIForPreferences(status: StatusMO) {
|
func updateUIForPreferences(status: StatusMO) {
|
||||||
baseUpdateUIForPreferences(status: status)
|
baseUpdateUIForPreferences(status: status)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue