Last active
March 15, 2021 10:32
-
-
Save ResonantEdge/3684a2de2e6268b4347189c300ce957d to your computer and use it in GitHub Desktop.
iOS Appetite Subscription Creation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var imageCard = "icons_credit" | |
let child = SpinnerViewController() | |
var selectedMonth : Int? | |
var selectedYear : Int? | |
var restaurant: Restaurant? | |
var cartItemArray = [PlanMenu]() | |
var planDictionary = [String: Any]() | |
var submitViewModel = SubmitViewModel() | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
setupView() | |
} | |
// MARK: - Mealplan creation | |
@objc func tapSubmit(_ sender: UIButton) { | |
animateButton(sender) | |
dismissKeyboard() | |
errorLabel.alpha = 0 | |
submitPlan() | |
} | |
func submitPlan() { | |
submitViewModel.submitPlanResponse { (information, status) in | |
switch status { | |
case .processing: | |
self.showSpinner() | |
case .payment: | |
guard let tokenId = information else { return } | |
self.submitViewModel.savePlan(planDictionary: self.planDictionary, restaurant: self.restaurant, tokenId: tokenId) | |
case .error: | |
self.removeSpinner() | |
guard let error = information else { return } | |
self.showError(message: error) | |
case .created: | |
self.removeSpinner() | |
guard let planId = information else { return } | |
self.transitionToPlan(planId: planId) | |
} | |
} | |
submitViewModel.createCard(selectedMonth, selectedYear, ccvNumber.text, numberCard.text) | |
} | |
func transitionToPlan(planId: String) { | |
let createdPlanId : [String: String] = ["createdPlanId": planId] | |
let name = Notification.Name(rawValue: Constants.Observer.planCreated) | |
NotificationCenter.default.post(name: name, object: nil, userInfo: createdPlanId) | |
if self.presentingViewController != nil { | |
print("presenter not nil") | |
self.dismiss(animated: false, completion: { | |
self.tabBarController?.selectedIndex = 0 | |
self.navigationController?.popToRootViewController(animated: true) | |
}) | |
} else { | |
self.tabBarController?.selectedIndex = 0 | |
self.navigationController?.popToRootViewController(animated: true) | |
} | |
} | |
@objc func didAddNumber(number: UITextField) { | |
number.text = self.modifyCreditCard(creditCard: number.text!) | |
} | |
func modifyCreditCard(creditCard : String) -> String { | |
let trimmedString = creditCard.components(separatedBy: .whitespaces).joined() | |
let arrOfCharacters = Array(trimmedString) | |
var modifiedCreditCard = "" | |
if(arrOfCharacters.count > 0) { | |
for i in 0...arrOfCharacters.count-1 { | |
modifiedCreditCard.append(arrOfCharacters[i]) | |
if((i+1) % 4 == 0 && i+1 != arrOfCharacters.count){ | |
modifiedCreditCard.append(" ") | |
} | |
} | |
} | |
let firstDigit = Int(creditCard.prefix(1) ) | |
switch firstDigit { | |
case 4: | |
updateImage(imageString: "logo_visa") | |
break | |
case 5: | |
updateImage(imageString: "logo_mastercard") | |
break | |
case 3: | |
updateImage(imageString: "logo_amex") | |
break | |
case 6: | |
updateImage(imageString: "logo_discover") | |
break | |
default: | |
updateImage(imageString: "logo_credit") | |
break | |
} | |
return modifiedCreditCard | |
} | |
class SubmitViewModel { | |
let db = Firestore.firestore() | |
let stripePublishableKey = "pk_test_7PNU1KNUDp2vmhBrkVrR1njI0022uUB11Z" | |
typealias submitPlanCallback = (_ information: String?, _ status: SubmitStatus) -> Void | |
var submitPlanProcess: submitPlanCallback? | |
init() {} | |
func submitPlanResponse(callback: @escaping submitPlanCallback){ | |
self.submitPlanProcess = callback | |
} | |
func createCard(_ month: Int?, _ year: Int?, _ ccv: String?, _ number: String?) { | |
submitPlanProcess?(nil, .processing) | |
let stripeCardParams = STPCardParams() | |
if let cardNumber = number, | |
let cardMonth = month, | |
let cardYear = year, | |
let cardCCV = ccv { | |
stripeCardParams.number = cardNumber | |
stripeCardParams.expMonth = UInt(cardMonth) | |
stripeCardParams.expYear = UInt(cardYear) | |
stripeCardParams.cvc = cardCCV | |
} else { | |
submitPlanProcess?("Please fill in all card details", .error) | |
} | |
//converting into token | |
let stpApiClient = STPAPIClient.init(publishableKey: stripePublishableKey) | |
stpApiClient.createToken(withCard: stripeCardParams) { (token, error) in | |
if error == nil { | |
//Success | |
guard let tokenId = token?.tokenId else { return } | |
DispatchQueue.main.async { | |
self.submitPlanProcess?(tokenId, .payment) | |
} | |
} else { | |
//failed | |
guard let error = error else { return } | |
self.submitPlanProcess?(error.localizedDescription, .error) | |
} | |
} | |
} | |
func savePlan(planDictionary: [String: Any], restaurant: Restaurant?, tokenId: String) { | |
guard let mpName = planDictionary["mpName"], | |
let planType = planDictionary["planType"], | |
let restaurantAddress = restaurant?.restaurantAddress, | |
let restaurantId = restaurant?.id, | |
let restaurantName = restaurant?.restaurantName, | |
let frequency = planDictionary["frequency"], | |
let userId = planDictionary["userId"], | |
let planSchedule = planDictionary["schedule"] as? [Schedule], | |
let planMenu = planDictionary["planMenu"] as? [PlanMenu] else { return } | |
let updatedSchedule = updateHour(schedule: planSchedule) | |
var schedule = [Any]() | |
for eachDay in updatedSchedule { | |
do { | |
let jsonData = try JSONEncoder().encode(eachDay) | |
let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) | |
schedule.append(jsonObject) | |
} | |
catch { | |
// handle error | |
submitPlanProcess?("Problems with setting schedule", .error) | |
} | |
} | |
var menu = [Any]() | |
for eachItem in planMenu { | |
do { | |
let jsonData = try JSONEncoder().encode(eachItem) | |
let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) | |
menu.append(jsonObject) | |
} | |
catch { | |
// handle error | |
submitPlanProcess?("Problems with saving menu", .error) | |
} | |
} | |
let mealPlan : [String: Any] = ["addressOne" : planDictionary["addressOne"] ?? "", | |
"addressTwo" : planDictionary["addressTwo"] ?? "", | |
"city" : planDictionary["city"] ?? "", | |
"postalCode" : planDictionary["postalCode"] ?? "", | |
"mpName" : mpName, | |
"phone" : planDictionary["phone"] ?? "", | |
"planType" : planType, | |
"restaurantAddress" : restaurantAddress, | |
"restaurantId" : restaurantId, | |
"restaurantName" : restaurantName, | |
"timeOfCreation" : Timestamp(date: Date()), | |
"instructions" : planDictionary["instructions"] ?? "", | |
"paymentToken" : tokenId, | |
"frequency" : frequency, | |
"schedule" : schedule, | |
"planMenu" : menu, | |
"status" : 1, | |
"userId" : userId | |
] | |
var planRef: DocumentReference? = nil | |
planRef = db.collection("Meal_Plans").addDocument(data: mealPlan) { err in | |
if let err = err { | |
self.submitPlanProcess?(err.localizedDescription, .error) | |
} else { | |
if let planRef = planRef { | |
self.submitPlanProcess?(planRef.documentID, .created) | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment