Skip to content

Commit

Permalink
[MBL-1024] Wire Up Block User Mutation (#1893)
Browse files Browse the repository at this point in the history
  • Loading branch information
scottkicks committed Dec 4, 2023
1 parent 85a4d86 commit 6886cab
Show file tree
Hide file tree
Showing 14 changed files with 405 additions and 111 deletions.
Expand Up @@ -169,26 +169,31 @@ final class CommentRepliesViewController: UITableViewController, MessageBannerVi
}
}

self.viewModel.outputs.userBlocked
self.viewModel.outputs.didBlockUser
.observeForUI()
.observeValues { [weak self] success in
guard let self else { return }
.observeValues { [weak self] _ in
guard let self, let messageBanner = self.messageBannerViewController else { return }

self.commentComposer.isHidden = true
self.delegate?.commentRepliesViewControllerDidBlockUser(self)

if success {
self.messageBannerViewController?
.showBanner(with: .success, message: Strings.Block_user_success())
self.delegate?.commentRepliesViewControllerDidBlockUser(self)
} else {
self.messageBannerViewController?
.showBanner(with: .error, message: Strings.Block_user_fail())
}
messageBanner.showBanner(with: .success, message: Strings.Block_user_success())
}

self.viewModel.outputs.didBlockUserError
.observeForUI()
.observeValues { [weak self] _ in
guard let self, let messageBanner = self.messageBannerViewController else { return }

messageBanner.showBanner(with: .error, message: Strings.Block_user_fail())
}
}

private func presentBlockUserAlert(username: String) {
private func presentBlockUserAlert(username: String, userId: String) {
let alert = UIAlertController
.blockUserAlert(username: username, blockUserHandler: { _ in self.viewModel.inputs.blockUser() })
.blockUserAlert(username: username, blockUserHandler: { _ in
self.viewModel.inputs.blockUser(id: userId)
})
self.present(alert, animated: true)
}

Expand All @@ -198,7 +203,7 @@ final class CommentRepliesViewController: UITableViewController, MessageBannerVi

let actionSheet = UIAlertController
.blockUserActionSheet(
blockUserHandler: { _ in self.presentBlockUserAlert(username: author.name) },
blockUserHandler: { _ in self.presentBlockUserAlert(username: author.name, userId: author.id) },
sourceView: cell,
isIPad: self.traitCollection.horizontalSizeClass == .regular
)
Expand Down
Expand Up @@ -183,24 +183,29 @@ internal final class CommentsViewController: UITableViewController, MessageBanne
self?.presentHelpWebViewController(with: helpType)
}

self.viewModel.outputs.userBlocked
self.viewModel.outputs.didBlockUser
.observeForUI()
.observeValues { [weak self] success in
self?.commentComposer.isHidden = true

if success {
self?.messageBannerViewController?
.showBanner(with: .success, message: Strings.Block_user_success())
} else {
self?.messageBannerViewController?
.showBanner(with: .error, message: Strings.Block_user_fail())
}
.observeValues { [weak self] _ in
guard let self, let messageBanner = self.messageBannerViewController else { return }

self.commentComposer.isHidden = true
messageBanner.showBanner(with: .success, message: Strings.Block_user_success())
}

self.viewModel.outputs.didBlockUserError
.observeForUI()
.observeValues { [weak self] _ in
guard let self, let messageBanner = self.messageBannerViewController else { return }

messageBanner.showBanner(with: .error, message: Strings.Block_user_fail())
}
}

private func presentBlockUserAlert(username: String) {
private func presentBlockUserAlert(username: String, userId: String) {
let alert = UIAlertController
.blockUserAlert(username: username, blockUserHandler: { _ in self.viewModel.inputs.blockUser() })
.blockUserAlert(username: username, blockUserHandler: { _ in
self.viewModel.inputs.blockUser(id: userId)
})
self.present(alert, animated: true)
}

Expand Down Expand Up @@ -268,7 +273,7 @@ extension CommentsViewController: CommentCellDelegate {

let actionSheet = UIAlertController
.blockUserActionSheet(
blockUserHandler: { _ in self.presentBlockUserAlert(username: author.name) },
blockUserHandler: { _ in self.presentBlockUserAlert(username: author.name, userId: author.id) },
sourceView: cell,
isIPad: self.traitCollection.horizontalSizeClass == .regular
)
Expand Down
Expand Up @@ -116,15 +116,18 @@ internal final class MessagesViewController: UITableViewController, MessageBanne

self.viewModel.outputs.didBlockUser
.observeForUI()
.observeValues { [weak self] success in

if success {
self?.messageBannerViewController?
.showBanner(with: .success, message: Strings.Block_user_success())
} else {
self?.messageBannerViewController?
.showBanner(with: .error, message: Strings.Block_user_fail())
}
.observeValues { [weak self] _ in
guard let self, let messageBanner = self.messageBannerViewController else { return }

messageBanner.showBanner(with: .success, message: Strings.Block_user_success())
}

self.viewModel.outputs.didBlockUserError
.observeForUI()
.observeValues { [weak self] _ in
guard let self, let messageBanner = self.messageBannerViewController else { return }

messageBanner.showBanner(with: .error, message: Strings.Block_user_fail())
}
}

Expand Down Expand Up @@ -189,9 +192,11 @@ internal final class MessagesViewController: UITableViewController, MessageBanne
}
}

