fix: update followState when view will appear

This commit is contained in:
sunxiaojian 2021-04-22 20:32:54 +08:00
parent e664722b13
commit 67f813a946
6 changed files with 47 additions and 19 deletions

View File

@ -5,8 +5,8 @@
// Created by sxiaojian on 2021/4/22. // Created by sxiaojian on 2021/4/22.
// //
import Foundation
import CoreData import CoreData
import Foundation
enum SelectedAccountItem { enum SelectedAccountItem {
case accountObjectID(accountObjectID: NSManagedObjectID) case accountObjectID(accountObjectID: NSManagedObjectID)

View File

@ -26,7 +26,7 @@ extension SelectedAccountSection {
case .accountObjectID(let objectID): case .accountObjectID(let objectID):
let user = managedObjectContext.object(with: objectID) as! MastodonUser let user = managedObjectContext.object(with: objectID) as! MastodonUser
cell.config(with: user) cell.config(with: user)
case .placeHolder( _): case .placeHolder:
cell.configAsPlaceHolder() cell.configAsPlaceHolder()
} }
return cell return cell

View File

@ -5,9 +5,9 @@
// Created by sxiaojian on 2021/4/22. // Created by sxiaojian on 2021/4/22.
// //
import CoreDataStack
import Foundation import Foundation
import UIKit import UIKit
import CoreDataStack
class SuggestionAccountCollectionViewCell: UICollectionViewCell { class SuggestionAccountCollectionViewCell: UICollectionViewCell {
let imageView: UIImageView = { let imageView: UIImageView = {
@ -18,11 +18,12 @@ class SuggestionAccountCollectionViewCell: UICollectionViewCell {
imageView.image = UIImage.placeholder(color: .systemFill) imageView.image = UIImage.placeholder(color: .systemFill)
return imageView return imageView
}() }()
func configAsPlaceHolder() { func configAsPlaceHolder() {
imageView.tintColor = Asset.Colors.Label.tertiary.color imageView.tintColor = Asset.Colors.Label.tertiary.color
imageView.image = UIImage.placeholder(color: .systemFill) imageView.image = UIImage.placeholder(color: .systemFill)
} }
func config(with mastodonUser: MastodonUser) { func config(with mastodonUser: MastodonUser) {
imageView.af.setImage( imageView.af.setImage(
withURL: URL(string: mastodonUser.avatar)!, withURL: URL(string: mastodonUser.avatar)!,
@ -30,15 +31,16 @@ class SuggestionAccountCollectionViewCell: UICollectionViewCell {
imageTransition: .crossDissolve(0.2) imageTransition: .crossDissolve(0.2)
) )
} }
override func prepareForReuse() { override func prepareForReuse() {
super.prepareForReuse() super.prepareForReuse()
} }
override init(frame: CGRect) { override init(frame: CGRect) {
super.init(frame: .zero) super.init(frame: .zero)
configure() configure()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
super.init(coder: coder) super.init(coder: coder)
configure() configure()
@ -46,7 +48,6 @@ class SuggestionAccountCollectionViewCell: UICollectionViewCell {
} }
extension SuggestionAccountCollectionViewCell { extension SuggestionAccountCollectionViewCell {
private func configure() { private func configure() {
contentView.addSubview(imageView) contentView.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false imageView.translatesAutoresizingMaskIntoConstraints = false

View File

@ -90,7 +90,7 @@ extension SuggestionAccountViewController {
) )
viewModel.collectionDiffableDataSource = SelectedAccountSection.collectionViewDiffableDataSource(for: selectedCollectionView, managedObjectContext: context.managedObjectContext) viewModel.collectionDiffableDataSource = SelectedAccountSection.collectionViewDiffableDataSource(for: selectedCollectionView, managedObjectContext: context.managedObjectContext)
viewModel.accounts viewModel.accounts
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
.sink { [weak self] accounts in .sink { [weak self] accounts in
@ -103,7 +103,9 @@ extension SuggestionAccountViewController {
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
tableView.deselectRow(with: transitionCoordinator, animated: animated) tableView.deselectRow(with: transitionCoordinator, animated: animated)
viewModel.checkAccountsFollowState()
} }
override func viewWillLayoutSubviews() { override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews() super.viewWillLayoutSubviews()
let avatarImageViewHeight: Double = 56 let avatarImageViewHeight: Double = 56
@ -111,6 +113,7 @@ extension SuggestionAccountViewController {
viewModel.headerPlaceholderCount = avatarImageViewCount viewModel.headerPlaceholderCount = avatarImageViewCount
viewModel.applySelectedCollectionViewDataSource(accounts: []) viewModel.applySelectedCollectionViewDataSource(accounts: [])
} }
func setupHeader(accounts: [NSManagedObjectID]) { func setupHeader(accounts: [NSManagedObjectID]) {
if accounts.isEmpty { if accounts.isEmpty {
return return
@ -138,15 +141,14 @@ extension SuggestionAccountViewController {
} }
extension SuggestionAccountViewController: UICollectionViewDelegateFlowLayout { extension SuggestionAccountViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 15 15
} }
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 56, height: 56) CGSize(width: 56, height: 56)
} }
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let diffableDataSource = viewModel.collectionDiffableDataSource else { return } guard let diffableDataSource = viewModel.collectionDiffableDataSource else { return }
guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return } guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { return }
@ -195,7 +197,7 @@ extension SuggestionAccountViewController: SuggestionAccountTableViewCellDelegat
cell.button.isSelected = selected cell.button.isSelected = selected
self.viewModel.selectedAccountsDidChange.send() self.viewModel.selectedAccountsDidChange.send()
} }
}, receiveValue: { relationShip in }, receiveValue: { _ in
}) })
.store(in: &disposeBag) .store(in: &disposeBag)
} }

