92 lines
3.9 KiB
Swift
92 lines
3.9 KiB
Swift
//
|
|
// DiscoverySection.swift
|
|
// Mastodon
|
|
//
|
|
// Created by MainasuK on 2022-4-13.
|
|
//
|
|
|
|
import UIKit
|
|
import MastodonCore
|
|
import MastodonUI
|
|
import MastodonSDK
|
|
|
|
enum DiscoverySection: CaseIterable {
|
|
// case posts
|
|
case hashtags
|
|
case news
|
|
case forYou
|
|
}
|
|
|
|
extension DiscoverySection {
|
|
|
|
class Configuration {
|
|
let authContext: AuthContext
|
|
weak var profileCardTableViewCellDelegate: ProfileCardTableViewCellDelegate?
|
|
let familiarFollowers: Published<[Mastodon.Entity.FamiliarFollowers]>.Publisher?
|
|
|
|
public init(
|
|
authContext: AuthContext,
|
|
profileCardTableViewCellDelegate: ProfileCardTableViewCellDelegate? = nil,
|
|
familiarFollowers: Published<[Mastodon.Entity.FamiliarFollowers]>.Publisher? = nil
|
|
) {
|
|
self.authContext = authContext
|
|
self.profileCardTableViewCellDelegate = profileCardTableViewCellDelegate
|
|
self.familiarFollowers = familiarFollowers
|
|
}
|
|
}
|
|
|
|
static func diffableDataSource(
|
|
tableView: UITableView,
|
|
context: AppContext,
|
|
configuration: Configuration
|
|
) -> UITableViewDiffableDataSource<DiscoverySection, DiscoveryItem> {
|
|
|
|
tableView.register(TrendTableViewCell.self, forCellReuseIdentifier: String(describing: TrendTableViewCell.self))
|
|
tableView.register(NewsTableViewCell.self, forCellReuseIdentifier: String(describing: NewsTableViewCell.self))
|
|
tableView.register(ProfileCardTableViewCell.self, forCellReuseIdentifier: String(describing: ProfileCardTableViewCell.self))
|
|
tableView.register(TimelineBottomLoaderTableViewCell.self, forCellReuseIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self))
|
|
|
|
return UITableViewDiffableDataSource(tableView: tableView) {
|
|
tableView,
|
|
indexPath,
|
|
item in
|
|
switch item {
|
|
case .hashtag(let tag):
|
|
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TrendTableViewCell.self), for: indexPath) as! TrendTableViewCell
|
|
cell.trendView.configure(tag: tag)
|
|
return cell
|
|
case .link(let link):
|
|
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: NewsTableViewCell.self), for: indexPath) as! NewsTableViewCell
|
|
cell.newsView.configure(link: link)
|
|
return cell
|
|
case .account(let account, relationship: let relationship):
|
|
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ProfileCardTableViewCell.self), for: indexPath) as! ProfileCardTableViewCell
|
|
|
|
cell.configure(
|
|
tableView: tableView,
|
|
account: account,
|
|
relationship: relationship,
|
|
profileCardTableViewCellDelegate: configuration.profileCardTableViewCellDelegate
|
|
)
|
|
|
|
// bind familiarFollowers
|
|
if let familiarFollowers = configuration.familiarFollowers {
|
|
familiarFollowers
|
|
.map { array in array.first(where: { $0.id == account.id }) }
|
|
.assign(to: \.familiarFollowers, on: cell.profileCardView.viewModel)
|
|
.store(in: &cell.disposeBag)
|
|
} else {
|
|
cell.profileCardView.viewModel.familiarFollowers = nil
|
|
}
|
|
|
|
return cell
|
|
case .bottomLoader:
|
|
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell
|
|
cell.activityIndicatorView.startAnimating()
|
|
return cell
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|