Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion KsApi/models/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import ReactiveSwift
public struct Project {
public var availableCardTypes: [String]?
public var blurb: String
public var category: Category
public var category: Category?
public var country: Country
public var creator: User
public var extendedProjectProperties: ExtendedProjectProperties?
Expand Down
6 changes: 5 additions & 1 deletion KsApi/models/graphql/adapters/Project+ProjectFragment.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ extension Project {
currency: projectFragment.currency.value
),
let categoryFragment = projectFragment.category?.fragments.categoryFragment,
let category = Project.Category.category(from: categoryFragment),
let dates = projectDates(from: projectFragment),
let memberData = projectMemberData(from: projectFragment),
let photo = projectPhoto(from: projectFragment),
Expand All @@ -34,6 +33,11 @@ extension Project {
let creator = User.user(from: userFragment)
else { return nil }

var category: Category?
if let categoryFragment = projectFragment.category?.fragments.categoryFragment {
category = Project.Category.category(from: categoryFragment)
}

var location: Location?
if let locationFragment = projectFragment.location?.fragments.locationFragment {
location = Location.location(from: locationFragment)
Expand Down
43 changes: 42 additions & 1 deletion KsApi/models/lenses/ProjectLenses.swift
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ extension Project {
) }
)

public static let category = Lens<Project, Project.Category>(
public static let category = Lens<Project, Project.Category?>(
view: { $0.category },
set: { Project(
availableCardTypes: $1.availableCardTypes, blurb: $1.blurb, category: $0, country: $1.country,
Expand Down Expand Up @@ -133,6 +133,47 @@ extension Project {
) }
)

public static let categoryName = Lens<Project, String>(
view: { $0.category?.name ?? "" },
set: { newName, project in
let updatedCategory: Project.Category? = project.category.map { category in
Project.Category(id: category.id, name: newName)
}

return Project(
availableCardTypes: project.availableCardTypes,
blurb: project.blurb,
category: updatedCategory,
country: project.country,
creator: project.creator,
extendedProjectProperties: project.extendedProjectProperties,
memberData: project.memberData, dates: project.dates,
displayPrelaunch: project.displayPrelaunch, flagging: project.flagging, id: project.id,
lastWave: project.lastWave,
location: project.location,
name: project.name,
pledgeManager: project.pledgeManager,
pledgeOverTimeCollectionPlanChargeExplanation: project
.pledgeOverTimeCollectionPlanChargeExplanation,
pledgeOverTimeCollectionPlanChargedAsNPayments: project
.pledgeOverTimeCollectionPlanChargedAsNPayments,
pledgeOverTimeCollectionPlanShortPitch: project.pledgeOverTimeCollectionPlanShortPitch,
pledgeOverTimeMinimumExplanation: project.pledgeOverTimeMinimumExplanation,
personalization: project.personalization, photo: project.photo,
isInPostCampaignPledgingPhase: project.isInPostCampaignPledgingPhase,
postCampaignPledgingEnabled: project.postCampaignPledgingEnabled,
prelaunchActivated: project.prelaunchActivated,
redemptionPageUrl: project.redemptionPageUrl,
rewardData: project.rewardData,
sendMetaCapiEvents: project.sendMetaCapiEvents, slug: project.slug,
staffPick: project.staffPick, state: project.state, stats: project.stats, tags: project.tags,
urls: project.urls,
video: project.video, watchesCount: project.watchesCount,
isPledgeOverTimeAllowed: project.isPledgeOverTimeAllowed
)
}
)

public static let country = Lens<Project, Country>(
view: { $0.country },
set: { Project(
Expand Down
6 changes: 3 additions & 3 deletions KsApi/models/templates/ProjectTemplates.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ extension Project {
|> Project.lens.photo.small .~ "https://i.kickstarter.com/assets/012/224/660/847bc4da31e6863e9351bee4e55b8005_original.jpg?fit=pad&height=90&origin=ugc&q=92&width=160&sig=rOHQ6Fif6TxwI%2BL8F9RQY0wUgN%2F4yusD%2FTGXhYW8w%2FQ%3D"
|> Project.lens.name .~ "Today"
|> Project.lens.blurb .~ "A 24-hour timepiece beautifully designed to change the way you see your day."
|> \.category.name .~ "Product Design"
|> Project.lens.categoryName .~ "Product Design"
|> Project.lens.stats.backersCount .~ 1_090
|> Project.lens.stats.pledged .~ 212_870
|> Project.lens.stats.goal .~ 24_000
Expand All @@ -87,7 +87,7 @@ extension Project {
|> Project.lens.photo.small .~ "https://i.kickstarter.com/assets/012/347/230/2eddca8c4a06ecb69b8787b985201b92_original.jpg?fit=contain&origin=ugc&q=92&width=460&sig=ewWbTA9q%2BTNYpB9KQnwXKCfjCJum57sWhpZkp%2FiwHKY%3D"
|> Project.lens.name .~ "Cosmic Surgery"
|> Project.lens.blurb .~ "Cosmic Surgery is a photo book, set in the not too distant future where the world of cosmetic surgery is about to be transformed."
|> \.category.name .~ "Photo Books"
|> Project.lens.categoryName .~ "Photo Books"
|> Project.lens.stats.backersCount .~ 329
|> Project.lens.stats.pledged .~ 22_318
|> Project.lens.stats.goal .~ 22_000
Expand All @@ -114,7 +114,7 @@ extension Project {
|> Project.lens.photo.med .~ "https://i.kickstarter.com/assets/005/055/025/6e0d27710c9ae20d661e2974e99fe239_original.jpg?fit=contain&origin=ugc&q=92&width=460&sig=C05wZhm%2Fm7cw9lbn9H05zOhA8ApoQ%2Bu%2FCAO%2FuGJDMo0%3D"
|> Project.lens.name .~ "Charlie Kaufman's Anomalisa"
|> Project.lens.blurb .~ "From writer Charlie Kaufman (Being John Malkovich, Eternal Sunshine of the Spotless Mind) and Duke Johnson (Moral Orel, Frankenhole) comes Anomalisa."
|> \.category.name .~ "Animation"
|> Project.lens.categoryName .~ "Animation"
|> Project.lens.stats.backersCount .~ 5_770
|> Project.lens.stats.pledged .~ 406_237
|> Project.lens.stats.goal .~ 200_000
Expand Down
10 changes: 8 additions & 2 deletions Library/Tracking/KSRAnalyticsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,10 @@ final class KSRAnalyticsTests: TestCase {
project.stats.percentFunded,
segmentClientProperties?["project_percent_raised"] as? Int
)
XCTAssertEqual(project.category.analyticsName, segmentClientProperties?["project_subcategory"] as? String)
XCTAssertEqual(
project.category?.analyticsName,
segmentClientProperties?["project_subcategory"] as? String
)
XCTAssertEqual("Art", segmentClientProperties?["project_category"] as? String)
XCTAssertEqual(String(project.creator.id), segmentClientProperties?["project_creator_uid"] as? String)
XCTAssertEqual(24 * 15, segmentClientProperties?["project_hours_remaining"] as? Int)
Expand Down Expand Up @@ -451,7 +454,10 @@ final class KSRAnalyticsTests: TestCase {

let segmentClientProperties = segmentClient.properties.last

XCTAssertEqual(project.category.analyticsName, segmentClientProperties?["project_subcategory"] as? String)
XCTAssertEqual(
project.category?.analyticsName,
segmentClientProperties?["project_subcategory"] as? String
)
XCTAssertEqual("Art", segmentClientProperties?["project_category"] as? String)
}

Expand Down
6 changes: 3 additions & 3 deletions Library/Tracking/ProjectAnalyticsProperties.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,15 @@ extension Project: HasProjectAnalyticsProperties {

extension Project: ProjectAnalyticsProperties {
public var categoryAnalyticsName: String? {
self.category.analyticsName
self.category?.analyticsName
}

public var categoryParentAnalyticsName: String? {
self.category.parentAnalyticsName
self.category?.parentAnalyticsName
}

public var categoryParentId: String? {
self.category.parentId.flatMap(String.init)
self.category?.parentId.flatMap(String.init)
}

public var countryCode: String {
Expand Down
2 changes: 1 addition & 1 deletion Library/ViewModels/ActivityFriendBackingViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public final class ActivityFriendBackingViewModel: ActivityFriendBackingViewMode
self.friendTitle = activity
.map { activity in
let stringCategoryId = (
activity.project?.category.parentId ?? activity.project?.category.id
activity.project?.category?.parentId ?? activity.project?.category?.id
)
.map(String.init)

Expand Down
12 changes: 7 additions & 5 deletions Library/ViewModels/DiscoveryPostcardViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ private enum PostcardMetadataType {
iconAndTextColor: LegacyColors.ksr_create_700.uiColor()
)
case .featured:
guard let rootCategory = project.category.parentName else { return nil }
guard let rootCategory = project.category?.parentName else { return nil }
return PostcardMetadataData(
iconImage: image(named: "metadata-featured"),
labelText: Strings.discovery_baseball_card_metadata_featured_project(
Expand Down Expand Up @@ -224,7 +224,7 @@ public final class DiscoveryPostcardViewModel: DiscoveryPostcardViewModelType,
.map(fundingStatusText(forProject:))

self.projectCategoryName = configuredProject
.map { $0.category.name }
.map { $0.category?.name ?? "" }

self.projectCategoryViewHidden = Signal.combineLatest(
configuredProject,
Expand All @@ -235,9 +235,11 @@ public final class DiscoveryPostcardViewModel: DiscoveryPostcardViewModelType,
return false
}

// if we are in a subcategory, compare categories
if !category.isRoot {
return Int(project.category.id) == category.intID
if let projectCategory = project.category {
// if we are in a subcategory, compare categories
if !category.isRoot {
return Int(projectCategory.id) == category.intID
}
}

// otherwise, always show category
Expand Down
7 changes: 3 additions & 4 deletions Library/ViewModels/DiscoveryPostcardViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,8 @@ internal final class DiscoveryPostcardViewModelTests: TestCase {
let backedProject = .template
|> Project.lens.personalization.isBacking .~ true

let featuredProject = Project.template
|> \.category.parentId .~ Project.Category.art.id
|> \.category.parentName .~ Project.Category.art.name
let featuredProject = .template
|> \.category .~ Project.Category.art
|> Project.lens.dates.featuredAt .~ featuredAt

let backedColor: UIColor = LegacyColors.ksr_create_700.uiColor()
Expand Down Expand Up @@ -143,7 +142,7 @@ internal final class DiscoveryPostcardViewModelTests: TestCase {
self.metadataIconTintColor.assertValues([backedColor])

self.vm.inputs.configure(with: (featuredProject, nil, nil))
guard let parentName = featuredProject.category.parentName else { return }
guard let parentName = featuredProject.category?.parentName else { return }
self.metadataLabelText.assertValues(
[
Strings.discovery_baseball_card_metadata_backer(),
Expand Down
6 changes: 3 additions & 3 deletions Library/ViewModels/DiscoveryProjectCardViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ private func projectCategoryTagShouldHide(for project: Project, in category: KsA
return false
}

return project.category.id == category.intID
return project.category?.id == category.intID
}

private func projectPWLTagShouldHide(project: Project) -> Bool {
Expand All @@ -194,10 +194,10 @@ private func projectTags(project: Project, category: KsApi.Category?) -> [Discov
tags.append(pwlTag)
}

if shouldShowCategoryTag {
if shouldShowCategoryTag, let category = project.category {
let categoryTag = DiscoveryPillData(
imageName: "icon--compass",
text: project.category.name,
text: category.name,
type: .grey
)

Expand Down
26 changes: 18 additions & 8 deletions Library/ViewModels/PledgeViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4398,11 +4398,16 @@ final class PledgeViewModelTests: TestCase {
}

func testTrackingEvents_PledgeScreenViewed_LoggedOut() {
let category = Project.Category(
analyticsName: Project.Category.illustration.name,
id: Project.Category.art.id,
name: Project.Category.illustration.name,
parentId: Project.Category.art.id,
parentName: Project.Category.art.name
)

let project = Project.template
|> \.category.analyticsName .~ Project.Category.illustration.name
|> \.category.name .~ Project.Category.illustration.name
|> \.category.parentId .~ Project.Category.art.id
|> \.category.parentName .~ Project.Category.art.name
|> \.category .~ category

let reward = Reward.template

Expand Down Expand Up @@ -4460,11 +4465,16 @@ final class PledgeViewModelTests: TestCase {
)

withEnvironment(currentUser: user, ksrAnalytics: ksrAnalytics) {
let category = Project.Category(
analyticsName: Project.Category.illustration.name,
id: Project.Category.art.id,
name: Project.Category.illustration.name,
parentId: Project.Category.art.id,
parentName: Project.Category.art.name
)

let project = Project.template
|> \.category.name .~ Project.Category.illustration.name
|> \.category.analyticsName .~ Project.Category.illustration.name
|> \.category.parentId .~ Project.Category.art.id
|> \.category.parentName .~ Project.Category.art.name
|> \.category .~ category
|> Project.lens.stats.userCurrency .~ "USD"
|> \.personalization.isStarred .~ true

Expand Down
6 changes: 3 additions & 3 deletions Library/ViewModels/ProjectPamphletMainCellProperties.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public struct ProjectPamphletMainCellProperties {
public let displayPrelaunch: Bool?
public let isBacking: Bool?
public let backersCount: Int
public let categoryName: String
public let categoryName: String?
public let locationName: String
public let deadline: TimeInterval?
public let fxRate: Float
Expand Down Expand Up @@ -58,7 +58,7 @@ public struct ProjectPamphletMainCellProperties {
displayPrelaunch: Bool?,
isBacking: Bool?,
backersCount: Int,
categoryName: String,
categoryName: String?,
locationName: String,
deadline: TimeInterval?,
fxRate: Float,
Expand Down Expand Up @@ -127,7 +127,7 @@ extension Project: HasProjectPamphletMainCellProperties {
displayPrelaunch: self.displayPrelaunch,
isBacking: self.personalization.isBacking,
backersCount: self.stats.backersCount,
categoryName: self.category.name,
categoryName: self.category?.name,
locationName: self.location?.displayableName ?? "",
deadline: self.dates.deadline,
fxRate: self.stats.userCurrencyRate ?? self.stats.staticUsdRate,
Expand Down
2 changes: 1 addition & 1 deletion Library/ViewModels/ProjectPamphletMainCellViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ public final class ProjectPamphletMainCellViewModel: ProjectPamphletMainCellView
self.backersTitleLabelText = backersTitleAndSubtitleText.map { title, _ in title ?? "" }
self.backersSubtitleLabelText = backersTitleAndSubtitleText.map { _, subtitle in subtitle ?? "" }

self.categoryNameLabelText = properties.map { $0.categoryName }
self.categoryNameLabelText = properties.map { $0.categoryName ?? "" }

let deadlineTitleAndSubtitle = properties.map { properties -> (String, String) in
var durationValue = ("", "")
Expand Down
6 changes: 4 additions & 2 deletions Library/ViewModels/ThanksViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public final class ThanksViewModel: ThanksViewModelType, ThanksViewModelInputs,

let shouldShowGamesAlert = project
.map { project in
project.category.rootId == KsApi.Category.gamesId &&
project.category?.rootId == KsApi.Category.gamesId &&
!(AppEnvironment.current.currentUser?.newsletters.games ?? false) &&
!AppEnvironment.current.userDefaults.hasSeenGamesNewsletterPrompt
}
Expand Down Expand Up @@ -138,7 +138,9 @@ public final class ThanksViewModel: ThanksViewModelType, ThanksViewModelInputs,
}

let rootCategory: Signal<KsApi.Category, Never> = project
.map { toBase64($0.category) }
.map { $0.category }
.skipNil()
.map(toBase64)
.flatMap {
AppEnvironment.current.apiService.fetchGraphCategory(id: $0)
.ksr_delay(AppEnvironment.current.apiDelayInterval, on: AppEnvironment.current.scheduler)
Expand Down