Migrate FamiliarFollowers over to Entity (IOS-195)

This commit is contained in:
Nathan Mattes 2023-11-21 14:40:31 +01:00
parent 2c26b3f97e
commit 74d1fbe89a
7 changed files with 62 additions and 93 deletions

View File

@ -293,7 +293,6 @@
DB4FFC2C269EC39600D62E92 /* SearchTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4FFC2A269EC39600D62E92 /* SearchTransitionController.swift */; }; DB4FFC2C269EC39600D62E92 /* SearchTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4FFC2A269EC39600D62E92 /* SearchTransitionController.swift */; };
DB5B549A2833A60400DEF8B2 /* FamiliarFollowersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B54992833A60400DEF8B2 /* FamiliarFollowersViewController.swift */; }; DB5B549A2833A60400DEF8B2 /* FamiliarFollowersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B54992833A60400DEF8B2 /* FamiliarFollowersViewController.swift */; };
DB5B549D2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B549C2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift */; }; DB5B549D2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B549C2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift */; };
DB5B549F2833A72500DEF8B2 /* FamiliarFollowersViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B549E2833A72500DEF8B2 /* FamiliarFollowersViewModel+Diffable.swift */; };
DB5B54A12833A89600DEF8B2 /* FamiliarFollowersViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B54A02833A89600DEF8B2 /* FamiliarFollowersViewController+DataSourceProvider.swift */; }; DB5B54A12833A89600DEF8B2 /* FamiliarFollowersViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B54A02833A89600DEF8B2 /* FamiliarFollowersViewController+DataSourceProvider.swift */; };
DB5B54A32833BD1A00DEF8B2 /* UserListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B54A22833BD1A00DEF8B2 /* UserListViewModel.swift */; }; DB5B54A32833BD1A00DEF8B2 /* UserListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B54A22833BD1A00DEF8B2 /* UserListViewModel.swift */; };
DB5B54A62833BE0000DEF8B2 /* UserListViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B54A52833BE0000DEF8B2 /* UserListViewModel+State.swift */; }; DB5B54A62833BE0000DEF8B2 /* UserListViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B54A52833BE0000DEF8B2 /* UserListViewModel+State.swift */; };
@ -1005,7 +1004,6 @@
DB519B17281BCC2F00F0C99D /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = tr; path = tr.lproj/Intents.stringsdict; sourceTree = "<group>"; }; DB519B17281BCC2F00F0C99D /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = tr; path = tr.lproj/Intents.stringsdict; sourceTree = "<group>"; };
DB5B54992833A60400DEF8B2 /* FamiliarFollowersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FamiliarFollowersViewController.swift; sourceTree = "<group>"; }; DB5B54992833A60400DEF8B2 /* FamiliarFollowersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FamiliarFollowersViewController.swift; sourceTree = "<group>"; };
DB5B549C2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FamiliarFollowersViewModel.swift; sourceTree = "<group>"; }; DB5B549C2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FamiliarFollowersViewModel.swift; sourceTree = "<group>"; };
DB5B549E2833A72500DEF8B2 /* FamiliarFollowersViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FamiliarFollowersViewModel+Diffable.swift"; sourceTree = "<group>"; };
DB5B54A02833A89600DEF8B2 /* FamiliarFollowersViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FamiliarFollowersViewController+DataSourceProvider.swift"; sourceTree = "<group>"; }; DB5B54A02833A89600DEF8B2 /* FamiliarFollowersViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FamiliarFollowersViewController+DataSourceProvider.swift"; sourceTree = "<group>"; };
DB5B54A22833BD1A00DEF8B2 /* UserListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserListViewModel.swift; sourceTree = "<group>"; }; DB5B54A22833BD1A00DEF8B2 /* UserListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserListViewModel.swift; sourceTree = "<group>"; };
DB5B54A52833BE0000DEF8B2 /* UserListViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserListViewModel+State.swift"; sourceTree = "<group>"; }; DB5B54A52833BE0000DEF8B2 /* UserListViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserListViewModel+State.swift"; sourceTree = "<group>"; };
@ -2288,7 +2286,6 @@
DB5B54992833A60400DEF8B2 /* FamiliarFollowersViewController.swift */, DB5B54992833A60400DEF8B2 /* FamiliarFollowersViewController.swift */,
DB5B54A02833A89600DEF8B2 /* FamiliarFollowersViewController+DataSourceProvider.swift */, DB5B54A02833A89600DEF8B2 /* FamiliarFollowersViewController+DataSourceProvider.swift */,
DB5B549C2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift */, DB5B549C2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift */,
DB5B549E2833A72500DEF8B2 /* FamiliarFollowersViewModel+Diffable.swift */,
); );
path = FamiliarFollowers; path = FamiliarFollowers;
sourceTree = "<group>"; sourceTree = "<group>";
@ -3718,7 +3715,6 @@
0FAA101C25E10E760017CCDE /* UIFont.swift in Sources */, 0FAA101C25E10E760017CCDE /* UIFont.swift in Sources */,
2D38F1D525CD465300561493 /* HomeTimelineViewController.swift in Sources */, 2D38F1D525CD465300561493 /* HomeTimelineViewController.swift in Sources */,
DB6180E926391BDF0018D199 /* MediaHostToMediaPreviewViewControllerAnimatedTransitioning.swift in Sources */, DB6180E926391BDF0018D199 /* MediaHostToMediaPreviewViewControllerAnimatedTransitioning.swift in Sources */,
DB5B549F2833A72500DEF8B2 /* FamiliarFollowersViewModel+Diffable.swift in Sources */,
DB6B351E2601FAEE00DC1E11 /* ComposeStatusAttachmentCollectionViewCell.swift in Sources */, DB6B351E2601FAEE00DC1E11 /* ComposeStatusAttachmentCollectionViewCell.swift in Sources */,
DB8F7076279E954700E1225B /* DataSourceFacade+Follow.swift in Sources */, DB8F7076279E954700E1225B /* DataSourceFacade+Follow.swift in Sources */,
DB63F7542799491600455B82 /* DataSourceFacade+SearchHistory.swift in Sources */, DB63F7542799491600455B82 /* DataSourceFacade+SearchHistory.swift in Sources */,

