mastodon-app-ufficiale-ipho.../MastodonSDK/Sources/MastodonUI/View/Content/ProfileCardView+Configurati...

90 lines
2.9 KiB
Swift

//
// ProfileCardView+Configuration.swift
//
//
// Created by MainasuK on 2022-4-14.
//
import Foundation
import Combine
import CoreDataStack
import Meta
import MastodonMeta
import MastodonSDK
extension ProfileCardView {
public func configure(user: MastodonUser) {
// banner
user.publisher(for: \.header)
.map { URL(string: $0) }
.assign(to: \.authorBannerImageURL, on: viewModel)
.store(in: &disposeBag)
// author avatar
Publishers.CombineLatest3(
user.publisher(for: \.avatar),
user.publisher(for: \.avatarStatic),
UserDefaults.shared.publisher(for: \.preferredStaticAvatar)
)
.map { _ in user.avatarImageURL() }
.assign(to: \.authorAvatarImageURL, on: viewModel)
.store(in: &disposeBag)
// name
Publishers.CombineLatest(
user.publisher(for: \.displayName),
user.publisher(for: \.emojis)
)
.map { _, emojis in
do {
let content = MastodonContent(content: user.displayNameWithFallback, emojis: emojis.asDictionary)
let metaContent = try MastodonMetaContent.convert(document: content)
return metaContent
} catch {
assertionFailure(error.localizedDescription)
return PlaintextMetaContent(string: user.displayNameWithFallback)
}
}
.assign(to: \.authorName, on: viewModel)
.store(in: &disposeBag)
// username
user.publisher(for: \.acct)
.map { $0 as String? }
.assign(to: \.authorUsername, on: viewModel)
.store(in: &disposeBag)
// bio
Publishers.CombineLatest(
user.publisher(for: \.note),
user.publisher(for: \.emojis)
)
.map { note, emojis in
guard let note = note else { return nil }
do {
let content = MastodonContent(content: note, emojis: emojis.asDictionary)
let metaContent = try MastodonMetaContent.convert(document: content)
return metaContent
} catch {
assertionFailure(error.localizedDescription)
return nil
}
}
.assign(to: \.bioContent, on: viewModel)
.store(in: &disposeBag)
// relationship
viewModel.relationshipViewModel.user = user
// dashboard
user.publisher(for: \.statusesCount)
.map { Int($0) }
.assign(to: \.statusesCount, on: viewModel)
.store(in: &disposeBag)
user.publisher(for: \.followingCount)
.map { Int($0) }
.assign(to: \.followingCount, on: viewModel)
.store(in: &disposeBag)
user.publisher(for: \.followersCount)
.map { Int($0) }
.assign(to: \.followersCount, on: viewModel)
.store(in: &disposeBag)
}
}