// // ThreadViewController+Provider.swift // Mastodon // // Created by MainasuK Cirno on 2021-4-12. // import UIKit import Combine import CoreData import CoreDataStack // MARK: - StatusProvider extension ThreadViewController: StatusProvider { func status() -> Future { return Future { promise in promise(.success(nil)) } } func status(for cell: UITableViewCell?, indexPath: IndexPath?) -> Future { return Future { promise in guard let diffableDataSource = self.viewModel.diffableDataSource else { assertionFailure() promise(.success(nil)) return } guard let indexPath = indexPath ?? cell.flatMap({ self.tableView.indexPath(for: $0) }), let item = diffableDataSource.itemIdentifier(for: indexPath) else { promise(.success(nil)) return } switch item { case .root(let statusObjectID, _), .reply(let statusObjectID, _), .leaf(let statusObjectID, _): let managedObjectContext = self.viewModel.context.managedObjectContext managedObjectContext.perform { let status = managedObjectContext.object(with: statusObjectID) as? Status promise(.success(status)) } default: promise(.success(nil)) } } } func status(for cell: UICollectionViewCell) -> Future { return Future { promise in promise(.success(nil)) } } var managedObjectContext: NSManagedObjectContext { return viewModel.context.managedObjectContext } var tableViewDiffableDataSource: UITableViewDiffableDataSource? { return viewModel.diffableDataSource } func item(for cell: UITableViewCell?, indexPath: IndexPath?) -> Item? { guard let diffableDataSource = self.viewModel.diffableDataSource else { assertionFailure() return nil } guard let indexPath = indexPath ?? cell.flatMap({ self.tableView.indexPath(for: $0) }), let item = diffableDataSource.itemIdentifier(for: indexPath) else { return nil } return item } func items(indexPaths: [IndexPath]) -> [Item] { guard let diffableDataSource = self.viewModel.diffableDataSource else { assertionFailure() return [] } var items: [Item] = [] for indexPath in indexPaths { guard let item = diffableDataSource.itemIdentifier(for: indexPath) else { continue } items.append(item) } return items } func statusObjectItems(indexPaths: [IndexPath]) -> [StatusObjectItem] { guard let diffableDataSource = self.viewModel.diffableDataSource else { return [] } let items = indexPaths.compactMap { diffableDataSource.itemIdentifier(for: $0)?.statusObjectItem } return items } } extension ThreadViewController: UserProvider {}