123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- //
- // FollowerListViewController.swift
- // Mastodon
- //
- // Created by Cirno MainasuK on 2021-11-1.
- //
- import os.log
- import UIKit
- import GameplayKit
- import Combine
- import MastodonCore
- import MastodonUI
- import MastodonLocalization
- final class FollowerListViewController: UIViewController, NeedsDependency {
-
- let logger = Logger(subsystem: "FollowerListViewController", category: "ViewController")
-
- weak var context: AppContext! { willSet { precondition(!isViewLoaded) } }
- weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } }
-
- var disposeBag = Set<AnyCancellable>()
- var viewModel: FollowerListViewModel!
-
- lazy var tableView: UITableView = {
- let tableView = UITableView()
- 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
- }()
-
- deinit {
- os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
- }
-
- }
- extension FollowerListViewController {
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- title = L10n.Scene.Follower.title
-
- view.backgroundColor = ThemeService.shared.currentTheme.value.secondarySystemBackgroundColor
- ThemeService.shared.currentTheme
- .receive(on: DispatchQueue.main)
- .sink { [weak self] theme in
- guard let self = self else { return }
- self.view.backgroundColor = theme.secondarySystemBackgroundColor
- }
- .store(in: &disposeBag)
-
- tableView.translatesAutoresizingMaskIntoConstraints = false
- view.addSubview(tableView)
- NSLayoutConstraint.activate([
- tableView.topAnchor.constraint(equalTo: view.topAnchor),
- tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
- tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
- tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
- ])
-
- tableView.delegate = self
- viewModel.setupDiffableDataSource(
- tableView: tableView,
- userTableViewCellDelegate: self
- )
-
- // setup batch fetch
- viewModel.listBatchFetchViewModel.setup(scrollView: tableView)
- viewModel.listBatchFetchViewModel.shouldFetch
- .receive(on: DispatchQueue.main)
- .sink { [weak self] _ in
- guard let self = self else { return }
- self.viewModel.stateMachine.enter(FollowerListViewModel.State.Loading.self)
- }
- .store(in: &disposeBag)
-
- // trigger user timeline loading
- Publishers.CombineLatest(
- viewModel.$domain.removeDuplicates(),
- viewModel.$userID.removeDuplicates()
- )
- .receive(on: DispatchQueue.main)
- .sink { [weak self] _ in
- guard let self = self else { return }
- self.viewModel.stateMachine.enter(FollowerListViewModel.State.Reloading.self)
- }
- .store(in: &disposeBag)
- }
-
- override func viewWillAppear(_ animated: Bool) {
- super.viewWillAppear(animated)
-
- tableView.deselectRow(with: transitionCoordinator, animated: animated)
- }
-
- }
- // MARK: - AuthContextProvider
- extension FollowerListViewController: AuthContextProvider {
- var authContext: AuthContext { viewModel.authContext }
- }
- // MARK: - UITableViewDelegate
- extension FollowerListViewController: UITableViewDelegate, AutoGenerateTableViewDelegate {
- // sourcery:inline:FollowerListViewController.AutoGenerateTableViewDelegate
- // Generated using Sourcery
- // DO NOT EDIT
- func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
- aspectTableView(tableView, didSelectRowAt: indexPath)
- }
- // sourcery:end
- }
- // MARK: - UserTableViewCellDelegate
- extension FollowerListViewController: UserTableViewCellDelegate { }
|