feat(android): complete first successful skip export

This commit is contained in:
Daniel Arantes Loverde
2026-03-20 10:56:22 -03:00
parent cb7bfef356
commit 9bdb9dfdea
22 changed files with 360 additions and 153 deletions

View File

@@ -22,6 +22,7 @@ struct OrderTrackingView: View {
@State var showCancellationReason = false
@State var reviewDraft: ReviewDraft? = nil
@State var didSaveReviewForCurrentOrder = false
@State var reviewSavedObserver: Any?
var body: some View {
ScrollView(showsIndicators: false) {
@@ -61,21 +62,41 @@ struct OrderTrackingView: View {
}
tracker.start(orderId: orderId, jwt: DefaultTokenStore().jwt)
}
.onAppear {
attachReviewSavedObserverIfNeeded()
}
.onDisappear {
tracker.stop()
detachReviewSavedObserver()
}
.navigationDestination(item: $reviewDraft) { draft in
MyReviewsView(initialOrder: draft)
}
.onReceive(NotificationCenter.default.publisher(for: .orderReviewDidSave)) { payload in
}
private func attachReviewSavedObserverIfNeeded() {
guard reviewSavedObserver == nil else { return }
reviewSavedObserver = NotificationCenter.default.addObserver(
forName: .orderReviewDidSave,
object: nil,
queue: nil
) { payload in
guard let orderIdFromEvent = payload.userInfo?["orderId"] as? String else { return }
let currentOrderId = (order?.id ?? orderId).trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
let currentOrderId = (order?.id ?? orderId)
.trimmingCharacters(in: .whitespacesAndNewlines)
.lowercased()
if orderIdFromEvent.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() == currentOrderId {
didSaveReviewForCurrentOrder = true
}
}
}
private func detachReviewSavedObserver() {
guard let reviewSavedObserver else { return }
NotificationCenter.default.removeObserver(reviewSavedObserver)
self.reviewSavedObserver = nil
}
private var topHeader: some View {
HStack(spacing: 10) {
Circle()
@@ -754,23 +775,23 @@ struct OrderTrackingView: View {
@MainActor
private func loadInitialOrder() async {
logger.info("OrderTracking initial fetch orderId=\(orderId, privacy: .public)")
logger.info("OrderTracking initial fetch orderId=\(orderId)")
do {
let response = try await ApiService().publicOrder(orderId: orderId)
if response.error {
errorMessage = response.message ?? "Não foi possível carregar o pedido."
logger.error("OrderTracking initial fetch API error orderId=\(orderId, privacy: .public) message=\((response.message ?? "unknown"), privacy: .public)")
logger.error("OrderTracking initial fetch API error orderId=\(orderId) message=\(response.message ?? "unknown")")
} else if let result = response.result {
order = result
storeContactPhone = result.storePhone
errorMessage = nil
logger.info("OrderTracking initial fetch success orderId=\(orderId, privacy: .public) status=\((result.status ?? "nil"), privacy: .public) paymentStatus=\((result.paymentStatus ?? "nil"), privacy: .public)")
logger.info("OrderTracking initial fetch success orderId=\(orderId) status=\(result.status ?? "nil") paymentStatus=\(result.paymentStatus ?? "nil")")
await refreshStoreContactPhone(for: result)
}
} catch {
errorMessage = "Não foi possível carregar o pedido."
logger.error("OrderTracking initial fetch failure orderId=\(orderId, privacy: .public) error=\(error.localizedDescription, privacy: .public)")
logger.error("OrderTracking initial fetch failure orderId=\(orderId) error=\(error.localizedDescription)")
}
isLoading = false