diff --git a/KsApi/GraphSchema.swift b/KsApi/GraphSchema.swift index f7e141d97b..8372953e74 100644 --- a/KsApi/GraphSchema.swift +++ b/KsApi/GraphSchema.swift @@ -234,6 +234,12 @@ public enum Query { } public enum Reward { + public enum ShippingRulesExpandedConnection { + public enum Argument { + case locationId(String) + } + } + case amount(NonEmptySet) case backersCount case convertedAmount(NonEmptySet) @@ -250,6 +256,10 @@ public enum Query { case remainingQuantity case shippingPreference case shippingRules(NonEmptySet) + case shippingRulesExpanded( + Set>, + NonEmptySet> + ) case startsAt public enum Item: String { @@ -671,6 +681,7 @@ extension Query.Reward: QueryType { case .remainingQuantity: return "remainingQuantity" case .shippingPreference: return "shippingPreference" case let .shippingRules(fields): return "shippingRules { \(join(fields)) }" + case let .shippingRulesExpanded(args, fields): return "shippingRulesExpanded" + connection(args, fields) case .startsAt: return "startsAt" } } @@ -682,6 +693,14 @@ extension Query.Reward.Item: QueryType { } } +extension Query.Reward.ShippingRulesExpandedConnection.Argument: CustomStringConvertible { + public var description: String { + switch self { + case let .locationId(id): return "forLocation: \"\(id)\"" + } + } +} + extension Query.User.LaunchedProjects: QueryType { public var description: String { switch self { diff --git a/KsApi/models/Location.swift b/KsApi/models/Location.swift index a5806f3a60..9b9bf97b49 100644 --- a/KsApi/models/Location.swift +++ b/KsApi/models/Location.swift @@ -31,3 +31,9 @@ extension Location: Equatable {} public func == (lhs: Location, rhs: Location) -> Bool { return lhs.id == rhs.id } + +extension Location: GraphIDBridging { + public static var modelName: String { + return "Location" + } +} diff --git a/KsApi/models/Money.swift b/KsApi/models/Money.swift index 5697a1f506..c31506300c 100644 --- a/KsApi/models/Money.swift +++ b/KsApi/models/Money.swift @@ -3,8 +3,8 @@ import Prelude public struct Money: Swift.Decodable, Equatable { public var amount: Double - public var currency: CurrencyCode - public var symbol: String + public var currency: CurrencyCode? + public var symbol: String? public enum CurrencyCode: String, CaseIterable, Swift.Decodable, Equatable { case aud = "AUD" @@ -42,8 +42,8 @@ extension Money { } self.amount = amount - self.currency = try values.decode(CurrencyCode.self, forKey: .currency) - self.symbol = try values.decode(String.self, forKey: .symbol) + self.currency = try values.decodeIfPresent(CurrencyCode.self, forKey: .currency) + self.symbol = try values.decodeIfPresent(String.self, forKey: .symbol) } } diff --git a/KsApi/models/Reward.swift b/KsApi/models/Reward.swift index 55b1c93da3..1895f05d9a 100644 --- a/KsApi/models/Reward.swift +++ b/KsApi/models/Reward.swift @@ -18,6 +18,7 @@ public struct Reward { public let rewardsItems: [RewardsItem] public let shipping: Shipping // only v1 public let shippingRules: [ShippingRule]? // only GraphQL + public let shippingRulesExpanded: [ShippingRule]? // only GraphQL public let startsAt: TimeInterval? public let title: String? @@ -29,11 +30,13 @@ public struct Reward { /** Returns the closest matching `ShippingRule` for this `Reward` to `otherShippingRule`. If no match is found `otherShippingRule` is returned, this is to be backward-compatible - with v1 Rewards that do not include the `shippingRules` array. + with v1 Rewards that do not include the `shippingRulesExpanded` array. */ public func shippingRule(matching otherShippingRule: ShippingRule?) -> ShippingRule? { - return self.shippingRules? - .first { shippingRule in shippingRule.location.id == otherShippingRule?.location.id } + return self.shippingRulesExpanded? + .first { shippingRule in + shippingRule.location.id == otherShippingRule?.location.id + } ?? otherShippingRule } @@ -100,6 +103,7 @@ extension Reward: Argo.Decodable { <*> ((json <|| "rewards_items") <|> .success([])) <*> tryDecodable(json) <*> json <||? "shipping_rules" + <*> json <||? "shipping_rules_expanded" <*> json <|? "starts_at" <*> json <|? "title" } diff --git a/KsApi/models/RewardTests.swift b/KsApi/models/RewardTests.swift index ec694fdc5b..eb32b423c8 100644 --- a/KsApi/models/RewardTests.swift +++ b/KsApi/models/RewardTests.swift @@ -204,6 +204,23 @@ final class RewardTests: XCTestCase { XCTAssertEqual(reward.shippingRule(matching: match), shippingRule1) } + func testRewardShippingRuleExpanded_Match() { + let shippingRule1 = ShippingRule.template + |> ShippingRule.lens.cost .~ 5.0 + |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 1) + let shippingRule2 = ShippingRule.template + |> ShippingRule.lens.cost .~ 1.0 + |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 2) + let reward = Reward.template + |> Reward.lens.shippingRulesExpanded .~ [shippingRule1, shippingRule2] + + let match = ShippingRule.template + |> ShippingRule.lens.cost .~ 500.0 + |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 1) + + XCTAssertEqual(reward.shippingRule(matching: match), shippingRule1) + } + func testRewardShippingRule_NoMatch() { let shippingRule1 = ShippingRule.template |> ShippingRule.lens.cost .~ 5.0 @@ -212,7 +229,7 @@ final class RewardTests: XCTestCase { |> ShippingRule.lens.cost .~ 1.0 |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 2) let reward = Reward.template - |> Reward.lens.shippingRules .~ [shippingRule1, shippingRule2] + |> Reward.lens.shippingRulesExpanded .~ [shippingRule1, shippingRule2] let match = ShippingRule.template |> ShippingRule.lens.cost .~ 500.0 diff --git a/KsApi/models/graphql/GraphReward.swift b/KsApi/models/graphql/GraphReward.swift index d538ea3b9b..357a1adf2d 100644 --- a/KsApi/models/graphql/GraphReward.swift +++ b/KsApi/models/graphql/GraphReward.swift @@ -18,6 +18,7 @@ struct GraphReward: Swift.Decodable { var remainingQuantity: Int? var shippingPreference: ShippingPreference? var shippingRules: [ShippingRule]? + var shippingRulesExpanded: ShippingRuleExpanded? var startsAt: TimeInterval? struct Items: Swift.Decodable { @@ -50,6 +51,10 @@ struct GraphReward: Swift.Decodable { var name: String } } + + struct ShippingRuleExpanded: Swift.Decodable { + let nodes: [ShippingRule] + } } extension GraphReward { diff --git a/KsApi/models/graphql/adapters/Reward+GraphReward.swift b/KsApi/models/graphql/adapters/Reward+GraphReward.swift index 8e396001c8..0d0117e5e0 100644 --- a/KsApi/models/graphql/adapters/Reward+GraphReward.swift +++ b/KsApi/models/graphql/adapters/Reward+GraphReward.swift @@ -36,6 +36,7 @@ extension Reward { rewardsItems: rewardItemsData(from: graphReward, with: projectId), shipping: shippingData(from: graphReward), shippingRules: shippingRulesData(from: graphReward), + shippingRulesExpanded: shippingRulesExpandedData(from: graphReward), startsAt: graphReward.startsAt, title: graphReward.name ) @@ -109,3 +110,24 @@ private func shippingRulesData( ) } } + +private func shippingRulesExpandedData( + from graphReward: GraphReward +) -> [ShippingRule]? { + guard let shippingRules = graphReward.shippingRulesExpanded?.nodes else { return nil } + + return shippingRules.compactMap { shippingRule -> ShippingRule? in + guard let locationId = decompose(id: shippingRule.location.id) else { return nil } + return ShippingRule( + cost: shippingRule.cost.amount, + id: decompose(id: shippingRule.id), + location: Location( + country: shippingRule.location.country, + displayableName: shippingRule.location.displayableName, + id: locationId, + localizedName: shippingRule.location.name, + name: shippingRule.location.name + ) + ) + } +} diff --git a/KsApi/models/lenses/RewardLenses.swift b/KsApi/models/lenses/RewardLenses.swift index 246d6bb8ee..31d655470c 100644 --- a/KsApi/models/lenses/RewardLenses.swift +++ b/KsApi/models/lenses/RewardLenses.swift @@ -19,6 +19,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -41,6 +42,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -63,6 +65,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -85,6 +88,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -107,6 +111,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -129,6 +134,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -151,6 +157,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -173,6 +180,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -195,6 +203,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -217,6 +226,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -239,6 +249,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -261,6 +272,7 @@ extension Reward { rewardsItems: $0, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -283,6 +295,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $0, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $1.title ) } @@ -305,6 +318,30 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $0, + shippingRulesExpanded: $1.shippingRulesExpanded, + startsAt: $1.startsAt, + title: $1.title + ) } + ) + + public static let shippingRulesExpanded = Lens( + view: { $0.shippingRulesExpanded }, + set: { Reward( + backersCount: $1.backersCount, + convertedMinimum: $1.convertedMinimum, + description: $1.description, + endsAt: $1.endsAt, + estimatedDeliveryOn: $1.estimatedDeliveryOn, + hasAddOns: $1.hasAddOns, + id: $1.id, + limit: $1.limit, + limitPerBacker: $1.limitPerBacker, + minimum: $1.minimum, + remaining: $1.remaining, + rewardsItems: $1.rewardsItems, + shipping: $1.shipping, + shippingRules: $1.shippingRules, + shippingRulesExpanded: $0, startsAt: $1.startsAt, title: $1.title ) } @@ -327,6 +364,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $0, title: $1.title ) } @@ -349,6 +387,7 @@ extension Reward { rewardsItems: $1.rewardsItems, shipping: $1.shipping, shippingRules: $1.shippingRules, + shippingRulesExpanded: $1.shippingRulesExpanded, startsAt: $1.startsAt, title: $0 ) } diff --git a/KsApi/models/templates/RewardTemplates.swift b/KsApi/models/templates/RewardTemplates.swift index b0ce8c2561..45c049fedc 100644 --- a/KsApi/models/templates/RewardTemplates.swift +++ b/KsApi/models/templates/RewardTemplates.swift @@ -24,6 +24,7 @@ extension Reward { type: nil ), shippingRules: nil, + shippingRulesExpanded: nil, startsAt: nil, title: "My Reward" ) @@ -49,6 +50,7 @@ extension Reward { type: nil ), shippingRules: nil, + shippingRulesExpanded: nil, startsAt: nil, title: nil ) @@ -74,6 +76,7 @@ extension Reward { type: nil ), shippingRules: nil, + shippingRulesExpanded: nil, startsAt: nil, title: nil ) diff --git a/KsApi/models/templates/graphql/GraphRewardTemplates.swift b/KsApi/models/templates/graphql/GraphRewardTemplates.swift index 3ec31b5f86..bf5be6cb4d 100644 --- a/KsApi/models/templates/graphql/GraphRewardTemplates.swift +++ b/KsApi/models/templates/graphql/GraphRewardTemplates.swift @@ -20,6 +20,7 @@ extension GraphReward { remainingQuantity: 10, shippingPreference: .restricted, shippingRules: [.template], + shippingRulesExpanded: ShippingRuleExpanded(nodes: [.template]), startsAt: 1_487_502_131 ) } diff --git a/KsApi/queries/RewardAddOnSelectionViewQueries.swift b/KsApi/queries/RewardAddOnSelectionViewQueries.swift index 4d9fffe31b..a9ffd00351 100644 --- a/KsApi/queries/RewardAddOnSelectionViewQueries.swift +++ b/KsApi/queries/RewardAddOnSelectionViewQueries.swift @@ -1,9 +1,19 @@ import Prelude -public func rewardAddOnSelectionViewAddOnsQuery(withProjectSlug slug: String) -> NonEmptySet { +public func rewardAddOnSelectionViewAddOnsQuery(withProjectSlug slug: String, + andGraphId id: String?) -> NonEmptySet { return Query.project( slug: slug, GraphProject.baseQueryProperties - .op(Query.Project.addOns([], NonEmptySet(.nodes(GraphReward.baseQueryProperties))) +| []) + .op(Query.Project.addOns( + [], + NonEmptySet(.nodes(GraphReward.baseQueryProperties + .op(NonEmptySet(Query.Reward + .shippingRulesExpanded( + [.arg(.locationId(id ?? ""))], // An empty string will fetch only digital rewards + NonEmptySet(.nodes(.id +| + [.cost(Money.baseQueryProperties), .location(GraphLocation.baseQueryProperties)])) + ))))) + ) +| []) ) +| [] } diff --git a/KsApi/queries/RewardAddOnSelectionViewQueriesTests.swift b/KsApi/queries/RewardAddOnSelectionViewQueriesTests.swift index 54e8a8f8fd..23792b0c67 100644 --- a/KsApi/queries/RewardAddOnSelectionViewQueriesTests.swift +++ b/KsApi/queries/RewardAddOnSelectionViewQueriesTests.swift @@ -3,11 +3,31 @@ import XCTest final class RewardAddOnSelectionViewQueriesTests: XCTestCase { func testRewardAddOnSelectionViewAddOnsQuery() { - let query = Query.build(rewardAddOnSelectionViewAddOnsQuery(withProjectSlug: "project-slug")) + let envelope = RewardAddOnSelectionViewEnvelope.template + guard let graphId = envelope.project.addOns?.nodes.first?.shippingRulesExpanded?.nodes.first?.location.id + else { + XCTFail("ID for location should exist") + return + } + let query = Query + .build(rewardAddOnSelectionViewAddOnsQuery(withProjectSlug: "project-slug", andGraphId: graphId)) // swiftformat:disable wrap let expected = """ - { project(slug: "project-slug") { actions { displayConvertAmount } addOns { nodes { amount { amount currency symbol } backersCount convertedAmount { amount currency symbol } description displayName endsAt estimatedDeliveryOn id isMaxPledge items { nodes { id name } } limit limitPerBacker name remainingQuantity shippingPreference shippingRules { cost { amount currency symbol } id location { country countryName displayableName id name } } startsAt } } backersCount category { id name parentCategory { id name } } country { code name } creator { id imageUrl: imageUrl(blur: false, width: 1024) name uid } currency deadlineAt description fxRate goal { amount currency symbol } image { id url(width: 1024) } isProjectWeLove launchedAt location { country countryName displayableName id name } name pid pledged { amount currency symbol } slug state stateChangedAt url usdExchangeRate } } + { project(slug: "project-slug") { actions { displayConvertAmount } addOns { nodes { amount { amount currency symbol } backersCount convertedAmount { amount currency symbol } description displayName endsAt estimatedDeliveryOn id isMaxPledge items { nodes { id name } } limit limitPerBacker name remainingQuantity shippingPreference shippingRules { cost { amount currency symbol } id location { country countryName displayableName id name } } shippingRulesExpanded(forLocation: "\(graphId)") { nodes { cost { amount currency symbol } id location { country countryName displayableName id name } } } startsAt } } backersCount category { id name parentCategory { id name } } country { code name } creator { id imageUrl: imageUrl(blur: false, width: 1024) name uid } currency deadlineAt description fxRate goal { amount currency symbol } image { id url(width: 1024) } isProjectWeLove launchedAt location { country countryName displayableName id name } name pid pledged { amount currency symbol } slug state stateChangedAt url usdExchangeRate } } + """ + // swiftformat:enable wrap + + XCTAssertEqual(query, expected) + } + + func testRewardAddOnSelectionViewAddOnsQuery_NoGraphId() { + let query = Query + .build(rewardAddOnSelectionViewAddOnsQuery(withProjectSlug: "project-slug", andGraphId: nil)) + + // swiftformat:disable wrap + let expected = """ + { project(slug: "project-slug") { actions { displayConvertAmount } addOns { nodes { amount { amount currency symbol } backersCount convertedAmount { amount currency symbol } description displayName endsAt estimatedDeliveryOn id isMaxPledge items { nodes { id name } } limit limitPerBacker name remainingQuantity shippingPreference shippingRules { cost { amount currency symbol } id location { country countryName displayableName id name } } shippingRulesExpanded(forLocation: "") { nodes { cost { amount currency symbol } id location { country countryName displayableName id name } } } startsAt } } backersCount category { id name parentCategory { id name } } country { code name } creator { id imageUrl: imageUrl(blur: false, width: 1024) name uid } currency deadlineAt description fxRate goal { amount currency symbol } image { id url(width: 1024) } isProjectWeLove launchedAt location { country countryName displayableName id name } name pid pledged { amount currency symbol } slug state stateChangedAt url usdExchangeRate } } """ // swiftformat:enable wrap diff --git a/Library/ViewModels/RewardAddOnSelectionViewModel.swift b/Library/ViewModels/RewardAddOnSelectionViewModel.swift index e76bf66e59..8858d7d545 100644 --- a/Library/ViewModels/RewardAddOnSelectionViewModel.swift +++ b/Library/ViewModels/RewardAddOnSelectionViewModel.swift @@ -87,9 +87,19 @@ public final class RewardAddOnSelectionViewModel: RewardAddOnSelectionViewModelT slug.takeWhen(self.beginRefreshSignal) ) - let projectEvent = fetchAddOnsWithSlug.switchMap { slug in + let shippingRule = Signal.merge( + self.shippingRuleSelectedProperty.signal, + baseReward.filter { reward in !reward.shipping.enabled }.mapConst(nil) + ) + + let slugAndShippingRule = Signal.combineLatest(fetchAddOnsWithSlug, shippingRule) + + let projectEvent = slugAndShippingRule.switchMap { slug, shippingRule in AppEnvironment.current.apiService.fetchRewardAddOnsSelectionViewRewards( - query: rewardAddOnSelectionViewAddOnsQuery(withProjectSlug: slug) + query: rewardAddOnSelectionViewAddOnsQuery( + withProjectSlug: slug, + andGraphId: shippingRule?.location.graphID + ) ) .ksr_delay(AppEnvironment.current.apiDelayInterval, on: AppEnvironment.current.scheduler) .materialize() @@ -99,13 +109,10 @@ public final class RewardAddOnSelectionViewModel: RewardAddOnSelectionViewModelT self.endRefreshing = projectEvent.filter { $0.isTerminating }.ignoreValues() let addOns = projectEvent.values().map(\.rewardData.addOns).skipNil() + let shippingRuleExpanded = projectEvent.values() + .map(\.rewardData.addOns?.first?.shippingRulesExpanded?.first) let requestErrored = projectEvent.map(\.error).map(isNotNil) - let shippingRule = Signal.merge( - self.shippingRuleSelectedProperty.signal, - baseReward.filter { reward in !reward.shipping.enabled }.mapConst(nil) - ) - // Quantities updated as the user selects them, merged with an empty initial value. let updatedSelectedQuantities = Signal.merge( self.rewardAddOnCardViewDidSelectQuantityProperty.signal @@ -153,7 +160,7 @@ public final class RewardAddOnSelectionViewModel: RewardAddOnSelectionViewModelT project, baseReward, context, - shippingRule + shippingRuleExpanded ) let reloadRewardsIntoDataSource = rewardAddOnCardsViewData @@ -209,7 +216,7 @@ public final class RewardAddOnSelectionViewModel: RewardAddOnSelectionViewModelT } } - let selectionChanged = Signal.combineLatest(project, latestSelectedQuantities, shippingRule) + let selectionChanged = Signal.combineLatest(project, latestSelectedQuantities, shippingRuleExpanded) .map(isValid) self.configureContinueCTAViewWithData = Signal.merge( @@ -232,7 +239,7 @@ public final class RewardAddOnSelectionViewModel: RewardAddOnSelectionViewModelT let selectedLocationId = Signal.merge( initialLocationId, - shippingRule.map { $0?.location.id } + shippingRuleExpanded.map { $0?.location.id } ) self.goToPledge = Signal.combineLatest( @@ -346,17 +353,17 @@ private func rewardsData( ) -> [RewardAddOnSelectionDataSourceItem] { let addOnsFilteredByAvailability = addOns.filter { addOnIsAvailable($0, in: project) } - let addOnsFilteredByShippingRule = filteredAddOns( + let addOnsFilteredByExpandedShippingRule = filteredAddOns( addOnsFilteredByAvailability, filteredBy: shippingRule, baseReward: baseReward ) - guard !addOnsFilteredByShippingRule.isEmpty else { + guard !addOnsFilteredByExpandedShippingRule.isEmpty else { return [.emptyState(.addOnsUnavailable)] } - return addOnsFilteredByShippingRule + return addOnsFilteredByExpandedShippingRule .map { reward in RewardAddOnCardViewData( project: project, @@ -405,15 +412,15 @@ private func filteredAddOns( For restricted or unrestricted shipping base rewards, unrestricted shipping or digital-only add-ons are available. */ - let addOnIsDigitalOrUnrestricted = addOn.shipping.preference - .isAny(of: Reward.Shipping.Preference.none, .unrestricted) + let addOnIsDigital = addOn.shipping.preference + .isAny(of: Reward.Shipping.Preference.none) - return addOnIsDigitalOrUnrestricted || addOnReward(addOn, shipsTo: shippingRule?.location.id) + return addOnIsDigital || addOnReward(addOn, shipsTo: shippingRule?.location.id) } } /** - For base rewards that have restricted shipping, only return + For base rewards that have restricted or unrestricted shipping, only return add-ons that can ship to the selected shipping location. */ private func addOnReward( @@ -423,7 +430,7 @@ private func addOnReward( guard let selectedLocationId = locationId else { return false } let addOnShippingLocationIds: Set = Set( - addOn.shippingRules?.map(\.location).map(\.id) ?? [] + addOn.shippingRulesExpanded?.map(\.location).map(\.id) ?? [] ) return addOnShippingLocationIds.contains(selectedLocationId) diff --git a/Library/ViewModels/RewardAddOnSelectionViewModelTests.swift b/Library/ViewModels/RewardAddOnSelectionViewModelTests.swift index 52abee2649..ab2eb8cf65 100644 --- a/Library/ViewModels/RewardAddOnSelectionViewModelTests.swift +++ b/Library/ViewModels/RewardAddOnSelectionViewModelTests.swift @@ -489,7 +489,7 @@ final class RewardAddOnSelectionViewModelTests: TestCase { let shippingAddOn1 = Reward.template |> Reward.lens.id .~ 2 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [ + |> Reward.lens.shippingRulesExpanded .~ [ shippingRule, shippingRule |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 99) ] @@ -497,7 +497,7 @@ final class RewardAddOnSelectionViewModelTests: TestCase { let shippingAddOn2 = Reward.template |> Reward.lens.id .~ 3 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [ + |> Reward.lens.shippingRulesExpanded .~ [ shippingRule, shippingRule |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 99) ] @@ -505,14 +505,14 @@ final class RewardAddOnSelectionViewModelTests: TestCase { let shippingAddOn3 = Reward.template |> Reward.lens.id .~ 4 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [ + |> Reward.lens.shippingRulesExpanded .~ [ shippingRule |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 3) ] let shippingAddOn4 = Reward.template |> Reward.lens.id .~ 5 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [shippingRule] + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let project = Project.template |> Project.lens.rewardData.rewards .~ [reward] @@ -532,7 +532,7 @@ final class RewardAddOnSelectionViewModelTests: TestCase { project: project, reward: reward, context: .pledge, - shippingRule: reward.shippingRules?.first, + shippingRule: reward.shippingRulesExpanded?.first, selectedQuantities: [:] ) } @@ -553,14 +553,16 @@ final class RewardAddOnSelectionViewModelTests: TestCase { self.vm.inputs.configure(with: data) self.vm.inputs.viewDidLoad() - self.scheduler.advance() - self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertDidNotEmitValue( "Nothing is emitted until a shipping location is selected" ) + self.scheduler.advance() + self.vm.inputs.shippingRuleSelected(shippingRule) + self.scheduler.advance() + self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertValues([expected]) XCTAssertEqual( self.loadAddOnRewardsIntoDataSourceAndReloadTableView.values.last?.count, 4, @@ -591,17 +593,17 @@ final class RewardAddOnSelectionViewModelTests: TestCase { let shippingAddOn1 = Reward.template |> Reward.lens.id .~ 2 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [shippingRule] + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let shippingAddOn2 = Reward.template |> Reward.lens.id .~ 3 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [shippingRule] + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let shippingAddOn3 = Reward.template |> Reward.lens.id .~ 4 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [ + |> Reward.lens.shippingRulesExpanded .~ [ shippingRule |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 3) ] @@ -627,7 +629,7 @@ final class RewardAddOnSelectionViewModelTests: TestCase { project: project, reward: reward, context: .pledge, - shippingRule: reward.shippingRules?.first, + shippingRule: reward.shippingRulesExpanded?.first, selectedQuantities: [:] ) } @@ -648,14 +650,16 @@ final class RewardAddOnSelectionViewModelTests: TestCase { self.vm.inputs.configure(with: data) self.vm.inputs.viewDidLoad() - self.scheduler.advance() - self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertDidNotEmitValue( "Nothing is emitted until a shipping location is selected" ) + self.scheduler.advance() + self.vm.inputs.shippingRuleSelected(shippingRule) + self.scheduler.advance() + self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertValues([expected]) XCTAssertEqual( self.loadAddOnRewardsIntoDataSourceAndReloadTableView.values.last?.count, 3, @@ -667,7 +671,7 @@ final class RewardAddOnSelectionViewModelTests: TestCase { } } - func testLoadAddOnRewardsIntoDataSource_RestrictedShippingBaseReward_NoRewardsMatchOnLocation() { + func testLoadAddOnRewardsIntoDataSource_RestrictedShippingBaseReward_MatchBasedOnAddOnLocation() { self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertDidNotEmitValue() let shippingRule = ShippingRule.template @@ -677,33 +681,33 @@ final class RewardAddOnSelectionViewModelTests: TestCase { |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .restricted |> Reward.lens.id .~ 99 - |> Reward.lens.shippingRules .~ [shippingRule] + // The first addOns shippingRulesExpanded value determines what is visible let shippingAddOn1 = Reward.template |> Reward.lens.id .~ 2 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [ + |> Reward.lens.shippingRulesExpanded .~ [ shippingRule |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 99) ] let shippingAddOn2 = Reward.template |> Reward.lens.id .~ 3 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [ + |> Reward.lens.shippingRulesExpanded .~ [ shippingRule |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 99) ] let shippingAddOn3 = Reward.template |> Reward.lens.id .~ 4 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [ + |> Reward.lens.shippingRulesExpanded .~ [ shippingRule |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 3) ] let shippingAddOn4 = Reward.template |> Reward.lens.id .~ 5 |> Reward.lens.shipping.enabled .~ true - |> Reward.lens.shippingRules .~ [ + |> Reward.lens.shippingRulesExpanded .~ [ shippingRule |> ShippingRule.lens.location .~ (.template |> Location.lens.id .~ 3) ] @@ -716,6 +720,20 @@ final class RewardAddOnSelectionViewModelTests: TestCase { shippingAddOn4 ] + let expectedAddOns = [shippingAddOn1, shippingAddOn2] + + let expected = expectedAddOns + .map { reward in + RewardAddOnCardViewData( + project: project, + reward: reward, + context: .pledge, + shippingRule: reward.shippingRulesExpanded?.first, + selectedQuantities: [:] + ) + } + .map(RewardAddOnSelectionDataSourceItem.rewardAddOn) + let mockService = MockService(fetchRewardAddOnsSelectionViewRewardsResult: .success(project)) withEnvironment(apiService: mockService) { @@ -731,18 +749,20 @@ final class RewardAddOnSelectionViewModelTests: TestCase { self.vm.inputs.configure(with: data) self.vm.inputs.viewDidLoad() - self.scheduler.advance() - self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertDidNotEmitValue( "Nothing is emitted until a shipping location is selected" ) + self.scheduler.advance() + self.vm.inputs.shippingRuleSelected(shippingRule) - self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertValues([[.emptyState(.addOnsUnavailable)]]) + self.scheduler.advance() + + self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertValues([expected]) XCTAssertEqual( - self.loadAddOnRewardsIntoDataSourceAndReloadTableView.values.last?.count, 1, - "Empty state is emitted" + self.loadAddOnRewardsIntoDataSourceAndReloadTableView.values.last?.count, 2, + "Only addOns with the same location ID given from the shippingRulesExpanded should be visible" ) } } @@ -765,21 +785,25 @@ final class RewardAddOnSelectionViewModelTests: TestCase { |> Reward.lens.id .~ 1 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn2 = Reward.template |> Reward.lens.id .~ 2 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn3 = Reward.template |> Reward.lens.id .~ 3 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn4 = Reward.template |> Reward.lens.id .~ 4 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let project = Project.template |> Project.lens.rewardData.rewards .~ [reward] @@ -817,14 +841,16 @@ final class RewardAddOnSelectionViewModelTests: TestCase { self.vm.inputs.configure(with: data) self.vm.inputs.viewDidLoad() - self.scheduler.advance() - self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertDidNotEmitValue( "Nothing is emitted until a shipping location is selected" ) + self.scheduler.advance() + self.vm.inputs.shippingRuleSelected(shippingRule) + self.scheduler.advance() + self.loadAddOnRewardsIntoDataSource.assertDidNotEmitValue() self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertValues([expected]) XCTAssertEqual( @@ -871,21 +897,25 @@ final class RewardAddOnSelectionViewModelTests: TestCase { |> Reward.lens.id .~ 1 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn2 = Reward.template |> Reward.lens.id .~ 2 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn3 = Reward.template |> Reward.lens.id .~ 3 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn4 = Reward.template |> Reward.lens.id .~ 4 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let project = Project.template |> Project.lens.rewardData.rewards .~ [reward] @@ -947,6 +977,8 @@ final class RewardAddOnSelectionViewModelTests: TestCase { self.vm.inputs.shippingRuleSelected(shippingRule) + self.scheduler.advance() + self.loadAddOnRewardsIntoDataSource.assertDidNotEmitValue() self.loadAddOnRewardsIntoDataSourceAndReloadTableView.assertValues([expected]) XCTAssertEqual( @@ -1034,21 +1066,25 @@ final class RewardAddOnSelectionViewModelTests: TestCase { |> Reward.lens.id .~ 1 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn2 = Reward.template |> Reward.lens.id .~ 2 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn3 = Reward.template |> Reward.lens.id .~ 3 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn4 = Reward.template |> Reward.lens.id .~ 4 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let project = Project.template |> Project.lens.rewardData.rewards .~ [reward] @@ -1075,6 +1111,7 @@ final class RewardAddOnSelectionViewModelTests: TestCase { self.scheduler.advance() self.vm.inputs.shippingRuleSelected(shippingRule) + self.scheduler.advance() self.vm.inputs.continueButtonTapped() @@ -1109,21 +1146,25 @@ final class RewardAddOnSelectionViewModelTests: TestCase { |> Reward.lens.id .~ 1 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn2 = Reward.template |> Reward.lens.id .~ 2 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn3 = Reward.template |> Reward.lens.id .~ 3 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let addOn4 = Reward.template |> Reward.lens.id .~ 4 |> Reward.lens.shipping.enabled .~ true |> Reward.lens.shipping.preference .~ .unrestricted + |> Reward.lens.shippingRulesExpanded .~ [shippingRule] let project = Project.template |> Project.lens.rewardData.rewards .~ [reward] @@ -1150,6 +1191,7 @@ final class RewardAddOnSelectionViewModelTests: TestCase { self.scheduler.advance() self.vm.inputs.shippingRuleSelected(shippingRule) + self.scheduler.advance() self.vm.inputs.rewardAddOnCardViewDidSelectQuantity(quantity: 3, rewardId: 2) self.vm.inputs.rewardAddOnCardViewDidSelectQuantity(quantity: 2, rewardId: 1) diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_pad@2x.png index 217adfbc2d..1f3143b158 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone4_7inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone4inch@2x.png index 53043e903e..e4d6de8195 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone5_5inch@2x.png index 5f6714f51e..8eb17b30dc 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone5_8inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_de_device_phone5_8inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_pad@2x.png index 217adfbc2d..1f3143b158 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone4_7inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone4inch@2x.png index 53043e903e..e4d6de8195 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone5_5inch@2x.png index 5f6714f51e..8eb17b30dc 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone5_8inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_en_device_phone5_8inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_pad@2x.png index 217adfbc2d..1f3143b158 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone4_7inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone4inch@2x.png index 53043e903e..e4d6de8195 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone5_5inch@2x.png index 5f6714f51e..8eb17b30dc 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone5_8inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_es_device_phone5_8inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_pad@2x.png index 217adfbc2d..1f3143b158 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone4_7inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone4inch@2x.png index 53043e903e..e4d6de8195 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone5_5inch@2x.png index 5f6714f51e..8eb17b30dc 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone5_8inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_fr_device_phone5_8inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_pad@2x.png index 217adfbc2d..1f3143b158 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone4_7inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone4inch@2x.png index 53043e903e..e4d6de8195 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone5_5inch@2x.png index 5f6714f51e..8eb17b30dc 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone5_8inch@2x.png index 3eca89ac72..7b258ff9dd 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Error_lang_ja_device_phone5_8inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_pad@2x.png index 9ede4c6263..ffcb3251b0 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone4_7inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone4inch@2x.png index c824b00c5b..b417a1ea86 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone5_5inch@2x.png index c9bf2f3982..82eb27cb10 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone5_8inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_de_device_phone5_8inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_pad@2x.png index 9ede4c6263..ffcb3251b0 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone4_7inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone4inch@2x.png index c824b00c5b..b417a1ea86 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone5_5inch@2x.png index c9bf2f3982..82eb27cb10 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone5_8inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_en_device_phone5_8inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_pad@2x.png index 9ede4c6263..ffcb3251b0 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone4_7inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone4inch@2x.png index c824b00c5b..b417a1ea86 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone5_5inch@2x.png index c9bf2f3982..82eb27cb10 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone5_8inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_es_device_phone5_8inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_pad@2x.png index 9ede4c6263..ffcb3251b0 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone4_7inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone4inch@2x.png index c824b00c5b..b417a1ea86 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone5_5inch@2x.png index c9bf2f3982..82eb27cb10 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone5_8inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_fr_device_phone5_8inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_pad@2x.png index 9ede4c6263..ffcb3251b0 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_pad@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_pad@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone4_7inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone4_7inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone4_7inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone4inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone4inch@2x.png index c824b00c5b..b417a1ea86 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone4inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone4inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone5_5inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone5_5inch@2x.png index c9bf2f3982..82eb27cb10 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone5_5inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone5_5inch@2x.png differ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone5_8inch@2x.png index 0c3c8a7b37..4f80625d83 100644 Binary files a/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone5_8inch@2x.png and b/Screenshots/_64/Kickstarter_Framework_iOSTests.RewardAddOnSelectionViewControllerTests/testView_Shipping_lang_ja_device_phone5_8inch@2x.png differ