diff --git a/Networking/Networking/Model/Copiable/Models+Copiable.generated.swift b/Networking/Networking/Model/Copiable/Models+Copiable.generated.swift index 117dc48d6bc..a3d49214916 100644 --- a/Networking/Networking/Model/Copiable/Models+Copiable.generated.swift +++ b/Networking/Networking/Model/Copiable/Models+Copiable.generated.swift @@ -170,7 +170,7 @@ extension CouponReport { } extension Customer { - func copy( + public func copy( customerID: CopiableProp = .copy, email: CopiableProp = .copy, firstName: NullableCopiableProp = .copy, diff --git a/Storage/Storage/Model/Copiable/Models+Copiable.generated.swift b/Storage/Storage/Model/Copiable/Models+Copiable.generated.swift index 8cd2eee7508..61446aadd77 100644 --- a/Storage/Storage/Model/Copiable/Models+Copiable.generated.swift +++ b/Storage/Storage/Model/Copiable/Models+Copiable.generated.swift @@ -26,6 +26,7 @@ extension GeneralAppSettings { isViewAddOnsSwitchEnabled: CopiableProp = .copy, isProductSKUInputScannerSwitchEnabled: CopiableProp = .copy, isCouponManagementSwitchEnabled: CopiableProp = .copy, + isInAppPurchasesSwitchEnabled: CopiableProp = .copy, knownCardReaders: CopiableProp<[String]> = .copy, lastEligibilityErrorInfo: NullableCopiableProp = .copy, lastJetpackBenefitsBannerDismissedTime: NullableCopiableProp = .copy, @@ -36,6 +37,7 @@ extension GeneralAppSettings { let isViewAddOnsSwitchEnabled = isViewAddOnsSwitchEnabled ?? self.isViewAddOnsSwitchEnabled let isProductSKUInputScannerSwitchEnabled = isProductSKUInputScannerSwitchEnabled ?? self.isProductSKUInputScannerSwitchEnabled let isCouponManagementSwitchEnabled = isCouponManagementSwitchEnabled ?? self.isCouponManagementSwitchEnabled + let isInAppPurchasesSwitchEnabled = isInAppPurchasesSwitchEnabled ?? self.isInAppPurchasesSwitchEnabled let knownCardReaders = knownCardReaders ?? self.knownCardReaders let lastEligibilityErrorInfo = lastEligibilityErrorInfo ?? self.lastEligibilityErrorInfo let lastJetpackBenefitsBannerDismissedTime = lastJetpackBenefitsBannerDismissedTime ?? self.lastJetpackBenefitsBannerDismissedTime @@ -47,6 +49,7 @@ extension GeneralAppSettings { isViewAddOnsSwitchEnabled: isViewAddOnsSwitchEnabled, isProductSKUInputScannerSwitchEnabled: isProductSKUInputScannerSwitchEnabled, isCouponManagementSwitchEnabled: isCouponManagementSwitchEnabled, + isInAppPurchasesSwitchEnabled: isInAppPurchasesSwitchEnabled, knownCardReaders: knownCardReaders, lastEligibilityErrorInfo: lastEligibilityErrorInfo, lastJetpackBenefitsBannerDismissedTime: lastJetpackBenefitsBannerDismissedTime, diff --git a/Storage/Storage/Model/GeneralAppSettings.swift b/Storage/Storage/Model/GeneralAppSettings.swift index d45932fd96e..a0176adfb0b 100644 --- a/Storage/Storage/Model/GeneralAppSettings.swift +++ b/Storage/Storage/Model/GeneralAppSettings.swift @@ -32,6 +32,10 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable { /// public var isCouponManagementSwitchEnabled: Bool + /// The state for the In-app Purchases feature switch. + /// + public var isInAppPurchasesSwitchEnabled: Bool + /// A list (possibly empty) of known card reader IDs - i.e. IDs of card readers that should be reconnected to automatically /// e.g. ["CHB204909005931"] /// @@ -53,6 +57,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable { isViewAddOnsSwitchEnabled: Bool, isProductSKUInputScannerSwitchEnabled: Bool, isCouponManagementSwitchEnabled: Bool, + isInAppPurchasesSwitchEnabled: Bool, knownCardReaders: [String], lastEligibilityErrorInfo: EligibilityErrorInfo? = nil, lastJetpackBenefitsBannerDismissedTime: Date? = nil, @@ -66,6 +71,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable { self.lastEligibilityErrorInfo = lastEligibilityErrorInfo self.lastJetpackBenefitsBannerDismissedTime = lastJetpackBenefitsBannerDismissedTime self.featureAnnouncementCampaignSettings = featureAnnouncementCampaignSettings + self.isInAppPurchasesSwitchEnabled = isInAppPurchasesSwitchEnabled } public static var `default`: Self { @@ -74,6 +80,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable { isViewAddOnsSwitchEnabled: false, isProductSKUInputScannerSwitchEnabled: false, isCouponManagementSwitchEnabled: false, + isInAppPurchasesSwitchEnabled: false, knownCardReaders: [], lastEligibilityErrorInfo: nil, featureAnnouncementCampaignSettings: [:]) @@ -102,6 +109,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable { isViewAddOnsSwitchEnabled: isViewAddOnsSwitchEnabled, isProductSKUInputScannerSwitchEnabled: isProductSKUInputScannerSwitchEnabled, isCouponManagementSwitchEnabled: isCouponManagementSwitchEnabled, + isInAppPurchasesSwitchEnabled: isInAppPurchasesSwitchEnabled, knownCardReaders: knownCardReaders, lastEligibilityErrorInfo: lastEligibilityErrorInfo, featureAnnouncementCampaignSettings: featureAnnouncementCampaignSettings @@ -121,6 +129,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable { isViewAddOnsSwitchEnabled: isViewAddOnsSwitchEnabled, isProductSKUInputScannerSwitchEnabled: isProductSKUInputScannerSwitchEnabled, isCouponManagementSwitchEnabled: isCouponManagementSwitchEnabled, + isInAppPurchasesSwitchEnabled: isInAppPurchasesSwitchEnabled, knownCardReaders: knownCardReaders, lastEligibilityErrorInfo: lastEligibilityErrorInfo, featureAnnouncementCampaignSettings: updatedSettings @@ -140,6 +149,7 @@ extension GeneralAppSettings { self.isViewAddOnsSwitchEnabled = try container.decodeIfPresent(Bool.self, forKey: .isViewAddOnsSwitchEnabled) ?? false self.isProductSKUInputScannerSwitchEnabled = try container.decodeIfPresent(Bool.self, forKey: .isProductSKUInputScannerSwitchEnabled) ?? false self.isCouponManagementSwitchEnabled = try container.decodeIfPresent(Bool.self, forKey: .isCouponManagementSwitchEnabled) ?? false + self.isInAppPurchasesSwitchEnabled = try container.decodeIfPresent(Bool.self, forKey: .isInAppPurchasesSwitchEnabled) ?? false self.knownCardReaders = try container.decodeIfPresent([String].self, forKey: .knownCardReaders) ?? [] self.lastEligibilityErrorInfo = try container.decodeIfPresent(EligibilityErrorInfo.self, forKey: .lastEligibilityErrorInfo) self.lastJetpackBenefitsBannerDismissedTime = try container.decodeIfPresent(Date.self, forKey: .lastJetpackBenefitsBannerDismissedTime) diff --git a/Storage/StorageTests/Model/AppSettings/GeneralAppSettingsTests.swift b/Storage/StorageTests/Model/AppSettings/GeneralAppSettingsTests.swift index 01beb178724..04429ca9589 100644 --- a/Storage/StorageTests/Model/AppSettings/GeneralAppSettingsTests.swift +++ b/Storage/StorageTests/Model/AppSettings/GeneralAppSettingsTests.swift @@ -66,6 +66,7 @@ final class GeneralAppSettingsTests: XCTestCase { isViewAddOnsSwitchEnabled: true, isProductSKUInputScannerSwitchEnabled: true, isCouponManagementSwitchEnabled: true, + isInAppPurchasesSwitchEnabled: false, knownCardReaders: readers, lastEligibilityErrorInfo: eligibilityInfo, lastJetpackBenefitsBannerDismissedTime: jetpackBannerDismissedDate, @@ -101,6 +102,7 @@ private extension GeneralAppSettingsTests { isViewAddOnsSwitchEnabled: Bool = false, isProductSKUInputScannerSwitchEnabled: Bool = false, isCouponManagementSwitchEnabled: Bool = false, + isInAppPurchasesSwitchEnabled: Bool = false, knownCardReaders: [String] = [], lastEligibilityErrorInfo: EligibilityErrorInfo? = nil, lastJetpackBenefitsBannerDismissedTime: Date? = nil, @@ -111,6 +113,7 @@ private extension GeneralAppSettingsTests { isViewAddOnsSwitchEnabled: isViewAddOnsSwitchEnabled, isProductSKUInputScannerSwitchEnabled: isProductSKUInputScannerSwitchEnabled, isCouponManagementSwitchEnabled: isCouponManagementSwitchEnabled, + isInAppPurchasesSwitchEnabled: isInAppPurchasesSwitchEnabled, knownCardReaders: knownCardReaders, lastEligibilityErrorInfo: lastEligibilityErrorInfo, lastJetpackBenefitsBannerDismissedTime: lastJetpackBenefitsBannerDismissedTime, diff --git a/WooCommerce/Classes/Model/BetaFeature.swift b/WooCommerce/Classes/Model/BetaFeature.swift index 0aa87767a08..1aeed9db83d 100644 --- a/WooCommerce/Classes/Model/BetaFeature.swift +++ b/WooCommerce/Classes/Model/BetaFeature.swift @@ -4,6 +4,7 @@ enum BetaFeature: String, CaseIterable { case viewAddOns case productSKUScanner case couponManagement + case inAppPurchases } extension BetaFeature { @@ -15,6 +16,8 @@ extension BetaFeature { return Localization.productSKUScannerTitle case .couponManagement: return Localization.couponManagementTitle + case .inAppPurchases: + return Localization.inAppPurchasesManagementTitle } } @@ -26,6 +29,8 @@ extension BetaFeature { return Localization.productSKUScannerDescription case .couponManagement: return Localization.couponManagementDescription + case .inAppPurchases: + return Localization.inAppPurchasesManagementDescription } } @@ -37,6 +42,8 @@ extension BetaFeature { return \.isProductSKUInputScannerSwitchEnabled case .couponManagement: return \.isCouponManagementSwitchEnabled + case .inAppPurchases: + return \.isInAppPurchasesSwitchEnabled } } @@ -51,6 +58,19 @@ extension BetaFeature { } } + var isAvailable: Bool { + switch self { + case .inAppPurchases: + return ServiceLocator.featureFlagService.isFeatureFlagEnabled(.inAppPurchases) + default: + return true + } + } + + static var availableFeatures: [Self] { + allCases.filter(\.isAvailable) + } + func analyticsProperties(toggleState enabled: Bool) -> [String: WooAnalyticsEventPropertyType] { var properties = ["state": enabled ? "on" : "off"] if analyticsStat == .settingsBetaFeatureToggled { @@ -62,7 +82,10 @@ extension BetaFeature { extension GeneralAppSettingsStorage { func betaFeatureEnabled(_ feature: BetaFeature) -> Bool { - value(for: feature.settingsKey) + guard feature.isAvailable else { + return false + } + return value(for: feature.settingsKey) } func betaFeatureEnabledBinding(_ feature: BetaFeature) -> Binding { @@ -109,5 +132,12 @@ private extension BetaFeature { static let couponManagementDescription = NSLocalizedString( "Test out managing coupons as we get ready to launch", comment: "Cell description on beta features screen to enable coupon management") + + static let inAppPurchasesManagementTitle = NSLocalizedString( + "In-app purchases", + comment: "Cell title on beta features screen to enable in-app purchases") + static let inAppPurchasesManagementDescription = NSLocalizedString( + "Test out in-app purchases as we get ready to launch", + comment: "Cell description on beta features screen to enable in-app purchases") } } diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Beta features/BetaFeaturesConfiguration.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Beta features/BetaFeaturesConfiguration.swift index 7739fa6512c..a3f09acf1dc 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Beta features/BetaFeaturesConfiguration.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Beta features/BetaFeaturesConfiguration.swift @@ -17,7 +17,7 @@ struct BetaFeaturesConfiguration: View { var body: some View { List { - ForEach(BetaFeature.allCases) { feature in + ForEach(BetaFeature.availableFeatures) { feature in Section(footer: Text(feature.description)) { TitleAndToggleRow(title: feature.title, isOn: appSettings.betaFeatureEnabledBinding(feature)) } diff --git a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift index 12c3419d1ff..e958ac7a121 100644 --- a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift +++ b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenu.swift @@ -16,6 +16,7 @@ struct HubMenu: View { @State private var showingInbox = false @State private var showingReviews = false @State private var showingCoupons = false + @State private var showingIAPDebug = false /// State to disable multiple taps on menu items /// Make sure to reset the value to false after dismissing sub-flows @@ -73,6 +74,8 @@ struct HubMenu: View { showingReviews = true case HubMenuViewModel.Coupons.id: showingCoupons = true + case HubMenuViewModel.InAppPurchases.id: + showingIAPDebug = true default: break } @@ -110,6 +113,9 @@ struct HubMenu: View { NavigationLink(destination: CouponListView(siteID: viewModel.siteID), isActive: $showingCoupons) { EmptyView() }.hidden() + NavigationLink(destination: InAppPurchasesDebugView(), isActive: $showingIAPDebug) { + EmptyView() + }.hidden() LazyNavigationLink(destination: viewModel.getReviewDetailDestination(), isActive: $viewModel.showingReviewDetail) { EmptyView() } diff --git a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift index 82fcee9a4d9..f6ebdcd8827 100644 --- a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift @@ -4,6 +4,7 @@ import SwiftUI import Combine import Experiments import Yosemite +import Storage extension NSNotification.Name { /// Posted whenever the hub menu view did appear. @@ -54,6 +55,7 @@ final class HubMenuViewModel: ObservableObject { private let stores: StoresManager private let featureFlagService: FeatureFlagService + private let generalAppSettings: GeneralAppSettingsStorage private var productReviewFromNoteParcel: ProductReviewFromNoteParcel? @@ -64,11 +66,13 @@ final class HubMenuViewModel: ObservableObject { init(siteID: Int64, navigationController: UINavigationController? = nil, featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService, - stores: StoresManager = ServiceLocator.stores) { + stores: StoresManager = ServiceLocator.stores, + generalAppSettings: GeneralAppSettingsStorage = ServiceLocator.generalAppSettings) { self.siteID = siteID self.navigationController = navigationController self.stores = stores self.featureFlagService = featureFlagService + self.generalAppSettings = generalAppSettings observeSiteForUIUpdates() } @@ -80,6 +84,9 @@ final class HubMenuViewModel: ObservableObject { /// func setupMenuElements() { menuElements = [Payments(), WoocommerceAdmin(), ViewStore(), Reviews()] + if generalAppSettings.betaFeatureEnabled(.inAppPurchases) { + menuElements.append(InAppPurchases()) + } let inboxUseCase = InboxEligibilityUseCase(stores: stores, featureFlagService: featureFlagService) inboxUseCase.isEligibleForInbox(siteID: siteID) { [weak self] isInboxMenuShown in @@ -259,6 +266,17 @@ extension HubMenuViewModel { let trackingOption: String = "reviews" } + struct InAppPurchases: HubMenuItem { + static var id = "iap" + + let title: String = "[Debug] IAP" + let icon: UIImage = UIImage(systemName: "ladybug.fill")! + let iconColor: UIColor = .red + let badge: HubMenuBadgeType = .number(number: 0) + let accessibilityIdentifier: String = "menu-iap" + let trackingOption: String = "debug-iap" + } + private enum Localization { static let payments = NSLocalizedString("Payments", comment: "Title of the hub menu payments button") diff --git a/WooCommerce/Classes/ViewRelated/InAppPurchases/InAppPurchasesDebugView.swift b/WooCommerce/Classes/ViewRelated/InAppPurchases/InAppPurchasesDebugView.swift new file mode 100644 index 00000000000..8942df312ee --- /dev/null +++ b/WooCommerce/Classes/ViewRelated/InAppPurchases/InAppPurchasesDebugView.swift @@ -0,0 +1,17 @@ +import SwiftUI +import StoreKit + +struct InAppPurchasesDebugView: View { + var body: some View { + Group { + Text("No products available") + } + .navigationTitle("IAP Debug") + } +} + +struct InAppPurchasesDebugView_Previews: PreviewProvider { + static var previews: some View { + InAppPurchasesDebugView() + } +} diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 469659cbd29..7cebcfe3f4f 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -1776,6 +1776,7 @@ E12AF69B26BA8B2000C371C1 /* CardPresentPaymentsOnboardingUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E12AF69A26BA8B2000C371C1 /* CardPresentPaymentsOnboardingUseCaseTests.swift */; }; E12FB786266E0CAE0039E9C2 /* ApllicationLogDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E12FB785266E0CAE0039E9C2 /* ApllicationLogDetailView.swift */; }; E1308381270311E200D5A68D /* CardPresentModalUpdateFailedLowBattery.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1308380270311E200D5A68D /* CardPresentModalUpdateFailedLowBattery.swift */; }; + E1325EFB28FD544E00EC9B2A /* InAppPurchasesDebugView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1325EFA28FD544E00EC9B2A /* InAppPurchasesDebugView.swift */; }; E138D4F4269ED9C3006EA5C6 /* InPersonPaymentsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E138D4F3269ED9C3006EA5C6 /* InPersonPaymentsViewController.swift */; }; E138D4FC269EEAFE006EA5C6 /* InPersonPaymentsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E138D4FB269EEAFE006EA5C6 /* InPersonPaymentsViewModel.swift */; }; E15F163126C5117300D3059B /* InPersonPaymentsNoConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E15F163026C5117300D3059B /* InPersonPaymentsNoConnectionView.swift */; }; @@ -3706,6 +3707,7 @@ E12AF69A26BA8B2000C371C1 /* CardPresentPaymentsOnboardingUseCaseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardPresentPaymentsOnboardingUseCaseTests.swift; sourceTree = ""; }; E12FB785266E0CAE0039E9C2 /* ApllicationLogDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApllicationLogDetailView.swift; sourceTree = ""; }; E1308380270311E200D5A68D /* CardPresentModalUpdateFailedLowBattery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentModalUpdateFailedLowBattery.swift; sourceTree = ""; }; + E1325EFA28FD544E00EC9B2A /* InAppPurchasesDebugView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppPurchasesDebugView.swift; sourceTree = ""; }; E138D4F3269ED9C3006EA5C6 /* InPersonPaymentsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InPersonPaymentsViewController.swift; sourceTree = ""; }; E138D4FB269EEAFE006EA5C6 /* InPersonPaymentsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InPersonPaymentsViewModel.swift; sourceTree = ""; }; E15F163026C5117300D3059B /* InPersonPaymentsNoConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InPersonPaymentsNoConnectionView.swift; sourceTree = ""; }; @@ -6757,6 +6759,7 @@ B56DB3EF2049C06D00D4AA8E /* ViewRelated */ = { isa = PBXGroup; children = ( + E1325EF928FD543B00EC9B2A /* InAppPurchases */, 03FBDA9B263AD47200ACE257 /* Coupons */, 571B850024CF7E1600CF58A7 /* InAppFeedback */, 0235594024496414004BE2B8 /* BottomSheet */, @@ -8490,6 +8493,14 @@ path = Settings; sourceTree = ""; }; + E1325EF928FD543B00EC9B2A /* InAppPurchases */ = { + isa = PBXGroup; + children = ( + E1325EFA28FD544E00EC9B2A /* InAppPurchasesDebugView.swift */, + ); + path = InAppPurchases; + sourceTree = ""; + }; E138D4F2269ED99A006EA5C6 /* In-Person Payments */ = { isa = PBXGroup; children = ( @@ -9576,6 +9587,7 @@ D8C11A4E22DD235F00D4A88D /* OrderDetailsResultsControllers.swift in Sources */, D8C251D9230D256F00F49782 /* NoticePresenter.swift in Sources */, 77E53EB8250E6A4E003D385F /* ProductDownloadListViewController.swift in Sources */, + E1325EFB28FD544E00EC9B2A /* InAppPurchasesDebugView.swift in Sources */, 74460D4022289B7600D7316A /* Coordinator.swift in Sources */, B57C743D20F5493300EEFC87 /* AccountHeaderView.swift in Sources */, 31AD0B1126E9575F000B6391 /* CardPresentModalConnectingFailed.swift in Sources */, diff --git a/Yosemite/YosemiteTests/Stores/AppSettings/InAppFeedbackCardVisibilityUseCaseTests.swift b/Yosemite/YosemiteTests/Stores/AppSettings/InAppFeedbackCardVisibilityUseCaseTests.swift index d26052d3b5f..ef271504dfe 100644 --- a/Yosemite/YosemiteTests/Stores/AppSettings/InAppFeedbackCardVisibilityUseCaseTests.swift +++ b/Yosemite/YosemiteTests/Stores/AppSettings/InAppFeedbackCardVisibilityUseCaseTests.swift @@ -161,6 +161,7 @@ final class InAppFeedbackCardVisibilityUseCaseTests: XCTestCase { feedbacks: [:], isViewAddOnsSwitchEnabled: false, isProductSKUInputScannerSwitchEnabled: false, isCouponManagementSwitchEnabled: false, + isInAppPurchasesSwitchEnabled: false, knownCardReaders: [], featureAnnouncementCampaignSettings: [:]) let useCase = InAppFeedbackCardVisibilityUseCase(settings: settings, feedbackType: .ordersCreation) @@ -228,6 +229,7 @@ private extension InAppFeedbackCardVisibilityUseCaseTests { isViewAddOnsSwitchEnabled: false, isProductSKUInputScannerSwitchEnabled: false, isCouponManagementSwitchEnabled: false, + isInAppPurchasesSwitchEnabled: false, knownCardReaders: [], featureAnnouncementCampaignSettings: [:] ) diff --git a/Yosemite/YosemiteTests/Stores/AppSettingsStoreTests.swift b/Yosemite/YosemiteTests/Stores/AppSettingsStoreTests.swift index 8be09a8e66f..e6197ba9137 100644 --- a/Yosemite/YosemiteTests/Stores/AppSettingsStoreTests.swift +++ b/Yosemite/YosemiteTests/Stores/AppSettingsStoreTests.swift @@ -1006,6 +1006,7 @@ private extension AppSettingsStoreTests { isViewAddOnsSwitchEnabled: false, isProductSKUInputScannerSwitchEnabled: false, isCouponManagementSwitchEnabled: false, + isInAppPurchasesSwitchEnabled: false, knownCardReaders: [], featureAnnouncementCampaignSettings: [:] ) @@ -1019,6 +1020,7 @@ private extension AppSettingsStoreTests { isViewAddOnsSwitchEnabled: false, isProductSKUInputScannerSwitchEnabled: false, isCouponManagementSwitchEnabled: false, + isInAppPurchasesSwitchEnabled: false, knownCardReaders: [], featureAnnouncementCampaignSettings: featureAnnouncementCampaignSettings )