Almost done

This commit is contained in:
Daniel Arantes Loverde
2026-06-08 10:46:52 -03:00
parent aec1193944
commit 23d9752bfd
25 changed files with 476 additions and 257 deletions

View File

@@ -28,7 +28,6 @@ struct CheckoutView: View {
@State var pixPaymentContext: PixPaymentContext? = nil
@State var cardPaymentContext: CardPaymentContext? = nil
@State var orderTrackingContext: OrderTrackingContext? = nil
@State var savedCards: [SavedCard] = []
@State var showCardSelectionSheet = false
var paymentConfig: StorePaymentMethodsInfo? { storeInfo?.paymentMethods }
@@ -191,7 +190,6 @@ struct CheckoutView: View {
items: appState.cart.toOrderItemsPayload()
)
CardSelectionSheet(
savedCards: savedCards,
cardContext: cardContext,
appState: $appState,
onSavedCardConfirmed: { cardId in
@@ -209,11 +207,6 @@ struct CheckoutView: View {
}
)
}
.task(id: paymentMethod) {
if paymentMethod == .creditCard && useInAppPayment {
await loadSavedCards()
}
}
.navigationDestination(item: $orderTrackingContext) { context in
OrderTrackingView(orderId: context.orderId, initialShortId: context.shortId, postOrderBack: {
appState.shouldNavigateToOrders = true
@@ -957,24 +950,23 @@ struct PaymentPixView: View {
// MARK: - CardSelectionSheet
struct CardSelectionSheet: View {
let savedCards: [SavedCard]
let cardContext: CardPaymentContext
@Binding var appState: AppState
let onSavedCardConfirmed: (String) -> Void
let onOrderCreated: (String, String?) -> Void
@Environment(\.dismiss) var dismiss
@State private var cards: [SavedCard] = []
@State private var isLoading = false
@State var selectedCardId: String?
@State var isSubmitting = false
@State var showNewCardSheet = false
init(savedCards: [SavedCard], cardContext: CardPaymentContext, appState: Binding<AppState>, onSavedCardConfirmed: @escaping (String) -> Void, onOrderCreated: @escaping (String, String?) -> Void) {
self.savedCards = savedCards
init(cardContext: CardPaymentContext, appState: Binding<AppState>, onSavedCardConfirmed: @escaping (String) -> Void, onOrderCreated: @escaping (String, String?) -> Void) {
self.cardContext = cardContext
self._appState = appState
self.onSavedCardConfirmed = onSavedCardConfirmed
self.onOrderCreated = onOrderCreated
_selectedCardId = State(initialValue: savedCards.first(where: { $0.isDefault })?.id ?? savedCards.first?.id)
}
var body: some View {
@@ -1004,11 +996,15 @@ struct CardSelectionSheet: View {
ScrollView(showsIndicators: false) {
VStack(alignment: .leading, spacing: 16) {
if savedCards.isEmpty == false {
if isLoading {
ProgressView()
.frame(maxWidth: .infinity)
.padding(.top, 32)
} else if cards.isEmpty == false {
VStack(alignment: .leading, spacing: 0) {
ForEach(savedCards) { card in
ForEach(cards) { card in
savedCardRow(card)
if card.id != savedCards.last?.id {
if card.id != cards.last?.id {
Divider().padding(.horizontal, 14)
}
}
@@ -1066,6 +1062,17 @@ struct CardSelectionSheet: View {
SnackbarOverlay(center: SnackbarCenter.shared)
}
.task { await fetchCards() }
}
@MainActor
private func fetchCards() async {
isLoading = true
defer { isLoading = false }
if let result = try? await ApiService().listCards(), result.error == false, let fetched = result.result {
cards = fetched
selectedCardId = fetched.first(where: { $0.isDefault })?.id ?? fetched.first?.id
}
}
private func savedCardRow(_ card: SavedCard) -> some View {