Skip to content

Instantly share code, notes, and snippets.

@ResonantEdge
Last active March 15, 2021 10:32
Show Gist options
  • Save ResonantEdge/3684a2de2e6268b4347189c300ce957d to your computer and use it in GitHub Desktop.
Save ResonantEdge/3684a2de2e6268b4347189c300ce957d to your computer and use it in GitHub Desktop.
iOS Appetite Subscription Creation
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