Skip to content

Commit f52f4bd

Browse files
committed
make Project.Category optional and safely unwrap it
1 parent 5d83da3 commit f52f4bd

11 files changed

+73
-24
lines changed

KsApi/models/Project.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import ReactiveSwift
55
public struct Project {
66
public var availableCardTypes: [String]?
77
public var blurb: String
8-
public var category: Category
8+
public var category: Category?
99
public var country: Country
1010
public var creator: User
1111
public var extendedProjectProperties: ExtendedProjectProperties?

KsApi/models/graphql/adapters/Project+ProjectFragment.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ extension Project {
2525
currency: projectFragment.currency.value
2626
),
2727
let categoryFragment = projectFragment.category?.fragments.categoryFragment,
28-
let category = Project.Category.category(from: categoryFragment),
2928
let dates = projectDates(from: projectFragment),
3029
let memberData = projectMemberData(from: projectFragment),
3130
let photo = projectPhoto(from: projectFragment),
@@ -34,6 +33,11 @@ extension Project {
3433
let creator = User.user(from: userFragment)
3534
else { return nil }
3635

36+
var category: Category?
37+
if let categoryFragment = projectFragment.category?.fragments.categoryFragment {
38+
category = Project.Category.category(from: categoryFragment)
39+
}
40+
3741
var location: Location?
3842
if let locationFragment = projectFragment.location?.fragments.locationFragment {
3943
location = Location.location(from: locationFragment)

KsApi/models/lenses/ProjectLenses.swift

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ extension Project {
104104
) }
105105
)
106106

107-
public static let category = Lens<Project, Project.Category>(
107+
public static let category = Lens<Project, Project.Category?>(
108108
view: { $0.category },
109109
set: { Project(
110110
availableCardTypes: $1.availableCardTypes, blurb: $1.blurb, category: $0, country: $1.country,
@@ -133,6 +133,47 @@ extension Project {
133133
) }
134134
)
135135

136+
public static let categoryName = Lens<Project, String>(
137+
view: { $0.category?.name ?? "" },
138+
set: { newName, project in
139+
let updatedCategory: Project.Category? = project.category.map { category in
140+
Project.Category(id: category.id, name: newName)
141+
}
142+
143+
return Project(
144+
availableCardTypes: project.availableCardTypes,
145+
blurb: project.blurb,
146+
category: updatedCategory,
147+
country: project.country,
148+
creator: project.creator,
149+
extendedProjectProperties: project.extendedProjectProperties,
150+
memberData: project.memberData, dates: project.dates,
151+
displayPrelaunch: project.displayPrelaunch, flagging: project.flagging, id: project.id,
152+
lastWave: project.lastWave,
153+
location: project.location,
154+
name: project.name,
155+
pledgeManager: project.pledgeManager,
156+
pledgeOverTimeCollectionPlanChargeExplanation: project
157+
.pledgeOverTimeCollectionPlanChargeExplanation,
158+
pledgeOverTimeCollectionPlanChargedAsNPayments: project
159+
.pledgeOverTimeCollectionPlanChargedAsNPayments,
160+
pledgeOverTimeCollectionPlanShortPitch: project.pledgeOverTimeCollectionPlanShortPitch,
161+
pledgeOverTimeMinimumExplanation: project.pledgeOverTimeMinimumExplanation,
162+
personalization: project.personalization, photo: project.photo,
163+
isInPostCampaignPledgingPhase: project.isInPostCampaignPledgingPhase,
164+
postCampaignPledgingEnabled: project.postCampaignPledgingEnabled,
165+
prelaunchActivated: project.prelaunchActivated,
166+
redemptionPageUrl: project.redemptionPageUrl,
167+
rewardData: project.rewardData,
168+
sendMetaCapiEvents: project.sendMetaCapiEvents, slug: project.slug,
169+
staffPick: project.staffPick, state: project.state, stats: project.stats, tags: project.tags,
170+
urls: project.urls,
171+
video: project.video, watchesCount: project.watchesCount,
172+
isPledgeOverTimeAllowed: project.isPledgeOverTimeAllowed
173+
)
174+
}
175+
)
176+
136177
public static let country = Lens<Project, Country>(
137178
view: { $0.country },
138179
set: { Project(

KsApi/models/templates/ProjectTemplates.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ extension Project {
7676
|> 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"
7777
|> Project.lens.name .~ "Today"
7878
|> Project.lens.blurb .~ "A 24-hour timepiece beautifully designed to change the way you see your day."
79-
|> \.category.name .~ "Product Design"
79+
|> Project.lens.categoryName .~ "Product Design"
8080
|> Project.lens.stats.backersCount .~ 1_090
8181
|> Project.lens.stats.pledged .~ 212_870
8282
|> Project.lens.stats.goal .~ 24_000
@@ -87,7 +87,7 @@ extension Project {
8787
|> 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"
8888
|> Project.lens.name .~ "Cosmic Surgery"
8989
|> 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."
90-
|> \.category.name .~ "Photo Books"
90+
|> Project.lens.categoryName .~ "Photo Books"
9191
|> Project.lens.stats.backersCount .~ 329
9292
|> Project.lens.stats.pledged .~ 22_318
9393
|> Project.lens.stats.goal .~ 22_000
@@ -114,7 +114,7 @@ extension Project {
114114
|> 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"
115115
|> Project.lens.name .~ "Charlie Kaufman's Anomalisa"
116116
|> Project.lens.blurb .~ "From writer Charlie Kaufman (Being John Malkovich, Eternal Sunshine of the Spotless Mind) and Duke Johnson (Moral Orel, Frankenhole) comes Anomalisa."
117-
|> \.category.name .~ "Animation"
117+
|> Project.lens.categoryName .~ "Animation"
118118
|> Project.lens.stats.backersCount .~ 5_770
119119
|> Project.lens.stats.pledged .~ 406_237
120120
|> Project.lens.stats.goal .~ 200_000

Library/Tracking/ProjectAnalyticsProperties.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ extension Project: HasProjectAnalyticsProperties {
5454

5555
extension Project: ProjectAnalyticsProperties {
5656
public var categoryAnalyticsName: String? {
57-
self.category.analyticsName
57+
self.category?.analyticsName
5858
}
5959

6060
public var categoryParentAnalyticsName: String? {
61-
self.category.parentAnalyticsName
61+
self.category?.parentAnalyticsName
6262
}
6363

6464
public var categoryParentId: String? {
65-
self.category.parentId.flatMap(String.init)
65+
self.category?.parentId.flatMap(String.init)
6666
}
6767

6868
public var countryCode: String {

Library/ViewModels/ActivityFriendBackingViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public final class ActivityFriendBackingViewModel: ActivityFriendBackingViewMode
5252
self.friendTitle = activity
5353
.map { activity in
5454
let stringCategoryId = (
55-
activity.project?.category.parentId ?? activity.project?.category.id
55+
activity.project?.category?.parentId ?? activity.project?.category?.id
5656
)
5757
.map(String.init)
5858

Library/ViewModels/DiscoveryPostcardViewModel.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ private enum PostcardMetadataType {
2929
iconAndTextColor: LegacyColors.ksr_create_700.uiColor()
3030
)
3131
case .featured:
32-
guard let rootCategory = project.category.parentName else { return nil }
32+
guard let rootCategory = project.category?.parentName else { return nil }
3333
return PostcardMetadataData(
3434
iconImage: image(named: "metadata-featured"),
3535
labelText: Strings.discovery_baseball_card_metadata_featured_project(
@@ -224,7 +224,7 @@ public final class DiscoveryPostcardViewModel: DiscoveryPostcardViewModelType,
224224
.map(fundingStatusText(forProject:))
225225

226226
self.projectCategoryName = configuredProject
227-
.map { $0.category.name }
227+
.map { $0.category?.name ?? "" }
228228

229229
self.projectCategoryViewHidden = Signal.combineLatest(
230230
configuredProject,
@@ -235,9 +235,11 @@ public final class DiscoveryPostcardViewModel: DiscoveryPostcardViewModelType,
235235
return false
236236
}
237237

238-
// if we are in a subcategory, compare categories
239-
if !category.isRoot {
240-
return Int(project.category.id) == category.intID
238+
if let projectCategory = project.category {
239+
// if we are in a subcategory, compare categories
240+
if !category.isRoot {
241+
return Int(projectCategory.id) == category.intID
242+
}
241243
}
242244

243245
// otherwise, always show category

Library/ViewModels/DiscoveryProjectCardViewModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ private func projectCategoryTagShouldHide(for project: Project, in category: KsA
171171
return false
172172
}
173173

174-
return project.category.id == category.intID
174+
return project.category?.id == category.intID
175175
}
176176

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

197-
if shouldShowCategoryTag {
197+
if shouldShowCategoryTag, let category = project.category {
198198
let categoryTag = DiscoveryPillData(
199199
imageName: "icon--compass",
200-
text: project.category.name,
200+
text: category.name,
201201
type: .grey
202202
)
203203

Library/ViewModels/ProjectPamphletMainCellProperties.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public struct ProjectPamphletMainCellProperties {
2828
public let displayPrelaunch: Bool?
2929
public let isBacking: Bool?
3030
public let backersCount: Int
31-
public let categoryName: String
31+
public let categoryName: String?
3232
public let locationName: String
3333
public let deadline: TimeInterval?
3434
public let fxRate: Float
@@ -58,7 +58,7 @@ public struct ProjectPamphletMainCellProperties {
5858
displayPrelaunch: Bool?,
5959
isBacking: Bool?,
6060
backersCount: Int,
61-
categoryName: String,
61+
categoryName: String?,
6262
locationName: String,
6363
deadline: TimeInterval?,
6464
fxRate: Float,
@@ -127,7 +127,7 @@ extension Project: HasProjectPamphletMainCellProperties {
127127
displayPrelaunch: self.displayPrelaunch,
128128
isBacking: self.personalization.isBacking,
129129
backersCount: self.stats.backersCount,
130-
categoryName: self.category.name,
130+
categoryName: self.category?.name,
131131
locationName: self.location?.displayableName ?? "",
132132
deadline: self.dates.deadline,
133133
fxRate: self.stats.userCurrencyRate ?? self.stats.staticUsdRate,

Library/ViewModels/ProjectPamphletMainCellViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ public final class ProjectPamphletMainCellViewModel: ProjectPamphletMainCellView
219219
self.backersTitleLabelText = backersTitleAndSubtitleText.map { title, _ in title ?? "" }
220220
self.backersSubtitleLabelText = backersTitleAndSubtitleText.map { _, subtitle in subtitle ?? "" }
221221

222-
self.categoryNameLabelText = properties.map { $0.categoryName }
222+
self.categoryNameLabelText = properties.map { $0.categoryName ?? "" }
223223

224224
let deadlineTitleAndSubtitle = properties.map { properties -> (String, String) in
225225
var durationValue = ("", "")

0 commit comments

Comments
 (0)