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-671] Corrected Search State of Prelaunch Cells #1804

Merged
merged 3 commits into from
Mar 27, 2023
Merged
Show file tree
Hide file tree
Changes from all 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 @@ -32,6 +32,9 @@ internal final class BackerDashboardProjectCell: UITableViewCell, ValueCell {
self.projectNameLabel.rac.attributedText = self.viewModel.outputs.projectTitleText
self.projectImageView.rac.ksr_imageUrl = self.viewModel.outputs.photoURL
self.progressBarView.rac.backgroundColor = self.viewModel.outputs.progressBarColor
self.progressBarView.rac.hidden = self.viewModel.outputs.prelaunchProject
self.progressStaticView.rac.hidden = self.viewModel.outputs.prelaunchProject
self.percentFundedLabel.rac.hidden = self.viewModel.outputs.prelaunchProject
self.savedIconImageView.rac.hidden = self.viewModel.outputs.savedIconIsHidden

self.viewModel.outputs.progress
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,40 @@ internal final class SearchViewContollerTests: TestCase {
}
}

func testView_PrelaunchProject_InSearch_Success() {
let project = (1...10).map {
.cosmicSurgery
|> Project.lens.id .~ $0
|> Project.lens.photo.full .~ ""
|> Project.lens.photo.med .~ ""
|> Project.lens.displayPrelaunch .~ true
}

let discoveryResponse = .template
|> DiscoveryEnvelope.lens.projects .~ project

combos(Language.allLanguages, [Device.phone5_8inch, Device.pad])
.forEach { language, device in
withEnvironment(
apiService: MockService(fetchDiscoveryResponse: discoveryResponse), language: language
) {
let controller = Storyboard.Search.instantiate(SearchViewController.self)
controller.viewWillAppear(true)
let (parent, _) = traitControllers(device: device, orientation: .portrait, child: controller)

controller.viewModel.inputs.searchTextChanged("abcdefgh")

self.scheduler.run()

assertSnapshot(
matching: parent.view,
as: .image(perceptualPrecision: 0.98),
named: "lang_\(language)_device_\(device)"
)
}
}
}

