194 lines
6.0 KiB
Swift
194 lines
6.0 KiB
Swift
//
|
|
// DataSourceFacade+Profile.swift
|
|
// Mastodon
|
|
//
|
|
// Created by MainasuK on 2022-1-13.
|
|
//
|
|
|
|
import UIKit
|
|
import CoreDataStack
|
|
import MastodonCore
|
|
import MastodonSDK
|
|
|
|
extension DataSourceFacade {
|
|
|
|
@MainActor
|
|
static func coordinateToProfileScene(
|
|
provider: DataSourceProvider & AuthContextProvider,
|
|
target: StatusTarget,
|
|
status: MastodonStatus
|
|
) async {
|
|
let acct: String
|
|
switch target {
|
|
case .status:
|
|
acct = status.reblog?.entity.account.acct ?? status.entity.account.acct
|
|
case .reblog:
|
|
acct = status.entity.account.acct
|
|
}
|
|
|
|
provider.coordinator.showLoading()
|
|
|
|
let _redirectRecord = try? await Mastodon.API.Account.lookupAccount(
|
|
session: .shared,
|
|
domain: provider.authContext.mastodonAuthenticationBox.domain,
|
|
query: .init(acct: acct),
|
|
authorization: provider.authContext.mastodonAuthenticationBox.userAuthorization
|
|
).singleOutput().value
|
|
|
|
provider.coordinator.hideLoading()
|
|
|
|
guard let redirectRecord = _redirectRecord else {
|
|
assertionFailure()
|
|
return
|
|
}
|
|
await coordinateToProfileScene(
|
|
provider: provider,
|
|
account: redirectRecord
|
|
)
|
|
}
|
|
|
|
@MainActor
|
|
static func coordinateToProfileScene(
|
|
provider: ViewControllerWithDependencies & AuthContextProvider,
|
|
username: String,
|
|
domain: String
|
|
) async {
|
|
provider.coordinator.showLoading()
|
|
|
|
Task {
|
|
do {
|
|
guard let account = try await provider.context.apiService.fetchUser(username: username,
|
|
domain: domain,
|
|
authenticationBox: provider.authContext.mastodonAuthenticationBox) else {
|
|
return provider.coordinator.hideLoading()
|
|
}
|
|
|
|
provider.coordinator.hideLoading()
|
|
|
|
await coordinateToProfileScene(provider: provider, account: account)
|
|
} catch {
|
|
provider.coordinator.hideLoading()
|
|
}
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
static func coordinateToProfileScene(
|
|
provider: ViewControllerWithDependencies & AuthContextProvider,
|
|
domain: String,
|
|
accountID: String
|
|
) async {
|
|
provider.coordinator.showLoading()
|
|
|
|
Task {
|
|
do {
|
|
let account = try await provider.context.apiService.accountInfo(
|
|
domain: domain,
|
|
userID: accountID,
|
|
authorization: provider.authContext.mastodonAuthenticationBox.userAuthorization
|
|
).value
|
|
|
|
provider.coordinator.hideLoading()
|
|
|
|
await coordinateToProfileScene(provider: provider, account: account)
|
|
} catch {
|
|
provider.coordinator.hideLoading()
|
|
}
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
static func coordinateToProfileScene(
|
|
provider: ViewControllerWithDependencies & AuthContextProvider,
|
|
account: Mastodon.Entity.Account
|
|
) {
|
|
|
|
Task { @MainActor in
|
|
|
|
guard let me = provider.authContext.mastodonAuthenticationBox.authentication.account(),
|
|
let relationship = try? await provider.context.apiService.relationship(forAccounts: [account], authenticationBox: provider.authContext.mastodonAuthenticationBox).value.first else { return }
|
|
|
|
let profileViewModel = ProfileViewModel(
|
|
context: provider.context,
|
|
authContext: provider.authContext,
|
|
account: account,
|
|
relationship: relationship,
|
|
me: me
|
|
)
|
|
|
|
_ = provider.coordinator.present(
|
|
scene: .profile(viewModel: profileViewModel),
|
|
from: provider,
|
|
transition: .show
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
extension DataSourceFacade {
|
|
|
|
@MainActor
|
|
static func coordinateToProfileScene(
|
|
provider: DataSourceProvider & AuthContextProvider,
|
|
status: MastodonStatus,
|
|
mention: String, // username,
|
|
userInfo: [AnyHashable: Any]?
|
|
) async {
|
|
let domain = provider.authContext.mastodonAuthenticationBox.domain
|
|
|
|
guard
|
|
let href = userInfo?["href"] as? String,
|
|
let url = URL(string: href)
|
|
else {
|
|
return
|
|
}
|
|
let mentions = status.entity.mentions ?? []
|
|
|
|
guard let mention = mentions.first(where: { $0.url == href }) else {
|
|
_ = provider.coordinator.present(
|
|
scene: .safari(url: url),
|
|
from: provider,
|
|
transition: .safariPresent(animated: true, completion: nil)
|
|
)
|
|
|
|
return
|
|
}
|
|
|
|
await DataSourceFacade.coordinateToProfileScene(provider: provider, domain: domain, accountID: mention.id)
|
|
}
|
|
|
|
}
|
|
|
|
extension DataSourceFacade {
|
|
|
|
struct ProfileActionMenuContext {
|
|
let isMuting: Bool
|
|
let isBlocking: Bool
|
|
let isMyself: Bool
|
|
|
|
let cell: UITableViewCell?
|
|
let sourceView: UIView?
|
|
let barButtonItem: UIBarButtonItem?
|
|
}
|
|
|
|
static func createActivityViewController(
|
|
dependency: NeedsDependency,
|
|
account: Mastodon.Entity.Account
|
|
) -> UIActivityViewController {
|
|
|
|
let activityViewController = UIActivityViewController(
|
|
activityItems: [account.url],
|
|
applicationActivities: [SafariActivity(sceneCoordinator: dependency.coordinator)]
|
|
)
|
|
return activityViewController
|
|
}
|
|
|
|
static func createActivityViewControllerForMastodonUser(status: Status, dependency: NeedsDependency) -> UIActivityViewController {
|
|
let activityViewController = UIActivityViewController(
|
|
activityItems: status.activityItems,
|
|
applicationActivities: [SafariActivity(sceneCoordinator: dependency.coordinator)]
|
|
)
|
|
return activityViewController
|
|
}
|
|
}
|