Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // ProfileDetailsViewController.swift
- // PixFood
- //
- // Created by Jovan Mitrovski on 2/26/18.
- // Copyright © 2018 Dina Kocevska. All rights reserved.
- //
- import FacebookCore
- import FacebookLogin
- import Foundation
- import Lottie
- import Mixpanel
- import SDWebImage
- import UIKit
- enum SmallCardStates {
- // default for all cards
- case initialState
- // allergies card-state cases
- case noAllergiesSelected
- case hasAllergiesSelectedSmallCard
- case hasAllergiesSelectedBigCard
- // diests card-state cases
- case noDietsSelected
- case hasDietsSelectedBigCard
- case hasDietsSelectedSmallCard
- // dislikes card-state cases
- case noDislikesSelected
- case hasDislikesSelectedBigCard
- case hasDislikesSelectedSmallCard
- }
- class ProfileDetailsViewController: UIViewController, NewAdaptingItemsViewDelegate, UIScrollViewDelegate, UIGestureRecognizerDelegate {
- private var progressDotsView: UIView = UIView()
- private var navToolbarView: NavToolbarView = NavToolbarView()
- private var mainScroll: UIScrollView = UIScrollView()
- private var profileImageView: UIImageView = UIImageView()
- private var profileImageShadowView: UIView = UIView()
- private var userNameLabel: UILabel = UILabel()
- private var emailLabel: UILabel = UILabel()
- private var userEmailLabel: UILabel = UILabel()
- private var editProfileImgBtn: UIButton = UIButton()
- // moving the image to top
- private var profileImageToTopPercentage: Float = Float()
- private var profileToTopPosition: Float = 30
- private var pcWrapper: UIView = UIView()
- private var horizontalScroll: UIScrollView = UIScrollView()
- // main views
- private var userPrefPage1: UIView = UIView()
- private var userPrefPage2: UIView = UIView()
- private var userPrefPage3: UIView = UIView()
- private var userPrefPage1originX: CGFloat = CGFloat()
- private var userPrefPage2originX: CGFloat = CGFloat()
- private var userPrefPage3originX: CGFloat = CGFloat()
- // allergies screen setup
- private var allergiesTopView: UIView = UIView()
- private var allergiesTopSubView: UIView = UIView()
- private var allergiesTopScroll: NewAdaptingItemsView = NewAdaptingItemsView()
- private var allergiesBottomScroll: NewAdaptingItemsView = NewAdaptingItemsView()
- private var addAllergiesView: UIView = UIView()
- private var removeAllergiesView: UIView = UIView()
- private var selectedAllergies: [[String: Any]] = []
- private var unSelectedAllergies: [[String: Any]] = []
- private var allergiesTitle: UILabel = UILabel()
- private var hasAllergieSelected: Bool = false
- // allergies components
- private var switchButton: UISwitch = UISwitch()
- private var dontHaveAllerLbl: UILabel = UILabel()
- private var allergiesSmallDesc: UILabel = UILabel()
- private var allergiesBigDesc: UILabel = UILabel()
- private var allergiesTopSeparator: UIImageView = UIImageView()
- private var allergiesSelectedStringLbl: UILabel = UILabel()
- private var editAllergiesIcon: UIImageView = UIImageView()
- private var allergiesRightGradientLayer: CAGradientLayer = CAGradientLayer()
- private var allergiesTopScrollWrapper: UIView = UIView()
- private var addAllergiesACTextFieldWrapper: UIView = UIView()
- private var addAllergiesACTextField: ACTextField = ACTextField()
- private var addAllergiesACTextFieldClearBtn: UIButton = UIButton()
- private var newAllergieString: String = ""
- private var animationView: LOTAnimationView = LOTAnimationView()
- // diets screen setup
- private var dietsTopView: UIView = UIView()
- private var dietsTopSubView: UIView = UIView()
- private var dietsTopScroll: NewAdaptingItemsView = NewAdaptingItemsView()
- private var dietsBottomScroll: NewAdaptingItemsView = NewAdaptingItemsView()
- private var selectedDiets: [[String: Any]] = []
- private var unSelectedDiets: [[String: Any]] = []
- private var dietsTitle: UILabel = UILabel()
- private var hasDietSelected: Bool = false
- // diets components
- private var dietsSmallDesc: UILabel = UILabel()
- private var dietsBigDesc: UILabel = UILabel()
- private var dietsTopSeparator: UIImageView = UIImageView()
- private var dietsSelectedStringLbl: UILabel = UILabel()
- private var editDietsIcon: UIImageView = UIImageView()
- private var dietsRightGradientLayer: CAGradientLayer = CAGradientLayer()
- private var dietsTopScrollWrapper: UIView = UIView()
- private var selectedDislikes: [[String: Any]] = []
- // dislikes screen setup
- private var dislikesTopView: UIView = UIView()
- private var dislikesTopSubView: UIView = UIView()
- private var dislikesTopScroll: NewAdaptingItemsView = NewAdaptingItemsView()
- private var dislikesTopScrollWrapper: UIView = UIView()
- // dislikes components
- private var dislikesTitle: UILabel = UILabel()
- private var dislikesTopSeparator: UIImageView = UIImageView()
- private var dislikesBigDesc: UILabel = UILabel()
- private var editDislikesIcon: UIImageView = UIImageView()
- private var dislikesSmallDesc: UILabel = UILabel()
- private var dislikesACTextFieldWrapper: UIView = UIView()
- private var dislikesACTextField: ACTextField = ACTextField()
- private var dislikesACTextFieldClearButton: UIButton = UIButton()
- private var dislikesAddBtn: UIButton = UIButton()
- private var dislikesSelectedStringLbl: UILabel = UILabel()
- private var dislikesRightGradientLayer: CAGradientLayer = CAGradientLayer()
- private var dislikesSearchText: String = String()
- // config scrolls
- private var mainMargin: CGFloat = 16
- private var userPrefPage1ToLeftPercentage: CGFloat = (16 / 100)
- private var smallUserPrefCardWidth: CGFloat = CGFloat()
- private var scrolledToEndLeft: Bool = true
- // initial arrays
- private var initialSelectedAllergies: [[String: Any]] = [[String: Any]]()
- private var initialSelectedDiets: [[String: Any]] = [[String: Any]]()
- private var initialSelectedDislikes: [[String: Any]] = [[String: Any]]()
- // helping props
- private var userPrefCardTimeSpend: Date?
- private var userPreferences: UserPreferences = UserPreferences()
- private var methodStart: Date?
- private var isLogoutPressed: Bool = false
- private var isMainScrollOpened: Bool = false
- private var cardBorderRadius: CGFloat = 10
- private var noAllergiesToggleSelected: Bool = false
- private var startingNoAllergiesToggleSelected: Bool = false
- private var sendButton: UIButton = UIButton()
- private var mainScrollPercentageScrolled: CGFloat = 0
- private var cardSubViewWidth: CGFloat = 0
- private var horizontalScrollIndexPage: Int = 0
- private var isNoAlleryViewOpened: Bool = false
- private var tapGestureForKeyboard: UITapGestureRecognizer = UITapGestureRecognizer()
- private var allergiesCardState: SmallCardStates = .initialState
- private var dietsCardState: SmallCardStates = .initialState
- private var dislikesCardState: SmallCardStates = .initialState
- private var removingSelectedAllergie: [String: Any] = ["allowRemoving": false, "itemToRemove": [String: Any].self] {
- didSet {
- removingSelectedAllergie(removingSelectedAllergie)
- }
- }
- private var mainScrollScrolled: CGFloat = 0 {
- didSet {
- percentageAnimationOnViews()
- }
- }
- // deeplinks
- var isAllergiesDeeplink: Bool = false
- var isDietsDeeplink: Bool = false
- var isDeeplink: Bool = false
- // Black View init
- // MARK: - CONTROLLER LIFECYCLE
- override func viewDidLoad() {
- self.view.backgroundColor = .white
- // add tapGesture listener
- tapGestureForKeyboard = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
- self.view.addGestureRecognizer(tapGestureForKeyboard)
- if !isDeeplink {
- navControllerRoutesShuffle()
- }
- // self.navigationController?.interactivePopGestureRecognizer?.delegate = self
- disableAllergiesScroll(isDisabled: UserDefaults.standard.bool(forKey: "noAllergieToggleSelected"))
- initNavToolbarView()
- initScrollView()
- initUserDetails()
- initHorizontalScroll()
- initUserPreferences()
- initDotsPageIndicator()
- animateInit()
- }
- override func viewWillAppear(_ animated: Bool) {
- print("viewWillAppear")
- methodStart = Date()
- userNameLabel.text = (UserManagmentService.sharedInstance.getUser() as! User).name ?? ""
- if (UserManagmentService.sharedInstance.getUser() as! User).type == USER_LOGIN_TYPES.EMAIL {
- if (UserManagmentService.sharedInstance.getUser() as! User).imageUrl.isEmpty {
- editProfileImgBtn.layer.opacity = 1
- } else {
- editProfileImgBtn.layer.opacity = 0
- }
- }
- if UserManagmentService.sharedInstance.isUserLogedIn() {
- if !(UserManagmentService.sharedInstance.getUser() as! User).imageUrl.isEmpty {
- SDImageCache.shared().clearMemory()
- SDImageCache.shared().clearDisk()
- let imageUrl: URL = URL(string: (UserManagmentService.sharedInstance.getUser() as! User).imageUrl)!
- profileImageView.sd_setImage(with: imageUrl, completed: nil)
- } else {
- profileImageView.image = #imageLiteral(resourceName: "ic_profile_avatar")
- }
- } else {
- // this is impossible scenario
- profileImageView.image = #imageLiteral(resourceName: "ic_profile_avatar")
- }
- }
- override func viewWillDisappear(_ animated: Bool) {
- if !isLogoutPressed { // only if user logs out, then dont log the event.
- EventsService.sharedInstance.logEvent(withName: "OpenProfile", properies: nil, timeSpentSince: methodStart!)
- }
- if !UserDefaults.standard.bool(forKey: "noAllergieToggleSelected") {
- if noAllergiesToggleSelected {
- EventsService.sharedInstance.logEvent(withName: "NoAllergies", properies: nil, timeSpentSince: nil)
- }
- }
- UserDefaults.standard.setValue(noAllergiesToggleSelected, forKey: "noAllergieToggleSelected")
- UserDefaults.standard.synchronize()
- }
- override func viewDidDisappear(_ animated: Bool) {
- updateProfileCallOnBack()
- }
- func setupSwipeView() {
- let slideView = UIView(frame: CGRect(x: 0, y: 0, width: 2, height: ConstValues.screenHeight))
- view.addSubview(slideView)
- let swipeRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(swipeRecognizer(_:)))
- swipeRecognizer.direction = .right
- view.addGestureRecognizer(swipeRecognizer)
- }
- @objc func swipeRecognizer(_ sender: UIGestureRecognizer) {
- self.navigationController?.popViewController(animated: true)
- }
- // MARK: - Init Methods
- func initDotsPageIndicator() {
- progressDotsView = UIView(frame: CGRect(x: 16, y: 16, width: 46, height: 8))
- progressDotsView.alpha = 0
- let viewWidth: Int = 8
- var originx: Int = 0
- for i in 0 ..< 3 {
- let view = UIView(frame: CGRect(x: originx, y: 0, width: viewWidth, height: viewWidth))
- originx += viewWidth + 8
- view.backgroundColor = AppColors.lightGray
- view.layer.cornerRadius = view.frame.width / 2
- progressDotsView.addSubview(view)
- view.tag = i
- }
- progressDotsView.subviews[0].backgroundColor = AppColors.redColor
- progressDotsView.clipsToBounds = true
- pcWrapper.addSubview(progressDotsView)
- }
- func initAddAllergiesView() {
- isNoAlleryViewOpened = true
- let heightExtraArg: CGFloat = ConstValues.screenHeight > 670 ? 104 : 64
- addAllergiesView = UIView(frame: CGRect(
- x: 0,
- y: allergiesTopView.frame.maxY + 32,
- width: ConstValues.screenWidth,
- height: ConstValues.screenHeight - (allergiesTopView.frame.height + navToolbarView.frame.height + heightExtraArg + HelperMethodesService.sharedInstance.safeAreaBottomHeight())))
- addAllergiesView.backgroundColor = .white
- addAllergiesView.layer.opacity = 0
- addAllergiesACTextFieldWrapper = UIView(frame: CGRect(x: 32, y: 44, width: addAllergiesView.frame.width - 64, height: 44))
- addAllergiesACTextFieldWrapper.backgroundColor = AppColors.lightGray
- addAllergiesACTextFieldWrapper.layer.cornerRadius = 22
- addAllergiesACTextField = ACTextField(
- frame: CGRect(x: 32, y: 0, width: addAllergiesACTextFieldWrapper.frame.width - 2*32, height: addAllergiesACTextFieldWrapper.frame.height),
- font: AppFonts.openSansBold20!,
- mainFontColor: AppColors.textColor,
- autocompleteFontColor: UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.3),
- placeholderText: "Type",
- placeholderFontColor: AppColors.textColor.withAlphaComponent(0.3),
- turnAutocompleteOn: false
- )
- // -7 for x button to make more clickable and have right position
- addAllergiesACTextFieldClearBtn = UIButton(frame: CGRect(x: addAllergiesACTextField.frame.maxX - 7, y: (addAllergiesACTextFieldWrapper.frame.height/2) - (32/2), width: 32, height: 32))
- addAllergiesACTextFieldClearBtn.setImage(UIImage(named: "ic_clear_text"), for: UIControlState.normal)
- addAllergiesACTextFieldClearBtn.imageEdgeInsets = UIEdgeInsets(top: 9, left: 9, bottom: 9, right: 9)
- addAllergiesACTextFieldClearBtn.contentMode = .scaleAspectFill
- addAllergiesACTextFieldClearBtn.addTarget(self, action: #selector(ACTextFieldClearBtnTapped(sender:)), for: UIControlEvents.touchUpInside)
- addAllergiesACTextFieldClearBtn.layer.opacity = 0
- addAllergiesACTextField.delegate = self
- addAllergiesACTextFieldWrapper.addSubview(addAllergiesACTextField)
- addAllergiesACTextFieldWrapper.addSubview(addAllergiesACTextFieldClearBtn)
- addAllergiesView.addSubview(addAllergiesACTextFieldWrapper)
- // desc label
- let textLbl = UIManagmentService.sharedInstance.createLabel(
- x: 32,
- y: addAllergiesACTextFieldWrapper.frame.maxY + 24,
- w: addAllergiesView.frame.width - 2 * 32,
- h: 62,
- fontName: AppFonts.openSansRegular18!,
- fontColor: AppColors.textColor,
- lines: 2,
- alignment: .center,
- text: "the allergy you want us to take into consideration"
- )
- addAllergiesView.addSubview(textLbl)
- //Setup Button
- let halfScreenWidth = ConstValues.screenWidth / 2
- sendButton = UIButton(frame: CGRect(x: halfScreenWidth - (187/2), y: addAllergiesView.frame.height - 155, width: 187, height: 44))
- sendButton.layer.addSublayer(UIManagmentService.sharedInstance.addGradientColorOnButtonBorder(onView: sendButton))
- sendButton.setTitle("Send", for: UIControlState.normal)
- sendButton.titleLabel?.font = AppFonts.openSansBold18
- sendButton.setTitleColor(AppColors.redColor, for: UIControlState.normal)
- sendButton.addTarget(self, action: #selector(sendButtonPressed), for: UIControlEvents.touchUpInside)
- addAllergiesView.addSubview(sendButton)
- //Cancel Button
- let cancelButton = UIButton(frame: CGRect(x: ConstValues.marginX * 2, y: sendButton.frame.maxY + 50, width: addAllergiesView.frame.width - 4 * ConstValues.marginX, height: 44))
- cancelButton.setTitle("Cancel", for: UIControlState.normal)
- cancelButton.titleLabel?.font = AppFonts.openSansRegular16
- cancelButton.setTitleColor(AppColors.lightBlackColor, for: UIControlState.normal)
- cancelButton.addTarget(self, action: #selector(cancelButtonPressed), for: UIControlEvents.touchUpInside)
- addAllergiesView.addSubview(cancelButton)
- //LOTTIE
- animationView = UIManagmentService.sharedInstance.createLoader(originY: sendButton.frame.origin.y)
- animationView.isHidden = true
- addAllergiesView.addSubview(animationView)
- userPrefPage1.addSubview(addAllergiesView)
- userPrefPage1.sendSubview(toBack: addAllergiesView)
- UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseIn, animations: {
- self.addAllergiesView.layer.opacity = 1
- }, completion: nil)
- }
- func initRemoveAllergieView () {
- removeAllergiesView = UIView(frame: self.view.frame)
- removeAllergiesView.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.7)
- removeAllergiesView.alpha = 0
- let mainView = UIView(frame: CGRect(x: 16, y: removeAllergiesView.frame.height / 2 - 115, width: removeAllergiesView.frame.width - 2 * ConstValues.marginX, height: 230))
- mainView.backgroundColor = .white
- mainView.layer.cornerRadius = 10
- removeAllergiesView.addSubview(mainView)
- // SEPARATOR
- let separatorImage = UIImageView(frame: CGRect(x: (mainView.frame.width / 2) - 36, y: 32, width: 72, height: 5))
- separatorImage.contentMode = .scaleAspectFill
- separatorImage.image = #imageLiteral(resourceName: "ic_separator_wave")
- mainView.addSubview(separatorImage)
- // TEXT LABEL WITH ATR. STRING
- let messageLabel = UIManagmentService.sharedInstance.createLabel(
- x: ConstValues.marginX,
- y: separatorImage.frame.maxY + 22,
- w: mainView.frame.width - 2 * ConstValues.marginX,
- h: 52,
- fontName: AppFonts.openSansSemiBold18!,
- fontColor: AppColors.blackTitleColor,
- lines: 2,
- alignment: .center,
- text: "Any change to the allergies will affect the recipe selection you get!"
- )
- mainView.addSubview(messageLabel)
- let descLabel = UIManagmentService.sharedInstance.createLabel(
- x: 16,
- y: messageLabel.frame.maxY + 16,
- w: mainView.frame.width - 2 * ConstValues.marginX,
- h: 52,
- fontName: AppFonts.openSansRegular18!,
- fontColor: AppColors.textColor,
- lines: 1,
- alignment: .center,
- text: "Are you OK with this?"
- )
- mainView.addSubview(descLabel)
- let cancelButton = UIButton(frame: CGRect(x: 0, y: mainView.frame.height - 45, width: mainView.frame.width / 2, height: 45))
- cancelButton.tag = 9898
- cancelButton.setTitle("NO, GO BACK", for: UIControlState.normal)
- cancelButton.titleLabel?.font = AppFonts.openSansBold16
- cancelButton.setTitleColor(AppColors.black, for: UIControlState.normal)
- cancelButton.addTarget(self, action: #selector(cancelButtonPressed), for: UIControlEvents.touchUpInside)
- mainView.addSubview(cancelButton)
- let yesButton = UIButton(frame: CGRect(x: cancelButton.frame.maxX, y: mainView.frame.height - 45, width: mainView.frame.width / 2, height: 45))
- yesButton.setTitle("YES, CONTINUE", for: UIControlState.normal)
- yesButton.titleLabel?.font = AppFonts.openSansBold16
- yesButton.setTitleColor(AppColors.black, for: UIControlState.normal)
- yesButton.addTarget(self, action: #selector(yesButtonPressed(sender:)), for: UIControlEvents.touchUpInside)
- mainView.addSubview(yesButton)
- UIManagmentService.sharedInstance.addTopBorderWithColor(color: .black, view: cancelButton)
- UIManagmentService.sharedInstance.addTopBorderWithColor(color: .black, view: yesButton)
- UIManagmentService.sharedInstance.addLeftBorderWithColor(color: .black, view: yesButton)
- self.view.addSubview(removeAllergiesView)
- UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseIn, animations: {
- self.removeAllergiesView.alpha = 1
- }, completion: nil)
- }
- private func initNavToolbarView() {
- navToolbarView = NavToolbarView(screenType: .profileScreen)
- navToolbarView.delegate = self
- profileImageToTopPercentage = ((Float(navToolbarView.frame.origin.y + navToolbarView.frame.height + 20) - profileToTopPosition) / 100)
- self.view.addSubview(navToolbarView)
- }
- private func initScrollView() {
- mainScroll = UIScrollView(frame: CGRect(x: 0, y: (navToolbarView.frame.origin.y + navToolbarView.frame.height), width: ConstValues.screenWidth, height: ConstValues.screenHeight))
- mainScroll.tag = 1
- mainScroll.contentSize = CGSize(width: ConstValues.screenWidth, height: (ConstValues.screenHeight + (ConstValues.screenHeight / 2 + 120)) - (navToolbarView.frame.maxY))
- mainScroll.delegate = self
- mainScroll.clipsToBounds = true
- mainScroll.isPagingEnabled = true
- mainScroll.bounces = false
- mainScroll.showsVerticalScrollIndicator = false
- mainScroll.isMultipleTouchEnabled = false
- mainScroll.decelerationRate = UIScrollViewDecelerationRateFast
- mainScroll.isScrollEnabled = false
- pcWrapper = UIView(frame: CGRect(
- x: 0,
- y: ConstValues.screenHeight - 264 - CGFloat(HelperMethodesService.sharedInstance.safeAreaTotalHeight()),
- width: ConstValues.screenWidth,
- height: ConstValues.screenHeight)
- )
- mainScroll.addSubview(pcWrapper)
- self.view.addSubview(mainScroll)
- }
- private func initUserDetails() {
- profileImageView = UIImageView(frame: CGRect(x: 88, y: (navToolbarView.frame.maxY) + 20, width: ConstValues.screenWidth - 2*88, height: ConstValues.screenWidth - 2*88))
- profileImageView.layer.cornerRadius = profileImageView.frame.width / 2
- profileImageView.clipsToBounds = true
- profileImageView.layer.opacity = 0
- let cetvrtince = profileImageView.frame.width / 4
- editProfileImgBtn = UIButton(frame:
- CGRect(x: profileImageView.frame.origin.x + (cetvrtince * 3) + (cetvrtince / 10), y: profileImageView.frame.origin.y + cetvrtince - ((cetvrtince/10) * 7), width: 30, height: 30))
- editProfileImgBtn.layer.cornerRadius = editProfileImgBtn.frame.width / 2
- editProfileImgBtn.backgroundColor = .white
- editProfileImgBtn.setImage(#imageLiteral(resourceName: "ic_edit_pref"), for: UIControlState.normal)
- editProfileImgBtn.addTarget(self, action: #selector(editProfileImgBtnTapped(sender:)), for: .touchUpInside)
- editProfileImgBtn.layer.opacity = 0
- // ADD SHADOW
- profileImageShadowView = UIView(frame: profileImageView.frame)
- profileImageShadowView.clipsToBounds = false
- profileImageShadowView.layer.shadowColor = UIColor.black.cgColor
- profileImageShadowView.layer.shadowOpacity = 0.20
- profileImageShadowView.layer.shadowOffset = CGSize(width: 0, height: 5)
- profileImageShadowView.layer.shadowRadius = 20
- profileImageShadowView.layer.shadowPath = UIBezierPath(roundedRect: profileImageShadowView.bounds, cornerRadius: profileImageShadowView.frame.width / 2).cgPath
- profileImageShadowView.layer.opacity = 0
- profileImageShadowView.contentMode = .scaleToFill
- userNameLabel = UIManagmentService.sharedInstance.createLabel(
- x: 32,
- y: (profileImageView.frame.origin.y + profileImageView.frame.height) + 20,
- w: ConstValues.screenWidth - 2*32,
- h: 70,
- fontName: AppFonts.openSansBold26!,
- fontColor: AppColors.black,
- lines: 2,
- alignment: .center,
- text: (UserManagmentService.sharedInstance.getUser() as! User).name! )
- userNameLabel.layer.opacity = 0
- let emailLabelString: String = (UserManagmentService.sharedInstance.getUser() as! User).isInstagram! ? "USERNAME" : "E-MAIL"
- emailLabel = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: (userNameLabel.frame.origin.y + userNameLabel.frame.height) + 5,
- w: ConstValues.screenWidth,
- h: 14,
- fontName: AppFonts.openSansRegular12!,
- fontColor: UIColor(red: 81/255, green: 81/255, blue: 81/255, alpha: 0.5),
- lines: 1,
- alignment: .center,
- text: emailLabelString)
- emailLabel.layer.opacity = 0
- let userEmailLabelString: String = (UserManagmentService.sharedInstance.getUser() as! User).isInstagram!
- ? (UserManagmentService.sharedInstance.getUser() as! User).username!
- : (UserManagmentService.sharedInstance.getUser() as! User).email!
- userEmailLabel = UIManagmentService.sharedInstance.createLabel(
- x: 32,
- y: (emailLabel.frame.origin.y + emailLabel.frame.height) + 6,
- w: ConstValues.screenWidth - 2*32,
- h: 24,
- fontName: AppFonts.openSansSemiBold16!,
- fontColor: AppColors.textColor,
- lines: 1,
- alignment: .center,
- text: userEmailLabelString)
- userEmailLabel.layer.opacity = 0
- profileImageView.isUserInteractionEnabled = true
- let profileTapGesture = UITapGestureRecognizer(target: self, action: #selector(profileImageTapped(sender:)))
- profileTapGesture.numberOfTapsRequired = 1
- profileTapGesture.numberOfTouchesRequired = 1
- profileImageView.addGestureRecognizer(profileTapGesture)
- self.view.addSubview(profileImageShadowView)
- self.view.addSubview(profileImageView)
- self.view.addSubview(editProfileImgBtn)
- self.view.addSubview(userNameLabel)
- self.view.addSubview(emailLabel)
- self.view.addSubview(userEmailLabel)
- }
- private func initHorizontalScroll() {
- horizontalScroll = UIScrollView(frame: CGRect(x: 0, y: 0, width: ConstValues.screenWidth, height: ConstValues.screenHeight))
- horizontalScroll.tag = 2
- horizontalScroll.contentSize = CGSize(width: ConstValues.screenWidth*3, height: ConstValues.screenHeight)
- horizontalScroll.delegate = self
- horizontalScroll.clipsToBounds = false
- horizontalScroll.isPagingEnabled = true
- horizontalScroll.bounces = false
- horizontalScroll.decelerationRate = UIScrollViewDecelerationRateFast
- horizontalScroll.isMultipleTouchEnabled = false
- pcWrapper.addSubview(horizontalScroll)
- }
- private func initUserPreferences() {
- // setup allergies page
- userPrefPage1 = UIView(frame: CGRect(x: mainMargin, y: 0, width: ConstValues.screenWidth - 4*mainMargin, height: horizontalScroll.frame.height))
- userPrefPage1originX = userPrefPage1.frame.origin.x
- allergiesTitle = UIManagmentService.sharedInstance.createLabel(
- x: 16,
- y: 25,
- w: (userPrefPage1.frame.width/2),
- h: 32,
- fontName: AppFonts.openSansSemiBold20!,
- fontColor: AppColors.blackTitleColor,
- lines: 1,
- alignment: .left,
- text: "ALLERGIES"
- )
- allergiesTopView = generateTopViewOnView(viewAbove: userPrefPage1)
- allergiesTopView.layer.cornerRadius = cardBorderRadius
- userPrefPage1.addSubview(allergiesTopView)
- userPrefPage1.addSubview(allergiesTitle)
- allergiesTopSeparator = UIManagmentService.sharedInstance.createSeparatorWaveWithCoordinates(x: 16, y: allergiesTitle.frame.maxY + 5)
- dontHaveAllerLbl = UIManagmentService.sharedInstance.createLabel(
- x: allergiesTopView.frame.origin.x + 16,
- y: allergiesTopView.frame.maxY + 32,
- w: 220,
- h: 32,
- fontName: AppFonts.openSansSemiBold16!,
- fontColor: AppColors.textColor,
- lines: 1,
- alignment: .left,
- text: "I don’t have any allergies"
- )
- smallUserPrefCardWidth = userPrefPage1.frame.width
- dontHaveAllerLbl.layer.opacity = 0
- switchButton = UISwitch(frame: CGRect(x: ConstValues.screenWidth - 90, y: dontHaveAllerLbl.frame.origin.y, width: 60, height: 30))
- switchButton.onTintColor = AppColors.redColor
- switchButton.addTarget(self, action: #selector(switchValueDidChange(sender:)), for: .valueChanged)
- switchButton.layer.opacity = 0
- userPrefPage1.addSubview(allergiesTopSeparator)
- userPrefPage1.addSubview(dontHaveAllerLbl)
- userPrefPage1.addSubview(switchButton)
- // setup diets page
- userPrefPage2 = UIView(frame: CGRect(x: ConstValues.screenWidth - 2*mainMargin, y: 0, width: ConstValues.screenWidth - 4*mainMargin, height: horizontalScroll.frame.height))
- userPrefPage2originX = userPrefPage2.frame.origin.x
- dietsTitle = UIManagmentService.sharedInstance.createLabel(
- x: 16,
- y: 25,
- w: (userPrefPage2.frame.width/2),
- h: 32,
- fontName: AppFonts.openSansSemiBold20!,
- fontColor: AppColors.blackTitleColor,
- lines: 1,
- alignment: .left,
- text: "DIETS"
- )
- dietsTopSeparator = UIManagmentService.sharedInstance.createSeparatorWaveWithCoordinates(x: 16, y: dietsTitle.frame.maxY + 5)
- dietsTopView = generateTopViewOnView(viewAbove: userPrefPage2)
- dietsTopView.layer.cornerRadius = cardBorderRadius
- userPrefPage2.addSubview(dietsTopView)
- userPrefPage2.addSubview(dietsTitle)
- userPrefPage2.addSubview(dietsTopSeparator)
- // setup dislikes page
- userPrefPage3 = UIView(frame: CGRect(x: (ConstValues.screenWidth*2) - (2*16), y: 0, width: ConstValues.screenWidth - 4*mainMargin, height: horizontalScroll.frame.height))
- userPrefPage3originX = userPrefPage3.frame.origin.x
- dislikesTitle = UIManagmentService.sharedInstance.createLabel(
- x: 16,
- y: 25,
- w: (userPrefPage3.frame.width/2),
- h: 32,
- fontName: AppFonts.openSansSemiBold20!,
- fontColor: AppColors.blackTitleColor,
- lines: 1,
- alignment: .left,
- text: "DISLIKES"
- )
- dislikesTopView = generateTopViewOnView(viewAbove: userPrefPage3)
- dislikesTopView.layer.cornerRadius = cardBorderRadius
- dislikesTopSeparator = UIManagmentService.sharedInstance.createSeparatorWaveWithCoordinates(x: 16, y: dislikesTitle.frame.maxY + 5)
- userPrefPage3.addSubview(dislikesTopView)
- userPrefPage3.addSubview(dislikesTitle)
- userPrefPage3.addSubview(dislikesTopSeparator)
- horizontalScroll.addSubview(userPrefPage1)
- horizontalScroll.addSubview(userPrefPage2)
- horizontalScroll.addSubview(userPrefPage3)
- getPreferences()
- }
- private func animateInit() {
- UIView.animate(withDuration: 0.5) {
- self.profileImageView.layer.opacity = 1
- self.profileImageShadowView.layer.opacity = 1
- self.userNameLabel.layer.opacity = 1
- self.emailLabel.layer.opacity = 1
- self.userEmailLabel.layer.opacity = 1
- }
- }
- // MARK: - GET DATA
- func getPreferences() {
- userPreferences.getPreferencesForUser { (completed) in
- if completed {
- // update to noAllergies toggle
- self.noAllergiesToggleSelected = self.userPreferences.noAllergies
- self.startingNoAllergiesToggleSelected = self.userPreferences.noAllergies
- UserDefaults.standard.setValue(self.userPreferences.noAllergies, forKey: "noAllergieToggleSelected")
- self.switchButton.isOn = self.noAllergiesToggleSelected
- self.switchButton.setOn(self.noAllergiesToggleSelected, animated: false)
- // check for selected allergies/diets
- self.checkForSelectedItems(items: self.userPreferences.allergies, itemsType: "allergies")
- self.checkForSelectedItems(items: self.userPreferences.diets, itemsType: "diets")
- self.initialSelectedDislikes = self.userPreferences.dislikes!
- self.selectedDislikes = self.userPreferences.dislikes!
- self.mainScroll.isScrollEnabled = true
- // check which card type to display
- if !self.selectedAllergies.isEmpty {
- self.allergiesCardState = .hasAllergiesSelectedSmallCard
- self.hasAllergieSelected = true
- } else {
- self.allergiesCardState = .noAllergiesSelected
- self.hasAllergieSelected = false
- }
- if !self.selectedDiets.isEmpty {
- self.dietsCardState = .hasDietsSelectedSmallCard
- self.hasDietSelected = true
- } else {
- self.dietsCardState = .noDietsSelected
- self.hasDietSelected = false
- }
- if !self.selectedDislikes.isEmpty {
- self.dislikesCardState = .hasDislikesSelectedSmallCard
- } else {
- self.dislikesCardState = .noDislikesSelected
- }
- // GENERATE HORISONTAL SCROLL WITH DATA
- self.renderCardContent(cardType: "allergies")
- self.renderCardContent(cardType: "diets")
- self.renderCardContent(cardType: "dislikes")
- self.staticAnimationOnViews(cardTypeToAnimate: self.allergiesCardState)
- self.staticAnimationOnViews(cardTypeToAnimate: self.dietsCardState)
- self.staticAnimationOnViews(cardTypeToAnimate: self.dislikesCardState)
- // add bottom adapting scroll views for allergies/diets
- // TODO: this needs to be fixed (additionalHeight needs to be removed)
- var additionalHeight: CGFloat = ConstValues.screenWidth <= 375 ? 100 : 125
- self.allergiesBottomScroll = NewAdaptingItemsView(
- frame: CGRect(
- x: self.allergiesTopView.frame.origin.x + 16,
- y: self.dontHaveAllerLbl.frame.maxY + 18,
- width: self.view.frame.width - 2*16,
- height: ConstValues.screenHeight - (self.dontHaveAllerLbl.frame.maxY + additionalHeight)
- ),
- items: self.unSelectedAllergies,
- itemsType: "allergies",
- scrollOrientation: "vertical"
- )
- self.allergiesBottomScroll.allowRemovingItems = true
- self.allergiesBottomScroll.delegate = self
- self.allergiesBottomScroll.layer.opacity = 0
- self.allergiesBottomScroll.isUserInteractionEnabled = !self.noAllergiesToggleSelected
- self.userPrefPage1.addSubview(self.allergiesBottomScroll)
- additionalHeight = ConstValues.screenWidth <= 375 ? 114 : 139
- self.dietsBottomScroll = NewAdaptingItemsView(
- frame: CGRect(
- x: self.dietsTopView.frame.origin.x + 16,
- y: self.dietsTopView.frame.maxY + 32,
- width: self.view.frame.width - 2*16,
- height: ConstValues.screenHeight - (self.dietsTopView.frame.maxY + additionalHeight)
- ),
- items: self.unSelectedDiets,
- itemsType: "diets",
- scrollOrientation: "vertical")
- self.dietsBottomScroll.allowRemovingItems = true
- self.dietsBottomScroll.delegate = self
- self.dietsBottomScroll.layer.opacity = 0
- self.userPrefPage2.addSubview(self.dietsBottomScroll)
- self.userPrefPage2.sendSubview(toBack: self.dietsBottomScroll)
- // scroll to top if pulse is animated
- if UserDefaults.standard.bool(forKey: "hasBlinked") && !UserDefaults.standard.bool(forKey: "hasBlinkedhasOpenedProfile") {
- let topOffset = CGPoint(x: 0, y: self.mainScroll.contentSize.height - self.mainScroll.bounds.size.height)
- self.mainScroll.setContentOffset(topOffset, animated: true)
- UserDefaults.standard.set(true, forKey: "hasBlinkedhasOpenedProfile")
- }
- if self.isAllergiesDeeplink {
- let topOffset = CGPoint(x: 0, y: self.mainScroll.contentSize.height - self.mainScroll.bounds.size.height)
- self.mainScroll.setContentOffset(topOffset, animated: true)
- }
- if self.isDietsDeeplink {
- let topOffsetVScroll = CGPoint(x: 0, y: self.mainScroll.contentSize.height - self.mainScroll.bounds.size.height)
- self.mainScroll.setContentOffset(topOffsetVScroll, animated: true)
- let topOffsetHScroll = CGPoint(x: self.mainScroll.contentSize.width, y: 0)
- self.horizontalScroll.setContentOffset(topOffsetHScroll, animated: true)
- }
- }
- }
- }
- private func renderCardContent(cardType: String) {
- if cardType == "allergies" { renderAllergiesCard() } else if cardType == "diets" { renderDietsCard() } else { renderDislikesCard() }
- }
- private func renderAllergiesCard() {
- let gradientColor: UIColor = .white
- allergiesSmallDesc = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: 23,
- w: allergiesTopSubView.frame.width,
- h: 15,
- fontName: AppFonts.openSansRegular12!,
- fontColor: UIColor(red: 81/255, green: 81/255, blue: 81/255, alpha: 0.5),
- lines: 1,
- alignment: NSTextAlignment.left,
- text: "NOT SHOWING RECIPES WITH:"
- )
- allergiesSmallDesc.layer.opacity = 0
- allergiesTopSubView.addSubview(allergiesSmallDesc)
- allergiesBigDesc = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: 18,
- w: allergiesTopSubView.frame.width,
- h: 52,
- fontName: AppFonts.openSansRegular18!,
- fontColor: AppColors.textColor,
- lines: 2,
- alignment: NSTextAlignment.left,
- text: "Got food allergies? Tell us, so we never recommend such recipe."
- )
- allergiesBigDesc.layer.opacity = 0
- allergiesTopSubView.addSubview(allergiesBigDesc)
- allergiesSelectedStringLbl = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: allergiesSmallDesc.frame.maxY + 7,
- w: allergiesTopSubView.frame.width + 16,
- h: 30, fontName: AppFonts.openSansSemiBold18!,
- fontColor: AppColors.blackTitleColor,
- lines: 1, alignment: .left,
- text: makeStringFromArray(array: selectedAllergies)
- )
- allergiesSelectedStringLbl.layer.opacity = 0
- allergiesTopSubView.addSubview(allergiesSelectedStringLbl)
- editAllergiesIcon = UIImageView(frame: CGRect(x: allergiesTopSubView.frame.width - 25, y: -40, width: 25, height: 25))
- editAllergiesIcon.image = #imageLiteral(resourceName: "ic_edit_pref")
- editAllergiesIcon.layer.opacity = 0
- allergiesTopSubView.addSubview(editAllergiesIcon)
- allergiesTopScrollWrapper = UIView(frame: CGRect(x: 0, y: 40, width: allergiesTopSubView.frame.width, height: 30))
- allergiesTopScrollWrapper.layer.opacity = 0
- allergiesTopScrollWrapper.clipsToBounds = true
- allergiesTopScroll = NewAdaptingItemsView(frame:
- CGRect(x: 0, y: 0, width: ConstValues.screenWidth, height: 30), items: selectedAllergies, itemsType: "allergies", scrollOrientation: "horizontal")
- allergiesTopScroll.delegate = self
- allergiesTopScrollWrapper.addSubview(allergiesTopScroll)
- allergiesTopSubView.addSubview(allergiesTopScrollWrapper)
- // gradients
- allergiesRightGradientLayer.colors = [gradientColor.withAlphaComponent(0.0).cgColor, gradientColor.cgColor]
- allergiesRightGradientLayer.frame = CGRect(
- x: (allergiesTopSubView.frame.maxX) - 40,
- y: allergiesTopScrollWrapper.frame.origin.y - 10,
- width: 40,
- height: allergiesTopSubView.frame.height / 2
- )
- allergiesRightGradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
- allergiesRightGradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
- allergiesRightGradientLayer.opacity = 0
- allergiesTopSubView.layer.addSublayer(allergiesRightGradientLayer)
- }
- private func renderDietsCard() {
- let gradientColor: UIColor = .white
- dietsSmallDesc = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: 23,
- w: dietsTopSubView.frame.width,
- h: 15,
- fontName: AppFonts.openSansRegular12!,
- fontColor: UIColor(red: 81/255, green: 81/255, blue: 81/255, alpha: 0.5),
- lines: 1,
- alignment: .left,
- text: "YOU HAVE SELECTED:"
- )
- dietsSmallDesc.layer.opacity = 0
- dietsTopSubView.addSubview(dietsSmallDesc)
- dietsBigDesc = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: 18,
- w: dietsTopSubView.frame.width,
- h: 52,
- fontName: AppFonts.openSansRegular18!,
- fontColor: AppColors.textColor,
- lines: 2,
- alignment: .left,
- text: "Tell us if you follow any diet, so you get recipes fit for you."
- )
- dietsBigDesc.layer.opacity = 0
- dietsTopSubView.addSubview(dietsBigDesc)
- dietsSelectedStringLbl = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: dietsSmallDesc.frame.maxY + 7,
- w: dietsSmallDesc.frame.width,
- h: 30,
- fontName: AppFonts.openSansSemiBold18!,
- fontColor: AppColors.blackTitleColor,
- lines: 1,
- alignment: .left,
- text: makeStringFromArray(array: selectedDiets)
- )
- dietsSelectedStringLbl.layer.opacity = 0
- dietsTopSubView.addSubview(dietsSelectedStringLbl)
- editDietsIcon = UIImageView(frame: CGRect(x: dietsTopSubView.frame.width - 25, y: -40, width: 25, height: 25))
- editDietsIcon.image = #imageLiteral(resourceName: "ic_edit_pref")
- editDietsIcon.layer.opacity = 0
- dietsTopSubView.addSubview(editDietsIcon)
- dietsTopScrollWrapper = UIView(frame: CGRect(x: 0, y: 40, width: dietsTopSubView.frame.width, height: 30))
- dietsTopScrollWrapper.layer.opacity = 0
- dietsTopScrollWrapper.clipsToBounds = true
- dietsTopScroll = NewAdaptingItemsView(frame:
- CGRect(x: 0, y: 0, width: ConstValues.screenWidth, height: 30), items: selectedDiets, itemsType: "diets", scrollOrientation: "horizontal")
- dietsTopScroll.allowRemovingItems = true
- dietsTopScroll.delegate = self
- dietsTopScrollWrapper.addSubview(dietsTopScroll)
- dietsTopSubView.addSubview(dietsTopScrollWrapper)
- // gradients
- dietsRightGradientLayer.colors = [gradientColor.withAlphaComponent(0.0).cgColor, gradientColor.cgColor]
- dietsRightGradientLayer.frame = CGRect(
- x: (dietsTopSubView.frame.origin.x + dietsTopSubView.frame.width) - 40,
- y: dietsTopScrollWrapper.frame.origin.y - 10,
- width: 40,
- height: dietsTopSubView.frame.height / 2
- )
- dietsRightGradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
- dietsRightGradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
- dietsRightGradientLayer.opacity = 0
- dietsTopSubView.layer.addSublayer(dietsRightGradientLayer)
- }
- private func renderDislikesCard() {
- let gradientColor: UIColor = .white
- dislikesBigDesc = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: 18,
- w: dislikesTopSubView.frame.width,
- h: 52,
- fontName: AppFonts.openSansRegular18!,
- fontColor: AppColors.textColor,
- lines: 2,
- alignment: .left,
- text: "Any ingredients to avoid recipes that include them?"
- )
- dislikesBigDesc.layer.opacity = 0
- dislikesTopSubView.addSubview(dislikesBigDesc)
- editDislikesIcon = UIImageView(frame: CGRect(x: dislikesTopSubView.frame.width - 25, y: -40, width: 25, height: 25))
- editDislikesIcon.image = #imageLiteral(resourceName: "ic_edit_pref")
- editDislikesIcon.layer.opacity = 0
- dislikesTopSubView.addSubview(editDislikesIcon)
- dislikesSmallDesc = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: 23,
- w: dislikesTopSubView.frame.width,
- h: 15,
- fontName: AppFonts.openSansRegular12!,
- fontColor: UIColor(red: 81/255, green: 81/255, blue: 81/255, alpha: 0.5),
- lines: 1,
- alignment: .left,
- text: "DISLIKES SELECTED:"
- )
- dislikesSmallDesc.layer.opacity = 0
- dislikesTopSubView.addSubview(dislikesSmallDesc)
- dislikesSelectedStringLbl = UIManagmentService.sharedInstance.createLabel(
- x: 0,
- y: dislikesSmallDesc.frame.maxY + 7,
- w: dislikesTopSubView.frame.width + 16,
- h: 30,
- fontName: AppFonts.openSansSemiBold18!,
- fontColor: AppColors.blackTitleColor,
- lines: 1,
- alignment: .left,
- text: makeStringFromArray(array: selectedDislikes)
- )
- dislikesSelectedStringLbl.layer.opacity = 0
- dislikesTopSubView.addSubview(dislikesSelectedStringLbl)
- dislikesTopScrollWrapper = UIView(frame: CGRect(x: 0, y: 40, width: dislikesTopSubView.frame.width, height: 30))
- dislikesTopScrollWrapper.layer.opacity = 0
- dislikesTopScrollWrapper.clipsToBounds = true
- dislikesTopScroll = NewAdaptingItemsView(
- frame: CGRect(x: 0, y: 0, width: ConstValues.screenWidth, height: 30),
- items: selectedDislikes,
- itemsType: "dislikes",
- scrollOrientation: "horizontal"
- )
- dislikesTopScroll.delegate = self
- dislikesTopScroll.allowRemovingItemsFromScroll()
- dislikesTopScrollWrapper.addSubview(dislikesTopScroll)
- dislikesTopSubView.addSubview(dislikesTopScrollWrapper)
- // gradients
- dislikesRightGradientLayer.colors = [gradientColor.withAlphaComponent(0.0).cgColor, gradientColor.cgColor]
- dislikesRightGradientLayer.frame = CGRect(x: dietsTopSubView.frame.maxX - 40, y: dietsTopScrollWrapper.frame.origin.y - 10, width: 40, height: dietsTopSubView.frame.height / 2)
- dislikesRightGradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
- dislikesRightGradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
- dislikesRightGradientLayer.opacity = 0
- dislikesTopView.layer.addSublayer(dislikesRightGradientLayer)
- dislikesACTextFieldWrapper = UIView(frame: CGRect(x: 32, y: dislikesTopView.frame.maxY + 44, width: ConstValues.screenWidth - 2*32, height: 44))
- dislikesACTextFieldWrapper.backgroundColor = AppColors.lightGray
- dislikesACTextFieldWrapper.layer.cornerRadius = 22
- dislikesACTextFieldWrapper.layer.opacity = 0
- dislikesACTextField = ACTextField(
- frame: CGRect(x: 32, y: 0, width: dislikesACTextFieldWrapper.frame.width - 2*32, height: dislikesACTextFieldWrapper.frame.height),
- font: AppFonts.openSansBold20!,
- mainFontColor: AppColors.textColor,
- autocompleteFontColor: UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.3),
- placeholderText: "Type an ingredient",
- placeholderFontColor: AppColors.textColor.withAlphaComponent(0.3),
- turnAutocompleteOn: true
- )
- dislikesACTextField.delegate = self
- dislikesACTextField.updateAutocompleteSource(source: UserManagmentService.sharedInstance.getRawIngredients())
- // -7 for x button to make more clickable and have right position
- dislikesACTextFieldClearButton = UIButton(frame: CGRect(x: dislikesACTextField.frame.maxX - 7, y: (dislikesACTextFieldWrapper.frame.height / 2) - (32 / 2), width: 32, height: 32))
- dislikesACTextFieldClearButton.setImage(UIImage(named: "ic_clear_text"), for: UIControlState.normal)
- dislikesACTextFieldClearButton.imageEdgeInsets = UIEdgeInsets(top: 9, left: 9, bottom: 9, right: 9)
- dislikesACTextFieldClearButton.contentMode = .scaleAspectFill
- dislikesACTextFieldClearButton.addTarget(self, action: #selector(ACTextFieldClearBtnTapped(sender:)), for: UIControlEvents.touchUpInside)
- dislikesACTextFieldClearButton.layer.opacity = 0
- dislikesAddBtn = UIButton(frame: CGRect(x: 94, y: dislikesACTextFieldWrapper.frame.maxY + 200, width: ConstValues.screenWidth - 2*94, height: 44))
- dislikesAddBtn.backgroundColor = .clear
- dislikesAddBtn.layer.addSublayer(UIManagmentService.sharedInstance.addGradientColorOnButtonBorder(onView: dislikesAddBtn))
- dislikesAddBtn.titleLabel?.font = AppFonts.openSansBold18
- dislikesAddBtn.setTitleColor(AppColors.lightRedColor, for: UIControlState.normal)
- dislikesAddBtn.setTitle("Add", for: UIControlState.normal)
- dislikesAddBtn.addTarget(self, action: #selector(dislikesAddButtonPressed(sender:)), for: UIControlEvents.touchUpInside)
- dislikesACTextFieldWrapper.addSubview(dislikesACTextField)
- dislikesACTextFieldWrapper.addSubview(dislikesACTextFieldClearButton)
- userPrefPage3.addSubview(dislikesACTextFieldWrapper)
- userPrefPage3.addSubview(dislikesAddBtn)
- }
- // MARK: - GENERATE VIEWS
- func generateTopViewOnView(viewAbove: UIView) -> UIView {
- // INIT TOP VIEW (height of top card)
- let heightOfView: CGFloat = 166
- let topView = UIView(frame: CGRect(x: 0, y: 3, width: viewAbove.frame.width, height: heightOfView))
- if viewAbove.frame.origin.x == mainMargin {
- // to place the view inside the first card
- allergiesTopSubView = UIView(frame: CGRect(
- x: topView.frame.origin.x + mainMargin,
- y: topView.frame.origin.y + 64,
- width: userPrefPage1.frame.width - 2*mainMargin,
- height: topView.frame.height - 67)
- )
- cardSubViewWidth = allergiesTopSubView.frame.width
- topView.addSubview(allergiesTopSubView)
- } else if viewAbove.frame.origin.x == ConstValues.screenWidth - mainMargin*2 {
- // to place the view inside the second card
- dietsTopSubView = UIView(frame: CGRect(
- x: topView.frame.origin.x + mainMargin,
- y: topView.frame.origin.y + 64,
- width: userPrefPage2.frame.width - 2*mainMargin,
- height: topView.frame.height - 67)
- )
- topView.addSubview(dietsTopSubView)
- } else {
- // to place the view inside the third card
- dislikesTopSubView = UIView(frame: CGRect(
- x: topView.frame.origin.x + mainMargin,
- y: topView.frame.origin.y + 64,
- width: userPrefPage2.frame.width - 2*mainMargin,
- height: topView.frame.height - 67)
- )
- topView.addSubview(dislikesTopSubView)
- }
- // shadow on top view
- topView.backgroundColor = .white
- topView.clipsToBounds = true
- topView.layer.masksToBounds = false
- topView.layer.shadowOffset = CGSize(width: 0, height: 15)
- topView.layer.shadowRadius = 15
- topView.layer.shadowOpacity = 0.13
- let topViewTapGesture = UITapGestureRecognizer(target: self, action: #selector(topViewTapped(sender:)))
- topViewTapGesture.numberOfTapsRequired = 1
- topViewTapGesture.numberOfTouchesRequired = 1
- topView.addGestureRecognizer(topViewTapGesture)
- return topView
- }
- // MARK: - ANIMATION FUNCTIONS
- private func animateLabels() {
- userNameLabel.layer.opacity = 1 - Float(mainScrollScrolled) * 2
- userNameLabel.frame.origin.y = profileImageView.frame.origin.y + profileImageView.frame.height + 20
- emailLabel.layer.opacity = 1 - Float(mainScrollScrolled) * 2
- emailLabel.frame.origin.y = userNameLabel.frame.origin.y + userNameLabel.frame.height + 5
- userEmailLabel.layer.opacity = 1 - Float(mainScrollScrolled) * 2
- userEmailLabel.frame.origin.y = emailLabel.frame.origin.y + emailLabel.frame.height + 5
- if (UserManagmentService.sharedInstance.getUser() as! User).imageUrl.isEmpty
- && (UserManagmentService.sharedInstance.getUser() as! User).type == USER_LOGIN_TYPES.EMAIL {
- editProfileImgBtn.layer.opacity = 1 - Float(mainScrollScrolled) * 2
- }
- let cetvrtince: CGFloat = profileImageView.frame.width / 4
- editProfileImgBtn.frame.origin.x = profileImageView.frame.origin.x + (cetvrtince * 3) + (cetvrtince / 10)
- editProfileImgBtn.frame.origin.y = profileImageView.frame.origin.y + cetvrtince - ((cetvrtince/10) * 7)
- }
- private func animateProfileImg() {
- if mainScrollPercentageScrolled <= 83 {
- profileImageView.transform = CGAffineTransform(scaleX: 1 - mainScrollScrolled, y: 1 - mainScrollScrolled)
- profileImageShadowView.transform = CGAffineTransform(scaleX: 1 - mainScrollScrolled, y: 1 - mainScrollScrolled)
- let moveToTop = mainScrollPercentageScrolled * CGFloat(profileImageToTopPercentage)
- profileImageView.frame.origin.y = ((navToolbarView.frame.origin.y + navToolbarView.frame.height) + 20) - CGFloat(moveToTop)
- profileImageShadowView.frame.origin.y = ((navToolbarView.frame.origin.y + navToolbarView.frame.height) + 20) - CGFloat(moveToTop)
- }
- }
- private func animateUserPreferences() {
- let moveOriginX = mainMargin - (mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)
- // open allergies page
- userPrefPage1.frame = CGRect(x: moveOriginX, y: 0, width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4), height: ConstValues.screenHeight)
- animateCardSubViewsSize()
- if horizontalScrollIndexPage == 0 {
- // open diets page
- userPrefPage2.frame = CGRect(
- x: userPrefPage1.frame.maxX + moveOriginX,
- y: 0,
- width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4),
- height: ConstValues.screenHeight
- )
- //open dislikes page
- userPrefPage3.frame = CGRect(
- x: userPrefPage3originX + mainScrollPercentageScrolled*(userPrefPage1ToLeftPercentage*2),
- y: 0,
- width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4),
- height: ConstValues.screenHeight
- )
- } else if horizontalScrollIndexPage == 1 {
- // open diets page
- let curr = userPrefPage1.frame.origin.x + ConstValues.screenWidth
- userPrefPage2.frame = CGRect(x: curr, y: 0, width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4), height: ConstValues.screenHeight)
- //open dislikes page
- userPrefPage3.frame = CGRect(
- x: userPrefPage3originX + mainScrollPercentageScrolled*(userPrefPage1ToLeftPercentage*2),
- y: 0,
- width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4),
- height: ConstValues.screenHeight
- )
- } else if horizontalScrollIndexPage == 2 {
- // open diets page
- var curr = userPrefPage1.frame.origin.x + ConstValues.screenWidth
- userPrefPage2.frame = CGRect(x: curr, y: 0, width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4), height: ConstValues.screenHeight)
- //open dislikes page
- curr = userPrefPage1.frame.origin.x + ConstValues.screenWidth*2
- userPrefPage3.frame = CGRect(x: curr, y: 0, width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4), height: ConstValues.screenHeight)
- }
- // animate the inner-card resizing
- allergiesTopView.frame = CGRect(x: 0, y: 0, width: userPrefPage1.frame.width, height: allergiesTopView.frame.height)
- dietsTopView.frame = CGRect(x: 0, y: 0, width: userPrefPage2.frame.width, height: dietsTopView.frame.height)
- dislikesTopView.frame = CGRect(x: 0, y: 0, width: userPrefPage3.frame.width, height: dislikesTopView.frame.height)
- animateAlphaOnViews()
- }
- private func animateCardSubViewsSize() {
- let moveOriginX = mainMargin - (mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)
- allergiesTopSubView.frame = CGRect(
- x: moveOriginX,
- y: allergiesTopSubView.frame.origin.y,
- width: cardSubViewWidth + (((ConstValues.screenWidth - cardSubViewWidth)/100)*mainScrollPercentageScrolled),
- height: allergiesTopSubView.frame.height
- )
- allergiesTopScrollWrapper.frame.size.width = allergiesTopSubView.frame.width
- allergiesBigDesc.frame.origin.x = (mainMargin / 100 * mainScrollPercentageScrolled)
- dietsTopSubView.frame = CGRect(
- x: moveOriginX,
- y: dietsTopSubView.frame.origin.y,
- width: cardSubViewWidth + (((ConstValues.screenWidth - cardSubViewWidth)/100)*mainScrollPercentageScrolled),
- height: dietsTopSubView.frame.height
- )
- dietsTopScrollWrapper.frame.size.width = dietsTopSubView.frame.width
- dietsBigDesc.frame.origin.x = (mainMargin / 100 * mainScrollPercentageScrolled)
- dislikesTopSubView.frame = CGRect(
- x: moveOriginX,
- y: dislikesTopSubView.frame.origin.y,
- width: cardSubViewWidth + (((ConstValues.screenWidth - cardSubViewWidth)/100)*mainScrollPercentageScrolled),
- height: dislikesTopSubView.frame.height
- )
- dislikesTopScrollWrapper.frame.size.width = dietsTopSubView.frame.width
- dislikesBigDesc.frame.origin.x = (mainMargin / 100 * mainScrollPercentageScrolled)
- }
- private func animateCornerRadiusOnCards() {
- allergiesTopView.layer.cornerRadius = cardBorderRadius - ((cardBorderRadius/100)*(mainScrollPercentageScrolled))
- dietsTopView.layer.cornerRadius = cardBorderRadius - ((cardBorderRadius/100)*(mainScrollPercentageScrolled))
- dislikesTopView.layer.cornerRadius = cardBorderRadius - ((cardBorderRadius/100)*(mainScrollPercentageScrolled))
- }
- private func animateShadowOffsetOnCards() {
- allergiesTopView.layer.shadowOffset = CGSize(width: 0, height: 15 + ((35-15)/100 * (mainScrollPercentageScrolled)))
- dietsTopView.layer.shadowOffset = CGSize(width: 0, height: 15 + ((35-15)/100 * (mainScrollPercentageScrolled)))
- dislikesTopView.layer.shadowOffset = CGSize(width: 0, height: 15 + ((35-15)/100 * (mainScrollPercentageScrolled)))
- }
- private func animateAlphaOnViews () {
- if !isNoAlleryViewOpened {
- allergiesBottomScroll.alpha = switchButton.isOn ? 0.5 : mainScrollScrolled
- }
- dietsBottomScroll.alpha = mainScrollScrolled
- if Double(mainScrollScrolled) > 0.7 {
- progressDotsView.alpha = mainScrollScrolled
- } else { progressDotsView.alpha = mainScrollScrolled / 6 }
- }
- private func percentageAnimationOnViews() {
- mainScrollPercentageScrolled = mainScrollScrolled * 100
- // animate rest of the screen
- animateLabels()
- animateProfileImg()
- animateUserPreferences()
- navToolbarView.animateFadeInOut(opacity: Float(mainScrollScrolled), scrollPercentage: Int(mainScrollPercentageScrolled))
- animateCornerRadiusOnCards()
- animateShadowOffsetOnCards()
- if !isNoAlleryViewOpened {
- dontHaveAllerLbl.layer.opacity = Float(mainScrollScrolled)
- switchButton.layer.opacity = Float(mainScrollScrolled)
- }
- addAllergiesView.layer.opacity = Float(mainScrollScrolled)
- dietsBottomScroll.layer.opacity = Float(mainScrollScrolled)
- dislikesACTextFieldWrapper.layer.opacity = Float(mainScrollScrolled)
- if allergiesCardState == .noAllergiesSelected {
- editAllergiesIcon.layer.opacity = Float(1-mainScrollScrolled)
- } else {
- allergiesSmallDesc.layer.opacity = Float(1-mainScrollScrolled)
- allergiesRightGradientLayer.opacity = Float(1-(mainScrollScrolled*3))
- allergiesSelectedStringLbl.layer.opacity = Float(1-mainScrollScrolled)
- allergiesTopScrollWrapper.layer.opacity = Float(mainScrollScrolled)
- }
- if dietsCardState == .noDietsSelected {
- editDietsIcon.layer.opacity = Float(1-mainScrollScrolled)
- } else {
- dietsSmallDesc.layer.opacity = Float(1-mainScrollScrolled)
- dietsRightGradientLayer.opacity = Float(1-(mainScrollScrolled*3))
- dietsSelectedStringLbl.layer.opacity = Float(1-mainScrollScrolled)
- dietsTopScrollWrapper.layer.opacity = Float(mainScrollScrolled)
- }
- if dislikesCardState == .noDislikesSelected {
- editDislikesIcon.layer.opacity = Float(1-mainScrollScrolled)
- } else {
- dislikesSmallDesc.layer.opacity = Float(1-mainScrollScrolled)
- dislikesRightGradientLayer.opacity = Float(1-(mainScrollScrolled*3))
- dislikesSelectedStringLbl.layer.opacity = Float(1-mainScrollScrolled)
- dislikesTopScrollWrapper.layer.opacity = Float(mainScrollScrolled)
- }
- }
- private func animateHorizontalScroll(scrollView: UIScrollView) {
- var tempIndex = horizontalScrollIndexPage
- if scrollView.contentOffset.x < ConstValues.screenWidth {
- tempIndex = 0
- } else if scrollView.contentOffset.x > ConstValues.screenWidth && scrollView.contentOffset.x < ConstValues.screenWidth*2 {
- tempIndex = 1
- } else if scrollView.contentOffset.x == ConstValues.screenWidth*2 {
- tempIndex = 2
- }
- if !isMainScrollOpened {
- if tempIndex == 0 {
- let moveCardOriginX = ((ConstValues.screenWidth + mainMargin) - userPrefPage2originX)/100
- let currScreenScrollPercentage = ((scrollView.contentOffset.x/ConstValues.screenWidth)*100)
- userPrefPage2.frame.origin.x = userPrefPage2originX + (currScreenScrollPercentage * moveCardOriginX)
- } else if tempIndex == 1 {
- let moveCardOriginX = ((ConstValues.screenWidth*2 + mainMargin) - userPrefPage3originX)/100
- let currScreenScrollPercentage = ((scrollView.contentOffset.x-ConstValues.screenWidth)/(ConstValues.screenWidth))*100
- userPrefPage3.frame.origin.x = userPrefPage3originX + (currScreenScrollPercentage * moveCardOriginX)
- } else if tempIndex == 2 {
- // do nothing for now
- }
- }
- }
- private func staticAnimationOnViews(cardTypeToAnimate: SmallCardStates) {
- switch cardTypeToAnimate {
- case .noAllergiesSelected:
- UIView.animate(withDuration: 0.1, animations: {
- self.removeCardContent(card: "allergiesCard")
- }, completion: { (_) in
- UIView.animate(withDuration: 0.2, animations: {
- if !self.isMainScrollOpened {
- self.editAllergiesIcon.layer.opacity = 1
- }
- self.allergiesBigDesc.layer.opacity = 1
- self.allergiesRightGradientLayer.opacity = 0
- })
- })
- case .hasAllergiesSelectedSmallCard:
- UIView.animate(withDuration: 0.1, animations: {
- self.removeCardContent(card: "allergiesCard")
- }, completion: { (_) in
- UIView.animate(withDuration: 0.2, animations: {
- self.allergiesSelectedStringLbl.layer.opacity = 1
- self.allergiesRightGradientLayer.opacity = 1
- self.allergiesSmallDesc.layer.opacity = 1
- })
- })
- case .hasAllergiesSelectedBigCard:
- UIView.animate(withDuration: 0.1, animations: {
- self.removeCardContent(card: "allergiesCard")
- }, completion: { (_) in
- UIView.animate(withDuration: 0.2, animations: {
- self.allergiesTopScrollWrapper.layer.opacity = 1
- self.allergiesRightGradientLayer.opacity = 0
- })
- })
- case .noDietsSelected:
- UIView.animate(withDuration: 0.1, animations: {
- self.removeCardContent(card: "dietsCard")
- }, completion: { (_) in
- UIView.animate(withDuration: 0.2, animations: {
- if !self.isMainScrollOpened {
- self.editDietsIcon.layer.opacity = 1
- }
- self.dietsBigDesc.layer.opacity = 1
- self.dietsRightGradientLayer.opacity = 0
- })
- })
- case .hasDietsSelectedSmallCard:
- UIView.animate(withDuration: 0.1, animations: {
- self.removeCardContent(card: "dietsCard")
- }, completion: { (_) in
- UIView.animate(withDuration: 0.2, animations: {
- self.dietsSelectedStringLbl.layer.opacity = 1
- self.dietsRightGradientLayer.opacity = 1
- self.dietsSmallDesc.layer.opacity = 1
- })
- })
- case .hasDietsSelectedBigCard:
- UIView.animate(withDuration: 0.1, animations: {
- self.removeCardContent(card: "dietsCard")
- }, completion: { (_) in
- UIView.animate(withDuration: 0.2, animations: {
- self.dietsTopScrollWrapper.layer.opacity = 1
- self.dietsRightGradientLayer.opacity = 0
- })
- })
- case .noDislikesSelected:
- UIView.animate(withDuration: 0.1, animations: {
- self.removeCardContent(card: "dislikes")
- }, completion: { (_) in
- UIView.animate(withDuration: 0.2, animations: {
- if !self.isMainScrollOpened {
- self.editDislikesIcon.layer.opacity = 1
- }
- self.dislikesBigDesc.layer.opacity = 1
- self.dislikesRightGradientLayer.opacity = 0
- })
- })
- case .hasDislikesSelectedBigCard:
- UIView.animate(withDuration: 0.1, animations: {
- self.removeCardContent(card: "dislikes")
- }, completion: { (_) in
- UIView.animate(withDuration: 0.2, animations: {
- self.dislikesTopScrollWrapper.layer.opacity = 1
- self.dislikesRightGradientLayer.opacity = 0
- })
- })
- case .hasDislikesSelectedSmallCard:
- UIView.animate(withDuration: 0.1, animations: {
- self.removeCardContent(card: "dislikes")
- }, completion: { (_) in
- UIView.animate(withDuration: 0.2, animations: {
- self.dislikesSelectedStringLbl.layer.opacity = 1
- self.dislikesSmallDesc.layer.opacity = 1
- self.dislikesRightGradientLayer.opacity = 1
- })
- })
- default:
- print("default staticAnimationOnViews")
- }
- }
- // MARK: - HELPER FUNCTIONS
- private func areArraysEquivalent(first aFirstArray: [String], second aSecondArray: [String]) -> Bool {
- return aFirstArray.sorted() == aSecondArray.sorted()
- }
- private func checkForSelectedItems(items: [[String: Any]]?, itemsType: String) {
- if var items = items {
- for i in 0 ..< items.count {
- if items[i]["isSelected"] as! Bool {
- if itemsType == "allergies" {
- selectedAllergies.append(items[i])
- initialSelectedAllergies.append(items[i])
- } else {
- selectedDiets.append(items[i])
- initialSelectedDiets.append(items[i])
- }
- } else {
- if itemsType == "allergies" {
- unSelectedAllergies.append(items[i])
- } else {
- unSelectedDiets.append(items[i])
- }
- }
- }
- }
- }
- private func getIdsFromArrayDict(array: [[String: Any]]) -> [String] {
- var tmpArr: [String] = [String]()
- for i in 0 ..< array.count {
- tmpArr.append(array[i]["id"] as! String)
- }
- return tmpArr
- }
- private func makeStringFromArray(array: [[String: Any]]) -> String {
- var tmpString: String = String()
- for i in 0 ..< array.count {
- if i == (array.count - 1) {
- tmpString += "\(String(describing: array[i]["name"]!))"
- } else {
- tmpString += "\(String(describing: array[i]["name"]!)), "
- }
- }
- return tmpString
- }
- private func removingSelectedAllergie(_ selectedAllergie: [String: Any]) {
- if selectedAllergie["allowRemoving"] as! Bool {
- var tmpItem = selectedAllergie["itemToRemove"] as! [String: Any]
- tmpItem.updateValue(false, forKey: "isSelected")
- if !allergiesTopScroll.allowRemovingItems {
- allergiesTopScroll.allowToRemoveItems()
- }
- allergiesBottomScroll.addButtonToScroll(item: tmpItem)
- selectedAllergies = HelperMethodesService.sharedInstance.removeItemFromArray(array: selectedAllergies, item: tmpItem)
- unSelectedAllergies.append(tmpItem)
- allergiesSelectedStringLbl.text = makeStringFromArray(array: selectedAllergies)
- EventsService.sharedInstance.logEvent(withName: "DeselectAllergies", properies: ["Id": tmpItem["id"] as! String, "Name": tmpItem["name"] as! String], timeSpentSince: nil)
- if selectedAllergies.isEmpty {
- staticAnimationOnViews(cardTypeToAnimate: .noAllergiesSelected)
- allergiesCardState = .noAllergiesSelected
- hasAllergieSelected = false
- }
- }
- }
- private func disableAllergiesScroll(isDisabled: Bool) {
- if isDisabled {
- noAllergiesToggleSelected = true
- if allergiesCardState != .noAllergiesSelected {
- staticAnimationOnViews(cardTypeToAnimate: .noAllergiesSelected)
- }
- allergiesCardState = .noAllergiesSelected
- removeAllSelectedAllergies()
- allergiesBottomScroll.alpha = 0.5
- allergiesBottomScroll.isUserInteractionEnabled = false
- } else {
- allergiesBottomScroll.alpha = 1
- allergiesBottomScroll.isUserInteractionEnabled = true
- noAllergiesToggleSelected = false
- }
- }
- private func logCustomEventCardOpen(horizontalScrollIndexPage: Int, logReverse: Bool) {
- // log custom event
- if horizontalScrollIndexPage == 0 {
- EventsService.sharedInstance.logEvent(withName: "OpenAllergies", properies: nil, timeSpentSince: userPrefCardTimeSpend)
- } else if horizontalScrollIndexPage == 1 {
- EventsService.sharedInstance.logEvent(withName: "OpenDiets", properies: nil, timeSpentSince: userPrefCardTimeSpend)
- } else {
- EventsService.sharedInstance.logEvent(withName: "OpenDislikes", properies: nil, timeSpentSince: userPrefCardTimeSpend)
- }
- }
- private func removeCardContent(card: String) {
- if card == "allergiesCard" {
- for view in self.allergiesTopSubView.subviews {
- view.layer.opacity = 0
- }
- } else if card == "dietsCard" {
- for view in self.dietsTopSubView.subviews {
- view.layer.opacity = 0
- }
- } else {
- for view in self.dislikesTopSubView.subviews {
- view.layer.opacity = 0
- }
- }
- }
- @objc private func dismissKeyboard() {
- if addAllergiesACTextField.isFirstResponder() {
- addAllergiesACTextField.hideKeyboardResignFirstResponder()
- }
- if dislikesACTextField.isFirstResponder() {
- dislikesACTextField.hideKeyboardResignFirstResponder()
- }
- }
- private func navControllerRoutesShuffle() {
- var tmpArr: [UIViewController] = [UIViewController]()
- for viewController in (self.navigationController?.viewControllers)! {
- if !viewController.isKind(of: ProfileViewController.self) && !viewController.isKind(of: EmailRegistrationViewController.self) {
- tmpArr.append(viewController)
- }
- }
- self.navigationController?.setViewControllers(tmpArr, animated: false)
- }
- @objc private func ACTextFieldClearBtnTapped(sender: UIButton) {
- if horizontalScrollIndexPage == 2 {
- clearDislikesSearchQuery()
- }
- if horizontalScrollIndexPage == 0 {
- clearAddAllergiesSearchQuery()
- }
- }
- private func clearDislikesSearchQuery() {
- if dislikesACTextField.isFirstResponder() {
- dislikesACTextField.clearTextField()
- } else {
- dislikesACTextField.resetTextField()
- }
- UIView.animate(withDuration: 0.2) {
- self.dislikesACTextFieldClearButton.layer.opacity = 0
- }
- }
- private func clearAddAllergiesSearchQuery() {
- if addAllergiesACTextField.isFirstResponder() {
- addAllergiesACTextField.clearTextField()
- } else {
- addAllergiesACTextField.resetTextField()
- }
- UIView.animate(withDuration: 0.2) {
- self.addAllergiesACTextFieldClearBtn.layer.opacity = 0
- }
- }
- @objc private func dislikesAddButtonPressed(sender: UIButton) {
- if dislikesACTextField.filterByInput(input: dislikesACTextField.getTextFieldText())["name"] != nil {
- var dislikeItem: [String: Any] = dislikesACTextField.filterByInput(input: dislikesSearchText)
- let duplicateDislike = selectedDislikes.filter({ ($0["name"] as! String == dislikeItem["name"] as! String) })
- if duplicateDislike.isEmpty {
- UIView.animate(withDuration: 0.2) {
- self.dislikesACTextFieldClearButton.layer.opacity = 0
- }
- if selectedDislikes.isEmpty {
- dislikesCardState = .hasDislikesSelectedBigCard
- staticAnimationOnViews(cardTypeToAnimate: .hasDislikesSelectedBigCard)
- }
- selectedDislikes.append(dislikeItem)
- dislikesSelectedStringLbl.text = makeStringFromArray(array: selectedDislikes)
- dislikesTopScroll.addButtonToScroll(item: dislikeItem)
- dislikesACTextField.resetTextField()
- EventsService.sharedInstance.logEvent(withName: "SelectDislike", properies: ["Id": dislikeItem["id"] as! String, "Name": dislikeItem["name"] as! String], timeSpentSince: nil)
- } else {
- UIManagmentService.sharedInstance.showNotification(toVC: self, withMessage: "You’ve already added this ingredient.")
- dislikesACTextField.shakeTextField()
- }
- } else {
- if !dislikesACTextField.getTextFieldText().isEmpty {
- UIManagmentService.sharedInstance.showNotification(toVC: self, withMessage: "We have nothing to list related to this subject")
- }
- dislikesACTextField.shakeTextField()
- }
- }
- @objc private func updateProfileCallOnBack() {
- if !areArraysEquivalent(first: getIdsFromArrayDict(array: selectedAllergies),
- second: getIdsFromArrayDict(array: initialSelectedAllergies)) || (noAllergiesToggleSelected != startingNoAllergiesToggleSelected)
- || !areArraysEquivalent(first: getIdsFromArrayDict(array: selectedDiets), second: getIdsFromArrayDict(array: initialSelectedDiets))
- || !areArraysEquivalent(first: getIdsFromArrayDict(array: selectedDislikes), second: getIdsFromArrayDict(array: initialSelectedDislikes)) {
- NetworkWrapper.sharedInstance.setPreferencesForUser(
- params: [
- "allergies": getIdsFromArrayDict(array: selectedAllergies),
- "diets": getIdsFromArrayDict(array: selectedDiets),
- "dislikes": getIdsFromArrayDict(array: selectedDislikes),
- "type": "Ingredient",
- "noAllergy": noAllergiesToggleSelected
- ]) { (response, _, _) in
- if response != nil {
- NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updatedPreferences"), object: nil)
- NotificationCenter.default.post(name: Notification.Name("reload_recipes"), object: nil)
- }
- }
- }
- }
- // MARK: - Button actions
- @objc func profileImageTapped(sender: UITapGestureRecognizer) {
- if isMainScrollOpened {
- let bottomOffset = CGPoint(x: 0, y: 0)
- mainScroll.setContentOffset(bottomOffset, animated: true)
- if dislikesACTextField.isFirstResponder() {
- dislikesACTextField.hideKeyboardResignFirstResponder()
- }
- }
- }
- @objc func editProfileImgBtnTapped(sender: UIButton) {
- let editProfileVC = EditProfileViewController()
- self.present(editProfileVC, animated: true, completion: nil)
- }
- @objc func topViewTapped(sender: UITapGestureRecognizer) {
- if !isMainScrollOpened {
- let topOffset = CGPoint(x: 0, y: mainScroll.contentSize.height - mainScroll.bounds.size.height)
- mainScroll.setContentOffset(topOffset, animated: true)
- } else {
- if addAllergiesACTextField.isFirstResponder() {
- addAllergiesACTextField.hideKeyboardResignFirstResponder()
- }
- if dislikesACTextField.isFirstResponder() {
- dislikesACTextField.hideKeyboardResignFirstResponder()
- }
- }
- }
- @objc func switchValueDidChange(sender: UISwitch!) {
- disableAllergiesScroll(isDisabled: sender.isOn)
- }
- @objc func sendButtonPressed (sender: UIButton) {
- if addAllergiesACTextField.getTextFieldText() != "" {
- UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
- // UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
- // sender.transform = CGAffineTransform(scaleX: 0.10, y: 1)
- sender.alpha = 0
- }, completion: nil)
- animationView.isHidden = false
- animationView.play()
- NetworkWrapper.sharedInstance.submitNewAllergy(allergyName: newAllergieString, completion: { (data, _, _) in
- self.animationView.isHidden = true
- self.animationView.pause()
- self.dismissAddAllergieView()
- let tmpNewAllergieString = self.newAllergieString
- self.newAllergieString = ""
- self.isNoAlleryViewOpened = false
- if data != nil {
- UIManagmentService.sharedInstance.showNotification(toVC: self, withMessage: "Your allergy has been sent. We will consider your feedback!")
- EventsService.sharedInstance.logEvent(withName: "AllergySuggestion", properies: ["allergySuggestionName": tmpNewAllergieString], timeSpentSince: nil)
- } else {
- UIManagmentService.sharedInstance.showNotification(toVC: self, withMessage: "Something went wrong, try adding it again")
- }
- })
- } else { addAllergiesACTextField.shakeTextField() }
- }
- @objc func yesButtonPressed (sender: UIButton) {
- UserDefaults.standard.setValue(true, forKey: "hasRemovedAllergy")
- UserDefaults.standard.synchronize()
- removingSelectedAllergie.updateValue(true, forKey: "allowRemoving")
- dismissRemoveAllergieView()
- }
- @objc func cancelButtonPressed (sender: UIButton) {
- if sender.tag == 9898 {
- dismissRemoveAllergieView()
- } else {
- dismissAddAllergieView()
- }
- }
- func dismissRemoveAllergieView () {
- UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseIn, animations: {
- self.removeAllergiesView.alpha = 0
- }) { (_) in
- self.removeAllergiesView.removeFromSuperview()
- }
- }
- func dismissAddAllergieView () {
- UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseIn, animations: {
- self.addAllergiesView.alpha = 0
- self.isNoAlleryViewOpened = false
- }) { (_) in
- self.addAllergiesView.removeFromSuperview()
- self.allergiesBottomScroll.layer.opacity = 1
- self.dontHaveAllerLbl.layer.opacity = 1
- self.switchButton.layer.opacity = 1
- }
- }
- private func removeAllSelectedAllergies() {
- for i in 0 ..< selectedAllergies.count {
- var tmpItem = selectedAllergies[i]
- tmpItem.updateValue(false, forKey: "isSelected")
- allergiesBottomScroll.addButtonToScroll(item: tmpItem)
- unSelectedAllergies.append(tmpItem)
- }
- hasAllergieSelected = false
- selectedAllergies = []
- allergiesTopScroll.removeAllItems()
- allergiesSelectedStringLbl.text = makeStringFromArray(array: selectedAllergies)
- }
- // MARK: - Delegates
- func scrollViewDidScroll(_ scrollView: UIScrollView) {
- if addAllergiesACTextField.isFirstResponder() {
- addAllergiesACTextField.hideKeyboardResignFirstResponder()
- }
- if scrollView.tag == 1 {
- mainScrollScrolled = scrollView.contentOffset.y / (scrollView.contentSize.height - scrollView.bounds.size.height)
- // TODO: mainScrollScrolled goes beyond 1 (for iphone X) this needs to be fixed
- if mainScrollScrolled >= 0 {
- if mainScrollScrolled == 0 {
- isMainScrollOpened = false
- logCustomEventCardOpen(horizontalScrollIndexPage: horizontalScrollIndexPage, logReverse: false)
- if !selectedAllergies.isEmpty {
- allergiesCardState = .hasAllergiesSelectedSmallCard
- } else {
- allergiesCardState = .noAllergiesSelected
- }
- if !selectedDiets.isEmpty {
- dietsCardState = .hasDietsSelectedSmallCard
- } else {
- dietsCardState = .noDietsSelected
- }
- } else if mainScrollScrolled >= 1 {
- isMainScrollOpened = true
- userPrefCardTimeSpend = Date()
- if !selectedAllergies.isEmpty {
- allergiesCardState = .hasAllergiesSelectedBigCard
- } else {
- allergiesCardState = .noAllergiesSelected
- }
- if !selectedDiets.isEmpty {
- dietsCardState = .hasDietsSelectedBigCard
- } else {
- dietsCardState = .noDietsSelected
- }
- }
- }
- } else if scrollView.tag == 2 {
- if isMainScrollOpened {
- if dislikesACTextField.isFirstResponder() {
- dislikesACTextField.hideKeyboardResignFirstResponder()
- }
- }
- animateHorizontalScroll(scrollView: scrollView)
- let indexPage: Int = Int(scrollView.contentOffset.x / scrollView.frame.size.width)
- for i in 0 ..< 3 {
- progressDotsView.subviews[i].backgroundColor = AppColors.lightGray
- progressDotsView.subviews[indexPage].backgroundColor = AppColors.redColor
- }
- }
- }
- func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
- if scrollView.tag == 2 {
- if isMainScrollOpened {
- logCustomEventCardOpen(horizontalScrollIndexPage: horizontalScrollIndexPage, logReverse: true)
- userPrefCardTimeSpend = Date()
- }
- // remember horizontalScrollIndexPage for logging events
- if scrollView.contentOffset.x == 0 {
- horizontalScrollIndexPage = 0
- } else if scrollView.contentOffset.x == ConstValues.screenWidth {
- horizontalScrollIndexPage = 1
- } else if scrollView.contentOffset.x == ConstValues.screenWidth*2 {
- horizontalScrollIndexPage = 2
- }
- }
- }
- internal func unselectedItemTapped(button: UIButton, item: [String: Any], itemType: String) {
- if itemType == "allergies" {
- if button.titleLabel?.text?.lowercased() == "my allergy is not listed"{
- allergiesBottomScroll.layer.opacity = 0
- dontHaveAllerLbl.layer.opacity = 0
- switchButton.layer.opacity = 0
- initAddAllergiesView()
- EventsService.sharedInstance.logEvent(withName: "AllergyNotListed", properies: nil, timeSpentSince: nil)
- } else {
- if item["isSelected"] as! Bool {
- removingSelectedAllergie.updateValue(item, forKey: "itemToRemove")
- if !UserDefaults.standard.bool(forKey: "hasRemovedAllergy") {
- initRemoveAllergieView()
- } else {
- if !(removingSelectedAllergie["allowRemoving"] as! Bool) {
- removingSelectedAllergie.updateValue(true, forKey: "allowRemoving")
- }
- }
- } else {
- var tmpItem = item
- tmpItem.updateValue(true, forKey: "isSelected")
- allergiesTopScroll.addButtonToScroll(item: tmpItem)
- unSelectedAllergies = HelperMethodesService.sharedInstance.removeItemFromArray(array: unSelectedAllergies, item: tmpItem)
- selectedAllergies.append(tmpItem)
- allergiesSelectedStringLbl.text = makeStringFromArray(array: selectedAllergies)
- hasAllergieSelected = true
- if allergiesCardState != .hasAllergiesSelectedBigCard {
- staticAnimationOnViews(cardTypeToAnimate: .hasAllergiesSelectedBigCard)
- }
- allergiesCardState = .hasAllergiesSelectedBigCard
- EventsService.sharedInstance.logEvent(withName: "SelectAllergies", properies: ["Id": item["id"] as! String, "Name": item["name"] as! String], timeSpentSince: nil)
- }
- }
- } else if itemType == "diets" {
- // DIETS
- if item["isSelected"] as! Bool {
- var tmpItem = item
- tmpItem.updateValue(false, forKey: "isSelected")
- dietsBottomScroll.addButtonToScroll(item: tmpItem)
- selectedDiets = HelperMethodesService.sharedInstance.removeItemFromArray(array: selectedDiets, item: tmpItem)
- unSelectedDiets.append(tmpItem)
- dietsSelectedStringLbl.text = makeStringFromArray(array: selectedDiets)
- EventsService.sharedInstance.logEvent(withName: "DeselectDiets", properies: ["Id": item["id"] as! String, "Name": item["name"] as! String], timeSpentSince: nil)
- if selectedDiets.isEmpty {
- staticAnimationOnViews(cardTypeToAnimate: .noDietsSelected)
- dietsCardState = .noDietsSelected
- hasDietSelected = false
- }
- } else {
- var tmpItem = item
- tmpItem.updateValue(true, forKey: "isSelected")
- dietsTopScroll.addButtonToScroll(item: tmpItem)
- unSelectedDiets = HelperMethodesService.sharedInstance.removeItemFromArray(array: unSelectedDiets, item: tmpItem)
- selectedDiets.append(tmpItem)
- dietsSelectedStringLbl.text = makeStringFromArray(array: selectedDiets)
- hasDietSelected = true
- if dietsCardState != .hasDietsSelectedBigCard {
- staticAnimationOnViews(cardTypeToAnimate: .hasDietsSelectedBigCard)
- }
- dietsCardState = .hasDietsSelectedBigCard
- EventsService.sharedInstance.logEvent(withName: "SelectDiets", properies: ["Id": item["id"] as! String, "Name": item["name"] as! String], timeSpentSince: nil)
- }
- } else {
- // DISLIKES
- EventsService.sharedInstance.logEvent(withName: "DeselectDislikes", properies: ["Id": item["id"] as! String, "Name": item["name"] as! String], timeSpentSince: nil)
- selectedDislikes = HelperMethodesService.sharedInstance.removeItemFromArray(array: selectedDislikes, item: item)
- dislikesSelectedStringLbl.text = makeStringFromArray(array: selectedDislikes)
- if selectedDislikes.isEmpty {
- staticAnimationOnViews(cardTypeToAnimate: .noDislikesSelected)
- dislikesCardState = .noDislikesSelected
- }
- }
- }
- }
- extension ProfileDetailsViewController: NavToolbarViewDelegate {
- internal func leftButtonTapped(button: UIButton) {
- // if its deeplink the navigation is different
- if isAllergiesDeeplink || isDietsDeeplink || isDeeplink {
- self.dismiss(animated: false, completion: nil)
- } else {
- self.navigationController?.popViewController(animated: true)
- }
- }
- func firstRightButtonTapped(button: UIButton) {
- EventsService.sharedInstance.logEvent(withName: "SavedRecipes", properies: nil, timeSpentSince: nil)
- let savedRecipesController = SavedRecipesViewController()
- self.navigationController?.pushViewController(savedRecipesController, animated: true)
- }
- internal func secondRightButtonTapped(button: UIButton) {
- // create an actionSheet
- let actionSheetController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
- // create an action
- let shareWithFriends = UIAlertAction(title: "Invite Friends", style: .default, handler: { (action) in
- let policiesVC = PoliciesViewController()
- policiesVC.urlString = "http://invite.pixfood.com/create"
- policiesVC.controllerName = action.title!
- self.present(policiesVC, animated: true, completion: nil)
- })
- let editProfile = UIAlertAction(title: "Edit Profile", style: .default) { (action) in
- let editProfileVC = EditProfileViewController()
- self.present(editProfileVC, animated: true, completion: nil)
- }
- let faqAction = UIAlertAction(title: "FAQ", style: .default, handler: { (action) in
- let policiesVC = PoliciesViewController()
- policiesVC.urlString = "https://s3.amazonaws.com/mga-dev-web/faq.html"
- policiesVC.controllerName = action.title!
- self.present(policiesVC, animated: true, completion: nil)
- })
- let getInTouch = UIAlertAction(title: "Message Us", style: .default) { (action) in
- let policiesVC = PoliciesViewController()
- policiesVC.urlString = ""
- policiesVC.controllerName = action.title!
- self.present(policiesVC, animated: true, completion: nil)
- }
- let termsAndConditions = UIAlertAction(title: "Terms & Conditions", style: .default) { (action) in
- let policiesVC = PoliciesViewController()
- policiesVC.urlString = "https://s3.amazonaws.com/mga-dev-web/terms-conditions.html"
- policiesVC.controllerName = action.title!
- self.present(policiesVC, animated: true, completion: nil)
- }
- let privacyPolicy = UIAlertAction(title: "Privacy Policy", style: .default) { (action) in
- let policiesVC = PoliciesViewController()
- policiesVC.urlString = "https://s3.amazonaws.com/mga-dev-web/privacy-policy.html"
- policiesVC.controllerName = action.title!
- self.present(policiesVC, animated: true, completion: nil)
- }
- let openSourceLibraries = UIAlertAction(title: "Open Source Libraries", style: .default) { (action) in
- let policiesVC = PoliciesViewController()
- policiesVC.urlString = "https://s3.amazonaws.com/mga-dev-web/ios-libs.html"
- policiesVC.controllerName = action.title!
- self.present(policiesVC, animated: true, completion: nil)
- }
- let logOutAction: UIAlertAction = UIAlertAction (title: "Log Out", style: .default) { (_) in
- print("Log Out Action pressed")
- self.isLogoutPressed = true
- EventsService.sharedInstance.logEvent(withName: "OpenProfile", properies: nil, timeSpentSince: self.methodStart!)
- UserDefaults.standard.removeObject(forKey: "token")
- UserDefaults.standard.removeObject(forKey: "userID")
- UserDefaults.standard.removeObject(forKey: "userData")
- UserDefaults.standard.removeObject(forKey: "userStatus")
- UserDefaults.standard.synchronize()
- UserManagmentService.sharedInstance.removeAllSavedRecipesForUser()
- NotificationCenter.default.post(name: Notification.Name("reload_recipes"), object: nil)
- EventsService.sharedInstance.logEvent(withName: "LogOut", properies: nil, timeSpentSince: nil)
- // FB logout
- LoginManager().logOut()
- // RESET USER ON MIXPANEL
- let mixpanel = Mixpanel.mainInstance()
- mixpanel.clearSuperProperties()
- mixpanel.reset()
- //generate random number for distinct id and Anonymous-random
- let random: Int = Int(arc4random())
- let anonymousId = "\(random)"
- // identify new Anonymous user with random id and name
- mixpanel.identify(distinctId: anonymousId)
- mixpanel.identify(distinctId: anonymousId, usePeople: true)
- mixpanel.people.setOnce(properties: ["$first_name": "Anonymous-\(anonymousId)"])
- // BACK BUTTON TAPPED
- NotificationCenter.default.post(name: Notification.Name("fb-login"), object: nil)
- self.leftButtonTapped(button: UIButton())
- }
- actionSheetController.addAction(shareWithFriends)
- if (UserManagmentService.sharedInstance.getUser() as! User).type == USER_LOGIN_TYPES.EMAIL {
- actionSheetController.addAction(editProfile)
- }
- actionSheetController.addAction(faqAction)
- actionSheetController.addAction(getInTouch)
- actionSheetController.addAction(termsAndConditions)
- actionSheetController.addAction(privacyPolicy)
- actionSheetController.addAction(openSourceLibraries)
- if UserManagmentService.sharedInstance.isUserLogedIn() {
- actionSheetController.addAction(logOutAction)
- }
- actionSheetController.addAction(UIAlertAction(title: "Cancel", style: .cancel) { _ -> Void in })
- // present an actionSheet...
- self.present(actionSheetController, animated: true, completion: nil)
- }
- }
- extension ProfileDetailsViewController: ACTextFieldDelegate {
- func textFieldDidBeginEditing(textField: UITextField) { }
- func textFieldDidEndEditing(textField: UITextField) {
- if let text = textField.text {
- dislikesSearchText = text
- } else { dislikesSearchText = "" }
- }
- func textFieldDidChange(textField: UITextField, range: NSRange, replacementString: String) {
- let currentText: String = textField.text! + replacementString
- let opacity: Float = currentText.isEmpty || (replacementString.isEmpty && textField.text!.count == 1) ? 0 : 1
- if dislikesACTextField.isFirstResponder() {
- UIView.animate(withDuration: 0.2) {
- self.dislikesACTextFieldClearButton.layer.opacity = opacity
- }
- }
- if addAllergiesACTextField.isFirstResponder() {
- UIView.animate(withDuration: 0.2) {
- self.addAllergiesACTextFieldClearBtn.layer.opacity = opacity
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement