Fix login

This commit is contained in:
Daniel Arantes Loverde
2026-02-21 18:51:39 -03:00
parent 0f5ad4c268
commit 3a3dc7217b
17 changed files with 1296 additions and 91 deletions

View File

@@ -24,7 +24,8 @@ struct CheckoutView: View {
@State var lastAcceptedAddressState: AddressState? = nil
@State var isSubmittingOrder = false
@State var pixPaymentContext: PixPaymentContext? = nil
@State var openCardPayment = false
@State var cardPaymentContext: CardPaymentContext? = nil
@State var orderTrackingContext: OrderTrackingContext? = nil
var paymentConfig: StorePaymentMethodsInfo? { storeInfo?.paymentMethods }
@@ -151,10 +152,17 @@ struct CheckoutView: View {
}
}
.navigationDestination(item: $pixPaymentContext) { context in
PaymentPixView(context: context)
PaymentPixView(context: context) {
orderTrackingContext = OrderTrackingContext(orderId: context.orderId, shortId: context.shortId)
}
}
.navigationDestination(isPresented: $openCardPayment) {
PaymentCardView(total: totalValue)
.navigationDestination(item: $cardPaymentContext) { context in
PaymentCardView(context: context) {
orderTrackingContext = OrderTrackingContext(orderId: context.orderId, shortId: context.shortId)
}
}
.navigationDestination(item: $orderTrackingContext) { context in
OrderTrackingView(orderId: context.orderId, initialShortId: context.shortId)
}
}
@@ -529,9 +537,26 @@ struct PixPaymentContext: Identifiable, Hashable {
let expirationDate: String?
}
struct OrderTrackingContext: Identifiable, Hashable {
var id: String { orderId }
let orderId: String
let shortId: String?
}
struct CardPaymentContext: Identifiable, Hashable {
var id: String { orderId }
let orderId: String
let shortId: String?
let total: Double
}
struct PaymentPixView: View {
let context: PixPaymentContext
var onOpenTracking: (() -> Void)? = nil
@Environment(\.dismiss) var dismiss
@State var tracker = OrderRealtimeTracker()
@State var latestOrder: PublicOrderResult? = nil
@State var hasOpenedTracking = false
private var qrImageSource: String? {
guard let raw = context.qrCodeImageBase64?.trimmingCharacters(in: .whitespacesAndNewlines),
@@ -601,7 +626,11 @@ struct PaymentPixView: View {
}
Button("Já realizei o pagamento") {
dismiss()
if latestOrder?.isPaymentConfirmed == true {
openTrackingOnce()
} else {
SnackbarCenter.shared.show(title: "Pagamento ainda não confirmado.", style: .info, icon: "clock.fill", duration: 2.0)
}
}
.font(AppTypography.heading3)
.foregroundStyle(AppColors.textMuted)
@@ -612,6 +641,25 @@ struct PaymentPixView: View {
.background(AppColors.backgroundLight)
.navigationTitle("Pagamento via PIX")
.navigationBarTitleDisplayMode(.inline)
.task {
tracker.onOrderUpdated = { updated in
latestOrder = updated
if updated.isPaymentConfirmed {
openTrackingOnce()
}
}
tracker.start(orderId: context.orderId, jwt: DefaultTokenStore().jwt)
}
.onDisappear {
tracker.stop()
}
}
private func openTrackingOnce() {
guard hasOpenedTracking == false else { return }
hasOpenedTracking = true
onOpenTracking?()
dismiss()
}
private func copyToClipboard(_ value: String) {
@@ -625,12 +673,16 @@ struct PaymentPixView: View {
}
struct PaymentCardView: View {
let total: Double
let context: CardPaymentContext
var onOpenTracking: (() -> Void)? = nil
@Environment(\.dismiss) var dismiss
@State var cardHolderName = ""
@State var cardNumber = ""
@State var expiry = ""
@State var cvv = ""
@State var tracker = OrderRealtimeTracker()
@State var latestOrder: PublicOrderResult? = nil
@State var hasOpenedTracking = false
var body: some View {
ScrollView(showsIndicators: false) {
@@ -643,7 +695,7 @@ struct PaymentCardView: View {
Text("Total do Pedido")
.font(AppTypography.caption)
.foregroundStyle(AppColors.textMuted)
Text(formatCurrency(total))
Text(formatCurrency(context.total))
.font(AppTypography.heading2)
.foregroundStyle(AppColors.textPrimary)
}
@@ -670,11 +722,19 @@ struct PaymentCardView: View {
.clipShape(RoundedRectangle(cornerRadius: AppLayout.radiusLG, style: .continuous))
PrimaryButton(title: "Salvar e Pagar") {
SnackbarCenter.shared.show(title: "Fluxo de cartão em construção.", style: .info, icon: "creditcard.fill", duration: 2.0)
if latestOrder?.isPaymentConfirmed == true {
openTrackingOnce()
} else {
SnackbarCenter.shared.show(title: "Pagamento ainda não confirmado.", style: .info, icon: "clock.fill", duration: 2.0)
}
}
Button("Apenas Pagar") {
dismiss()
if latestOrder?.isPaymentConfirmed == true {
openTrackingOnce()
} else {
SnackbarCenter.shared.show(title: "Aguardando confirmação do pagamento.", style: .info, icon: "clock.fill", duration: 2.0)
}
}
.font(AppTypography.heading3)
.foregroundStyle(AppColors.textMuted)
@@ -688,6 +748,25 @@ struct PaymentCardView: View {
.background(AppColors.backgroundLight)
.navigationTitle("Pagamento")
.navigationBarTitleDisplayMode(.inline)
.task {
tracker.onOrderUpdated = { updated in
latestOrder = updated
if updated.isPaymentConfirmed {
openTrackingOnce()
}
}
tracker.start(orderId: context.orderId, jwt: DefaultTokenStore().jwt)
}
.onDisappear {
tracker.stop()
}
}
private func openTrackingOnce() {
guard hasOpenedTracking == false else { return }
hasOpenedTracking = true
onOpenTracking?()
dismiss()
}
private func labeledField(_ label: String, placeholder: String, text: Binding<String>) -> some View {