mastodon-ios/Mastodon/Scene/Search/Search/SearchViewController+Follow...

111 lines
4.6 KiB
Swift

//
// SearchViewController+Follow.swift
// Mastodon
//
// Created by xiaojian sun on 2021/4/9.
//
import Combine
import CoreDataStack
import Foundation
import UIKit
extension SearchViewController: UserProvider {
func mastodonUser(for cell: UITableViewCell?) -> Future<MastodonUser?, Never> {
return Future { promise in
promise(.success(nil))
}
}
func mastodonUser() -> Future<MastodonUser?, Never> {
Future { promise in
promise(.success(nil))
}
}
}
extension SearchViewController: SearchRecommendAccountsCollectionViewCellDelegate {
func searchRecommendAccountsCollectionViewCell(_ cell: SearchRecommendAccountsCollectionViewCell, followButtonDidPressed button: UIButton) {
guard let diffableDataSource = viewModel.accountDiffableDataSource else { return }
guard let indexPath = accountsCollectionView.indexPath(for: cell),
let item = diffableDataSource.itemIdentifier(for: indexPath) else { return }
context.managedObjectContext.performAndWait {
guard let user = try? context.managedObjectContext.existingObject(with: item) as? MastodonUser else { return }
self.toggleFriendship(for: user)
}
}
func toggleFriendship(for mastodonUser: MastodonUser) {
guard let currentMastodonUser = viewModel.currentMastodonUser.value else {
return
}
guard let relationshipAction = RecommendAccountSection.relationShipActionSet(
mastodonUser: mastodonUser,
currentMastodonUser: currentMastodonUser).highPriorityAction(except: .editOptions)
else { return }
switch relationshipAction {
case .none:
break
case .follow, .following:
UserProviderFacade.toggleUserFollowRelationship(provider: self, mastodonUser: mastodonUser)
.sink { _ in
// error handling
} receiveValue: { _ in
// success
}
.store(in: &disposeBag)
case .pending:
break
case .muting:
let name = mastodonUser.displayNameWithFallback
let alertController = UIAlertController(
title: L10n.Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.title,
message: L10n.Scene.Profile.RelationshipActionAlert.ConfirmUnmuteUser.message(name),
preferredStyle: .alert
)
let unmuteAction = UIAlertAction(title: L10n.Common.Controls.Friendship.unmute, style: .default) { [weak self] _ in
guard let self = self else { return }
UserProviderFacade.toggleUserMuteRelationship(provider: self, mastodonUser: mastodonUser)
.sink { _ in
// do nothing
} receiveValue: { _ in
// do nothing
}
.store(in: &self.context.disposeBag)
}
alertController.addAction(unmuteAction)
let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .cancel, handler: nil)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)
case .blocking:
let name = mastodonUser.displayNameWithFallback
let alertController = UIAlertController(
title: L10n.Scene.Profile.RelationshipActionAlert.ConfirmUnblockUsre.title,
message: L10n.Scene.Profile.RelationshipActionAlert.ConfirmUnblockUsre.message(name),
preferredStyle: .alert
)
let unblockAction = UIAlertAction(title: L10n.Common.Controls.Friendship.unblock, style: .default) { [weak self] _ in
guard let self = self else { return }
UserProviderFacade.toggleUserBlockRelationship(provider: self, mastodonUser: mastodonUser)
.sink { _ in
// do nothing
} receiveValue: { _ in
// do nothing
}
.store(in: &self.context.disposeBag)
}
alertController.addAction(unblockAction)
let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .cancel, handler: nil)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)
case .blocked:
break
default:
assertionFailure()
}
}
}