// // DiscoverySection.swift // Mastodon // // Created by MainasuK on 2022-4-13. // import os.log import UIKit import MastodonUI enum DiscoverySection: CaseIterable { // case posts case hashtags case news case forYou } extension DiscoverySection { static let logger = Logger(subsystem: "DiscoverySection", category: "logic") class Configuration { weak var profileCardTableViewCellDelegate: ProfileCardTableViewCellDelegate? public init(profileCardTableViewCellDelegate: ProfileCardTableViewCellDelegate? = nil) { self.profileCardTableViewCellDelegate = profileCardTableViewCellDelegate } } static func diffableDataSource( tableView: UITableView, context: AppContext, configuration: Configuration ) -> UITableViewDiffableDataSource { 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 .user(let record): let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ProfileCardTableViewCell.self), for: indexPath) as! ProfileCardTableViewCell context.managedObjectContext.performAndWait { guard let user = record.object(in: context.managedObjectContext) else { return } cell.configure( tableView: tableView, user: user, profileCardTableViewCellDelegate: configuration.profileCardTableViewCellDelegate ) } context.authenticationService.activeMastodonAuthentication .map { $0?.user } .assign(to: \.me, on: cell.profileCardView.viewModel.relationshipViewModel) .store(in: &cell.disposeBag) return cell case .bottomLoader: let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell cell.activityIndicatorView.startAnimating() return cell } } } }