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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,42 +6,22 @@ final class BetaFeaturesConfigurationViewModel: ObservableObject {
@Published private(set) var availableFeatures: [BetaFeature] = []
private let appSettings: GeneralAppSettingsStorage
private let featureFlagService: FeatureFlagService
private let posEligibilityChecker: POSEligibilityCheckerProtocol

init(appSettings: GeneralAppSettingsStorage = ServiceLocator.generalAppSettings,
featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService,
posEligibilityChecker: POSEligibilityCheckerProtocol = POSEligibilityChecker(
siteSettings: ServiceLocator.selectedSiteSettings,
currencySettings: ServiceLocator.currencySettings,
featureFlagService: ServiceLocator.featureFlagService
)) {
featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService) {
self.appSettings = appSettings
self.featureFlagService = featureFlagService
self.posEligibilityChecker = posEligibilityChecker
observePOSEligibilityForAvailableFeatures()
availableFeatures = BetaFeature.allCases.filter { betaFeature in
switch betaFeature {
case .viewAddOns:
return true
case .inAppPurchases:
return featureFlagService.isFeatureFlagEnabled(.inAppPurchasesDebugMenu)
}
}
}

func isOn(feature: BetaFeature) -> Binding<Bool> {
appSettings.betaFeatureEnabledBinding(feature)
}
}

private extension BetaFeaturesConfigurationViewModel {
func observePOSEligibilityForAvailableFeatures() {
posEligibilityChecker.isEligible
.map { [weak self] isEligibleForPOS in
guard let self else {
return []
}
return BetaFeature.allCases.filter { betaFeature in
switch betaFeature {
case .viewAddOns:
return true
case .inAppPurchases:
return self.featureFlagService.isFeatureFlagEnabled(.inAppPurchasesDebugMenu)
}
}
}
.assign(to: &$availableFeatures)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,9 @@ final class BetaFeaturesConfigurationViewModelTests: XCTestCase {

func test_availableFeatures_include_viewAddOns() {
// Given
let viewModel = BetaFeaturesConfigurationViewModel(appSettings: appSettings,
posEligibilityChecker: MockPOSEligibilityChecker(isEligibleValue: true))
let viewModel = BetaFeaturesConfigurationViewModel(appSettings: appSettings)

// Then
XCTAssertTrue(viewModel.availableFeatures.contains(.viewAddOns))
}
}

private final class MockPOSEligibilityChecker: POSEligibilityCheckerProtocol {
@Published var isEligibleValue: Bool

init(isEligibleValue: Bool) {
self.isEligibleValue = isEligibleValue
}

var isEligible: AnyPublisher<Bool, Never> {
$isEligibleValue.eraseToAnyPublisher()
}
}