Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MBL-1036] Block User Popup + Banner Message #1880

Merged
merged 14 commits into from
Nov 9, 2023
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@
}
}

final class CommentRepliesViewController: UITableViewController {
final class CommentRepliesViewController: UITableViewController, MessageBannerViewControllerPresenting {
// MARK: Properties

private let dataSource = CommentRepliesDataSource()
internal let viewModel: CommentRepliesViewModelType = CommentRepliesViewModel()

public var messageBannerViewController: MessageBannerViewController?

private lazy var commentComposer: CommentComposerView = {
let frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: Layout.Composer.originalHeight)
let view = CommentComposerView(frame: frame)
Expand Down Expand Up @@ -72,6 +74,8 @@

self.navigationItem.title = Strings.Replies()

self.messageBannerViewController = self.configureMessageBannerViewController(on: self)
self.messageBannerViewController?.delegate = self
self.tableView.dataSource = self.dataSource
self.tableView.delegate = self
self.tableView.registerCellClass(CommentCell.self)
Expand Down Expand Up @@ -159,18 +163,35 @@
self?.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
}
}

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

Check warning on line 170 in Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift#L170

Added line #L170 was not covered by tests

if success {
self?.messageBannerViewController?
.showBanner(with: .success, message: "This user has been successfully blocked")
self?.view.isUserInteractionEnabled = false

Check warning on line 175 in Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift#L173-L175

Added lines #L173 - L175 were not covered by tests
scottkicks marked this conversation as resolved.
Show resolved Hide resolved
} else {
self?.messageBannerViewController?
.showBanner(with: .error, message: "Your request did not go through. Try again.")

Check warning on line 178 in Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift#L177-L178

Added lines #L177 - L178 were not covered by tests
}
}
}

private func blockUser() {
// Scott TODO: present popup UI [mbl-1036](https://kickstarter.atlassian.net/browse/MBL-1036)
private func presentBlockUserAlert(username: String) {
let alert = UIAlertController

Check warning on line 184 in Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift#L184

Added line #L184 was not covered by tests
.blockUserAlert(username: username, blockUserHandler: { _ in self.viewModel.inputs.blockUser() })
self.present(alert, animated: true)

Check warning on line 186 in Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift#L186

Added line #L186 was not covered by tests
}

private func handleCommentCellHeaderTapped(in cell: UITableViewCell, _: Comment.Author) {
private func handleCommentCellHeaderTapped(in cell: UITableViewCell, _ author: Comment.Author) {
guard AppEnvironment.current.currentUser != nil, featureBlockUsersEnabled() else { return }

let actionSheet = UIAlertController
.blockUserActionSheet(
blockUserHandler: { _ in self.blockUser() },
blockUserHandler: { _ in self.presentBlockUserAlert(username: author.name) },
sourceView: cell,
isIPad: self.traitCollection.horizontalSizeClass == .regular
)
Expand Down Expand Up @@ -231,6 +252,15 @@
}
}

// MARK: - MessageBannerViewControllerDelegate

extension CommentRepliesViewController: MessageBannerViewControllerDelegate {
func messageBannerViewDidHide(type _: MessageBannerType) {
self.commentComposer.isHidden = false
self.view.isUserInteractionEnabled = true

Check warning on line 260 in Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentRepliesViewController.swift#L259-L260

Added lines #L259 - L260 were not covered by tests
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I took a peek in MessageBannerViewController, and it does already reference self.view.superview, so it might be safe to move isUserInteractionEnabled in there. But that's not a blocker, as previously discussed.

}
}

// MARK: - Styles

private let tableViewStyle: TableViewStyle = { tableView in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
}
}

internal final class CommentsViewController: UITableViewController {
internal final class CommentsViewController: UITableViewController, MessageBannerViewControllerPresenting {
// MARK: - Properties

private lazy var commentComposer: CommentComposerView = {
Expand Down Expand Up @@ -43,6 +43,8 @@
internal let viewModel: CommentsViewModelType = CommentsViewModel()
private let dataSource = CommentsDataSource()

public var messageBannerViewController: MessageBannerViewController?

// MARK: - Accessors

internal static func configuredWith(project: Project? = nil,
Expand All @@ -62,6 +64,8 @@

self.commentComposer.delegate = self

self.messageBannerViewController = self.configureMessageBannerViewController(on: self)
self.messageBannerViewController?.delegate = self
self.tableView.registerCellClass(CommentCell.self)
self.tableView.registerCellClass(CommentPostFailedCell.self)
self.tableView.registerCellClass(CommentRemovedCell.self)
Expand Down Expand Up @@ -177,10 +181,27 @@
.observeValues { [weak self] helpType in
self?.presentHelpWebViewController(with: helpType)
}

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

Check warning on line 189 in Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift#L188-L189

Added lines #L188 - L189 were not covered by tests

if success {
self?.messageBannerViewController?
.showBanner(with: .success, message: "This user has been successfully blocked")

Check warning on line 193 in Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift#L192-L193

Added lines #L192 - L193 were not covered by tests
} else {
self?.messageBannerViewController?
.showBanner(with: .error, message: "Your request did not go through. Try again.")

Check warning on line 196 in Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift#L195-L196

Added lines #L195 - L196 were not covered by tests
}
}
}

private func blockUser() {
// Scott TODO: present popup ui
private func presentBlockUserAlert(username: String) {
let alert = UIAlertController

Check warning on line 202 in Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift#L202

Added line #L202 was not covered by tests
.blockUserAlert(username: username, blockUserHandler: { _ in self.viewModel.inputs.blockUser() })
self.present(alert, animated: true)

Check warning on line 204 in Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift#L204

Added line #L204 was not covered by tests
}

// MARK: - Actions
Expand Down Expand Up @@ -241,12 +262,12 @@
// MARK: - CommentCellDelegate

extension CommentsViewController: CommentCellDelegate {
func commentCellDidTapHeader(_ cell: CommentCell, _: Comment.Author) {
func commentCellDidTapHeader(_ cell: CommentCell, _ author: Comment.Author) {
guard AppEnvironment.current.currentUser != nil, featureBlockUsersEnabled() else { return }

let actionSheet = UIAlertController
.blockUserActionSheet(
blockUserHandler: { _ in self.blockUser() },
blockUserHandler: { _ in self.presentBlockUserAlert(username: author.name) },
sourceView: cell,
isIPad: self.traitCollection.horizontalSizeClass == .regular
)
Expand All @@ -271,6 +292,15 @@
}
}

// MARK: - MessageBannerViewControllerDelegate

extension CommentsViewController: MessageBannerViewControllerDelegate {
func messageBannerViewDidHide(type _: MessageBannerType) {
self.commentComposer.isHidden = false
self.view.isUserInteractionEnabled = true

Check warning on line 300 in Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift#L299-L300

Added lines #L299 - L300 were not covered by tests
}
}

// MARK: - Styles

private let tableViewStyle: TableViewStyle = { tableView in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,22 @@
-> MessageBannerViewController?
}

public protocol MessageBannerViewControllerDelegate: AnyObject {
func messageBannerViewDidHide(type: MessageBannerType)
scottkicks marked this conversation as resolved.
Show resolved Hide resolved
}

public final class MessageBannerViewController: UIViewController, NibLoading {
@IBOutlet fileprivate var backgroundView: UIView!
@IBOutlet fileprivate var iconImageView: UIImageView!
@IBOutlet fileprivate var messageLabel: UILabel!

private var bannerType: MessageBannerType?

internal var bottomConstraint: NSLayoutConstraint?
private let viewModel: MessageBannerViewModelType = MessageBannerViewModel()

weak var delegate: MessageBannerViewControllerDelegate?

struct AnimationConstants {
static let hideDuration: TimeInterval = 0.25
static let showDuration: TimeInterval = 0.3
Expand Down Expand Up @@ -88,6 +96,7 @@
}

public func showBanner(with type: MessageBannerType, message: String) {
self.bannerType = type
self.viewModel.inputs.update(with: (type, message))
self.viewModel.inputs.bannerViewWillShow(true)
}
Expand Down Expand Up @@ -140,6 +149,10 @@
argument: self?.backgroundView
)
}
} else {
if let type = self?.bannerType {
self?.delegate?.messageBannerViewDidHide(type: type)

Check warning on line 154 in Kickstarter-iOS/Features/MessageBanner/Controller/MessageBannerViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/MessageBanner/Controller/MessageBannerViewController.swift#L154

Added line #L154 was not covered by tests
}
}
}
)
Expand Down Expand Up @@ -206,8 +219,7 @@

