Skip to content

Commit a1459b0

Browse files
committed
Merge branch 'trunk' into feat/15198-update-reader-update-colors
2 parents 64e08c2 + ca5e5af commit a1459b0

File tree

14 files changed

+150
-102
lines changed

14 files changed

+150
-102
lines changed

Experiments/Experiments/DefaultFeatureFlagService.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,6 @@ public struct DefaultFeatureFlagService: FeatureFlagService {
8787
return true
8888
case .productGlobalUniqueIdentifierSupport:
8989
return true
90-
case .sendReceiptsForPointOfSale:
91-
return true
9290
case .hideSitesInStorePicker:
9391
return true
9492
case .filterHistoryOnOrderAndProductLists:

Experiments/Experiments/FeatureFlag.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,6 @@ public enum FeatureFlag: Int {
189189
///
190190
case productGlobalUniqueIdentifierSupport
191191

192-
/// Adds support for sending receipts after the payment for POS
193-
///
194-
case sendReceiptsForPointOfSale
195-
196192
/// Supports hiding sites from the store picker
197193
///
198194
case hideSitesInStorePicker

WooCommerce/Classes/Analytics/TracksProvider.swift

Lines changed: 85 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -110,25 +110,95 @@ private extension TracksProvider {
110110
}
111111

112112
private func decorateEventNameForPOSIfNeeded(_ eventName: String) -> String {
113-
// We do not want to track some events that might happen in POS mode as `pos_` events,
114-
// for example, when backgrounding the app or finishing async work from the app side.
115-
// Ref: https://github.com/woocommerce/woocommerce-ios/pull/15006#issuecomment-2622001706
116-
let exemptedEvents: Set<String> = [
117-
"application_opened",
118-
"application_closed",
119-
"orders_add_new",
120-
"support_new_request_viewed",
121-
"dynamic_dashboard_card_data_loading_completed"
122-
]
123-
if exemptedEvents.contains(eventName) {
113+
guard let event = WooAnalyticsStat(rawValue: eventName) else {
114+
DDLogWarn("⚠️ Event not found in WooAnalyticsStat list")
124115
return eventName
125116
}
126117

127-
if Self.isPOSModeActive {
128-
let prefix = "pos_"
129-
return "\(prefix)\(eventName)"
118+
let pointOfSaleEventList: Set<WooAnalyticsStat> = [
119+
// POS-specific events
120+
WooAnalyticsStat.pointOfSaleLoaded,
121+
WooAnalyticsStat.pointOfSaleProductsPullToRefresh,
122+
WooAnalyticsStat.pointOfSaleVariationsPullToRefresh,
123+
WooAnalyticsStat.pointOfSaleAddItemToCart,
124+
WooAnalyticsStat.pointOfSaleItemRemovedFromCart,
125+
WooAnalyticsStat.pointOfSaleCheckoutTapped,
126+
WooAnalyticsStat.pointOfSaleBackToCartTapped,
127+
WooAnalyticsStat.pointOfSaleBackToCheckoutFromCashTapped,
128+
WooAnalyticsStat.pointOfSaleClearCartTapped,
129+
WooAnalyticsStat.pointOfSaleExitMenuItemTapped,
130+
WooAnalyticsStat.pointOfSaleExitConfirmed,
131+
WooAnalyticsStat.pointOfSaleGetSupportTapped,
132+
WooAnalyticsStat.pointOfSaleSimpleProductsExplanationDialogShown,
133+
WooAnalyticsStat.pointOfSaleCreateNewOrderTapped,
134+
WooAnalyticsStat.pointOfSaleReceiptEmailSendTapped,
135+
WooAnalyticsStat.pointOfSalePaymentsOnboardingShown,
136+
WooAnalyticsStat.pointOfSalePaymentsOnboardingDismissed,
137+
WooAnalyticsStat.pointOfSaleCardReaderConnectionTapped,
138+
WooAnalyticsStat.pointOfSaleInteractionWithCustomerStarted,
139+
WooAnalyticsStat.pointOfSaleViewDocsTapped,
140+
WooAnalyticsStat.pointOfSaleReaderReadyForCardPayment,
141+
WooAnalyticsStat.pointOfSaleCashCollectPaymentSuccess,
142+
143+
// Order
144+
WooAnalyticsStat.orderCreationSuccess,
145+
WooAnalyticsStat.orderCreationFailed,
146+
147+
// Card Reader Connection
148+
WooAnalyticsStat.cardReaderSelectTypeShown,
149+
WooAnalyticsStat.cardReaderSelectTypeBuiltInTapped,
150+
WooAnalyticsStat.cardReaderSelectTypeBluetoothTapped,
151+
WooAnalyticsStat.cardReaderDiscoveryFailed,
152+
WooAnalyticsStat.cardReaderConnectionFailed,
153+
WooAnalyticsStat.cardReaderConnectionSuccess,
154+
WooAnalyticsStat.cardReaderDisconnectTapped,
155+
WooAnalyticsStat.manageCardReadersBuiltInReaderAutoDisconnect,
156+
WooAnalyticsStat.cardReaderAutomaticDisconnect,
157+
WooAnalyticsStat.cardReaderLocationPermissionPreAlertShown,
158+
WooAnalyticsStat.cardReaderLocationPermissionRequiredShown,
159+
160+
// Card Reader Software Update
161+
WooAnalyticsStat.cardReaderSoftwareUpdateTapped,
162+
WooAnalyticsStat.cardReaderSoftwareUpdateStarted,
163+
WooAnalyticsStat.cardReaderSoftwareUpdateSuccess,
164+
WooAnalyticsStat.cardReaderSoftwareUpdateFailed,
165+
WooAnalyticsStat.cardReaderSoftwareUpdateCancelTapped,
166+
WooAnalyticsStat.cardReaderSoftwareUpdateCanceled,
167+
168+
// Card-Present Payments Onboarding
169+
WooAnalyticsStat.cardPresentOnboardingLearnMoreTapped,
170+
WooAnalyticsStat.cardPresentOnboardingCompleted,
171+
WooAnalyticsStat.cardPresentOnboardingNotCompleted,
172+
WooAnalyticsStat.cardPresentOnboardingStepSkipped,
173+
WooAnalyticsStat.cardPresentOnboardingCtaTapped,
174+
WooAnalyticsStat.cardPresentOnboardingCtaFailed,
175+
176+
// Receipts
177+
WooAnalyticsStat.receiptEmailTapped,
178+
WooAnalyticsStat.receiptEmailSuccess,
179+
WooAnalyticsStat.receiptEmailFailed,
180+
181+
// Payments
182+
WooAnalyticsStat.collectPaymentCanceled,
183+
WooAnalyticsStat.collectPaymentFailed,
184+
WooAnalyticsStat.collectPaymentSuccess,
185+
WooAnalyticsStat.collectInteracPaymentSuccess,
186+
WooAnalyticsStat.interacRefundSuccess,
187+
WooAnalyticsStat.interacRefundFailed,
188+
WooAnalyticsStat.interacRefundCanceled,
189+
190+
// Payment Methods
191+
WooAnalyticsStat.paymentsFlowCompleted,
192+
WooAnalyticsStat.paymentsFlowCanceled,
193+
WooAnalyticsStat.paymentsFlowFailed,
194+
WooAnalyticsStat.paymentsFlowCollect,
195+
]
196+
197+
guard Self.isPOSModeActive, pointOfSaleEventList.contains(event) else {
198+
return eventName
130199
}
131-
return eventName
200+
let prefix = "pos_"
201+
return "\(prefix)\(eventName)"
132202
}
133203

134204
func refreshTracksMetadata() {

WooCommerce/Classes/Analytics/WooAnalyticsStat.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,8 +1283,7 @@ enum WooAnalyticsStat: String {
12831283
case pointOfSaleGetSupportTapped = "get_support_tapped"
12841284
case pointOfSaleSimpleProductsExplanationDialogShown = "simple_products_explanation_dialog_shown"
12851285
case pointOfSaleCreateNewOrderTapped = "create_new_order_tapped"
1286-
case pointOfSaleEmailReceiptTapped = "email_receipt_tapped"
1287-
case pointOfSaleEmailReceiptSendTapped = "email_receipt_send_tapped"
1286+
case pointOfSaleReceiptEmailSendTapped = "receipt_email_send_tapped"
12881287
case pointOfSalePaymentsOnboardingShown = "payments_onboarding_shown"
12891288
case pointOfSalePaymentsOnboardingDismissed = "payments_onboarding_dismissed"
12901289
case pointOfSaleCardReaderConnectionTapped = "card_reader_connection_tapped"

WooCommerce/Classes/POS/Models/PointOfSaleAggregateModel.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,14 @@ extension PointOfSaleAggregateModel {
278278

279279
@MainActor
280280
func sendReceipt(to emailAddress: String) async throws {
281-
try await orderController.sendReceipt(recipientEmail: emailAddress)
281+
do {
282+
try await orderController.sendReceipt(recipientEmail: emailAddress)
283+
analytics.track(.receiptEmailSuccess)
284+
} catch {
285+
// Catch and re-throw in order to capture the error event, but still allow the UI to handle the error state.
286+
analytics.track(.receiptEmailFailed)
287+
throw error
288+
}
282289
}
283290

284291
@MainActor

WooCommerce/Classes/POS/Presentation/Card Present Payments/Reader Messages/PointOfSaleCardPresentPaymentProcessingMessageViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ private extension PointOfSaleCardPresentPaymentProcessingMessageViewModel {
1414
)
1515

1616
static let pleaseWait = NSLocalizedString(
17-
"pointOfSale.cardPresent.paymentProcessing.message",
17+
"pointOfSale.cardPresent.waitForPaymentProcessing.message",
1818
value: "Please wait",
1919
comment: "Indicates to wait while payment is processing. Presented to users when payment collection starts"
2020
)

WooCommerce/Classes/POS/Presentation/POSFloatingControlView.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,12 @@ private extension POSFloatingControlView {
8888
}
8989

9090
var fontColor: Color {
91-
.posOnSurface
91+
switch backgroundAppearance {
92+
case .primary:
93+
.posOnSurface
94+
case .secondary:
95+
Self.secondaryFontColor
96+
}
9297
}
9398
}
9499

WooCommerce/Classes/POS/Presentation/PaymentButtons.swift

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,11 @@ struct PaymentsActionButtons: View {
88

99
private let receiptEligibilityUseCase = ReceiptEligibilityUseCase()
1010

11-
private var shouldShowSendReceiptButton: Bool {
12-
ServiceLocator.featureFlagService.isFeatureFlagEnabled(.sendReceiptsForPointOfSale)
13-
}
14-
1511
var body: some View {
1612
ZStack {
1713
VStack {
1814
newOrderButton
1915
sendReceiptButton
20-
.renderedIf(shouldShowSendReceiptButton)
2116
}
2217
}
2318
}
@@ -28,7 +23,7 @@ private extension PaymentsActionButtons {
2823
var sendReceiptButton: some View {
2924
Button(action: {
3025
Task { @MainActor in
31-
ServiceLocator.analytics.track(.pointOfSaleEmailReceiptTapped)
26+
ServiceLocator.analytics.track(.receiptEmailTapped)
3227
await handleSendReceiptAction()
3328
}
3429
}, label: {

WooCommerce/Classes/POS/Presentation/Reusable Views/POSSendReceiptView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ struct POSSendReceiptView: View {
7474
}
7575

7676
private func sendReceipt() {
77-
ServiceLocator.analytics.track(.pointOfSaleEmailReceiptSendTapped)
77+
ServiceLocator.analytics.track(.pointOfSaleReceiptEmailSendTapped)
7878
Task { @MainActor in
7979
guard isEmailValid else {
8080
errorMessage = Localization.emailValidationErrorText

WooCommerce/Classes/ViewModels/Order Details/Receipts/ReceiptEligibilityUseCase.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,6 @@ final class ReceiptEligibilityUseCase: ReceiptEligibilityUseCaseProtocol {
4444
/// WooCommerce 9.5 allows to attach a customer email after payment is made and send email receipt via the API.
4545
///
4646
func isEligibleForPointOfSaleReceipts(onCompletion: @escaping (Bool) -> Void) {
47-
guard featureFlagService.isFeatureFlagEnabled(.sendReceiptsForPointOfSale) else {
48-
onCompletion(false)
49-
return
50-
}
51-
5247
Task { @MainActor in
5348
let isWooCommerceSupported = await isPluginSupported(Constants.wcPluginName,
5449
minimumVersion: Constants.PointOfSaleReceipts.wcPluginMinimumVersion)

0 commit comments

Comments
 (0)