func testScrollToTop() {
let controller = ActivitiesViewController.instantiate()

Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ internal final class MostPopularSearchProjectCell: UITableViewCell, ValueCell {
self.progressBarView.rac.backgroundColor = self.viewModel.outputs.progressBarColor
self.projectImageView.rac.ksr_imageUrl = self.viewModel.outputs.projectImageUrl
self.projectNameLabel.rac.attributedText = self.viewModel.outputs.projectName
self.statsStackView.rac.hidden = self.viewModel.outputs.prelaunchProject
self.progressBarView.rac.hidden = self.viewModel.outputs.prelaunchProject
self.metadataIconImageView.rac.hidden = self.viewModel.outputs.prelaunchProject

self.viewModel.outputs.progress
.observeForUI()
Expand Down
30 changes: 29 additions & 1 deletion Library/ViewModels/BackerDashboardProjectCellViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ public protocol BackerDashboardProjectCellViewModelOutputs {

/// Emits a boolean when the saved icon is hidden or not.
var savedIconIsHidden: Signal<Bool, Never> { get }

/// Emits to hide information about pledging when project is prelaunch
var prelaunchProject: Signal<Bool, Never> { get }
}

public protocol BackerDashboardProjectCellViewModelType {
Expand All @@ -57,13 +60,19 @@ public final class BackerDashboardProjectCellViewModel: BackerDashboardProjectCe

self.metadataText = project.map(metadataString(for:))

self.metadataIconIsHidden = project.map { $0.state != .live }
self.metadataIconIsHidden = project.map { project in
guard !isProjectPrelaunch(project) else { return true }

return project.state != .live
}

self.percentFundedText = project.map(percentFundedString(for:))

self.progressBarColor = project.map(progressBarColorForProject)

self.savedIconIsHidden = project.map { $0.personalization.isStarred != .some(true) }

self.prelaunchProject = project.map(isProjectPrelaunch)
}

fileprivate let projectProperty = MutableProperty<Project?>(nil)
Expand All @@ -79,13 +88,16 @@ public final class BackerDashboardProjectCellViewModel: BackerDashboardProjectCe
public let progress: Signal<Float, Never>
public let progressBarColor: Signal<UIColor, Never>
public let projectTitleText: Signal<NSAttributedString, Never>
public let prelaunchProject: Signal<Bool, Never>
public let savedIconIsHidden: Signal<Bool, Never>

public var inputs: BackerDashboardProjectCellViewModelInputs { return self }
public var outputs: BackerDashboardProjectCellViewModelOutputs { return self }
}

private func metadataString(for project: Project) -> String {
guard !isProjectPrelaunch(project) else { return Strings.Coming_soon() }

switch project.state {
case .live:
guard let deadline = project.dates.deadline else {
Expand Down Expand Up @@ -126,6 +138,10 @@ private func progressBarColorForProject(_ project: Project) -> UIColor {
}

private func metadataBackgroundColorForProject(_ project: Project) -> UIColor {
guard !isProjectPrelaunch(project) else {
return .ksr_create_700
}

switch project.state {
case .live, .successful:
return .ksr_create_700
Expand Down Expand Up @@ -163,3 +179,15 @@ private func stateString(for project: Project) -> String {
return ""
}
}

private func isProjectPrelaunch(_ project: Project) -> Bool {
switch (project.displayPrelaunch, project.dates.launchedAt, project.prelaunchActivated) {
case (.some(true), _, _),
(_, _, .some(true)):
return true
case let (_, .some(timeValue), _):
return timeValue <= 0
default:
return false
}
}
16 changes: 16 additions & 0 deletions Library/ViewModels/BackerDashboardProjectCellViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ internal final class BackerDashboardProjectCellViewModelTests: TestCase {

private let metadataIconIsHidden = TestObserver<Bool, Never>()
private let metadataText = TestObserver<String, Never>()
private let prelaunchProject = TestObserver<Bool, Never>()
private let percentFundedText = TestObserver<String, Never>()
private let photoURL = TestObserver<String, Never>()
private let progress = TestObserver<Float, Never>()
Expand All @@ -24,6 +25,7 @@ internal final class BackerDashboardProjectCellViewModelTests: TestCase {
self.vm.outputs.percentFundedText.map { $0.string }.observe(self.percentFundedText.observer)
self.vm.outputs.photoURL.map { $0?.absoluteString ?? "" }.observe(self.photoURL.observer)
self.vm.outputs.progress.observe(self.progress.observer)
self.vm.outputs.prelaunchProject.observe(self.prelaunchProject.observer)
self.vm.outputs.progressBarColor.observe(self.progressBarColor.observer)
self.vm.outputs.projectTitleText.map { $0.string }.observe(self.projectTitleText.observer)
self.vm.outputs.savedIconIsHidden.observe(self.savedIconIsHidden.observer)
Expand Down Expand Up @@ -107,4 +109,18 @@ internal final class BackerDashboardProjectCellViewModelTests: TestCase {
self.projectTitleText.assertValues(["Best of Lazy Bathtub Cat"])
self.savedIconIsHidden.assertValues([false])
}

func testProjectData_Prelaunch() {
let project = .template
|> Project.lens.name .~ "Best of Lazy Bathtub Cat"
|> Project.lens.photo.full .~ "http://www.lazybathtubcat.com/vespa.jpg"
|> Project.lens.displayPrelaunch .~ true
|> Project.lens.personalization.isStarred .~ true

self.prelaunchProject.assertDidNotEmitValue()

self.vm.inputs.configureWith(project: project)

self.prelaunchProject.assertValues([true])
}
}
22 changes: 22 additions & 0 deletions Library/ViewModels/MostPopularSearchProjectCellViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ public protocol MostPopularSearchProjectCellViewModelOutputs {

/// Emits project name to be displayed.
var projectName: Signal<NSAttributedString, Never> { get }

/// Emits to hide information about pledging when project is prelaunch
var prelaunchProject: Signal<Bool, Never> { get }
}

public protocol MostPopularSearchProjectCellViewModelType {
Expand All @@ -48,6 +51,8 @@ public final class MostPopularSearchProjectCellViewModel: MostPopularSearchProje
self.percentFundedText = project.map(percentFundedString(for:))

self.metadataText = project.map(metadataString(for:))

self.prelaunchProject = project.map(isProjectPrelaunch)
}

fileprivate let projectProperty = MutableProperty<Project?>(nil)
Expand All @@ -61,12 +66,27 @@ public final class MostPopularSearchProjectCellViewModel: MostPopularSearchProje
public let progressBarColor: Signal<UIColor, Never>
public let projectImageUrl: Signal<URL?, Never>
public let projectName: Signal<NSAttributedString, Never>
public let prelaunchProject: Signal<Bool, Never>

public var inputs: MostPopularSearchProjectCellViewModelInputs { return self }
public var outputs: MostPopularSearchProjectCellViewModelOutputs { return self }
}

private func isProjectPrelaunch(_ project: Project) -> Bool {
switch (project.displayPrelaunch, project.dates.launchedAt, project.prelaunchActivated) {
case (.some(true), _, _),
(_, _, .some(true)):
return true
case let (_, .some(timeValue), _):
return timeValue <= 0
default:
return false
}
}

private func metadataString(for project: Project) -> String {
guard !isProjectPrelaunch(project) else { return Strings.Coming_soon() }

switch project.state {
case .live:
guard let deadline = project.dates.deadline else {
Expand Down Expand Up @@ -99,6 +119,8 @@ private func percentFundedString(for project: Project) -> NSAttributedString {
}

private func progressBarColorForProject(_ project: Project) -> UIColor {
guard !isProjectPrelaunch(project) else { return .ksr_create_700 }

switch project.state {
case .live, .successful:
return .ksr_create_700
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ internal final class MostPopularSearchProjectCellViewModelTests: TestCase {
private let metadataText = TestObserver<String, Never>()
private let percentFundedText = TestObserver<String, Never>()
private let progress = TestObserver<Float, Never>()
private let prelaunchProject = TestObserver<Bool, Never>()
private let progressBarColor = TestObserver<UIColor, Never>()
private let projectImageUrl = TestObserver<String, Never>()
private let projectName = TestObserver<String, Never>()
Expand All @@ -22,6 +23,7 @@ internal final class MostPopularSearchProjectCellViewModelTests: TestCase {
self.vm.outputs.progressBarColor.observe(self.progressBarColor.observer)
self.vm.outputs.projectImageUrl.map { $0?.absoluteString ?? "" }.observe(self.projectImageUrl.observer)
self.vm.outputs.projectName.map { $0.string }.observe(self.projectName.observer)
self.vm.outputs.prelaunchProject.observe(self.prelaunchProject.observer)
}

func testProjectData_Live() {
Expand Down Expand Up @@ -87,4 +89,18 @@ internal final class MostPopularSearchProjectCellViewModelTests: TestCase {
self.projectImageUrl.assertValues(["http://wwww.cosmicsurgery.com/theproject.jpg"])
self.projectName.assertValues(["Cosmic Surgery"])
}

func testProjectData_Prelaunch() {
let project = .template
|> Project.lens.name .~ "Best of Lazy Bathtub Cat"
|> Project.lens.photo.full .~ "http://www.lazybathtubcat.com/vespa.jpg"
|> Project.lens.displayPrelaunch .~ true
|> Project.lens.personalization.isStarred .~ true

self.prelaunchProject.assertDidNotEmitValue()

self.vm.inputs.configureWith(project: project)

self.prelaunchProject.assertValues([true])
}
}