2022-01-27 14:23:39 +01:00
|
|
|
//
|
|
|
|
// RecommendAccountSection.swift
|
|
|
|
// Mastodon
|
|
|
|
//
|
|
|
|
// Created by sxiaojian on 2021/4/1.
|
|
|
|
//
|
|
|
|
|
|
|
|
import CoreData
|
|
|
|
import CoreDataStack
|
|
|
|
import Foundation
|
|
|
|
import MastodonSDK
|
|
|
|
import UIKit
|
|
|
|
import MetaTextKit
|
|
|
|
import MastodonMeta
|
|
|
|
import Combine
|
|
|
|
|
|
|
|
enum RecommendAccountSection: Equatable, Hashable {
|
|
|
|
case main
|
|
|
|
}
|
|
|
|
|
|
|
|
//extension RecommendAccountSection {
|
|
|
|
// static func collectionViewDiffableDataSource(
|
|
|
|
// for collectionView: UICollectionView,
|
|
|
|
// dependency: NeedsDependency,
|
|
|
|
// delegate: SearchRecommendAccountsCollectionViewCellDelegate,
|
|
|
|
// managedObjectContext: NSManagedObjectContext
|
|
|
|
// ) -> UICollectionViewDiffableDataSource<RecommendAccountSection, NSManagedObjectID> {
|
|
|
|
// UICollectionViewDiffableDataSource(collectionView: collectionView) { [weak delegate] collectionView, indexPath, objectID -> UICollectionViewCell? in
|
|
|
|
// let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: SearchRecommendAccountsCollectionViewCell.self), for: indexPath) as! SearchRecommendAccountsCollectionViewCell
|
|
|
|
// managedObjectContext.performAndWait {
|
|
|
|
// let user = managedObjectContext.object(with: objectID) as! MastodonUser
|
|
|
|
// configure(cell: cell, user: user, dependency: dependency)
|
|
|
|
// }
|
|
|
|
// cell.delegate = delegate
|
|
|
|
// return cell
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// static func configure(
|
|
|
|
// cell: SearchRecommendAccountsCollectionViewCell,
|
|
|
|
// user: MastodonUser,
|
|
|
|
// dependency: NeedsDependency
|
|
|
|
// ) {
|
|
|
|
// configureContent(cell: cell, user: user)
|
|
|
|
//
|
|
|
|
// if let currentMastodonUser = dependency.context.authenticationService.activeMastodonAuthentication.value?.user {
|
|
|
|
// configureFollowButton(with: user, currentMastodonUser: currentMastodonUser, followButton: cell.followButton)
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// Publishers.CombineLatest(
|
|
|
|
// ManagedObjectObserver.observe(object: user).eraseToAnyPublisher().mapError { $0 as Error },
|
|
|
|
// dependency.context.authenticationService.activeMastodonAuthentication.setFailureType(to: Error.self)
|
|
|
|
// )
|
|
|
|
// .receive(on: DispatchQueue.main)
|
|
|
|
// .sink { _ in
|
|
|
|
// // do nothing
|
|
|
|
// } receiveValue: { [weak cell] change, authentication in
|
|
|
|
// guard let cell = cell else { return }
|
|
|
|
// guard case .update(let object) = change.changeType,
|
|
|
|
// let user = object as? MastodonUser else { return }
|
|
|
|
// guard let currentMastodonUser = authentication?.user else { return }
|
|
|
|
//
|
|
|
|
// configureFollowButton(with: user, currentMastodonUser: currentMastodonUser, followButton: cell.followButton)
|
|
|
|
// }
|
|
|
|
// .store(in: &cell.disposeBag)
|
|
|
|
//
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// static func configureContent(
|
|
|
|
// cell: SearchRecommendAccountsCollectionViewCell,
|
|
|
|
// user: MastodonUser
|
|
|
|
// ) {
|
|
|
|
// do {
|
|
|
|
// let mastodonContent = MastodonContent(content: user.displayNameWithFallback, emojis: user.emojis.asDictionary)
|
|
|
|
// let metaContent = try MastodonMetaContent.convert(document: mastodonContent)
|
|
|
|
// cell.displayNameLabel.configure(content: metaContent)
|
|
|
|
// } catch {
|
|
|
|
// let metaContent = PlaintextMetaContent(string: user.displayNameWithFallback)
|
|
|
|
// cell.displayNameLabel.configure(content: metaContent)
|
|
|
|
// }
|
|
|
|
// cell.acctLabel.text = "@" + user.acct
|
|
|
|
// cell.avatarImageView.af.setImage(
|
|
|
|
// withURL: user.avatarImageURLWithFallback(domain: user.domain),
|
|
|
|
// placeholderImage: UIImage.placeholder(color: .systemFill),
|
|
|
|
// imageTransition: .crossDissolve(0.2)
|
|
|
|
// )
|
|
|
|
// cell.headerImageView.af.setImage(
|
|
|
|
// withURL: URL(string: user.header)!,
|
|
|
|
// placeholderImage: UIImage.placeholder(color: .systemFill),
|
|
|
|
// imageTransition: .crossDissolve(0.2)
|
|
|
|
// )
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// static func configureFollowButton(
|
|
|
|
// with mastodonUser: MastodonUser,
|
|
|
|
// currentMastodonUser: MastodonUser,
|
|
|
|
// followButton: HighlightDimmableButton
|
|
|
|
// ) {
|
|
|
|
// let relationshipActionSet = relationShipActionSet(mastodonUser: mastodonUser, currentMastodonUser: currentMastodonUser)
|
|
|
|
// followButton.setTitle(relationshipActionSet.title, for: .normal)
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// static func relationShipActionSet(
|
|
|
|
// mastodonUser: MastodonUser,
|
|
|
|
// currentMastodonUser: MastodonUser
|
|
|
|
// ) -> ProfileViewModel.RelationshipActionOptionSet {
|
|
|
|
// var relationshipActionSet = ProfileViewModel.RelationshipActionOptionSet([.follow])
|
|
|
|
// let isFollowing = mastodonUser.followingBy.flatMap { $0.contains(currentMastodonUser) } ?? false
|
|
|
|
// if isFollowing {
|
|
|
|
// relationshipActionSet.insert(.following)
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// let isPending = mastodonUser.followRequestedBy.flatMap { $0.contains(currentMastodonUser) } ?? false
|
|
|
|
// if isPending {
|
|
|
|
// relationshipActionSet.insert(.pending)
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// let isBlocking = mastodonUser.blockingBy.flatMap { $0.contains(currentMastodonUser) } ?? false
|
|
|
|
// if isBlocking {
|
|
|
|
// relationshipActionSet.insert(.blocking)
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// let isBlockedBy = currentMastodonUser.blockingBy.flatMap { $0.contains(mastodonUser) } ?? false
|
|
|
|
// if isBlockedBy {
|
|
|
|
// relationshipActionSet.insert(.blocked)
|
|
|
|
// }
|
|
|
|
// return relationshipActionSet
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
//}
|
|
|
|
//
|
2022-02-10 12:30:41 +01:00
|
|
|
extension RecommendAccountSection {
|
|
|
|
|
|
|
|
struct Configuration {
|
|
|
|
weak var suggestionAccountTableViewCellDelegate: SuggestionAccountTableViewCellDelegate?
|
|
|
|
}
|
|
|
|
|
|
|
|
static func tableViewDiffableDataSource(
|
|
|
|
tableView: UITableView,
|
|
|
|
context: AppContext,
|
|
|
|
configuration: Configuration
|
|
|
|
) -> UITableViewDiffableDataSource<RecommendAccountSection, RecommendAccountItem> {
|
|
|
|
UITableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, item -> UITableViewCell? in
|
|
|
|
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: SuggestionAccountTableViewCell.self)) as! SuggestionAccountTableViewCell
|
|
|
|
switch item {
|
|
|
|
case .account(let record):
|
|
|
|
context.managedObjectContext.performAndWait {
|
|
|
|
guard let user = record.object(in: context.managedObjectContext) else { return }
|
2022-02-16 10:25:55 +01:00
|
|
|
cell.configure(user: user)
|
2022-02-10 12:30:41 +01:00
|
|
|
}
|
2022-02-16 10:25:55 +01:00
|
|
|
|
|
|
|
context.authenticationService.activeMastodonAuthenticationBox
|
|
|
|
.map { $0 as UserIdentifier? }
|
|
|
|
.assign(to: \.userIdentifier, on: cell.viewModel)
|
|
|
|
.store(in: &cell.disposeBag)
|
|
|
|
cell.delegate = configuration.suggestionAccountTableViewCellDelegate
|
2022-02-10 12:30:41 +01:00
|
|
|
}
|
|
|
|
return cell
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|