parentViewController.view.addConstraints([
bottomViewBannerConstraint,
messageBannerView.leftAnchor.constraint(equalTo: parentViewController.view.leftAnchor),
messageBannerView.rightAnchor.constraint(equalTo: parentViewController.view.rightAnchor)
messageBannerView.widthAnchor.constraint(equalTo: parentViewController.view.widthAnchor)
])

return messageBannerViewController
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
import Prelude
import UIKit

internal final class MessagesViewController: UITableViewController {
internal final class MessagesViewController: UITableViewController, MessageBannerViewControllerPresenting {
@IBOutlet fileprivate var replyBarButtonItem: UIBarButtonItem!

fileprivate let viewModel: MessagesViewModelType = MessagesViewModel()
fileprivate let dataSource = MessagesDataSource()

public var messageBannerViewController: MessageBannerViewController?

internal static func configuredWith(messageThread: MessageThread) -> MessagesViewController {
let vc = self.instantiate()
vc.viewModel.inputs.configureWith(data: .left(messageThread))
Expand All @@ -28,6 +30,8 @@
internal override func viewDidLoad() {
super.viewDidLoad()

self.messageBannerViewController = self.configureMessageBannerViewController(on: self)
self.messageBannerViewController?.delegate = self

Check warning on line 34 in Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift#L33-L34

Added lines #L33 - L34 were not covered by tests
self.tableView.rowHeight = UITableView.automaticDimension
self.tableView.dataSource = self.dataSource

Expand Down Expand Up @@ -87,6 +91,20 @@
self.viewModel.outputs.goToBacking
.observeForControllerAction()
.observeValues { [weak self] params in self?.goToBacking(with: params) }

self.viewModel.outputs.userBlocked
.observeForUI()

Check warning on line 96 in Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift#L95-L96

Added lines #L95 - L96 were not covered by tests
.observeValues { [weak self] success in

if success {
self?.messageBannerViewController?
.showBanner(with: .success, message: "This user has been successfully blocked")
self?.view.isUserInteractionEnabled = false

Check warning on line 102 in Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift#L100-L102

Added lines #L100 - L102 were not covered by tests
} else {
self?.messageBannerViewController?
.showBanner(with: .error, message: "Your request did not go through. Try again.")

Check warning on line 105 in Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift#L104-L105

Added lines #L104 - L105 were not covered by tests
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Add a TODO here and for the other banner messages to update them once translated strings are ready

}
}
}

internal override func tableView(_: UITableView, estimatedHeightForRowAt _: IndexPath)
Expand Down Expand Up @@ -144,8 +162,10 @@
self.present(vc, animated: true)
}

private func blockUser() {
// Scott TODO: present popup UI [mbl-1036](https://kickstarter.atlassian.net/browse/MBL-1036)
private func presentBlockUserAlert(username: String) {
let alert = UIAlertController

Check warning on line 166 in Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift#L166

Added line #L166 was not covered by tests
.blockUserAlert(username: username, blockUserHandler: { _ in self.viewModel.inputs.blockUser() })
self.present(alert, animated: true)

Check warning on line 168 in Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift#L168

Added line #L168 was not covered by tests
}
}

Expand All @@ -170,16 +190,26 @@
// MARK: - MessageCellDelegate

extension MessagesViewController: MessageCellDelegate {
func messageCellDidTapHeader(_ cell: MessageCell, _: User) {
func messageCellDidTapHeader(_ cell: MessageCell, _ author: User) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: I don't think author is the right name in this context - just user would be better

guard AppEnvironment.current.currentUser != nil, featureBlockUsersEnabled() else { return }

let actionSheet = UIAlertController
.blockUserActionSheet(
blockUserHandler: { _ in self.blockUser() },
blockUserHandler: { _ in self.presentBlockUserAlert(username: author.name) },
sourceView: cell,
isIPad: self.traitCollection.horizontalSizeClass == .regular
)

self.present(actionSheet, animated: true)
}
}

// MARK: - MessageBannerViewControllerDelegate

extension MessagesViewController: MessageBannerViewControllerDelegate {
func messageBannerViewDidHide(type: MessageBannerType) {
if type == .success {
self.navigationController?.popViewController(animated: true)

Check warning on line 212 in Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/Messages/Controller/MessagesViewController.swift#L212

Added line #L212 was not covered by tests
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
self.configureNavigationSelectorView()

self.messageBannerViewController = self.configureMessageBannerViewController(on: self)
self.messageBannerViewController?.delegate = self
self.tableView.registerCellClass(ProjectFAQsAskAQuestionCell.self)
self.tableView.registerCellClass(ProjectFAQsCell.self)
self.tableView.registerCellClass(ProjectFAQsEmptyStateCell.self)
Expand Down Expand Up @@ -535,6 +536,19 @@
.observeValues { _ in
// 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
.observeForUI()
.observeValues { [weak self] success in
if success {
self?.messageBannerViewController?
.showBanner(with: .success, message: "This user has been successfully blocked")
self?.view.isUserInteractionEnabled = false

Check warning on line 546 in Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift#L544-L546

Added lines #L544 - L546 were not covered by tests
} else {
self?.messageBannerViewController?
.showBanner(with: .error, message: "Your request did not go through. Try again.")

Check warning on line 549 in Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift#L548-L549

Added lines #L548 - L549 were not covered by tests
}
}
}

private func prepareToPlayAudioVideoURL(audioVideoURL: URL,
Expand Down Expand Up @@ -724,8 +738,10 @@
}
}

private func blockUser() {
// Scott TODO: present popup UI [mbl-1036](https://kickstarter.atlassian.net/browse/MBL-1036)
private func presentBlockUserAlert(username: String) {
let alert = UIAlertController

Check warning on line 742 in Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift#L742

Added line #L742 was not covered by tests
.blockUserAlert(username: username, blockUserHandler: { _ in self.viewModel.inputs.blockUser() })
self.present(alert, animated: true)

Check warning on line 744 in Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift#L744

Added line #L744 was not covered by tests
}

private func goToCreatorProfile(forProject project: Project) {
Expand Down Expand Up @@ -981,7 +997,7 @@

let actionSheet = UIAlertController
.blockUserActionSheet(
blockUserHandler: { _ in self.blockUser() },
blockUserHandler: { _ in self.presentBlockUserAlert(username: project.creator.name) },
viewProfileHandler: { _ in self.goToCreatorProfile(forProject: project) },
sourceView: cell,
isIPad: self.traitCollection.horizontalSizeClass == .regular
Expand Down Expand Up @@ -1073,3 +1089,11 @@
})
}
}

extension ProjectPageViewController: MessageBannerViewControllerDelegate {
public func messageBannerViewDidHide(type: MessageBannerType) {
if type == .success {
self.dismiss(animated: true)

Check warning on line 1096 in Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift

View check run for this annotation

Codecov / codecov/patch

Kickstarter-iOS/Features/ProjectPage/Controller/ProjectPageViewController.swift#L1096

Added line #L1096 was not covered by tests
}
}
}