This commit is contained in:
Justin Mazzocchi 2021-01-30 22:30:12 -08:00
parent e62e87510d
commit 8086b0974b
No known key found for this signature in database
GPG key ID: E223E6937AAFB01C
3 changed files with 47 additions and 36 deletions

View file

@ -13,44 +13,21 @@ final class ExploreDataSource: UICollectionViewDiffableDataSource<ExploreViewMod
init(collectionView: UICollectionView, viewModel: ExploreViewModel) { init(collectionView: UICollectionView, viewModel: ExploreViewModel) {
self.collectionView = collectionView self.collectionView = collectionView
let tagRegistration = UICollectionView.CellRegistration<TagCollectionViewCell, TagViewModel> {
$0.viewModel = $2
}
let instanceRegistration = UICollectionView.CellRegistration<InstanceCollectionViewCell, InstanceViewModel> {
$0.viewModel = $2
}
let itemRegistration = UICollectionView.CellRegistration
<SeparatorConfiguredCollectionViewListCell, ExploreViewModel.Item> {
var configuration = $0.defaultContentConfiguration()
switch $2 {
case .profileDirectory:
configuration.text = NSLocalizedString("explore.profile-directory", comment: "")
configuration.image = UIImage(systemName: "person.crop.square.fill.and.at.rectangle")
default:
break
}
$0.contentConfiguration = configuration
$0.accessories = [.disclosureIndicator()]
}
super.init(collectionView: collectionView) { super.init(collectionView: collectionView) {
switch $2 { switch $2 {
case let .tag(tag): case let .tag(tag):
return $0.dequeueConfiguredReusableCell( return $0.dequeueConfiguredReusableCell(
using: tagRegistration, using: Self.tagRegistration,
for: $1, for: $1,
item: viewModel.viewModel(tag: tag)) item: viewModel.viewModel(tag: tag))
case .instance: case .instance:
return $0.dequeueConfiguredReusableCell( return $0.dequeueConfiguredReusableCell(
using: instanceRegistration, using: Self.instanceRegistration,
for: $1, for: $1,
item: viewModel.instanceViewModel) item: viewModel.instanceViewModel)
default: default:
return $0.dequeueConfiguredReusableCell(using: itemRegistration, for: $1, item: $2) return $0.dequeueConfiguredReusableCell(using: Self.itemRegistration, for: $1, item: $2)
} }
} }
@ -78,27 +55,51 @@ final class ExploreDataSource: UICollectionViewDiffableDataSource<ExploreViewMod
} }
private extension ExploreDataSource { private extension ExploreDataSource {
static let tagRegistration = UICollectionView.CellRegistration<TagCollectionViewCell, TagViewModel> {
$0.viewModel = $2
}
static let instanceRegistration = UICollectionView.CellRegistration<InstanceCollectionViewCell, InstanceViewModel> {
$0.viewModel = $2
}
static let itemRegistration = UICollectionView.CellRegistration
<SeparatorConfiguredCollectionViewListCell, ExploreViewModel.Item> {
var configuration = $0.defaultContentConfiguration()
switch $2 {
case .profileDirectory:
configuration.text = NSLocalizedString("explore.profile-directory", comment: "")
configuration.image = UIImage(systemName: "person.crop.square.fill.and.at.rectangle")
default:
break
}
$0.contentConfiguration = configuration
$0.accessories = [.disclosureIndicator()]
}
func update(tags: [Tag], instanceViewModel: InstanceViewModel?) { func update(tags: [Tag], instanceViewModel: InstanceViewModel?) {
var snapshot = NSDiffableDataSourceSnapshot<ExploreViewModel.Section, ExploreViewModel.Item>() var newsnapshot = NSDiffableDataSourceSnapshot<ExploreViewModel.Section, ExploreViewModel.Item>()
if !tags.isEmpty { if !tags.isEmpty {
snapshot.appendSections([.trending]) newsnapshot.appendSections([.trending])
snapshot.appendItems(tags.map(ExploreViewModel.Item.tag), toSection: .trending) newsnapshot.appendItems(tags.map(ExploreViewModel.Item.tag), toSection: .trending)
} }
if let instanceViewModel = instanceViewModel { if let instanceViewModel = instanceViewModel {
snapshot.appendSections([.instance]) newsnapshot.appendSections([.instance])
snapshot.appendItems([.instance], toSection: .instance) newsnapshot.appendItems([.instance], toSection: .instance)
if instanceViewModel.instance.canShowProfileDirectory { if instanceViewModel.instance.canShowProfileDirectory {
snapshot.appendItems([.profileDirectory], toSection: .instance) newsnapshot.appendItems([.profileDirectory], toSection: .instance)
} }
} }
let wasEmpty = self.snapshot().itemIdentifiers.isEmpty let wasEmpty = self.snapshot().itemIdentifiers.isEmpty
let contentOffset = collectionView?.contentOffset let contentOffset = collectionView?.contentOffset
apply(snapshot, animatingDifferences: false) { apply(newsnapshot, animatingDifferences: false) {
if let contentOffset = contentOffset, !wasEmpty { if let contentOffset = contentOffset, !wasEmpty {
self.collectionView?.contentOffset = contentOffset self.collectionView?.contentOffset = contentOffset
} }

View file

@ -246,14 +246,19 @@ private extension CompositionView {
} }
func changeIdentityMenu(identities: [Identity]) -> UIMenu { func changeIdentityMenu(identities: [Identity]) -> UIMenu {
UIMenu(children: identities.map { identity in let processor = RoundCornerImageProcessor(radius: .widthFraction(0.5))
var imageOptions = KingfisherManager.shared.defaultOptions
imageOptions.append(.processor(processor))
return UIMenu(children: identities.map { identity in
UIDeferredMenuElement { completion in UIDeferredMenuElement { completion in
let action = UIAction(title: identity.handle) { [weak self] _ in let action = UIAction(title: identity.handle) { [weak self] _ in
self?.parentViewModel.changeIdentity(identity) self?.parentViewModel.changeIdentity(identity)
} }
if let image = identity.image { if let image = identity.image {
KingfisherManager.shared.retrieveImage(with: image) { KingfisherManager.shared.retrieveImage(with: image, options: imageOptions) {
if case let .success(value) = $0 { if case let .success(value) = $0 {
action.image = value.image action.image = value.image
} }

View file

@ -34,6 +34,11 @@ final class SecondaryNavigationButton: UIBarButtonItem {
} }
.store(in: &cancellables) .store(in: &cancellables)
let processor = RoundCornerImageProcessor(radius: .widthFraction(0.5))
var imageOptions = KingfisherManager.shared.defaultOptions
imageOptions.append(.processor(processor))
viewModel.$recentIdentities.sink { identities in viewModel.$recentIdentities.sink { identities in
button.menu = UIMenu(children: identities.map { identity in button.menu = UIMenu(children: identities.map { identity in
UIDeferredMenuElement { completion in UIDeferredMenuElement { completion in
@ -42,7 +47,7 @@ final class SecondaryNavigationButton: UIBarButtonItem {
} }
if let image = identity.image { if let image = identity.image {
KingfisherManager.shared.retrieveImage(with: image) { KingfisherManager.shared.retrieveImage(with: image, options: imageOptions) {
if case let .success(value) = $0 { if case let .success(value) = $0 {
action.image = value.image action.image = value.image
} }