View File

@ -462,9 +462,7 @@ private extension SceneCoordinator {
let followingListViewController = FollowingListViewController(viewModel: viewModel, coordinator: self, context: appContext) let followingListViewController = FollowingListViewController(viewModel: viewModel, coordinator: self, context: appContext)
viewController = followingListViewController viewController = followingListViewController
case .familiarFollowers(let viewModel): case .familiarFollowers(let viewModel):
let _viewController = FamiliarFollowersViewController() viewController = FamiliarFollowersViewController(viewModel: viewModel, context: appContext, coordinator: self)
_viewController.viewModel = viewModel
viewController = _viewController
case .rebloggedBy(let viewModel): case .rebloggedBy(let viewModel):
let _viewController = RebloggedByViewController() let _viewController = RebloggedByViewController()
_viewController.viewModel = viewModel _viewController.viewModel = viewModel

View File

@ -143,8 +143,8 @@ extension DiscoveryForYouViewController: ProfileCardTableViewCellDelegate {
return return
} }
let familiarFollowersViewModel = FamiliarFollowersViewModel(context: context, authContext: authContext) let familiarFollowersViewModel = FamiliarFollowersViewModel(context: context, authContext: authContext, accounts: viewModel.accounts, relationships: viewModel.relationships)
familiarFollowersViewModel.familiarFollowers = familiarFollowers
_ = coordinator.present( _ = coordinator.present(
scene: .familiarFollowers(viewModel: familiarFollowersViewModel), scene: .familiarFollowers(viewModel: familiarFollowersViewModel),
from: self, from: self,

View File

@ -23,7 +23,7 @@ final class DiscoveryForYouViewModel {
@Published var familiarFollowers: [Mastodon.Entity.FamiliarFollowers] = [] @Published var familiarFollowers: [Mastodon.Entity.FamiliarFollowers] = []
@Published var isFetching = false @Published var isFetching = false
@Published var accounts: [Mastodon.Entity.Account] @Published var accounts: [Mastodon.Entity.Account]
var relationships: [Mastodon.Entity.Relationship?] var relationships: [Mastodon.Entity.Relationship]
// output // output
var diffableDataSource: UITableViewDiffableDataSource<DiscoverySection, DiscoveryItem>? var diffableDataSource: UITableViewDiffableDataSource<DiscoverySection, DiscoveryItem>?
@ -72,7 +72,7 @@ extension DiscoveryForYouViewModel {
snapshot.appendSections([.forYou]) snapshot.appendSections([.forYou])
let items = self.accounts.map { account in let items = self.accounts.map { account in
let relationship = relationships.first { $0?.id == account.id } ?? nil let relationship = relationships.first { $0.id == account.id } ?? nil
return DiscoveryItem.account(account, relationship: relationship) return DiscoveryItem.account(account, relationship: relationship)
} }

View File

@ -14,36 +14,34 @@ import CoreDataStack
final class FamiliarFollowersViewController: UIViewController, NeedsDependency { final class FamiliarFollowersViewController: UIViewController, NeedsDependency {
weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } weak var context: AppContext!
weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } } weak var coordinator: SceneCoordinator!
var disposeBag = Set<AnyCancellable>() var disposeBag = Set<AnyCancellable>()
var viewModel: FamiliarFollowersViewModel! var viewModel: FamiliarFollowersViewModel
lazy var tableView: UITableView = { let tableView: UITableView
let tableView = UITableView()
init(viewModel: FamiliarFollowersViewModel, context: AppContext, coordinator: SceneCoordinator) {
self.viewModel = viewModel
self.context = context
self.coordinator = coordinator
tableView = UITableView()
tableView.rowHeight = UITableView.automaticDimension tableView.rowHeight = UITableView.automaticDimension
tableView.separatorStyle = .none tableView.separatorStyle = .none
tableView.backgroundColor = .clear tableView.backgroundColor = .clear
return tableView
}()
}
extension FamiliarFollowersViewController { super.init(nibName: nil, bundle: nil)
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Scene.Familiarfollowers.title title = L10n.Scene.Familiarfollowers.title
view.backgroundColor = .secondarySystemBackground view.backgroundColor = .secondarySystemBackground
tableView.translatesAutoresizingMaskIntoConstraints = false tableView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(tableView) view.addSubview(tableView)
tableView.pinToParent() tableView.pinToParent()
tableView.delegate = self tableView.delegate = self
viewModel.setupDiffableDataSource( viewModel.setupDiffableDataSource(
tableView: tableView, tableView: tableView,
@ -51,10 +49,13 @@ extension FamiliarFollowersViewController {
) )
} }
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
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.viewWillAppear()
} }
} }

View File

@ -1,39 +0,0 @@
//
// FamiliarFollowersViewModel+Diffable.swift
// Mastodon
//
// Created by MainasuK on 2022-5-17.
//
import UIKit
import Combine
extension FamiliarFollowersViewModel {
func setupDiffableDataSource(
tableView: UITableView,
userTableViewCellDelegate: UserTableViewCellDelegate?
) {
diffableDataSource = UserSection.diffableDataSource(
tableView: tableView,
context: context,
authContext: authContext,
userTableViewCellDelegate: userTableViewCellDelegate
)
userFetchedResultsController.$records
.receive(on: DispatchQueue.main)
.sink { [weak self] records in
guard let self = self else { return }
guard let diffableDataSource = self.diffableDataSource else { return }
var snapshot = NSDiffableDataSourceSnapshot<UserSection, UserItem>()
snapshot.appendSections([.main])
let items = records.map { UserItem.user(record: $0) }
snapshot.appendItems(items, toSection: .main)
diffableDataSource.apply(snapshot, animatingDifferences: false)
}
.store(in: &disposeBag)
}
}

View File

@ -6,41 +6,54 @@
// //
import UIKit import UIKit
import Combine
import MastodonCore import MastodonCore
import MastodonSDK import MastodonSDK
import CoreDataStack
final class FamiliarFollowersViewModel { final class FamiliarFollowersViewModel {
var disposeBag = Set<AnyCancellable>()
// input
let context: AppContext let context: AppContext
let authContext: AuthContext let authContext: AuthContext
let userFetchedResultsController: UserFetchedResultsController
@Published var familiarFollowers: Mastodon.Entity.FamiliarFollowers? var accounts: [Mastodon.Entity.Account]
var relationships: [Mastodon.Entity.Relationship]
// output // output
var diffableDataSource: UITableViewDiffableDataSource<UserSection, UserItem>? var diffableDataSource: UITableViewDiffableDataSource<UserSection, UserItem>?
init(context: AppContext, authContext: AuthContext) { init(context: AppContext, authContext: AuthContext, accounts: [Mastodon.Entity.Account], relationships: [Mastodon.Entity.Relationship]) {
self.context = context self.context = context
self.authContext = authContext self.authContext = authContext
self.userFetchedResultsController = UserFetchedResultsController( self.accounts = accounts
managedObjectContext: context.managedObjectContext, self.relationships = relationships
domain: authContext.mastodonAuthenticationBox.domain, }
additionalPredicate: nil
) func setupDiffableDataSource(
// end init tableView: UITableView,
userTableViewCellDelegate: UserTableViewCellDelegate?
$familiarFollowers ) {
.map { familiarFollowers -> [MastodonUser.ID] in diffableDataSource = UserSection.diffableDataSource(
guard let familiarFollowers = familiarFollowers else { return [] } tableView: tableView,
return familiarFollowers.accounts.map { $0.id } context: context,
} authContext: authContext,
.assign(to: \.userIDs, on: userFetchedResultsController) userTableViewCellDelegate: userTableViewCellDelegate
.store(in: &disposeBag) )
}
func viewWillAppear() {
guard let diffableDataSource else { return }
var snapshot = NSDiffableDataSourceSnapshot<UserSection, UserItem>()
snapshot.appendSections([.main])
let accountsWithRelationship: [(account: Mastodon.Entity.Account, relationship: Mastodon.Entity.Relationship?)] = accounts.compactMap { account in
guard let relationship = self.relationships.first(where: {$0.id == account.id }) else { return (account: account, relationship: nil)}
return (account: account, relationship: relationship)
}
let items = accountsWithRelationship.map { UserItem.account(account: $0.account, relationship: $0.relationship) }
snapshot.appendItems(items, toSection: .main)
diffableDataSource.apply(snapshot, animatingDifferences: false)
} }
} }