View File

@ -23,6 +23,7 @@ final class SuggestionAccountViewModel: NSObject {
// input // input
let context: AppContext let context: AppContext
let currentMastodonUser = CurrentValueSubject<MastodonUser?, Never>(nil)
weak var delegate: SuggestionAccountViewModelDelegate? weak var delegate: SuggestionAccountViewModelDelegate?
// output // output
let accounts = CurrentValueSubject<[NSManagedObjectID], Never>([]) let accounts = CurrentValueSubject<[NSManagedObjectID], Never>([])
@ -60,11 +61,23 @@ final class SuggestionAccountViewModel: NSObject {
selectedAccountsDidChange selectedAccountsDidChange
.sink { [weak self] _ in .sink { [weak self] _ in
if let selectedAccout = self?.selectedAccounts { guard let self = self else { return }
self?.applySelectedCollectionViewDataSource(accounts: selectedAccout) self.applyTableViewDataSource(accounts: self.accounts.value)
} self.applySelectedCollectionViewDataSource(accounts: self.selectedAccounts)
} }
.store(in: &disposeBag) .store(in: &disposeBag)
context.authenticationService.activeMastodonAuthentication
.sink { [weak self] activeMastodonAuthentication in
guard let self = self else { return }
guard let activeMastodonAuthentication = activeMastodonAuthentication else {
self.currentMastodonUser.value = nil
return
}
self.currentMastodonUser.value = activeMastodonAuthentication.user
}
.store(in: &disposeBag)
if accounts == nil || (accounts ?? []).isEmpty { if accounts == nil || (accounts ?? []).isEmpty {
guard let activeMastodonAuthenticationBox = context.authenticationService.activeMastodonAuthenticationBox.value else { return } guard let activeMastodonAuthenticationBox = context.authenticationService.activeMastodonAuthenticationBox.value else { return }
@ -174,4 +187,17 @@ final class SuggestionAccountViewModel: NSObject {
needFeedback: false needFeedback: false
) )
} }
func checkAccountsFollowState() {
guard let currentMastodonUser = currentMastodonUser.value else {
return
}
let users = accounts.value.compactMap { context.managedObjectContext.object(with: $0) as? MastodonUser }
let followingUsers = users.filter { user -> Bool in
let isFollowing = user.followingBy.flatMap { $0.contains(currentMastodonUser) } ?? false
return isFollowing
}.map(\.objectID)
selectedAccounts = followingUsers
selectedAccountsDidChange.send()
}
} }

View File

@ -101,14 +101,14 @@ extension SuggestionAccountTableViewCell {
containerStackView.topAnchor.constraint(equalTo: contentView.topAnchor), containerStackView.topAnchor.constraint(equalTo: contentView.topAnchor),
containerStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), containerStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
containerStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), containerStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
containerStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor) containerStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
]) ])
_imageView.translatesAutoresizingMaskIntoConstraints = false _imageView.translatesAutoresizingMaskIntoConstraints = false
containerStackView.addArrangedSubview(_imageView) containerStackView.addArrangedSubview(_imageView)
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
_imageView.widthAnchor.constraint(equalToConstant: 42).priority(.required - 1), _imageView.widthAnchor.constraint(equalToConstant: 42).priority(.required - 1),
_imageView.heightAnchor.constraint(equalToConstant: 42).priority(.required - 1) _imageView.heightAnchor.constraint(equalToConstant: 42).priority(.required - 1),
]) ])
let textStackView = UIStackView() let textStackView = UIStackView()
@ -178,7 +178,6 @@ extension SuggestionAccountTableViewCell {
self?.button.isHidden = !isHidden self?.button.isHidden = !isHidden
} }
.store(in: &disposeBag) .store(in: &disposeBag)
} }
func startAnimating() { func startAnimating() {