Add pull to refresh to Followers-list
This commit is contained in:
parent
10f2358247
commit
96bea2ad95
Mastodon
Coordinator
Scene/Profile/Follower
|
@ -464,9 +464,8 @@ private extension SceneCoordinator {
|
|||
_viewController.viewModel = viewModel
|
||||
viewController = _viewController
|
||||
case .follower(let viewModel):
|
||||
let _viewController = FollowerListViewController()
|
||||
_viewController.viewModel = viewModel
|
||||
viewController = _viewController
|
||||
let followerListViewController = FollowerListViewController(viewModel: viewModel, coordinator: self, context: appContext)
|
||||
viewController = followerListViewController
|
||||
case .following(let viewModel):
|
||||
let followingListViewController = FollowingListViewController(viewModel: viewModel, coordinator: self, context: appContext)
|
||||
viewController = followingListViewController
|
||||
|
|
|
@ -11,28 +11,53 @@ import Combine
|
|||
import MastodonCore
|
||||
import MastodonUI
|
||||
import MastodonLocalization
|
||||
import CoreDataStack
|
||||
|
||||
final class FollowerListViewController: UIViewController, NeedsDependency {
|
||||
|
||||
weak var context: AppContext! { willSet { precondition(!isViewLoaded) } }
|
||||
weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } }
|
||||
weak var context: AppContext!
|
||||
weak var coordinator: SceneCoordinator!
|
||||
|
||||
var disposeBag = Set<AnyCancellable>()
|
||||
var viewModel: FollowerListViewModel!
|
||||
var viewModel: FollowerListViewModel
|
||||
|
||||
lazy var tableView: UITableView = {
|
||||
let tableView = UITableView()
|
||||
let tableView: UITableView
|
||||
let refreshControl: UIRefreshControl
|
||||
|
||||
init(viewModel: FollowerListViewModel, coordinator: SceneCoordinator, context: AppContext) {
|
||||
|
||||
self.context = context
|
||||
self.coordinator = coordinator
|
||||
self.viewModel = viewModel
|
||||
|
||||
tableView = UITableView()
|
||||
tableView.translatesAutoresizingMaskIntoConstraints = false
|
||||
tableView.register(UserTableViewCell.self, forCellReuseIdentifier: String(describing: UserTableViewCell.self))
|
||||
tableView.register(TimelineBottomLoaderTableViewCell.self, forCellReuseIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self))
|
||||
tableView.register(TimelineFooterTableViewCell.self, forCellReuseIdentifier: String(describing: TimelineFooterTableViewCell.self))
|
||||
tableView.rowHeight = UITableView.automaticDimension
|
||||
tableView.separatorStyle = .none
|
||||
tableView.backgroundColor = .clear
|
||||
return tableView
|
||||
}()
|
||||
|
||||
|
||||
|
||||
refreshControl = UIRefreshControl()
|
||||
tableView.refreshControl = refreshControl
|
||||
|
||||
super.init(nibName: nil, bundle: nil)
|
||||
|
||||
title = L10n.Scene.Following.title
|
||||
|
||||
view.backgroundColor = .secondarySystemBackground
|
||||
|
||||
view.addSubview(tableView)
|
||||
tableView.pinToParent()
|
||||
tableView.delegate = self
|
||||
tableView.refreshControl?.addTarget(self, action: #selector(FollowingListViewController.refresh(_:)), for: .valueChanged)
|
||||
|
||||
viewModel.tableView = tableView
|
||||
|
||||
refreshControl.addTarget(self, action: #selector(FollowerListViewController.refresh(_:)), for: .valueChanged)
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
|
||||
}
|
||||
|
||||
extension FollowerListViewController {
|
||||
|
@ -82,7 +107,13 @@ extension FollowerListViewController {
|
|||
|
||||
tableView.deselectRow(with: transitionCoordinator, animated: animated)
|
||||
}
|
||||
|
||||
|
||||
//MARK: - Actions
|
||||
|
||||
@objc
|
||||
func refresh(_ sender: UIRefreshControl) {
|
||||
viewModel.stateMachine.enter(FollowerListViewModel.State.Reloading.self)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - AuthContextProvider
|
||||
|
|
|
@ -9,7 +9,6 @@ import Foundation
|
|||
import GameplayKit
|
||||
import MastodonSDK
|
||||
import MastodonCore
|
||||
import CoreDataStack
|
||||
|
||||
extension FollowerListViewModel {
|
||||
class State: GKState {
|
||||
|
@ -98,6 +97,12 @@ extension FollowerListViewModel.State {
|
|||
return false
|
||||
}
|
||||
}
|
||||
|
||||
override func didEnter(from previousState: GKState?) {
|
||||
super.didEnter(from: previousState)
|
||||
|
||||
viewModel?.tableView?.refreshControl?.endRefreshing()
|
||||
}
|
||||
}
|
||||
|
||||
class Loading: FollowerListViewModel.State {
|
||||
|
@ -188,6 +193,8 @@ extension FollowerListViewModel.State {
|
|||
|
||||
override func didEnter(from previousState: GKState?) {
|
||||
super.didEnter(from: previousState)
|
||||
|
||||
viewModel?.tableView?.refreshControl?.endRefreshing()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,11 +21,14 @@ final class FollowerListViewModel {
|
|||
let authContext: AuthContext
|
||||
@Published var accounts: [Mastodon.Entity.Account]
|
||||
@Published var relationships: [Mastodon.Entity.Relationship]
|
||||
let listBatchFetchViewModel = ListBatchFetchViewModel()
|
||||
|
||||
let listBatchFetchViewModel: ListBatchFetchViewModel
|
||||
|
||||
@Published var domain: String?
|
||||
@Published var userID: String?
|
||||
|
||||
|
||||
var tableView: UITableView?
|
||||
|
||||
// output
|
||||
var diffableDataSource: UITableViewDiffableDataSource<UserSection, UserItem>?
|
||||
private(set) lazy var stateMachine: GKStateMachine = {
|
||||
|
@ -53,5 +56,6 @@ final class FollowerListViewModel {
|
|||
self.userID = userID
|
||||
self.accounts = []
|
||||
self.relationships = []
|
||||
self.listBatchFetchViewModel = ListBatchFetchViewModel()
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue