Follow all suggested user accounts (IOS-157)

This commit is contained in:
Nathan Mattes 2023-05-22 11:41:42 +02:00
parent f1777376f4
commit e4578686e3
7 changed files with 47 additions and 89 deletions

View File

@ -439,7 +439,6 @@
DBCC3B30261440A50045B23D /* UITabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCC3B2F261440A50045B23D /* UITabBarController.swift */; }; DBCC3B30261440A50045B23D /* UITabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCC3B2F261440A50045B23D /* UITabBarController.swift */; };
DBCC3B8F26148F7B0045B23D /* CachedProfileViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCC3B8E26148F7B0045B23D /* CachedProfileViewModel.swift */; }; DBCC3B8F26148F7B0045B23D /* CachedProfileViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCC3B8E26148F7B0045B23D /* CachedProfileViewModel.swift */; };
DBD376B2269302A4007FEC24 /* UITableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD376B1269302A4007FEC24 /* UITableViewCell.swift */; }; DBD376B2269302A4007FEC24 /* UITableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD376B1269302A4007FEC24 /* UITableViewCell.swift */; };
DBD5B1F627BCD3D200BD6B38 /* SuggestionAccountTableViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD5B1F527BCD3D200BD6B38 /* SuggestionAccountTableViewCell+ViewModel.swift */; };
DBD5B1F827BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD5B1F727BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift */; }; DBD5B1F827BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD5B1F727BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift */; };
DBD5B1FA27BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD5B1F927BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift */; }; DBD5B1FA27BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD5B1F927BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift */; };
DBDFF1902805543100557A48 /* DiscoveryPostsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBDFF18F2805543100557A48 /* DiscoveryPostsViewController.swift */; }; DBDFF1902805543100557A48 /* DiscoveryPostsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBDFF18F2805543100557A48 /* DiscoveryPostsViewController.swift */; };
@ -1164,7 +1163,6 @@
DBCC3B2F261440A50045B23D /* UITabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITabBarController.swift; sourceTree = "<group>"; }; DBCC3B2F261440A50045B23D /* UITabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITabBarController.swift; sourceTree = "<group>"; };
DBCC3B8E26148F7B0045B23D /* CachedProfileViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedProfileViewModel.swift; sourceTree = "<group>"; }; DBCC3B8E26148F7B0045B23D /* CachedProfileViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedProfileViewModel.swift; sourceTree = "<group>"; };
DBD376B1269302A4007FEC24 /* UITableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewCell.swift; sourceTree = "<group>"; }; DBD376B1269302A4007FEC24 /* UITableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewCell.swift; sourceTree = "<group>"; };
DBD5B1F527BCD3D200BD6B38 /* SuggestionAccountTableViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SuggestionAccountTableViewCell+ViewModel.swift"; sourceTree = "<group>"; };
DBD5B1F727BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceProvider+TableViewControllerNavigateable.swift"; sourceTree = "<group>"; }; DBD5B1F727BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceProvider+TableViewControllerNavigateable.swift"; sourceTree = "<group>"; };
DBD5B1F927BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceProvider+StatusTableViewControllerNavigateable.swift"; sourceTree = "<group>"; }; DBD5B1F927BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceProvider+StatusTableViewControllerNavigateable.swift"; sourceTree = "<group>"; };
DBDFF18F2805543100557A48 /* DiscoveryPostsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryPostsViewController.swift; sourceTree = "<group>"; }; DBDFF18F2805543100557A48 /* DiscoveryPostsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryPostsViewController.swift; sourceTree = "<group>"; };
@ -1615,7 +1613,6 @@
DB4F097826A039B400D62E92 /* Onboarding */, DB4F097826A039B400D62E92 /* Onboarding */,
DB0617F827855B170030EE79 /* User */, DB0617F827855B170030EE79 /* User */,
DB0617F927855B460030EE79 /* Profile */, DB0617F927855B460030EE79 /* Profile */,
DB0FCB892796BE1E006C02E2 /* RecommandAccount */,
DB4F097926A039C400D62E92 /* Status */, DB4F097926A039C400D62E92 /* Status */,
DB65C63527A2AF52008BAC2E /* Report */, DB65C63527A2AF52008BAC2E /* Report */,
DB0617F727855B010030EE79 /* Notification */, DB0617F727855B010030EE79 /* Notification */,
@ -1670,6 +1667,8 @@
2DAC9E36262FC20B0062E1A6 /* SuggestionAccount */ = { 2DAC9E36262FC20B0062E1A6 /* SuggestionAccount */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
2DE0FACD2615F7AD00CDF649 /* RecommendAccountSection.swift */,
DBB45B5F27B50A4F002DC5A7 /* RecommendAccountItem.swift */,
2DAC9E37262FC2320062E1A6 /* SuggestionAccountViewController.swift */, 2DAC9E37262FC2320062E1A6 /* SuggestionAccountViewController.swift */,
2DAC9E3D262FC2400062E1A6 /* SuggestionAccountViewModel.swift */, 2DAC9E3D262FC2400062E1A6 /* SuggestionAccountViewModel.swift */,
DBB45B6127B51112002DC5A7 /* SuggestionAccountViewModel+Diffable.swift */, DBB45B6127B51112002DC5A7 /* SuggestionAccountViewModel+Diffable.swift */,
@ -1682,7 +1681,6 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
2DAC9E45262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift */, 2DAC9E45262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift */,
DBD5B1F527BCD3D200BD6B38 /* SuggestionAccountTableViewCell+ViewModel.swift */,
D8BE30B22A179E26006B8270 /* SuggestionAccountTableViewFooter.swift */, D8BE30B22A179E26006B8270 /* SuggestionAccountTableViewFooter.swift */,
); );
path = "TableView-Components"; path = "TableView-Components";
@ -1921,15 +1919,6 @@
path = View; path = View;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
DB0FCB892796BE1E006C02E2 /* RecommandAccount */ = {
isa = PBXGroup;
children = (
2DE0FACD2615F7AD00CDF649 /* RecommendAccountSection.swift */,
DBB45B5F27B50A4F002DC5A7 /* RecommendAccountItem.swift */,
);
path = RecommandAccount;
sourceTree = "<group>";
};
DB1D187125EF5BBD003F1F23 /* TableView */ = { DB1D187125EF5BBD003F1F23 /* TableView */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -3597,7 +3586,6 @@
DB938F0F2624119800E5B6C1 /* ThreadViewModel+LoadThreadState.swift in Sources */, DB938F0F2624119800E5B6C1 /* ThreadViewModel+LoadThreadState.swift in Sources */,
DB6180F226391CF40018D199 /* MediaPreviewImageViewModel.swift in Sources */, DB6180F226391CF40018D199 /* MediaPreviewImageViewModel.swift in Sources */,
62FD27D12893707600B205C5 /* BookmarkViewController.swift in Sources */, 62FD27D12893707600B205C5 /* BookmarkViewController.swift in Sources */,
DBD5B1F627BCD3D200BD6B38 /* SuggestionAccountTableViewCell+ViewModel.swift in Sources */,
DB63F767279A5EB300455B82 /* NotificationTimelineViewModel.swift in Sources */, DB63F767279A5EB300455B82 /* NotificationTimelineViewModel.swift in Sources */,
2D607AD826242FC500B70763 /* NotificationViewModel.swift in Sources */, 2D607AD826242FC500B70763 /* NotificationViewModel.swift in Sources */,
DB5B54AB2833C12A00DEF8B2 /* RebloggedByViewController.swift in Sources */, DB5B54AB2833C12A00DEF8B2 /* RebloggedByViewController.swift in Sources */,

View File

@ -72,6 +72,12 @@ class SuggestionAccountViewController: UIViewController, NeedsDependency {
tableView.deselectRow(with: transitionCoordinator, animated: animated) tableView.deselectRow(with: transitionCoordinator, animated: animated)
} }
//MARK: - Actions
@objc func doneButtonDidClick(_ sender: UIButton) {
dismiss(animated: true, completion: nil)
}
} }
// MARK: - UITableViewDelegate // MARK: - UITableViewDelegate
@ -106,42 +112,16 @@ extension SuggestionAccountViewController: AuthContextProvider {
var authContext: AuthContext { viewModel.authContext } var authContext: AuthContext { viewModel.authContext }
} }
// MARK: - SuggestionAccountTableViewCellDelegate // MARK: - UserTableViewCellDelegate
extension SuggestionAccountViewController: SuggestionAccountTableViewCellDelegate { extension SuggestionAccountViewController: UserTableViewCellDelegate {}
func suggestionAccountTableViewCell(
_ cell: SuggestionAccountTableViewCell, // MARK: - SuggestionAccountTableViewCellDelegate
friendshipDidPressed button: UIButton extension SuggestionAccountViewController: SuggestionAccountTableViewCellDelegate { }
) {
guard let tableViewDiffableDataSource = viewModel.tableViewDiffableDataSource else { return }
guard let indexPath = tableView.indexPath(for: cell) else { return }
guard let item = tableViewDiffableDataSource.itemIdentifier(for: indexPath) else { return }
switch item {
case .account(let user):
Task { @MainActor in
do {
try await DataSourceFacade.responseToUserFollowAction(
dependency: self,
user: user
)
} catch {
// do noting
}
}
}
}
}
extension SuggestionAccountViewController {
@objc func doneButtonDidClick(_ sender: UIButton) {
dismiss(animated: true, completion: nil)
}
}
extension SuggestionAccountViewController: SuggestionAccountTableViewFooterDelegate { extension SuggestionAccountViewController: SuggestionAccountTableViewFooterDelegate {
func followAll(_ footerView: SuggestionAccountTableViewFooter) { func followAll(_ footerView: SuggestionAccountTableViewFooter) {
// get all five suggested accounts aka user viewModel.followAllSuggestedAccounts(self)
// follow all of them
} }
} }

View File

@ -85,4 +85,20 @@ final class SuggestionAccountViewModel: NSObject {
.store(in: &disposeBag) .store(in: &disposeBag)
} }
func followAllSuggestedAccounts(_ dependency: NeedsDependency & AuthContextProvider ) {
let userRecords = userFetchedResultsController.records.compactMap {
$0.object(in: dependency.context.managedObjectContext)?.asRecord
}
userRecords.forEach { user in
Task {
try? await DataSourceFacade.responseToUserViewButtonAction(
dependency: dependency,
user: user,
buttonState: .follow
)
}
}
}
} }

View File

@ -1,37 +0,0 @@
//
// SuggestionAccountTableViewCell+ViewModel.swift
// Mastodon
//
// Created by MainasuK on 2022-2-16.
//
import UIKit
import Combine
import CoreDataStack
import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonMeta
import Meta
extension SuggestionAccountTableViewCell {
func configure(user: MastodonUser) {
//TODO: Set Delegate
userView.configure(user: user, delegate: nil)
//TODO: Fix Button State
userView.setButtonState(.follow)
let metaContent: MetaContent = {
do {
let mastodonContent = MastodonContent(content: user.note ?? "", emojis: [:])
return try MastodonMetaContent.convert(document: mastodonContent)
} catch {
assertionFailure()
return PlaintextMetaContent(string: user.note ?? "")
}
} ()
bioMetaLabel.configure(content: metaContent)
}
}

