mirror of
https://github.com/nicklockwood/SwiftFormat.git
synced 2026-06-16 10:34:34 +00:00
75 lines
2.1 KiB
Swift
75 lines
2.1 KiB
Swift
//
|
|
// CheckoutView.swift
|
|
// CupcakeCorner
|
|
//
|
|
// Created by Nick Lockwood on 28/06/2020.
|
|
// Copyright © 2020 Nick Lockwood. All rights reserved.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct CheckoutView: View {
|
|
@ObservedObject var order = Order()
|
|
|
|
@State private var confirmationMessage = ""
|
|
@State private var showingConfirmation = false
|
|
|
|
var body: some View {
|
|
GeometryReader { geo in
|
|
ScrollView {
|
|
VStack {
|
|
Image("cupcakes")
|
|
.resizable()
|
|
.scaledToFit()
|
|
.frame(width: geo.size.width)
|
|
|
|
Text("Your total is $\(self.order.data.cost, specifier: "%.2f")")
|
|
.font(.title)
|
|
|
|
Button("Place order", action: self.placeOrder)
|
|
.padding()
|
|
}
|
|
}
|
|
}
|
|
.navigationBarTitle("Check out", displayMode: .inline)
|
|
.alert(isPresented: $showingConfirmation) {
|
|
Alert(title: Text("Thank you!"),
|
|
message: Text(confirmationMessage),
|
|
dismissButton: .default(Text("OK")))
|
|
}
|
|
}
|
|
|
|
func placeOrder() {
|
|
guard let encoded = try? JSONEncoder().encode(order) else {
|
|
print("Failed to encode order")
|
|
return
|
|
}
|
|
|
|
let url = URL(string: "https://reqres.in/api/cupcakes")!
|
|
var request = URLRequest(url: url)
|
|
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
request.httpMethod = "POST"
|
|
request.httpBody = encoded
|
|
|
|
URLSession.shared.dataTask(with: request) { data, _, error in
|
|
guard let data = data else {
|
|
self.confirmationMessage = "No data in response: \(error?.localizedDescription ?? "Unknown error")."
|
|
self.showingConfirmation = true
|
|
return
|
|
}
|
|
if let decodedOrder = try? JSONDecoder().decode(Order.self, from: data) {
|
|
self.confirmationMessage = "Your order for \(decodedOrder.data.quantity)x \(Order.types[decodedOrder.data.type].lowercased()) cupcakes is on its way!"
|
|
} else {
|
|
self.confirmationMessage = "Invalid response from server"
|
|
}
|
|
self.showingConfirmation = true
|
|
}.resume()
|
|
}
|
|
}
|
|
|
|
struct CheckoutView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
CheckoutView(order: Order())
|
|
}
|
|
}
|