Skip to content

Commit

Permalink
MBL-1029: Refresh Discover page after a user is blocked (#1885)
Browse files Browse the repository at this point in the history
* MBL-1029: Refresh Discover page after a user is blocked

* Add test

* Add .ksr_blockedUser notification to blocking call in ProjectPageViewModel
  • Loading branch information
amy-at-kickstarter committed Nov 16, 2023
1 parent d841813 commit ae907e4
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 2 deletions.
Expand Up @@ -18,6 +18,7 @@ internal final class DiscoveryPageViewController: UITableViewController {

private var configUpdatedObserver: Any?
private var currentEnvironmentChangedObserver: Any?
private var blockedUserObserver: Any?
fileprivate let dataSource = DiscoveryProjectsDataSource()
public weak var delegate: DiscoveryPageViewControllerDelegate?
fileprivate var emptyStatesController: EmptyStatesViewController?
Expand Down Expand Up @@ -77,6 +78,11 @@ internal final class DiscoveryPageViewController: UITableViewController {
self?.viewModel.inputs.configUpdated(config: AppEnvironment.current.config)
})

self.blockedUserObserver = NotificationCenter.default
.addObserver(forName: .ksr_blockedUser, object: nil, queue: nil, using: { [weak self] _ in
self?.viewModel.inputs.blockedUser()
})

let emptyVC = EmptyStatesViewController.configuredWith(emptyState: nil)
self.emptyStatesController = emptyVC
emptyVC.delegate = self
Expand Down
2 changes: 2 additions & 0 deletions Library/Notifications.swift
Expand Up @@ -17,6 +17,7 @@ public enum CurrentUserNotifications {
public static let sessionStarted = "CurrentUserNotifications.sessionStarted"
public static let showNotificationsDialog = "CurrentUserNotifications.showNotificationsDialog"
public static let userUpdated = "CurrentUserNotifications.userUpdated"
public static let blockedUser = "CurrentUserNotifications.blockedUser"
}

public enum AppStateNotifications {
Expand Down Expand Up @@ -61,4 +62,5 @@ extension Notification.Name {
CurrentUserNotifications.localePreferencesChanged
)
public static let ksr_userUpdated = Notification.Name(rawValue: CurrentUserNotifications.userUpdated)
public static let ksr_blockedUser = Notification.Name(rawValue: CurrentUserNotifications.blockedUser)
}
5 changes: 5 additions & 0 deletions Library/ViewModels/CommentRepliesViewModel.swift
Expand Up @@ -250,6 +250,11 @@ public final class CommentRepliesViewModel: CommentRepliesViewModelType,

// TODO: Call blocking GraphQL mutation
self.userBlocked = self.blockUserProperty.signal.map { true }

self.userBlocked.observeValues { didBlock in
guard didBlock == true else { return }
NotificationCenter.default.post(.init(name: .ksr_blockedUser))
}
}

private let blockUserProperty = MutableProperty(())
Expand Down
5 changes: 5 additions & 0 deletions Library/ViewModels/CommentsViewModel.swift
Expand Up @@ -359,6 +359,11 @@ public final class CommentsViewModel: CommentsViewModelType,

// TODO: Call blocking GraphQL mutation
self.userBlocked = self.blockUserProperty.signal.map { true }

self.userBlocked.observeValues { didBlock in
guard didBlock == true else { return }
NotificationCenter.default.post(.init(name: .ksr_blockedUser))
}
}

// Properties to assist with injecting these values into the existing data streams.
Expand Down
11 changes: 10 additions & 1 deletion Library/ViewModels/DiscoveryPageViewModel.swift
Expand Up @@ -14,6 +14,9 @@ public protocol DiscoveryPageViewModelInputs {
/// Call when the current environment has changed
func currentEnvironmentChanged(environment: EnvironmentType)

/// Call when the logged in user has blocked another user
func blockedUser()

/// Call when onboarding has been completed
func onboardingCompleted()

Expand Down Expand Up @@ -174,7 +177,8 @@ public final class DiscoveryPageViewModel: DiscoveryPageViewModelType, Discovery
let requestFirstPageWith = Signal.merge(
firstPageParams,
firstPageParams.takeWhen(environmentChanged),
firstPageParams.takeWhen(self.pulledToRefreshProperty.signal)
firstPageParams.takeWhen(self.pulledToRefreshProperty.signal),
firstPageParams.takeWhen(self.blockedUserProperty.signal)
)

let paginatedProjects: Signal<[Project], Never>
Expand Down Expand Up @@ -378,6 +382,11 @@ public final class DiscoveryPageViewModel: DiscoveryPageViewModelType, Discovery
self.currentEnvironmentChangedProperty.value = environment
}

fileprivate let blockedUserProperty = MutableProperty(())
public func blockedUser() {
self.blockedUserProperty.value = ()
}

fileprivate let onboardingCompletedProperty = MutableProperty(())
public func onboardingCompleted() {
self.onboardingCompletedProperty.value = ()
Expand Down
25 changes: 25 additions & 0 deletions Library/ViewModels/DiscoveryPageViewModelTests.swift
Expand Up @@ -1175,4 +1175,29 @@ internal final class DiscoveryPageViewModelTests: TestCase {

XCTAssertEqual("ending_soon", segmentClientProps?["discover_sort"] as? String)
}

func testBlockedUserNotification_RefreshesProjects() {
let playlist = (0...10).map { idx in .template |> Project.lens.id .~ (idx + 42) }
let projectEnv = .template
|> DiscoveryEnvelope.lens.projects .~ playlist

withEnvironment(apiService: MockService(fetchDiscoveryResponse: projectEnv)) {
self.vm.inputs.configureWith(sort: .magic)
self.vm.inputs.viewWillAppear()
self.vm.inputs.viewDidAppear()
self.vm.inputs.selectedFilter(.defaults)

self.projectsAreLoading.assertValueCount(1)

self.scheduler.advance()

self.projectsAreLoading.assertValueCount(2)

self.vm.inputs.blockedUser()

self.scheduler.advance()

self.projectsAreLoading.assertValueCount(4)
}
}
}
6 changes: 6 additions & 0 deletions Library/ViewModels/MessagesViewModel.swift
@@ -1,3 +1,4 @@
import Foundation
import KsApi
import Prelude
import ReactiveSwift
Expand Down Expand Up @@ -191,6 +192,11 @@ public final class MessagesViewModel: MessagesViewModelType, MessagesViewModelIn

// TODO: Call blocking GraphQL mutation
self.userBlocked = self.blockUserProperty.signal.map { true }

self.userBlocked.observeValues { didBlock in
guard didBlock == true else { return }
NotificationCenter.default.post(.init(name: .ksr_blockedUser))
}
}

private let backingInfoPressedProperty = MutableProperty(())
Expand Down
8 changes: 7 additions & 1 deletion Library/ViewModels/ProjectPageViewModel.swift
Expand Up @@ -502,7 +502,13 @@ public final class ProjectPageViewModel: ProjectPageViewModelType, ProjectPageVi

self.goToURL = self.didSelectCampaignImageLinkProperty.signal.skipNil()

self.userBlocked = self.blockUserProperty.signal.map { false }
// TODO: Call blocking GraphQL mutation
self.userBlocked = self.blockUserProperty.signal.map { true }

self.userBlocked.observeValues { didBlock in
guard didBlock == true else { return }
NotificationCenter.default.post(.init(name: .ksr_blockedUser))
}
}

fileprivate let askAQuestionCellTappedProperty = MutableProperty(())
Expand Down

0 comments on commit ae907e4

Please sign in to comment.