View File

@ -16,10 +16,9 @@ import MastodonMeta
import MastodonAsset import MastodonAsset
import MastodonLocalization import MastodonLocalization
import MastodonUI import MastodonUI
import MastodonCore
protocol SuggestionAccountTableViewCellDelegate: AnyObject { protocol SuggestionAccountTableViewCellDelegate: AnyObject, UserViewDelegate {}
func suggestionAccountTableViewCell(_ cell: SuggestionAccountTableViewCell, friendshipDidPressed button: UIButton)
}
final class SuggestionAccountTableViewCell: UITableViewCell { final class SuggestionAccountTableViewCell: UITableViewCell {
@ -80,9 +79,21 @@ final class SuggestionAccountTableViewCell: UITableViewCell {
disposeBag.removeAll() disposeBag.removeAll()
} }
//MARK: - Action func configure(user: MastodonUser) {
userView.configure(user: user, delegate: delegate)
//TODO: Fix Button State
userView.setButtonState(.follow)
@objc private func buttonDidPressed(_ sender: UIButton) { let metaContent: MetaContent = {
delegate?.suggestionAccountTableViewCell(self, friendshipDidPressed: sender) do {
let mastodonContent = MastodonContent(content: user.note ?? "", emojis: [:])
return try MastodonMetaContent.convert(document: mastodonContent)
} catch {
assertionFailure()
return PlaintextMetaContent(string: user.note ?? "")
}
} ()
bioMetaLabel.configure(content: metaContent)
} }
} }