import Foundation import SwiftUI struct CartView: View { @Binding var appState: AppState var body: some View { VStack(spacing: 14) { Text("Carrinho") .font(AppTypography.heading1) .frame(maxWidth: .infinity, alignment: .leading) .padding(.horizontal, 20) .padding(.top, 20) if appState.cart.items.isEmpty { VStack(spacing: 10) { Text("Seu carrinho está vazio") .font(AppTypography.heading3) .foregroundStyle(AppColors.textPrimary) Text("Adicione produtos para continuar.") .font(AppTypography.body) .foregroundStyle(AppColors.textMuted) } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) } else { ScrollView(showsIndicators: false) { VStack(spacing: 12) { if let storeName = appState.cart.storeName, storeName.isEmpty == false { Text(storeName) .font(AppTypography.heading3) .foregroundStyle(AppColors.textPrimary) .frame(maxWidth: .infinity, alignment: .leading) .padding(.horizontal, 20) } ForEach(appState.cart.items) { item in cartItemRow(item) } } .padding(.bottom, 120) } } } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(AppColors.backgroundLight) .safeAreaInset(edge: .bottom) { if appState.cart.items.isEmpty == false { VStack(spacing: 10) { HStack { Text("Total") .font(AppTypography.heading3) .foregroundStyle(AppColors.textPrimary) Spacer() Text(formatCurrency(appState.cart.total)) .font(AppTypography.heading2) .foregroundStyle(AppColors.primary) } .padding(.horizontal, 20) PrimaryButton(title: "Finalizar pedido", action: {}) .padding(.horizontal, 20) } .padding(.top, 10) .padding(.bottom, 12) .background(.ultraThinMaterial) } } } private func cartItemRow(_ item: CartItemState) -> some View { HStack(spacing: 12) { VStack(alignment: .leading, spacing: 4) { Text(item.name) .font(AppTypography.heading3) .foregroundStyle(AppColors.textPrimary) .lineLimit(1) if let details = item.details, details.isEmpty == false { Text(details) .font(.caption) .foregroundStyle(AppColors.textMuted) .lineLimit(2) } Text(formatCurrency(item.unitPrice)) .font(AppTypography.body) .foregroundStyle(AppColors.textMuted) } Spacer() HStack(spacing: 8) { Button(action: { appState.cart.decrement(itemId: item.id) }) { Image(systemName: "minus") .font(.system(size: 13, weight: .bold)) .foregroundStyle(AppColors.textPrimary) .frame(width: 28, height: 28) .background(AppColors.brandSoft) .clipShape(Circle()) } .buttonStyle(.plain) Text("\(item.quantity)") .font(AppTypography.heading3) .foregroundStyle(AppColors.textPrimary) .frame(minWidth: 18) Button(action: { appState.cart.increment(itemId: item.id) }) { Image(systemName: "plus") .font(.system(size: 13, weight: .bold)) .foregroundStyle(AppColors.textPrimary) .frame(width: 28, height: 28) .background(AppColors.tertiary) .clipShape(Circle()) } .buttonStyle(.plain) } } .padding(.horizontal, 14) .padding(.vertical, 12) .background(AppColors.surface) .clipShape(RoundedRectangle(cornerRadius: AppLayout.radiusLG, style: .continuous)) .padding(.horizontal, 20) } private func formatCurrency(_ value: Double) -> String { String(format: "R$ %.2f", value).replacingOccurrences(of: ".", with: ",") } }