Skip to content

Commit fbfb087

Browse files
authored
[Woo POS][Settings] i2: Feature flag and initial reader connection (#16283)
2 parents d44e9b5 + a62387c commit fbfb087

File tree

4 files changed

+121
-3
lines changed

4 files changed

+121
-3
lines changed

Modules/Sources/Experiments/DefaultFeatureFlagService.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ public struct DefaultFeatureFlagService: FeatureFlagService {
100100
return buildConfig == .localDeveloper || buildConfig == .alpha
101101
case .pointOfSaleSurveys:
102102
return buildConfig == .localDeveloper || buildConfig == .alpha
103+
case .pointOfSaleSettingsCardReaderFlow:
104+
return buildConfig == .localDeveloper || buildConfig == .alpha
103105
default:
104106
return true
105107
}

Modules/Sources/Experiments/FeatureFlag.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,8 @@ public enum FeatureFlag: Int {
207207
/// Enables surveys for potential and current POS merchants
208208
///
209209
case pointOfSaleSurveys
210+
211+
/// Enables card reader connection flow within POS settings
212+
///
213+
case pointOfSaleSettingsCardReaderFlow
210214
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import SwiftUI
2+
3+
struct POSSettingsCardView: View {
4+
let title: String
5+
let subtitle: String
6+
let action: () -> Void
7+
8+
var body: some View {
9+
Button(action: action) {
10+
VStack(alignment: .leading, spacing: POSPadding.xSmall) {
11+
Text(title)
12+
.font(.posBodyLargeRegular())
13+
.foregroundStyle(Color.posOnSurface)
14+
Text(subtitle)
15+
.font(.posBodyMediumRegular())
16+
.foregroundStyle(.secondary)
17+
}
18+
.padding()
19+
.frame(maxWidth: .infinity, alignment: .leading)
20+
.background(Color.posSurfaceContainerLowest)
21+
.dynamicTypeSize(...DynamicTypeSize.accessibility2)
22+
.posItemCardBorderStyles()
23+
}
24+
.buttonStyle(.plain)
25+
.accessibilityAddTraits(.isButton)
26+
.accessibilityLabel("\(title), \(subtitle)")
27+
}
28+
}
29+
30+
#if DEBUG
31+
#Preview {
32+
POSSettingsCardView(
33+
title: "Documentation",
34+
subtitle: "Learn more about accepting mobile payments",
35+
action: { }
36+
)
37+
}
38+
#endif

Modules/Sources/PointOfSale/Presentation/Settings/PointOfSaleSettingsHardwareDetailView.swift

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import SwiftUI
22
import struct WooFoundation.SafariView
33

44
struct PointOfSaleSettingsHardwareDetailView: View {
5+
@Environment(PointOfSaleAggregateModel.self) private var posModel
6+
@Environment(\.posFeatureFlags) private var featureFlags
57
@Environment(\.dynamicTypeSize) private var dynamicTypeSize
68
@Environment(\.posAnalytics) private var analytics
79

@@ -69,7 +71,12 @@ struct PointOfSaleSettingsHardwareDetailView: View {
6971
.navigationDestination(for: NavigationDestination.self) { destination in
7072
switch destination {
7173
case .hardware(.cardReaders):
72-
cardReadersView
74+
if featureFlags.isFeatureFlagEnabled(.pointOfSaleSettingsCardReaderFlow) {
75+
cardReadersView
76+
} else {
77+
// TODO: Legacy view to be removed along feature flag on WOOMOB-1591
78+
legacyCardReadersView
79+
}
7380
case .hardware(.scanners):
7481
scannersView
7582
}
@@ -92,7 +99,7 @@ struct PointOfSaleSettingsHardwareDetailView: View {
9299
}
93100
}
94101

95-
private var cardReadersView: some View {
102+
private var legacyCardReadersView: some View {
96103
VStack(spacing: POSSpacing.none) {
97104
POSPageHeaderView(
98105
title: Localization.cardReadersTitle,
@@ -161,6 +168,62 @@ struct PointOfSaleSettingsHardwareDetailView: View {
161168
}
162169
}
163170

171+
private var cardReadersView: some View {
172+
VStack(spacing: POSSpacing.none) {
173+
POSPageHeaderView(
174+
title: Localization.cardReadersTitle,
175+
backButtonConfiguration: .init(state: .enabled, action: {
176+
navigationPath.removeLast()
177+
}, buttonIcon: "chevron.left"))
178+
.foregroundColor(.posSurface)
179+
180+
List {
181+
if case .connected = posModel.cardReaderConnectionStatus {
182+
VStack(spacing: POSPadding.xSmall) {
183+
HStack {
184+
Text(Localization.readerModelTitle)
185+
.foregroundStyle(.primary)
186+
Spacer()
187+
Text(cardReaderName)
188+
.foregroundStyle(.secondary)
189+
}
190+
.padding()
191+
HStack {
192+
Text(Localization.readerBatteryTitle)
193+
.foregroundStyle(.primary)
194+
Spacer()
195+
Text(formattedBatteryLevel)
196+
.foregroundStyle(.secondary)
197+
}
198+
.padding()
199+
}
200+
.font(.posBodyMediumRegular())
201+
} else {
202+
POSSettingsCardView(title: Localization.cardReaderConnectTitle,
203+
subtitle: Localization.cardReaderConnectSubtitle,
204+
action: {
205+
posModel.connectCardReader()
206+
})
207+
}
208+
209+
POSSettingsCardView(title: Localization.cardReaderDocumentationTitle,
210+
subtitle: Localization.cardReaderDocumentationSubtitle,
211+
action: { showCardReaderDocumentationModal = true })
212+
.accessibilityAddTraits(.isButton)
213+
.listRowSeparator(.hidden)
214+
}
215+
.listStyle(.plain)
216+
.scrollContentBackground(.hidden)
217+
.listRowBackground(Color.clear)
218+
.background(backgroundColor)
219+
.foregroundColor(.posOnSurface)
220+
}
221+
.navigationBarBackButtonHidden(true)
222+
.posFullScreenCover(isPresented: $showCardReaderDocumentationModal) {
223+
SafariView(url: POSConstants.URLs.inPersonPaymentsLearnMoreWCPay.asURL())
224+
}
225+
}
226+
164227
private var scannersView: some View {
165228
VStack(spacing: POSSpacing.none) {
166229
POSPageHeaderView(
@@ -204,7 +267,8 @@ struct PointOfSaleSettingsHardwareDetailView: View {
204267
}
205268
}
206269

207-
extension PointOfSaleSettingsHardwareDetailView {
270+
// MARK: - Navigation
271+
private extension PointOfSaleSettingsHardwareDetailView {
208272
enum HardwareDestination: Identifiable, CaseIterable {
209273
case cardReaders
210274
case scanners
@@ -381,6 +445,16 @@ private extension PointOfSaleSettingsHardwareDetailView {
381445
value: "Configure barcode scanner settings",
382446
comment: "Description of Barcode scanner settings configuration."
383447
)
448+
static let cardReaderConnectTitle = NSLocalizedString(
449+
"pointOfSaleSettingsHardwareDetailView.cardReaderConnectTitle",
450+
value: "Connect card reader",
451+
comment: "Title for card reader connect button when no reader is connected."
452+
)
453+
static let cardReaderConnectSubtitle = NSLocalizedString(
454+
"pointOfSaleSettingsHardwareDetailView.cardReaderConnectSubtitle",
455+
value: "Connect your card reader and start accepting payments",
456+
comment: "Subtitle for card reader connect button when no reader is connected."
457+
)
384458
}
385459
}
386460

0 commit comments

Comments
 (0)