Fix status deletion not updating data model (IOS-205)

This commit is contained in:
Marcus Kida 2023-12-05 12:28:36 +01:00
parent a4db8a2b90
commit c30fb73922
No known key found for this signature in database
GPG Key ID: 19FF64E08013CA40
22 changed files with 110 additions and 19 deletions

View File

@ -20,13 +20,15 @@ import MastodonSDK
extension DataSourceFacade {
static func responseToDeleteStatus(
dependency: NeedsDependency & AuthContextProvider,
dependency: NeedsDependency & AuthContextProvider & DataSourceProvider,
status: MastodonStatus
) async throws {
_ = try await dependency.context.apiService.deleteStatus(
let deletedStatus = try await dependency.context.apiService.deleteStatus(
status: status,
authenticationBox: dependency.authContext.mastodonAuthenticationBox
)
).value.asMastodonStatus
dependency.delete(status: deletedStatus)
}
}

View File

@ -40,4 +40,5 @@ extension DataSourceItem {
protocol DataSourceProvider: ViewControllerWithDependencies {
func item(from source: DataSourceItem.Source) async -> DataSourceItem?
func update(status: MastodonStatus)
func delete(status: MastodonStatus)
}

View File

@ -27,11 +27,17 @@ extension DiscoveryCommunityViewController: DataSourceProvider {
return nil
}
}
func update(status: MastodonStatus) {
viewModel.statusFetchedResultsController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.statusFetchedResultsController.setRecords(
viewModel.statusFetchedResultsController.records.filter { $0.id != status.id }
)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -27,11 +27,17 @@ extension DiscoveryPostsViewController: DataSourceProvider {
return nil
}
}
func update(status: MastodonStatus) {
viewModel.statusFetchedResultsController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.statusFetchedResultsController.setRecords(
viewModel.statusFetchedResultsController.records.filter { $0.id != status.id }
)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -32,6 +32,10 @@ extension HashtagTimelineViewController: DataSourceProvider {
viewModel.fetchedResultsController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.fetchedResultsController.deleteRecord(status)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -35,11 +35,15 @@ extension HomeTimelineViewController: DataSourceProvider {
return nil
}
}
func update(status: MastodonStatus) {
viewModel.fetchedResultsController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.fetchedResultsController.records = viewModel.fetchedResultsController.records.filter { $0.id != status.id }
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -36,11 +36,15 @@ extension NotificationTimelineViewController: DataSourceProvider {
return nil
}
}
func update(status: MastodonStatus) {
viewModel.feedFetchedResultsController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.feedFetchedResultsController
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -27,11 +27,17 @@ extension BookmarkViewController: DataSourceProvider {
return nil
}
}
func update(status: MastodonStatus) {
viewModel.statusFetchedResultsController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.statusFetchedResultsController.setRecords(
viewModel.statusFetchedResultsController.records.filter { $0.id != status.id }
)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -104,7 +104,11 @@ extension FamiliarFollowersViewController: DataSourceProvider {
}
func update(status: MastodonStatus) {
assertionFailure("Implement not required in this class")
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
}
@MainActor

View File

@ -27,11 +27,17 @@ extension FavoriteViewController: DataSourceProvider {
return nil
}
}
func update(status: MastodonStatus) {
viewModel.statusFetchedResultsController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.statusFetchedResultsController.setRecords(
viewModel.statusFetchedResultsController.records.filter { $0.id != status.id }
)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -153,9 +153,13 @@ extension FollowerListViewController: DataSourceProvider {
return nil
}
}
func update(status: MastodonStatus) {
assertionFailure("Implement not required in this class")
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
}
@MainActor

View File

@ -151,7 +151,11 @@ extension FollowingListViewController: DataSourceProvider {
}
func update(status: MastodonStatus) {
assertionFailure("Implement not required in this class")
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
}
@MainActor

View File

@ -944,11 +944,15 @@ private extension ProfileViewController {
extension ProfileViewController: DataSourceProvider {
func item(from source: DataSourceItem.Source) async -> DataSourceItem? {
assertionFailure("Implement not required in this class")
assertionFailure("Not required")
return nil
}
func update(status: MastodonStatus) {
assertionFailure("Implement not required in this class")
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
}
}

View File

@ -32,6 +32,10 @@ extension UserTimelineViewController: DataSourceProvider {
viewModel.statusFetchedResultsController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.statusFetchedResultsController.deleteRecord(status)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -29,7 +29,11 @@ extension FavoritedByViewController: DataSourceProvider {
}
func update(status: MastodonStatus) {
assertionFailure("Implement not required in this class")
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
}
@MainActor

View File

@ -30,7 +30,11 @@ extension RebloggedByViewController: DataSourceProvider {
}
func update(status: MastodonStatus) {
assertionFailure("Implement not required in this class")
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
}
@MainActor

View File

@ -30,7 +30,11 @@ extension SearchHistoryViewController: DataSourceProvider {
}
func update(status: MastodonStatus) {
assertionFailure("Implement not required in this class")
assertionFailure("Not required")
}
func delete(status: MastodonStatus) {
assertionFailure("Not required")
}
@MainActor

View File

@ -37,6 +37,10 @@ extension SearchResultViewController: DataSourceProvider {
viewModel.statusFetchedResultsController.update(status: status)
}
func delete(status: MastodonStatus) {
viewModel.statusFetchedResultsController.deleteRecord(status)
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -33,6 +33,10 @@ extension ThreadViewController: DataSourceProvider {
viewModel.root = .root(context: .init(status: status))
}
func delete(status: MastodonStatus) {
assertionFailure("Needs implementation")
}
@MainActor
private func indexPath(for cell: UITableViewCell) async -> IndexPath? {
return tableView.indexPath(for: cell)

View File

@ -71,6 +71,10 @@ final public class FeedFetchedResultsController {
}
records = newRecords
}
public func delete(status: MastodonStatus) {
self.records.removeAll { $0.id == status.id }
}
}
private extension FeedFetchedResultsController {

View File

@ -36,6 +36,11 @@ public final class StatusFetchedResultsController {
self.records += records
}
@MainActor
public func deleteRecord(_ record: MastodonStatus) {
self.records = self.records.filter { $0.id != record.id }
}
@MainActor
public func update(status: MastodonStatus) {
var newRecords = Array(records)

View File

@ -49,9 +49,12 @@ extension MastodonStatus: Hashable {
}
public extension Mastodon.Entity.Status {
var asMastodonStatus: MastodonStatus {
.fromEntity(self)
}
var mastodonVisibility: MastodonVisibility? {
guard let visibility = visibility?.rawValue else { return nil }
return MastodonVisibility(rawValue: visibility)
}
}