private func presentBlockUserAlert(username: String) {
private func presentBlockUserAlert(username: String, userId: Int) {
let alert = UIAlertController
.blockUserAlert(username: username, blockUserHandler: { _ in self.viewModel.inputs.blockUser() })
.blockUserAlert(username: username, blockUserHandler: { _ in
self.viewModel.inputs.blockUser(id: "\(userId)")
})
self.present(alert, animated: true)
}
}
Expand Down Expand Up @@ -222,7 +227,7 @@ extension MessagesViewController: MessageCellDelegate {

let actionSheet = UIAlertController
.blockUserActionSheet(
blockUserHandler: { _ in self.presentBlockUserAlert(username: user.name) },
blockUserHandler: { _ in self.presentBlockUserAlert(username: user.name, userId: user.id) },
sourceView: cell,
isIPad: self.traitCollection.horizontalSizeClass == .regular
)
Expand Down
Expand Up @@ -537,16 +537,20 @@ public final class ProjectPageViewController: UIViewController, MessageBannerVie
// TODO: Use this flag to hide or show the Report this project label [MBL-983](https://kickstarter.atlassian.net/browse/MBL-983)
}

self.viewModel.outputs.userBlocked
self.viewModel.outputs.didBlockUser
.observeForUI()
.observeValues { [weak self] success in
if success {
self?.messageBannerViewController?
.showBanner(with: .success, message: Strings.Block_user_success())
} else {
self?.messageBannerViewController?
.showBanner(with: .error, message: Strings.Block_user_fail())
}
.observeValues { [weak self] _ in
guard let self, let messageBanner = self.messageBannerViewController else { return }

messageBanner.showBanner(with: .success, message: Strings.Block_user_success())
}

self.viewModel.outputs.didBlockUserError
.observeForUI()
.observeValues { [weak self] _ in
guard let self, let messageBanner = self.messageBannerViewController else { return }

messageBanner.showBanner(with: .error, message: Strings.Block_user_fail())
}
}

Expand Down Expand Up @@ -737,9 +741,12 @@ public final class ProjectPageViewController: UIViewController, MessageBannerVie
}
}

