Skip to content

Commit fa8489e

Browse files
[Application Passwords] Add experimental feature toggle in app settings (#16059)
2 parents 92fde87 + 021e0d4 commit fa8489e

File tree

18 files changed

+396
-17
lines changed

18 files changed

+396
-17
lines changed

Modules/Sources/Storage/Model/Copiable/Models+Copiable.generated.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ extension Storage.GeneralAppSettings {
5757
installationDate: NullableCopiableProp<Date> = .copy,
5858
feedbacks: CopiableProp<[FeedbackType: FeedbackSettings]> = .copy,
5959
isViewAddOnsSwitchEnabled: CopiableProp<Bool> = .copy,
60+
isApplicationPasswordsSwitchEnabled: CopiableProp<Bool> = .copy,
6061
knownCardReaders: CopiableProp<[String]> = .copy,
6162
lastEligibilityErrorInfo: NullableCopiableProp<EligibilityErrorInfo> = .copy,
6263
lastJetpackBenefitsBannerDismissedTime: NullableCopiableProp<Date> = .copy,
@@ -68,6 +69,7 @@ extension Storage.GeneralAppSettings {
6869
let installationDate = installationDate ?? self.installationDate
6970
let feedbacks = feedbacks ?? self.feedbacks
7071
let isViewAddOnsSwitchEnabled = isViewAddOnsSwitchEnabled ?? self.isViewAddOnsSwitchEnabled
72+
let isApplicationPasswordsSwitchEnabled = isApplicationPasswordsSwitchEnabled ?? self.isApplicationPasswordsSwitchEnabled
7173
let knownCardReaders = knownCardReaders ?? self.knownCardReaders
7274
let lastEligibilityErrorInfo = lastEligibilityErrorInfo ?? self.lastEligibilityErrorInfo
7375
let lastJetpackBenefitsBannerDismissedTime = lastJetpackBenefitsBannerDismissedTime ?? self.lastJetpackBenefitsBannerDismissedTime
@@ -80,6 +82,7 @@ extension Storage.GeneralAppSettings {
8082
installationDate: installationDate,
8183
feedbacks: feedbacks,
8284
isViewAddOnsSwitchEnabled: isViewAddOnsSwitchEnabled,
85+
isApplicationPasswordsSwitchEnabled: isApplicationPasswordsSwitchEnabled,
8386
knownCardReaders: knownCardReaders,
8487
lastEligibilityErrorInfo: lastEligibilityErrorInfo,
8588
lastJetpackBenefitsBannerDismissedTime: lastJetpackBenefitsBannerDismissedTime,

Modules/Sources/Storage/Model/GeneralAppSettings.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable {
2424
///
2525
public var isViewAddOnsSwitchEnabled: Bool
2626

27+
/// The state(`true` or `false`) for the application passwords feature switch.
28+
///
29+
public var isApplicationPasswordsSwitchEnabled: Bool
30+
2731
/// A list (possibly empty) of known card reader IDs - i.e. IDs of card readers that should be reconnected to automatically
2832
/// e.g. ["CHB204909005931"]
2933
///
@@ -55,6 +59,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable {
5559
public init(installationDate: Date?,
5660
feedbacks: [FeedbackType: FeedbackSettings],
5761
isViewAddOnsSwitchEnabled: Bool,
62+
isApplicationPasswordsSwitchEnabled: Bool,
5863
knownCardReaders: [String],
5964
lastEligibilityErrorInfo: EligibilityErrorInfo? = nil,
6065
lastJetpackBenefitsBannerDismissedTime: Date? = nil,
@@ -65,6 +70,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable {
6570
self.installationDate = installationDate
6671
self.feedbacks = feedbacks
6772
self.isViewAddOnsSwitchEnabled = isViewAddOnsSwitchEnabled
73+
self.isApplicationPasswordsSwitchEnabled = isApplicationPasswordsSwitchEnabled
6874
self.knownCardReaders = knownCardReaders
6975
self.lastEligibilityErrorInfo = lastEligibilityErrorInfo
7076
self.lastJetpackBenefitsBannerDismissedTime = lastJetpackBenefitsBannerDismissedTime
@@ -78,6 +84,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable {
7884
.init(installationDate: nil,
7985
feedbacks: [:],
8086
isViewAddOnsSwitchEnabled: false,
87+
isApplicationPasswordsSwitchEnabled: true,
8188
knownCardReaders: [],
8289
lastEligibilityErrorInfo: nil,
8390
featureAnnouncementCampaignSettings: [:],
@@ -107,6 +114,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable {
107114
installationDate: installationDate,
108115
feedbacks: updatedFeedbacks,
109116
isViewAddOnsSwitchEnabled: isViewAddOnsSwitchEnabled,
117+
isApplicationPasswordsSwitchEnabled: isApplicationPasswordsSwitchEnabled,
110118
knownCardReaders: knownCardReaders,
111119
lastEligibilityErrorInfo: lastEligibilityErrorInfo,
112120
featureAnnouncementCampaignSettings: featureAnnouncementCampaignSettings,
@@ -127,6 +135,7 @@ public struct GeneralAppSettings: Codable, Equatable, GeneratedCopiable {
127135
installationDate: installationDate,
128136
feedbacks: feedbacks,
129137
isViewAddOnsSwitchEnabled: isViewAddOnsSwitchEnabled,
138+
isApplicationPasswordsSwitchEnabled: isApplicationPasswordsSwitchEnabled,
130139
knownCardReaders: knownCardReaders,
131140
lastEligibilityErrorInfo: lastEligibilityErrorInfo,
132141
featureAnnouncementCampaignSettings: updatedSettings,
@@ -147,6 +156,7 @@ extension GeneralAppSettings {
147156
self.installationDate = try container.decodeIfPresent(Date.self, forKey: .installationDate)
148157
self.feedbacks = try container.decodeIfPresent([FeedbackType: FeedbackSettings].self, forKey: .feedbacks) ?? [:]
149158
self.isViewAddOnsSwitchEnabled = try container.decodeIfPresent(Bool.self, forKey: .isViewAddOnsSwitchEnabled) ?? false
159+
self.isApplicationPasswordsSwitchEnabled = try container.decodeIfPresent(Bool.self, forKey: .isApplicationPasswordsSwitchEnabled) ?? false
150160
self.knownCardReaders = try container.decodeIfPresent([String].self, forKey: .knownCardReaders) ?? []
151161
self.lastEligibilityErrorInfo = try container.decodeIfPresent(EligibilityErrorInfo.self, forKey: .lastEligibilityErrorInfo)
152162
self.lastJetpackBenefitsBannerDismissedTime = try container.decodeIfPresent(Date.self, forKey: .lastJetpackBenefitsBannerDismissedTime)

Modules/Sources/Yosemite/Actions/AppSettingsAction.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,4 +356,14 @@ public enum AppSettingsAction: Action {
356356
/// Loads the favorite products.
357357
///
358358
case loadFavoriteProductIDs(siteID: Int64, onCompletion: ([Int64]) -> Void)
359+
360+
// MARK: - Application passwords Experiment feature
361+
362+
/// Sets the state of the App Passwords Experiment feature
363+
///
364+
case setAppPasswordsExperimentSettingState(isOn: Bool, onCompletion: (Result<Void, Error>) -> Void)
365+
366+
/// Loads Loads the state of the App Passwords Experiment feature
367+
///
368+
case getAppPasswordsExperimentSettingState(onCompletion: (Bool) -> Void)
359369
}

Modules/Sources/Yosemite/Stores/AppSettingsStore.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,10 @@ public class AppSettingsStore: Store {
289289
dismissCustomFieldsTopBanner(onCompletion: onCompletion)
290290
case .loadCustomFieldsTopBannerDismissState(let onCompletion):
291291
loadCustomFieldsTopBannerDismissState(onCompletion: onCompletion)
292+
case .setAppPasswordsExperimentSettingState(let value, let onCompletion):
293+
setAppPasswordsExperimentSettingEnabled(isOn: value, onCompletion: onCompletion)
294+
case .getAppPasswordsExperimentSettingState(let onCompletion):
295+
getAppPasswordsExperimentSettingEnabled(onCompletion: onCompletion)
292296
}
293297
}
294298
}
@@ -1269,6 +1273,23 @@ private extension AppSettingsStore {
12691273
}
12701274
}
12711275

1276+
// MARK: - Application Passwords Experiment Feature
1277+
//
1278+
private extension AppSettingsStore {
1279+
func setAppPasswordsExperimentSettingEnabled(isOn: Bool, onCompletion: (Result<Void, Error>) -> Void) {
1280+
do {
1281+
try generalAppSettings.setValue(isOn, for: \.isApplicationPasswordsSwitchEnabled)
1282+
onCompletion(.success(()))
1283+
} catch {
1284+
onCompletion(.failure(error))
1285+
}
1286+
}
1287+
1288+
func getAppPasswordsExperimentSettingEnabled(onCompletion: (Bool) -> Void) {
1289+
onCompletion(generalAppSettings.value(for: \.isApplicationPasswordsSwitchEnabled))
1290+
}
1291+
}
1292+
12721293
// MARK: - Errors
12731294

12741295
/// Errors

Modules/Tests/StorageTests/Model/AppSettings/GeneralAppSettingsTests.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ final class GeneralAppSettingsTests: XCTestCase {
6666
let previousSettings = GeneralAppSettings(installationDate: installationDate,
6767
feedbacks: feedbackSettings,
6868
isViewAddOnsSwitchEnabled: true,
69+
isApplicationPasswordsSwitchEnabled: false,
6970
knownCardReaders: readers,
7071
lastEligibilityErrorInfo: eligibilityInfo,
7172
lastJetpackBenefitsBannerDismissedTime: jetpackBannerDismissedDate,
@@ -114,6 +115,7 @@ private extension GeneralAppSettingsTests {
114115
GeneralAppSettings(installationDate: installationDate,
115116
feedbacks: feedbacks,
116117
isViewAddOnsSwitchEnabled: isViewAddOnsSwitchEnabled,
118+
isApplicationPasswordsSwitchEnabled: false,
117119
knownCardReaders: knownCardReaders,
118120
lastEligibilityErrorInfo: lastEligibilityErrorInfo,
119121
lastJetpackBenefitsBannerDismissedTime: lastJetpackBenefitsBannerDismissedTime,

Modules/Tests/YosemiteTests/Stores/AppSettings/InAppFeedbackCardVisibilityUseCaseTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ private extension InAppFeedbackCardVisibilityUseCaseTests {
239239
installationDate: installationDate,
240240
feedbacks: [feedback.name: feedback],
241241
isViewAddOnsSwitchEnabled: false,
242+
isApplicationPasswordsSwitchEnabled: false,
242243
knownCardReaders: [],
243244
featureAnnouncementCampaignSettings: [:],
244245
sitesWithAtLeastOneIPPTransactionFinished: [],

Modules/Tests/YosemiteTests/Stores/AppSettingsStoreTests.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,6 +1522,7 @@ private extension AppSettingsStoreTests {
15221522
installationDate: installationDate,
15231523
feedbacks: [feedback.name: feedback],
15241524
isViewAddOnsSwitchEnabled: false,
1525+
isApplicationPasswordsSwitchEnabled: false,
15251526
knownCardReaders: [],
15261527
featureAnnouncementCampaignSettings: [:],
15271528
sitesWithAtLeastOneIPPTransactionFinished: [],
@@ -1536,6 +1537,7 @@ private extension AppSettingsStoreTests {
15361537
installationDate: Date(),
15371538
feedbacks: [:],
15381539
isViewAddOnsSwitchEnabled: false,
1540+
isApplicationPasswordsSwitchEnabled: false,
15391541
knownCardReaders: [],
15401542
featureAnnouncementCampaignSettings: featureAnnouncementCampaignSettings,
15411543
sitesWithAtLeastOneIPPTransactionFinished: [],

WooCommerce/Classes/Analytics/WooAnalyticsStat.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ enum WooAnalyticsStat: String {
299299
case settingsBetaFeaturesButtonTapped = "settings_beta_features_button_tapped"
300300
case settingsBetaFeaturesProductsToggled = "settings_beta_features_products_toggled"
301301
case settingsBetaFeaturesOrderAddOnsToggled = "settings_beta_features_order_addons_toggled"
302+
case settingsBetaFeaturesApplicationPasswordsToggled = "settings_beta_features_application_passwords_toggled"
302303
case settingsBetaFeatureToggled = "settings_beta_feature_toggled"
303304

304305
case settingsPrivacySettingsTapped = "settings_privacy_settings_button_tapped"

WooCommerce/Classes/Extensions/AttributedString+Helpers.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,19 @@ extension AttributedString {
1616
static func withEmbeddedLink(
1717
mainContent: String,
1818
linkText: String,
19-
link: String
19+
link: String,
20+
font: Font? = .body,
21+
foregroundColor: Color? = Color(uiColor: .text)
2022
) -> AttributedString {
2123
let content = String.localizedStringWithFormat(mainContent, linkText)
2224
var attributedText = AttributedString(content)
23-
attributedText.font = .body
24-
attributedText.foregroundColor = Color(uiColor: .text)
25+
26+
if let font {
27+
attributedText.font = font
28+
}
29+
if let foregroundColor {
30+
attributedText.foregroundColor = foregroundColor
31+
}
2532

2633
if let range = attributedText.range(of: linkText),
2734
let url = URL(string: link) {

WooCommerce/Classes/Extensions/UserDefaults+Woo.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ extension UserDefaults {
7070

7171
// Hide stores from store picker
7272
case hiddenStoreIDs
73+
74+
// Application passwords experiment remote FF cached value
75+
case applicationPasswordsExperimentRemoteFFValue
7376
}
7477
}
7578

0 commit comments

Comments
 (0)