// // ContentView.swift // invertedBoolMinimumWorking // // Created by Joe Hensel on 8/17/23. // import SwiftUI import Foundation import UIKit import CryptoKit struct ContentView: View { @StateObject var addParticipantModel: AddParticipantModel = AddParticipantModel() var body: some View { VStack { Group{ TextField( "First Name", text: $addParticipantModel.firstName ) .disableAutocorrection(true) .padding(.top, 20) Divider() TextField( "Last Name", text: $addParticipantModel.lastName ) .disableAutocorrection(true) .padding(.top, 20) Divider() DatePicker( "Date of Birth", selection: $addParticipantModel.dateOfBirth ) .padding(.top, 20) Divider() TextField( "Address Line 1", text: $addParticipantModel.address1 ) .disableAutocorrection(true) .padding(.top, 20) Divider() TextField( "Address Line 2", text: $addParticipantModel.address2 ) .disableAutocorrection(true) .padding(.top, 20) Divider() } Group{ TextField( "City", text: $addParticipantModel.city ) .disableAutocorrection(true) .padding(.top, 20) Divider() Picker("State",selection: $addParticipantModel.state){ Group{ Text("Alabama").tag("AL") Text("Alaska").tag("AK") Text("Arizona").tag("AZ") Text("Arkansas").tag("AR") Text("California").tag("CA") Text("Colorado").tag("CO") Text("Connecticut").tag("CT") Text("Delaware").tag("DE") Text("Florida").tag("FL") Text("Georgia").tag("GA") } Group{ Text("Hawaii").tag("HI") Text("Idaho").tag("ID") Text("Illinois").tag("IL") Text("Indiana").tag("IN") Text("Iowa").tag("IA") Text("Kansas").tag("KS") Text("Kentucky").tag("KY") Text("Louisiana").tag("LA") Text("Maine").tag("ME") Text("Maryland").tag("MD") } Group{ Text("Massachusetts").tag("MA") Text("Michigan").tag("MI") Text("Minnesota").tag("MN") Text("Mississippi").tag("MS") Text("Missouri").tag("MO") Text("Montana").tag("MT") Text("Nebraska").tag("NE") Text("Nevada").tag("NV") Text("New Hampshire").tag("NH") Text("New Jersey").tag("NJ") } Group{ Text("New Mexico").tag("NM") Text("New York").tag("NY") Text("North Carolina").tag("NC") Text("North Dakota").tag("ND") Text("Ohio").tag("OH") Text("Oklahoma").tag("OK") Text("Oregon").tag("OR") Text("Pennsylvania").tag("PA") Text("Rhode Island").tag("RI") Text("South Carolina").tag("SC") } Group{ Text("South Dakota").tag("SD") Text("Tennessee").tag("TN") Text("Texas").tag("TX") Text("Utah").tag("UT") Text("Vermont").tag("VT") Text("Virginia").tag("VA") Text("Washington").tag("WA") Text("West Virginia").tag("WV") Text("Wisconsin").tag("WI") Text("Wyoming").tag("WY") } } Divider() TextField( "Zip", text: $addParticipantModel.zip ) .disableAutocorrection(true) .padding(.top, 20) .keyboardType(UIKeyboardType.numberPad) Divider() } Spacer() Button( action: { Task{ await addParticipantModel.addParticipant() } }, label: { Text("Add Participant") .modifier(MainButton()) } ) } .padding() } } class AddParticipantModel: ObservableObject { @Published var firstName: String = "" @Published var lastName: String = "" @Published var dateOfBirth: Date = Date() @Published var address1: String = "" @Published var address2: String = "" @Published var city: String = "" @Published var state: String = "NV" @Published var zip: String = "" @Published var showErrorAlert: Bool = false @Published var stillLoading: Bool = false func addParticipant(/*authString: String*/) async { let participant: Participant = Participant(id: "", approved: ApprovalStatus.Pending, active: false, firstName: firstName, lastName: lastName, dob: dateOfBirth, programStart: Date(), address1: address1, address2: address2, city: city, state: state, zip: zip) DispatchQueue.main.async { self.stillLoading = true } print(stillLoading) await AddParticipantAction( parameters: AddParticipantRequest( participant: participant, deviceId: UIDevice.current.identifierForVendor!.uuidString /*authString: authString*/ ) ).call { response in //Check for an error response from the API if response.errorNumber == 0{ DispatchQueue.main.async{ self.showErrorAlert = false; self.stillLoading = false; } } else{ DispatchQueue.main.async{ self.showErrorAlert = true; self.stillLoading = false; } } print(self.stillLoading) } } } struct Participant: Hashable, Codable, Identifiable { var id: String var approved: ApprovalStatus var active: Bool var firstName: String var lastName: String var dob: Date var programStart: Date var address1: String var address2: String var city: String var state: String var zip: String enum CodingKeys: String, CodingKey { case id = "record_id" case approved case active case firstName = "first_name" case lastName = "last_name" case dob case programStart = "program_start" case address1 = "address_1" case address2 = "address_2" case city case state case zip } } extension Participant { static var emptyParticipant: Participant = Participant(id: "a", approved: ApprovalStatus.Denied, active: false, firstName: "", lastName: "", dob: Date(), programStart: Date(), address1: "", address2: "", city: "", state: "", zip: "") static let sampleParticipant: Participant = Participant(id: "e", approved: ApprovalStatus.Pending, active: false, firstName: "Sample", lastName: "Participant", dob: Date(), programStart: Date(), address1: "10 Sample Ln", address2: "Apt 10", city: "Las Vegas", state: "NV", zip: "89123") } enum ApprovalStatus: String, Codable{ case Approved = "Approved" case Denied = "Denied" case Pending = "Pending" case All = "All" } struct AddParticipantRequest: Encodable { let participant: Participant let deviceId: String /*let authString: String*/ enum CodingKeys: String, CodingKey { case participant case deviceId = "device_id" /*case authString = "auth_string"*/ } } struct AddParticipantResponse: Decodable { let data: String let error: String let errorNumber: Int enum CodingKeys: String, CodingKey { case data case error case errorNumber = "error_number" } } struct AddParticipantAction { /*let path = "REDACTED" let method: HTTPMethod = .post*/ var parameters: AddParticipantRequest func call( completion: @escaping (AddParticipantResponse) -> Void ) { /*APIRequest.call( path: path, method: .post, parameters: parameters ) { data in let decoder = JSONDecoder() decoder.dateDecodingStrategy = .secondsSince1970 if let response = try? decoder.decode( AddParticipantResponse.self, from: data ) { completion(response) } else { print("Unable to decode response JSON") } }*/ let fakeResponse = "{\"data\":\"success\",\"error\":\"\",\"error_number\":0}" let fakeData = Data(fakeResponse.utf8) let decoder = JSONDecoder() decoder.dateDecodingStrategy = .secondsSince1970 if let response = try? decoder.decode( AddParticipantResponse.self, from: fakeData ) { completion(response) } else { print("Unable to decode response JSON") } print("done") } } struct MainButton: ViewModifier { var color: Color = Color.blue func body(content: Content) -> some View { content .font(.system(size: 24, weight: .bold, design: .default)) .frame(maxWidth: .infinity, maxHeight: 60) .foregroundColor(Color.white) .background(color) .cornerRadius(10) } }