private func presentBlockUserAlert(username: String) {
private func presentBlockUserAlert(username: String, userId: Int) {
let alert = UIAlertController
.blockUserAlert(username: username, blockUserHandler: { _ in self.viewModel.inputs.blockUser() })
.blockUserAlert(username: username, blockUserHandler: { _ in
self.viewModel.inputs.blockUser(id: userId)
})

self.present(alert, animated: true)
}

Expand Down Expand Up @@ -996,7 +1003,9 @@ extension ProjectPageViewController: ProjectPamphletMainCellDelegate {

let actionSheet = UIAlertController
.blockUserActionSheet(
blockUserHandler: { _ in self.presentBlockUserAlert(username: project.creator.name) },
blockUserHandler: { _ in
self.presentBlockUserAlert(username: project.creator.name, userId: project.creator.id)
},
viewProfileHandler: { _ in self.goToCreatorProfile(forProject: project) },
sourceView: cell,
isIPad: self.traitCollection.horizontalSizeClass == .regular
Expand Down
21 changes: 17 additions & 4 deletions KsApi/MockService.swift
Expand Up @@ -19,6 +19,8 @@

fileprivate let addPaymentSheetPaymentSourceResult: Result<CreatePaymentSourceEnvelope, ErrorEnvelope>?

fileprivate let blockUserResult: Result<EmptyResponseEnvelope, ErrorEnvelope>?

fileprivate let cancelBackingResult: Result<EmptyResponseEnvelope, ErrorEnvelope>?

fileprivate let changeCurrencyResult: Result<EmptyResponseEnvelope, ErrorEnvelope>?
Expand Down Expand Up @@ -219,6 +221,7 @@
addNewCreditCardResult: Result<CreatePaymentSourceEnvelope, ErrorEnvelope>? = nil,
addPaymentSheetPaymentSourceResult: Result<CreatePaymentSourceEnvelope, ErrorEnvelope>? = nil,
apolloClient: ApolloClientType? = nil,
blockUserResult: Result<EmptyResponseEnvelope, ErrorEnvelope>? = nil,
cancelBackingResult: Result<EmptyResponseEnvelope, ErrorEnvelope>? = nil,
changeEmailResult: Result<EmptyResponseEnvelope, ErrorEnvelope>? = nil,
changePasswordResult: Result<EmptyResponseEnvelope, ErrorEnvelope>? = nil,
Expand Down Expand Up @@ -332,6 +335,8 @@

self.apolloClient = apolloClient ?? MockGraphQLClient.shared.client

self.blockUserResult = blockUserResult

self.cancelBackingResult = cancelBackingResult

self.changeEmailResult = changeEmailResult
Expand Down Expand Up @@ -543,6 +548,18 @@
return client.performWithResult(mutation: mutation, result: self.addPaymentSheetPaymentSourceResult)
}

public func blockUser(input: BlockUserInput)
-> SignalProducer<EmptyResponseEnvelope, ErrorEnvelope> {
guard let client = self.apolloClient else {
return .empty
}

let mutation = GraphAPI
.BlockUserMutation(input: GraphAPI.BlockUserInput(blockUserId: input.blockUserId))

return client.performWithResult(mutation: mutation, result: self.blockUserResult)
}

public func cancelBacking(input: CancelBackingInput)
-> SignalProducer<EmptyResponseEnvelope, ErrorEnvelope> {
guard let client = self.apolloClient else {
Expand Down Expand Up @@ -1681,10 +1698,6 @@
return SignalProducer(value: self.fetchUpdateResponse)
}

func blockUser(input _: BlockUserInput) -> SignalProducer<EmptyResponseEnvelope, ErrorEnvelope> {
return SignalProducer(value: EmptyResponseEnvelope())
}

internal func previewUrl(forDraft draft: UpdateDraft) -> URL? {
return URL(
string: "https://\(Secrets.Api.Endpoint.production)/projects/\(draft.update.projectId)/updates/"
Expand Down
4 changes: 4 additions & 0 deletions KsApi/mutations/inputs/BlockUserInput.swift
Expand Up @@ -2,4 +2,8 @@ import Foundation

public struct BlockUserInput: GraphMutationInput, Encodable {
let blockUserId: String

public init(blockUserId: String) {
self.blockUserId = blockUserId
}
}
37 changes: 24 additions & 13 deletions Library/ViewModels/CommentRepliesViewModel.swift
Expand Up @@ -6,7 +6,7 @@ import ReactiveSwift

public protocol CommentRepliesViewModelInputs {
/// Call when block user is tapped
func blockUser()
func blockUser(id: String)

/**
Call with the comment and project that we are viewing replies for. `Comment` can be provided to minimize
Expand Down Expand Up @@ -65,8 +65,11 @@ public protocol CommentRepliesViewModelOutputs {
/// Emits when a pagination error has occurred.
var showPaginationErrorState: Signal<(), Never> { get }

/// Emits when a request to block a user has been made
var userBlocked: Signal<Bool, Never> { get }
/// Emits when a block user request is successful.
var didBlockUser: Signal<(), Never> { get }

/// Emits when a block user request fails.
var didBlockUserError: Signal<(), Never> { get }
}

public protocol CommentRepliesViewModelType {
Expand Down Expand Up @@ -248,18 +251,25 @@ public final class CommentRepliesViewModel: CommentRepliesViewModelType,
.skipNil()
.takeWhen(self.dataSourceLoadedProperty.signal)

// TODO: Call blocking GraphQL mutation
self.userBlocked = self.blockUserProperty.signal.map { true }
let blockUserEvent = self.blockUserProperty.signal
.map(BlockUserInput.init(blockUserId:))
.switchMap { input in
AppEnvironment.current.apiService
.blockUser(input: input)
.ksr_delay(AppEnvironment.current.apiDelayInterval, on: AppEnvironment.current.scheduler)
.materialize()
}

self.userBlocked.observeValues { didBlock in
guard didBlock == true else { return }
NotificationCenter.default.post(.init(name: .ksr_blockedUser))
}
self.didBlockUser = blockUserEvent.values().ignoreValues()
.map { _ in NotificationCenter.default.post(.init(name: .ksr_blockedUser)) }

// TODO: Display proper error messaging from the backend
self.didBlockUserError = blockUserEvent.errors().ignoreValues()
}

private let blockUserProperty = MutableProperty(())
public func blockUser() {
self.blockUserProperty.value = ()
private let blockUserProperty = MutableProperty<String>("")
public func blockUser(id: String) {
self.blockUserProperty.value = id
}

private let didSelectCommentProperty = MutableProperty<Comment?>(nil)
Expand Down Expand Up @@ -319,7 +329,8 @@ public final class CommentRepliesViewModel: CommentRepliesViewModelType,
public let resetCommentComposer: Signal<(), Never>
public let scrollToReply: Signal<String, Never>
public let showPaginationErrorState: Signal<(), Never>
public let userBlocked: Signal<Bool, Never>
public var didBlockUser: Signal<(), Never>
public var didBlockUserError: Signal<(), Never>

public var inputs: CommentRepliesViewModelInputs { return self }
public var outputs: CommentRepliesViewModelOutputs { return self }
Expand Down

0 comments on commit 6886cab

Please sign in to comment.