Advertisement
Guest User

Untitled

a guest
Jul 19th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 97.07 KB | None | 0 0
  1. //
  2. // ProfileDetailsViewController.swift
  3. // PixFood
  4. //
  5. // Created by Jovan Mitrovski on 2/26/18.
  6. // Copyright © 2018 Dina Kocevska. All rights reserved.
  7. //
  8.  
  9. import FacebookCore
  10. import FacebookLogin
  11. import Foundation
  12. import Lottie
  13. import Mixpanel
  14. import SDWebImage
  15. import UIKit
  16.  
  17. enum SmallCardStates {
  18. // default for all cards
  19. case initialState
  20.  
  21. // allergies card-state cases
  22. case noAllergiesSelected
  23. case hasAllergiesSelectedSmallCard
  24. case hasAllergiesSelectedBigCard
  25.  
  26. // diests card-state cases
  27. case noDietsSelected
  28. case hasDietsSelectedBigCard
  29. case hasDietsSelectedSmallCard
  30.  
  31. // dislikes card-state cases
  32. case noDislikesSelected
  33. case hasDislikesSelectedBigCard
  34. case hasDislikesSelectedSmallCard
  35. }
  36.  
  37. class ProfileDetailsViewController: UIViewController, NewAdaptingItemsViewDelegate, UIScrollViewDelegate, UIGestureRecognizerDelegate {
  38.  
  39. private var progressDotsView: UIView = UIView()
  40. private var navToolbarView: NavToolbarView = NavToolbarView()
  41. private var mainScroll: UIScrollView = UIScrollView()
  42. private var profileImageView: UIImageView = UIImageView()
  43. private var profileImageShadowView: UIView = UIView()
  44. private var userNameLabel: UILabel = UILabel()
  45. private var emailLabel: UILabel = UILabel()
  46. private var userEmailLabel: UILabel = UILabel()
  47. private var editProfileImgBtn: UIButton = UIButton()
  48. // moving the image to top
  49. private var profileImageToTopPercentage: Float = Float()
  50. private var profileToTopPosition: Float = 30
  51.  
  52. private var pcWrapper: UIView = UIView()
  53. private var horizontalScroll: UIScrollView = UIScrollView()
  54.  
  55. // main views
  56. private var userPrefPage1: UIView = UIView()
  57. private var userPrefPage2: UIView = UIView()
  58. private var userPrefPage3: UIView = UIView()
  59.  
  60. private var userPrefPage1originX: CGFloat = CGFloat()
  61. private var userPrefPage2originX: CGFloat = CGFloat()
  62. private var userPrefPage3originX: CGFloat = CGFloat()
  63.  
  64. // allergies screen setup
  65. private var allergiesTopView: UIView = UIView()
  66. private var allergiesTopSubView: UIView = UIView()
  67. private var allergiesTopScroll: NewAdaptingItemsView = NewAdaptingItemsView()
  68. private var allergiesBottomScroll: NewAdaptingItemsView = NewAdaptingItemsView()
  69. private var addAllergiesView: UIView = UIView()
  70. private var removeAllergiesView: UIView = UIView()
  71. private var selectedAllergies: [[String: Any]] = []
  72. private var unSelectedAllergies: [[String: Any]] = []
  73. private var allergiesTitle: UILabel = UILabel()
  74. private var hasAllergieSelected: Bool = false
  75. // allergies components
  76. private var switchButton: UISwitch = UISwitch()
  77. private var dontHaveAllerLbl: UILabel = UILabel()
  78. private var allergiesSmallDesc: UILabel = UILabel()
  79. private var allergiesBigDesc: UILabel = UILabel()
  80. private var allergiesTopSeparator: UIImageView = UIImageView()
  81. private var allergiesSelectedStringLbl: UILabel = UILabel()
  82. private var editAllergiesIcon: UIImageView = UIImageView()
  83. private var allergiesRightGradientLayer: CAGradientLayer = CAGradientLayer()
  84. private var allergiesTopScrollWrapper: UIView = UIView()
  85.  
  86. private var addAllergiesACTextFieldWrapper: UIView = UIView()
  87. private var addAllergiesACTextField: ACTextField = ACTextField()
  88. private var addAllergiesACTextFieldClearBtn: UIButton = UIButton()
  89. private var newAllergieString: String = ""
  90. private var animationView: LOTAnimationView = LOTAnimationView()
  91.  
  92. // diets screen setup
  93. private var dietsTopView: UIView = UIView()
  94. private var dietsTopSubView: UIView = UIView()
  95. private var dietsTopScroll: NewAdaptingItemsView = NewAdaptingItemsView()
  96. private var dietsBottomScroll: NewAdaptingItemsView = NewAdaptingItemsView()
  97. private var selectedDiets: [[String: Any]] = []
  98. private var unSelectedDiets: [[String: Any]] = []
  99. private var dietsTitle: UILabel = UILabel()
  100. private var hasDietSelected: Bool = false
  101. // diets components
  102. private var dietsSmallDesc: UILabel = UILabel()
  103. private var dietsBigDesc: UILabel = UILabel()
  104. private var dietsTopSeparator: UIImageView = UIImageView()
  105. private var dietsSelectedStringLbl: UILabel = UILabel()
  106. private var editDietsIcon: UIImageView = UIImageView()
  107. private var dietsRightGradientLayer: CAGradientLayer = CAGradientLayer()
  108. private var dietsTopScrollWrapper: UIView = UIView()
  109. private var selectedDislikes: [[String: Any]] = []
  110.  
  111. // dislikes screen setup
  112. private var dislikesTopView: UIView = UIView()
  113. private var dislikesTopSubView: UIView = UIView()
  114. private var dislikesTopScroll: NewAdaptingItemsView = NewAdaptingItemsView()
  115. private var dislikesTopScrollWrapper: UIView = UIView()
  116. // dislikes components
  117. private var dislikesTitle: UILabel = UILabel()
  118. private var dislikesTopSeparator: UIImageView = UIImageView()
  119. private var dislikesBigDesc: UILabel = UILabel()
  120. private var editDislikesIcon: UIImageView = UIImageView()
  121. private var dislikesSmallDesc: UILabel = UILabel()
  122. private var dislikesACTextFieldWrapper: UIView = UIView()
  123. private var dislikesACTextField: ACTextField = ACTextField()
  124. private var dislikesACTextFieldClearButton: UIButton = UIButton()
  125. private var dislikesAddBtn: UIButton = UIButton()
  126. private var dislikesSelectedStringLbl: UILabel = UILabel()
  127. private var dislikesRightGradientLayer: CAGradientLayer = CAGradientLayer()
  128. private var dislikesSearchText: String = String()
  129.  
  130. // config scrolls
  131. private var mainMargin: CGFloat = 16
  132. private var userPrefPage1ToLeftPercentage: CGFloat = (16 / 100)
  133. private var smallUserPrefCardWidth: CGFloat = CGFloat()
  134. private var scrolledToEndLeft: Bool = true
  135.  
  136. // initial arrays
  137. private var initialSelectedAllergies: [[String: Any]] = [[String: Any]]()
  138. private var initialSelectedDiets: [[String: Any]] = [[String: Any]]()
  139. private var initialSelectedDislikes: [[String: Any]] = [[String: Any]]()
  140.  
  141. // helping props
  142. private var userPrefCardTimeSpend: Date?
  143. private var userPreferences: UserPreferences = UserPreferences()
  144. private var methodStart: Date?
  145. private var isLogoutPressed: Bool = false
  146. private var isMainScrollOpened: Bool = false
  147. private var cardBorderRadius: CGFloat = 10
  148. private var noAllergiesToggleSelected: Bool = false
  149. private var startingNoAllergiesToggleSelected: Bool = false
  150. private var sendButton: UIButton = UIButton()
  151. private var mainScrollPercentageScrolled: CGFloat = 0
  152. private var cardSubViewWidth: CGFloat = 0
  153. private var horizontalScrollIndexPage: Int = 0
  154. private var isNoAlleryViewOpened: Bool = false
  155. private var tapGestureForKeyboard: UITapGestureRecognizer = UITapGestureRecognizer()
  156.  
  157. private var allergiesCardState: SmallCardStates = .initialState
  158. private var dietsCardState: SmallCardStates = .initialState
  159. private var dislikesCardState: SmallCardStates = .initialState
  160.  
  161. private var removingSelectedAllergie: [String: Any] = ["allowRemoving": false, "itemToRemove": [String: Any].self] {
  162. didSet {
  163. removingSelectedAllergie(removingSelectedAllergie)
  164. }
  165. }
  166. private var mainScrollScrolled: CGFloat = 0 {
  167. didSet {
  168. percentageAnimationOnViews()
  169. }
  170. }
  171.  
  172. // deeplinks
  173. var isAllergiesDeeplink: Bool = false
  174. var isDietsDeeplink: Bool = false
  175. var isDeeplink: Bool = false
  176.  
  177. // Black View init
  178.  
  179. // MARK: - CONTROLLER LIFECYCLE
  180. override func viewDidLoad() {
  181. self.view.backgroundColor = .white
  182. // add tapGesture listener
  183. tapGestureForKeyboard = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
  184. self.view.addGestureRecognizer(tapGestureForKeyboard)
  185.  
  186. if !isDeeplink {
  187. navControllerRoutesShuffle()
  188. }
  189. // self.navigationController?.interactivePopGestureRecognizer?.delegate = self
  190.  
  191. disableAllergiesScroll(isDisabled: UserDefaults.standard.bool(forKey: "noAllergieToggleSelected"))
  192. initNavToolbarView()
  193. initScrollView()
  194. initUserDetails()
  195. initHorizontalScroll()
  196. initUserPreferences()
  197. initDotsPageIndicator()
  198. animateInit()
  199. }
  200.  
  201. override func viewWillAppear(_ animated: Bool) {
  202. print("viewWillAppear")
  203. methodStart = Date()
  204. userNameLabel.text = (UserManagmentService.sharedInstance.getUser() as! User).name ?? ""
  205. if (UserManagmentService.sharedInstance.getUser() as! User).type == USER_LOGIN_TYPES.EMAIL {
  206. if (UserManagmentService.sharedInstance.getUser() as! User).imageUrl.isEmpty {
  207. editProfileImgBtn.layer.opacity = 1
  208. } else {
  209. editProfileImgBtn.layer.opacity = 0
  210. }
  211. }
  212.  
  213. if UserManagmentService.sharedInstance.isUserLogedIn() {
  214. if !(UserManagmentService.sharedInstance.getUser() as! User).imageUrl.isEmpty {
  215. SDImageCache.shared().clearMemory()
  216. SDImageCache.shared().clearDisk()
  217. let imageUrl: URL = URL(string: (UserManagmentService.sharedInstance.getUser() as! User).imageUrl)!
  218. profileImageView.sd_setImage(with: imageUrl, completed: nil)
  219. } else {
  220. profileImageView.image = #imageLiteral(resourceName: "ic_profile_avatar")
  221. }
  222. } else {
  223. // this is impossible scenario
  224. profileImageView.image = #imageLiteral(resourceName: "ic_profile_avatar")
  225. }
  226.  
  227. }
  228.  
  229. override func viewWillDisappear(_ animated: Bool) {
  230. if !isLogoutPressed { // only if user logs out, then dont log the event.
  231. EventsService.sharedInstance.logEvent(withName: "OpenProfile", properies: nil, timeSpentSince: methodStart!)
  232. }
  233.  
  234. if !UserDefaults.standard.bool(forKey: "noAllergieToggleSelected") {
  235. if noAllergiesToggleSelected {
  236. EventsService.sharedInstance.logEvent(withName: "NoAllergies", properies: nil, timeSpentSince: nil)
  237. }
  238. }
  239.  
  240. UserDefaults.standard.setValue(noAllergiesToggleSelected, forKey: "noAllergieToggleSelected")
  241. UserDefaults.standard.synchronize()
  242. }
  243.  
  244. override func viewDidDisappear(_ animated: Bool) {
  245. updateProfileCallOnBack()
  246. }
  247.  
  248. func setupSwipeView() {
  249. let slideView = UIView(frame: CGRect(x: 0, y: 0, width: 2, height: ConstValues.screenHeight))
  250. view.addSubview(slideView)
  251.  
  252. let swipeRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(swipeRecognizer(_:)))
  253. swipeRecognizer.direction = .right
  254. view.addGestureRecognizer(swipeRecognizer)
  255. }
  256.  
  257. @objc func swipeRecognizer(_ sender: UIGestureRecognizer) {
  258. self.navigationController?.popViewController(animated: true)
  259. }
  260.  
  261. // MARK: - Init Methods
  262. func initDotsPageIndicator() {
  263. progressDotsView = UIView(frame: CGRect(x: 16, y: 16, width: 46, height: 8))
  264. progressDotsView.alpha = 0
  265.  
  266. let viewWidth: Int = 8
  267. var originx: Int = 0
  268. for i in 0 ..< 3 {
  269. let view = UIView(frame: CGRect(x: originx, y: 0, width: viewWidth, height: viewWidth))
  270. originx += viewWidth + 8
  271.  
  272. view.backgroundColor = AppColors.lightGray
  273. view.layer.cornerRadius = view.frame.width / 2
  274. progressDotsView.addSubview(view)
  275. view.tag = i
  276. }
  277. progressDotsView.subviews[0].backgroundColor = AppColors.redColor
  278. progressDotsView.clipsToBounds = true
  279.  
  280. pcWrapper.addSubview(progressDotsView)
  281. }
  282.  
  283. func initAddAllergiesView() {
  284. isNoAlleryViewOpened = true
  285. let heightExtraArg: CGFloat = ConstValues.screenHeight > 670 ? 104 : 64
  286. addAllergiesView = UIView(frame: CGRect(
  287. x: 0,
  288. y: allergiesTopView.frame.maxY + 32,
  289. width: ConstValues.screenWidth,
  290. height: ConstValues.screenHeight - (allergiesTopView.frame.height + navToolbarView.frame.height + heightExtraArg + HelperMethodesService.sharedInstance.safeAreaBottomHeight())))
  291. addAllergiesView.backgroundColor = .white
  292. addAllergiesView.layer.opacity = 0
  293.  
  294. addAllergiesACTextFieldWrapper = UIView(frame: CGRect(x: 32, y: 44, width: addAllergiesView.frame.width - 64, height: 44))
  295. addAllergiesACTextFieldWrapper.backgroundColor = AppColors.lightGray
  296. addAllergiesACTextFieldWrapper.layer.cornerRadius = 22
  297.  
  298. addAllergiesACTextField = ACTextField(
  299. frame: CGRect(x: 32, y: 0, width: addAllergiesACTextFieldWrapper.frame.width - 2*32, height: addAllergiesACTextFieldWrapper.frame.height),
  300. font: AppFonts.openSansBold20!,
  301. mainFontColor: AppColors.textColor,
  302. autocompleteFontColor: UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.3),
  303. placeholderText: "Type",
  304. placeholderFontColor: AppColors.textColor.withAlphaComponent(0.3),
  305. turnAutocompleteOn: false
  306. )
  307.  
  308. // -7 for x button to make more clickable and have right position
  309. addAllergiesACTextFieldClearBtn = UIButton(frame: CGRect(x: addAllergiesACTextField.frame.maxX - 7, y: (addAllergiesACTextFieldWrapper.frame.height/2) - (32/2), width: 32, height: 32))
  310. addAllergiesACTextFieldClearBtn.setImage(UIImage(named: "ic_clear_text"), for: UIControlState.normal)
  311. addAllergiesACTextFieldClearBtn.imageEdgeInsets = UIEdgeInsets(top: 9, left: 9, bottom: 9, right: 9)
  312. addAllergiesACTextFieldClearBtn.contentMode = .scaleAspectFill
  313. addAllergiesACTextFieldClearBtn.addTarget(self, action: #selector(ACTextFieldClearBtnTapped(sender:)), for: UIControlEvents.touchUpInside)
  314. addAllergiesACTextFieldClearBtn.layer.opacity = 0
  315.  
  316. addAllergiesACTextField.delegate = self
  317. addAllergiesACTextFieldWrapper.addSubview(addAllergiesACTextField)
  318. addAllergiesACTextFieldWrapper.addSubview(addAllergiesACTextFieldClearBtn)
  319. addAllergiesView.addSubview(addAllergiesACTextFieldWrapper)
  320.  
  321. // desc label
  322. let textLbl = UIManagmentService.sharedInstance.createLabel(
  323. x: 32,
  324. y: addAllergiesACTextFieldWrapper.frame.maxY + 24,
  325. w: addAllergiesView.frame.width - 2 * 32,
  326. h: 62,
  327. fontName: AppFonts.openSansRegular18!,
  328. fontColor: AppColors.textColor,
  329. lines: 2,
  330. alignment: .center,
  331. text: "the allergy you want us to take
into consideration"
  332. )
  333. addAllergiesView.addSubview(textLbl)
  334.  
  335. //Setup Button
  336. let halfScreenWidth = ConstValues.screenWidth / 2
  337. sendButton = UIButton(frame: CGRect(x: halfScreenWidth - (187/2), y: addAllergiesView.frame.height - 155, width: 187, height: 44))
  338. sendButton.layer.addSublayer(UIManagmentService.sharedInstance.addGradientColorOnButtonBorder(onView: sendButton))
  339. sendButton.setTitle("Send", for: UIControlState.normal)
  340. sendButton.titleLabel?.font = AppFonts.openSansBold18
  341. sendButton.setTitleColor(AppColors.redColor, for: UIControlState.normal)
  342. sendButton.addTarget(self, action: #selector(sendButtonPressed), for: UIControlEvents.touchUpInside)
  343. addAllergiesView.addSubview(sendButton)
  344.  
  345. //Cancel Button
  346. let cancelButton = UIButton(frame: CGRect(x: ConstValues.marginX * 2, y: sendButton.frame.maxY + 50, width: addAllergiesView.frame.width - 4 * ConstValues.marginX, height: 44))
  347. cancelButton.setTitle("Cancel", for: UIControlState.normal)
  348. cancelButton.titleLabel?.font = AppFonts.openSansRegular16
  349. cancelButton.setTitleColor(AppColors.lightBlackColor, for: UIControlState.normal)
  350. cancelButton.addTarget(self, action: #selector(cancelButtonPressed), for: UIControlEvents.touchUpInside)
  351. addAllergiesView.addSubview(cancelButton)
  352.  
  353. //LOTTIE
  354. animationView = UIManagmentService.sharedInstance.createLoader(originY: sendButton.frame.origin.y)
  355. animationView.isHidden = true
  356. addAllergiesView.addSubview(animationView)
  357.  
  358. userPrefPage1.addSubview(addAllergiesView)
  359. userPrefPage1.sendSubview(toBack: addAllergiesView)
  360.  
  361. UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseIn, animations: {
  362. self.addAllergiesView.layer.opacity = 1
  363. }, completion: nil)
  364. }
  365.  
  366. func initRemoveAllergieView () {
  367. removeAllergiesView = UIView(frame: self.view.frame)
  368. removeAllergiesView.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.7)
  369. removeAllergiesView.alpha = 0
  370.  
  371. let mainView = UIView(frame: CGRect(x: 16, y: removeAllergiesView.frame.height / 2 - 115, width: removeAllergiesView.frame.width - 2 * ConstValues.marginX, height: 230))
  372. mainView.backgroundColor = .white
  373. mainView.layer.cornerRadius = 10
  374. removeAllergiesView.addSubview(mainView)
  375.  
  376. // SEPARATOR
  377. let separatorImage = UIImageView(frame: CGRect(x: (mainView.frame.width / 2) - 36, y: 32, width: 72, height: 5))
  378. separatorImage.contentMode = .scaleAspectFill
  379. separatorImage.image = #imageLiteral(resourceName: "ic_separator_wave")
  380. mainView.addSubview(separatorImage)
  381.  
  382. // TEXT LABEL WITH ATR. STRING
  383. let messageLabel = UIManagmentService.sharedInstance.createLabel(
  384. x: ConstValues.marginX,
  385. y: separatorImage.frame.maxY + 22,
  386. w: mainView.frame.width - 2 * ConstValues.marginX,
  387. h: 52,
  388. fontName: AppFonts.openSansSemiBold18!,
  389. fontColor: AppColors.blackTitleColor,
  390. lines: 2,
  391. alignment: .center,
  392. text: "Any change to the allergies will affect the recipe selection you get!"
  393. )
  394. mainView.addSubview(messageLabel)
  395.  
  396. let descLabel = UIManagmentService.sharedInstance.createLabel(
  397. x: 16,
  398. y: messageLabel.frame.maxY + 16,
  399. w: mainView.frame.width - 2 * ConstValues.marginX,
  400. h: 52,
  401. fontName: AppFonts.openSansRegular18!,
  402. fontColor: AppColors.textColor,
  403. lines: 1,
  404. alignment: .center,
  405. text: "Are you OK with this?"
  406. )
  407. mainView.addSubview(descLabel)
  408.  
  409. let cancelButton = UIButton(frame: CGRect(x: 0, y: mainView.frame.height - 45, width: mainView.frame.width / 2, height: 45))
  410. cancelButton.tag = 9898
  411. cancelButton.setTitle("NO, GO BACK", for: UIControlState.normal)
  412. cancelButton.titleLabel?.font = AppFonts.openSansBold16
  413. cancelButton.setTitleColor(AppColors.black, for: UIControlState.normal)
  414. cancelButton.addTarget(self, action: #selector(cancelButtonPressed), for: UIControlEvents.touchUpInside)
  415. mainView.addSubview(cancelButton)
  416.  
  417. let yesButton = UIButton(frame: CGRect(x: cancelButton.frame.maxX, y: mainView.frame.height - 45, width: mainView.frame.width / 2, height: 45))
  418. yesButton.setTitle("YES, CONTINUE", for: UIControlState.normal)
  419. yesButton.titleLabel?.font = AppFonts.openSansBold16
  420. yesButton.setTitleColor(AppColors.black, for: UIControlState.normal)
  421. yesButton.addTarget(self, action: #selector(yesButtonPressed(sender:)), for: UIControlEvents.touchUpInside)
  422. mainView.addSubview(yesButton)
  423.  
  424. UIManagmentService.sharedInstance.addTopBorderWithColor(color: .black, view: cancelButton)
  425. UIManagmentService.sharedInstance.addTopBorderWithColor(color: .black, view: yesButton)
  426. UIManagmentService.sharedInstance.addLeftBorderWithColor(color: .black, view: yesButton)
  427.  
  428. self.view.addSubview(removeAllergiesView)
  429.  
  430. UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseIn, animations: {
  431. self.removeAllergiesView.alpha = 1
  432. }, completion: nil)
  433. }
  434.  
  435. private func initNavToolbarView() {
  436. navToolbarView = NavToolbarView(screenType: .profileScreen)
  437. navToolbarView.delegate = self
  438. profileImageToTopPercentage = ((Float(navToolbarView.frame.origin.y + navToolbarView.frame.height + 20) - profileToTopPosition) / 100)
  439.  
  440. self.view.addSubview(navToolbarView)
  441. }
  442.  
  443. private func initScrollView() {
  444. mainScroll = UIScrollView(frame: CGRect(x: 0, y: (navToolbarView.frame.origin.y + navToolbarView.frame.height), width: ConstValues.screenWidth, height: ConstValues.screenHeight))
  445. mainScroll.tag = 1
  446. mainScroll.contentSize = CGSize(width: ConstValues.screenWidth, height: (ConstValues.screenHeight + (ConstValues.screenHeight / 2 + 120)) - (navToolbarView.frame.maxY))
  447. mainScroll.delegate = self
  448. mainScroll.clipsToBounds = true
  449. mainScroll.isPagingEnabled = true
  450. mainScroll.bounces = false
  451. mainScroll.showsVerticalScrollIndicator = false
  452. mainScroll.isMultipleTouchEnabled = false
  453. mainScroll.decelerationRate = UIScrollViewDecelerationRateFast
  454. mainScroll.isScrollEnabled = false
  455.  
  456. pcWrapper = UIView(frame: CGRect(
  457. x: 0,
  458. y: ConstValues.screenHeight - 264 - CGFloat(HelperMethodesService.sharedInstance.safeAreaTotalHeight()),
  459. width: ConstValues.screenWidth,
  460. height: ConstValues.screenHeight)
  461. )
  462. mainScroll.addSubview(pcWrapper)
  463.  
  464. self.view.addSubview(mainScroll)
  465. }
  466.  
  467. private func initUserDetails() {
  468. profileImageView = UIImageView(frame: CGRect(x: 88, y: (navToolbarView.frame.maxY) + 20, width: ConstValues.screenWidth - 2*88, height: ConstValues.screenWidth - 2*88))
  469. profileImageView.layer.cornerRadius = profileImageView.frame.width / 2
  470. profileImageView.clipsToBounds = true
  471. profileImageView.layer.opacity = 0
  472.  
  473. let cetvrtince = profileImageView.frame.width / 4
  474. editProfileImgBtn = UIButton(frame:
  475. CGRect(x: profileImageView.frame.origin.x + (cetvrtince * 3) + (cetvrtince / 10), y: profileImageView.frame.origin.y + cetvrtince - ((cetvrtince/10) * 7), width: 30, height: 30))
  476. editProfileImgBtn.layer.cornerRadius = editProfileImgBtn.frame.width / 2
  477. editProfileImgBtn.backgroundColor = .white
  478. editProfileImgBtn.setImage(#imageLiteral(resourceName: "ic_edit_pref"), for: UIControlState.normal)
  479. editProfileImgBtn.addTarget(self, action: #selector(editProfileImgBtnTapped(sender:)), for: .touchUpInside)
  480. editProfileImgBtn.layer.opacity = 0
  481.  
  482. // ADD SHADOW
  483. profileImageShadowView = UIView(frame: profileImageView.frame)
  484. profileImageShadowView.clipsToBounds = false
  485. profileImageShadowView.layer.shadowColor = UIColor.black.cgColor
  486. profileImageShadowView.layer.shadowOpacity = 0.20
  487. profileImageShadowView.layer.shadowOffset = CGSize(width: 0, height: 5)
  488. profileImageShadowView.layer.shadowRadius = 20
  489. profileImageShadowView.layer.shadowPath = UIBezierPath(roundedRect: profileImageShadowView.bounds, cornerRadius: profileImageShadowView.frame.width / 2).cgPath
  490. profileImageShadowView.layer.opacity = 0
  491. profileImageShadowView.contentMode = .scaleToFill
  492.  
  493. userNameLabel = UIManagmentService.sharedInstance.createLabel(
  494. x: 32,
  495. y: (profileImageView.frame.origin.y + profileImageView.frame.height) + 20,
  496. w: ConstValues.screenWidth - 2*32,
  497. h: 70,
  498. fontName: AppFonts.openSansBold26!,
  499. fontColor: AppColors.black,
  500. lines: 2,
  501. alignment: .center,
  502. text: (UserManagmentService.sharedInstance.getUser() as! User).name! )
  503. userNameLabel.layer.opacity = 0
  504.  
  505. let emailLabelString: String = (UserManagmentService.sharedInstance.getUser() as! User).isInstagram! ? "USERNAME" : "E-MAIL"
  506. emailLabel = UIManagmentService.sharedInstance.createLabel(
  507. x: 0,
  508. y: (userNameLabel.frame.origin.y + userNameLabel.frame.height) + 5,
  509. w: ConstValues.screenWidth,
  510. h: 14,
  511. fontName: AppFonts.openSansRegular12!,
  512. fontColor: UIColor(red: 81/255, green: 81/255, blue: 81/255, alpha: 0.5),
  513. lines: 1,
  514. alignment: .center,
  515. text: emailLabelString)
  516. emailLabel.layer.opacity = 0
  517.  
  518. let userEmailLabelString: String = (UserManagmentService.sharedInstance.getUser() as! User).isInstagram!
  519. ? (UserManagmentService.sharedInstance.getUser() as! User).username!
  520. : (UserManagmentService.sharedInstance.getUser() as! User).email!
  521. userEmailLabel = UIManagmentService.sharedInstance.createLabel(
  522. x: 32,
  523. y: (emailLabel.frame.origin.y + emailLabel.frame.height) + 6,
  524. w: ConstValues.screenWidth - 2*32,
  525. h: 24,
  526. fontName: AppFonts.openSansSemiBold16!,
  527. fontColor: AppColors.textColor,
  528. lines: 1,
  529. alignment: .center,
  530. text: userEmailLabelString)
  531. userEmailLabel.layer.opacity = 0
  532.  
  533. profileImageView.isUserInteractionEnabled = true
  534. let profileTapGesture = UITapGestureRecognizer(target: self, action: #selector(profileImageTapped(sender:)))
  535. profileTapGesture.numberOfTapsRequired = 1
  536. profileTapGesture.numberOfTouchesRequired = 1
  537. profileImageView.addGestureRecognizer(profileTapGesture)
  538.  
  539. self.view.addSubview(profileImageShadowView)
  540. self.view.addSubview(profileImageView)
  541. self.view.addSubview(editProfileImgBtn)
  542. self.view.addSubview(userNameLabel)
  543. self.view.addSubview(emailLabel)
  544. self.view.addSubview(userEmailLabel)
  545. }
  546.  
  547. private func initHorizontalScroll() {
  548. horizontalScroll = UIScrollView(frame: CGRect(x: 0, y: 0, width: ConstValues.screenWidth, height: ConstValues.screenHeight))
  549. horizontalScroll.tag = 2
  550. horizontalScroll.contentSize = CGSize(width: ConstValues.screenWidth*3, height: ConstValues.screenHeight)
  551. horizontalScroll.delegate = self
  552. horizontalScroll.clipsToBounds = false
  553. horizontalScroll.isPagingEnabled = true
  554. horizontalScroll.bounces = false
  555. horizontalScroll.decelerationRate = UIScrollViewDecelerationRateFast
  556. horizontalScroll.isMultipleTouchEnabled = false
  557.  
  558. pcWrapper.addSubview(horizontalScroll)
  559. }
  560.  
  561. private func initUserPreferences() {
  562. // setup allergies page
  563. userPrefPage1 = UIView(frame: CGRect(x: mainMargin, y: 0, width: ConstValues.screenWidth - 4*mainMargin, height: horizontalScroll.frame.height))
  564. userPrefPage1originX = userPrefPage1.frame.origin.x
  565. allergiesTitle = UIManagmentService.sharedInstance.createLabel(
  566. x: 16,
  567. y: 25,
  568. w: (userPrefPage1.frame.width/2),
  569. h: 32,
  570. fontName: AppFonts.openSansSemiBold20!,
  571. fontColor: AppColors.blackTitleColor,
  572. lines: 1,
  573. alignment: .left,
  574. text: "ALLERGIES"
  575. )
  576. allergiesTopView = generateTopViewOnView(viewAbove: userPrefPage1)
  577. allergiesTopView.layer.cornerRadius = cardBorderRadius
  578. userPrefPage1.addSubview(allergiesTopView)
  579. userPrefPage1.addSubview(allergiesTitle)
  580.  
  581. allergiesTopSeparator = UIManagmentService.sharedInstance.createSeparatorWaveWithCoordinates(x: 16, y: allergiesTitle.frame.maxY + 5)
  582.  
  583. dontHaveAllerLbl = UIManagmentService.sharedInstance.createLabel(
  584. x: allergiesTopView.frame.origin.x + 16,
  585. y: allergiesTopView.frame.maxY + 32,
  586. w: 220,
  587. h: 32,
  588. fontName: AppFonts.openSansSemiBold16!,
  589. fontColor: AppColors.textColor,
  590. lines: 1,
  591. alignment: .left,
  592. text: "I don’t have any allergies"
  593. )
  594. smallUserPrefCardWidth = userPrefPage1.frame.width
  595. dontHaveAllerLbl.layer.opacity = 0
  596.  
  597. switchButton = UISwitch(frame: CGRect(x: ConstValues.screenWidth - 90, y: dontHaveAllerLbl.frame.origin.y, width: 60, height: 30))
  598. switchButton.onTintColor = AppColors.redColor
  599. switchButton.addTarget(self, action: #selector(switchValueDidChange(sender:)), for: .valueChanged)
  600. switchButton.layer.opacity = 0
  601.  
  602. userPrefPage1.addSubview(allergiesTopSeparator)
  603. userPrefPage1.addSubview(dontHaveAllerLbl)
  604. userPrefPage1.addSubview(switchButton)
  605.  
  606. // setup diets page
  607. userPrefPage2 = UIView(frame: CGRect(x: ConstValues.screenWidth - 2*mainMargin, y: 0, width: ConstValues.screenWidth - 4*mainMargin, height: horizontalScroll.frame.height))
  608. userPrefPage2originX = userPrefPage2.frame.origin.x
  609. dietsTitle = UIManagmentService.sharedInstance.createLabel(
  610. x: 16,
  611. y: 25,
  612. w: (userPrefPage2.frame.width/2),
  613. h: 32,
  614. fontName: AppFonts.openSansSemiBold20!,
  615. fontColor: AppColors.blackTitleColor,
  616. lines: 1,
  617. alignment: .left,
  618. text: "DIETS"
  619. )
  620. dietsTopSeparator = UIManagmentService.sharedInstance.createSeparatorWaveWithCoordinates(x: 16, y: dietsTitle.frame.maxY + 5)
  621. dietsTopView = generateTopViewOnView(viewAbove: userPrefPage2)
  622. dietsTopView.layer.cornerRadius = cardBorderRadius
  623. userPrefPage2.addSubview(dietsTopView)
  624. userPrefPage2.addSubview(dietsTitle)
  625. userPrefPage2.addSubview(dietsTopSeparator)
  626.  
  627. // setup dislikes page
  628. userPrefPage3 = UIView(frame: CGRect(x: (ConstValues.screenWidth*2) - (2*16), y: 0, width: ConstValues.screenWidth - 4*mainMargin, height: horizontalScroll.frame.height))
  629. userPrefPage3originX = userPrefPage3.frame.origin.x
  630. dislikesTitle = UIManagmentService.sharedInstance.createLabel(
  631. x: 16,
  632. y: 25,
  633. w: (userPrefPage3.frame.width/2),
  634. h: 32,
  635. fontName: AppFonts.openSansSemiBold20!,
  636. fontColor: AppColors.blackTitleColor,
  637. lines: 1,
  638. alignment: .left,
  639. text: "DISLIKES"
  640. )
  641. dislikesTopView = generateTopViewOnView(viewAbove: userPrefPage3)
  642. dislikesTopView.layer.cornerRadius = cardBorderRadius
  643. dislikesTopSeparator = UIManagmentService.sharedInstance.createSeparatorWaveWithCoordinates(x: 16, y: dislikesTitle.frame.maxY + 5)
  644. userPrefPage3.addSubview(dislikesTopView)
  645. userPrefPage3.addSubview(dislikesTitle)
  646. userPrefPage3.addSubview(dislikesTopSeparator)
  647.  
  648. horizontalScroll.addSubview(userPrefPage1)
  649. horizontalScroll.addSubview(userPrefPage2)
  650. horizontalScroll.addSubview(userPrefPage3)
  651. getPreferences()
  652. }
  653.  
  654. private func animateInit() {
  655. UIView.animate(withDuration: 0.5) {
  656. self.profileImageView.layer.opacity = 1
  657. self.profileImageShadowView.layer.opacity = 1
  658. self.userNameLabel.layer.opacity = 1
  659. self.emailLabel.layer.opacity = 1
  660. self.userEmailLabel.layer.opacity = 1
  661. }
  662. }
  663.  
  664. // MARK: - GET DATA
  665. func getPreferences() {
  666. userPreferences.getPreferencesForUser { (completed) in
  667. if completed {
  668. // update to noAllergies toggle
  669. self.noAllergiesToggleSelected = self.userPreferences.noAllergies
  670. self.startingNoAllergiesToggleSelected = self.userPreferences.noAllergies
  671. UserDefaults.standard.setValue(self.userPreferences.noAllergies, forKey: "noAllergieToggleSelected")
  672. self.switchButton.isOn = self.noAllergiesToggleSelected
  673. self.switchButton.setOn(self.noAllergiesToggleSelected, animated: false)
  674.  
  675. // check for selected allergies/diets
  676. self.checkForSelectedItems(items: self.userPreferences.allergies, itemsType: "allergies")
  677. self.checkForSelectedItems(items: self.userPreferences.diets, itemsType: "diets")
  678.  
  679. self.initialSelectedDislikes = self.userPreferences.dislikes!
  680. self.selectedDislikes = self.userPreferences.dislikes!
  681.  
  682. self.mainScroll.isScrollEnabled = true
  683.  
  684. // check which card type to display
  685. if !self.selectedAllergies.isEmpty {
  686. self.allergiesCardState = .hasAllergiesSelectedSmallCard
  687. self.hasAllergieSelected = true
  688. } else {
  689. self.allergiesCardState = .noAllergiesSelected
  690. self.hasAllergieSelected = false
  691. }
  692.  
  693. if !self.selectedDiets.isEmpty {
  694. self.dietsCardState = .hasDietsSelectedSmallCard
  695. self.hasDietSelected = true
  696. } else {
  697. self.dietsCardState = .noDietsSelected
  698. self.hasDietSelected = false
  699. }
  700.  
  701. if !self.selectedDislikes.isEmpty {
  702. self.dislikesCardState = .hasDislikesSelectedSmallCard
  703. } else {
  704. self.dislikesCardState = .noDislikesSelected
  705. }
  706.  
  707. // GENERATE HORISONTAL SCROLL WITH DATA
  708. self.renderCardContent(cardType: "allergies")
  709. self.renderCardContent(cardType: "diets")
  710. self.renderCardContent(cardType: "dislikes")
  711.  
  712. self.staticAnimationOnViews(cardTypeToAnimate: self.allergiesCardState)
  713. self.staticAnimationOnViews(cardTypeToAnimate: self.dietsCardState)
  714. self.staticAnimationOnViews(cardTypeToAnimate: self.dislikesCardState)
  715.  
  716. // add bottom adapting scroll views for allergies/diets
  717. // TODO: this needs to be fixed (additionalHeight needs to be removed)
  718. var additionalHeight: CGFloat = ConstValues.screenWidth <= 375 ? 100 : 125
  719. self.allergiesBottomScroll = NewAdaptingItemsView(
  720. frame: CGRect(
  721. x: self.allergiesTopView.frame.origin.x + 16,
  722. y: self.dontHaveAllerLbl.frame.maxY + 18,
  723. width: self.view.frame.width - 2*16,
  724. height: ConstValues.screenHeight - (self.dontHaveAllerLbl.frame.maxY + additionalHeight)
  725. ),
  726. items: self.unSelectedAllergies,
  727. itemsType: "allergies",
  728. scrollOrientation: "vertical"
  729. )
  730. self.allergiesBottomScroll.allowRemovingItems = true
  731. self.allergiesBottomScroll.delegate = self
  732. self.allergiesBottomScroll.layer.opacity = 0
  733. self.allergiesBottomScroll.isUserInteractionEnabled = !self.noAllergiesToggleSelected
  734. self.userPrefPage1.addSubview(self.allergiesBottomScroll)
  735.  
  736. additionalHeight = ConstValues.screenWidth <= 375 ? 114 : 139
  737. self.dietsBottomScroll = NewAdaptingItemsView(
  738. frame: CGRect(
  739. x: self.dietsTopView.frame.origin.x + 16,
  740. y: self.dietsTopView.frame.maxY + 32,
  741. width: self.view.frame.width - 2*16,
  742. height: ConstValues.screenHeight - (self.dietsTopView.frame.maxY + additionalHeight)
  743. ),
  744. items: self.unSelectedDiets,
  745. itemsType: "diets",
  746. scrollOrientation: "vertical")
  747. self.dietsBottomScroll.allowRemovingItems = true
  748. self.dietsBottomScroll.delegate = self
  749. self.dietsBottomScroll.layer.opacity = 0
  750. self.userPrefPage2.addSubview(self.dietsBottomScroll)
  751. self.userPrefPage2.sendSubview(toBack: self.dietsBottomScroll)
  752.  
  753. // scroll to top if pulse is animated
  754. if UserDefaults.standard.bool(forKey: "hasBlinked") && !UserDefaults.standard.bool(forKey: "hasBlinkedhasOpenedProfile") {
  755. let topOffset = CGPoint(x: 0, y: self.mainScroll.contentSize.height - self.mainScroll.bounds.size.height)
  756. self.mainScroll.setContentOffset(topOffset, animated: true)
  757. UserDefaults.standard.set(true, forKey: "hasBlinkedhasOpenedProfile")
  758. }
  759.  
  760. if self.isAllergiesDeeplink {
  761. let topOffset = CGPoint(x: 0, y: self.mainScroll.contentSize.height - self.mainScroll.bounds.size.height)
  762. self.mainScroll.setContentOffset(topOffset, animated: true)
  763. }
  764.  
  765. if self.isDietsDeeplink {
  766. let topOffsetVScroll = CGPoint(x: 0, y: self.mainScroll.contentSize.height - self.mainScroll.bounds.size.height)
  767. self.mainScroll.setContentOffset(topOffsetVScroll, animated: true)
  768. let topOffsetHScroll = CGPoint(x: self.mainScroll.contentSize.width, y: 0)
  769. self.horizontalScroll.setContentOffset(topOffsetHScroll, animated: true)
  770. }
  771.  
  772. }
  773. }
  774. }
  775.  
  776. private func renderCardContent(cardType: String) {
  777. if cardType == "allergies" { renderAllergiesCard() } else if cardType == "diets" { renderDietsCard() } else { renderDislikesCard() }
  778. }
  779.  
  780. private func renderAllergiesCard() {
  781. let gradientColor: UIColor = .white
  782. allergiesSmallDesc = UIManagmentService.sharedInstance.createLabel(
  783. x: 0,
  784. y: 23,
  785. w: allergiesTopSubView.frame.width,
  786. h: 15,
  787. fontName: AppFonts.openSansRegular12!,
  788. fontColor: UIColor(red: 81/255, green: 81/255, blue: 81/255, alpha: 0.5),
  789. lines: 1,
  790. alignment: NSTextAlignment.left,
  791. text: "NOT SHOWING RECIPES WITH:"
  792. )
  793. allergiesSmallDesc.layer.opacity = 0
  794. allergiesTopSubView.addSubview(allergiesSmallDesc)
  795.  
  796. allergiesBigDesc = UIManagmentService.sharedInstance.createLabel(
  797. x: 0,
  798. y: 18,
  799. w: allergiesTopSubView.frame.width,
  800. h: 52,
  801. fontName: AppFonts.openSansRegular18!,
  802. fontColor: AppColors.textColor,
  803. lines: 2,
  804. alignment: NSTextAlignment.left,
  805. text: "Got food allergies? Tell us, so we never recommend such recipe."
  806. )
  807. allergiesBigDesc.layer.opacity = 0
  808. allergiesTopSubView.addSubview(allergiesBigDesc)
  809.  
  810. allergiesSelectedStringLbl = UIManagmentService.sharedInstance.createLabel(
  811. x: 0,
  812. y: allergiesSmallDesc.frame.maxY + 7,
  813. w: allergiesTopSubView.frame.width + 16,
  814. h: 30, fontName: AppFonts.openSansSemiBold18!,
  815. fontColor: AppColors.blackTitleColor,
  816. lines: 1, alignment: .left,
  817. text: makeStringFromArray(array: selectedAllergies)
  818. )
  819. allergiesSelectedStringLbl.layer.opacity = 0
  820. allergiesTopSubView.addSubview(allergiesSelectedStringLbl)
  821.  
  822. editAllergiesIcon = UIImageView(frame: CGRect(x: allergiesTopSubView.frame.width - 25, y: -40, width: 25, height: 25))
  823. editAllergiesIcon.image = #imageLiteral(resourceName: "ic_edit_pref")
  824. editAllergiesIcon.layer.opacity = 0
  825. allergiesTopSubView.addSubview(editAllergiesIcon)
  826.  
  827. allergiesTopScrollWrapper = UIView(frame: CGRect(x: 0, y: 40, width: allergiesTopSubView.frame.width, height: 30))
  828. allergiesTopScrollWrapper.layer.opacity = 0
  829. allergiesTopScrollWrapper.clipsToBounds = true
  830.  
  831. allergiesTopScroll = NewAdaptingItemsView(frame:
  832. CGRect(x: 0, y: 0, width: ConstValues.screenWidth, height: 30), items: selectedAllergies, itemsType: "allergies", scrollOrientation: "horizontal")
  833. allergiesTopScroll.delegate = self
  834.  
  835. allergiesTopScrollWrapper.addSubview(allergiesTopScroll)
  836. allergiesTopSubView.addSubview(allergiesTopScrollWrapper)
  837.  
  838. // gradients
  839. allergiesRightGradientLayer.colors = [gradientColor.withAlphaComponent(0.0).cgColor, gradientColor.cgColor]
  840. allergiesRightGradientLayer.frame = CGRect(
  841. x: (allergiesTopSubView.frame.maxX) - 40,
  842. y: allergiesTopScrollWrapper.frame.origin.y - 10,
  843. width: 40,
  844. height: allergiesTopSubView.frame.height / 2
  845. )
  846. allergiesRightGradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
  847. allergiesRightGradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
  848. allergiesRightGradientLayer.opacity = 0
  849. allergiesTopSubView.layer.addSublayer(allergiesRightGradientLayer)
  850. }
  851.  
  852. private func renderDietsCard() {
  853. let gradientColor: UIColor = .white
  854. dietsSmallDesc = UIManagmentService.sharedInstance.createLabel(
  855. x: 0,
  856. y: 23,
  857. w: dietsTopSubView.frame.width,
  858. h: 15,
  859. fontName: AppFonts.openSansRegular12!,
  860. fontColor: UIColor(red: 81/255, green: 81/255, blue: 81/255, alpha: 0.5),
  861. lines: 1,
  862. alignment: .left,
  863. text: "YOU HAVE SELECTED:"
  864. )
  865. dietsSmallDesc.layer.opacity = 0
  866. dietsTopSubView.addSubview(dietsSmallDesc)
  867.  
  868. dietsBigDesc = UIManagmentService.sharedInstance.createLabel(
  869. x: 0,
  870. y: 18,
  871. w: dietsTopSubView.frame.width,
  872. h: 52,
  873. fontName: AppFonts.openSansRegular18!,
  874. fontColor: AppColors.textColor,
  875. lines: 2,
  876. alignment: .left,
  877. text: "Tell us if you follow any diet, so you get recipes fit for you."
  878. )
  879. dietsBigDesc.layer.opacity = 0
  880. dietsTopSubView.addSubview(dietsBigDesc)
  881.  
  882. dietsSelectedStringLbl = UIManagmentService.sharedInstance.createLabel(
  883. x: 0,
  884. y: dietsSmallDesc.frame.maxY + 7,
  885. w: dietsSmallDesc.frame.width,
  886. h: 30,
  887. fontName: AppFonts.openSansSemiBold18!,
  888. fontColor: AppColors.blackTitleColor,
  889. lines: 1,
  890. alignment: .left,
  891. text: makeStringFromArray(array: selectedDiets)
  892. )
  893. dietsSelectedStringLbl.layer.opacity = 0
  894. dietsTopSubView.addSubview(dietsSelectedStringLbl)
  895.  
  896. editDietsIcon = UIImageView(frame: CGRect(x: dietsTopSubView.frame.width - 25, y: -40, width: 25, height: 25))
  897. editDietsIcon.image = #imageLiteral(resourceName: "ic_edit_pref")
  898. editDietsIcon.layer.opacity = 0
  899. dietsTopSubView.addSubview(editDietsIcon)
  900.  
  901. dietsTopScrollWrapper = UIView(frame: CGRect(x: 0, y: 40, width: dietsTopSubView.frame.width, height: 30))
  902. dietsTopScrollWrapper.layer.opacity = 0
  903. dietsTopScrollWrapper.clipsToBounds = true
  904.  
  905. dietsTopScroll = NewAdaptingItemsView(frame:
  906. CGRect(x: 0, y: 0, width: ConstValues.screenWidth, height: 30), items: selectedDiets, itemsType: "diets", scrollOrientation: "horizontal")
  907. dietsTopScroll.allowRemovingItems = true
  908. dietsTopScroll.delegate = self
  909.  
  910. dietsTopScrollWrapper.addSubview(dietsTopScroll)
  911. dietsTopSubView.addSubview(dietsTopScrollWrapper)
  912.  
  913. // gradients
  914. dietsRightGradientLayer.colors = [gradientColor.withAlphaComponent(0.0).cgColor, gradientColor.cgColor]
  915. dietsRightGradientLayer.frame = CGRect(
  916. x: (dietsTopSubView.frame.origin.x + dietsTopSubView.frame.width) - 40,
  917. y: dietsTopScrollWrapper.frame.origin.y - 10,
  918. width: 40,
  919. height: dietsTopSubView.frame.height / 2
  920. )
  921. dietsRightGradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
  922. dietsRightGradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
  923. dietsRightGradientLayer.opacity = 0
  924. dietsTopSubView.layer.addSublayer(dietsRightGradientLayer)
  925. }
  926.  
  927. private func renderDislikesCard() {
  928. let gradientColor: UIColor = .white
  929. dislikesBigDesc = UIManagmentService.sharedInstance.createLabel(
  930. x: 0,
  931. y: 18,
  932. w: dislikesTopSubView.frame.width,
  933. h: 52,
  934. fontName: AppFonts.openSansRegular18!,
  935. fontColor: AppColors.textColor,
  936. lines: 2,
  937. alignment: .left,
  938. text: "Any ingredients to avoid recipes that include them?"
  939. )
  940. dislikesBigDesc.layer.opacity = 0
  941. dislikesTopSubView.addSubview(dislikesBigDesc)
  942.  
  943. editDislikesIcon = UIImageView(frame: CGRect(x: dislikesTopSubView.frame.width - 25, y: -40, width: 25, height: 25))
  944. editDislikesIcon.image = #imageLiteral(resourceName: "ic_edit_pref")
  945. editDislikesIcon.layer.opacity = 0
  946. dislikesTopSubView.addSubview(editDislikesIcon)
  947.  
  948. dislikesSmallDesc = UIManagmentService.sharedInstance.createLabel(
  949. x: 0,
  950. y: 23,
  951. w: dislikesTopSubView.frame.width,
  952. h: 15,
  953. fontName: AppFonts.openSansRegular12!,
  954. fontColor: UIColor(red: 81/255, green: 81/255, blue: 81/255, alpha: 0.5),
  955. lines: 1,
  956. alignment: .left,
  957. text: "DISLIKES SELECTED:"
  958. )
  959. dislikesSmallDesc.layer.opacity = 0
  960. dislikesTopSubView.addSubview(dislikesSmallDesc)
  961.  
  962. dislikesSelectedStringLbl = UIManagmentService.sharedInstance.createLabel(
  963. x: 0,
  964. y: dislikesSmallDesc.frame.maxY + 7,
  965. w: dislikesTopSubView.frame.width + 16,
  966. h: 30,
  967. fontName: AppFonts.openSansSemiBold18!,
  968. fontColor: AppColors.blackTitleColor,
  969. lines: 1,
  970. alignment: .left,
  971. text: makeStringFromArray(array: selectedDislikes)
  972. )
  973. dislikesSelectedStringLbl.layer.opacity = 0
  974. dislikesTopSubView.addSubview(dislikesSelectedStringLbl)
  975.  
  976. dislikesTopScrollWrapper = UIView(frame: CGRect(x: 0, y: 40, width: dislikesTopSubView.frame.width, height: 30))
  977. dislikesTopScrollWrapper.layer.opacity = 0
  978. dislikesTopScrollWrapper.clipsToBounds = true
  979.  
  980. dislikesTopScroll = NewAdaptingItemsView(
  981. frame: CGRect(x: 0, y: 0, width: ConstValues.screenWidth, height: 30),
  982. items: selectedDislikes,
  983. itemsType: "dislikes",
  984. scrollOrientation: "horizontal"
  985. )
  986. dislikesTopScroll.delegate = self
  987. dislikesTopScroll.allowRemovingItemsFromScroll()
  988.  
  989. dislikesTopScrollWrapper.addSubview(dislikesTopScroll)
  990. dislikesTopSubView.addSubview(dislikesTopScrollWrapper)
  991.  
  992. // gradients
  993. dislikesRightGradientLayer.colors = [gradientColor.withAlphaComponent(0.0).cgColor, gradientColor.cgColor]
  994. dislikesRightGradientLayer.frame = CGRect(x: dietsTopSubView.frame.maxX - 40, y: dietsTopScrollWrapper.frame.origin.y - 10, width: 40, height: dietsTopSubView.frame.height / 2)
  995. dislikesRightGradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
  996. dislikesRightGradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
  997. dislikesRightGradientLayer.opacity = 0
  998. dislikesTopView.layer.addSublayer(dislikesRightGradientLayer)
  999.  
  1000. dislikesACTextFieldWrapper = UIView(frame: CGRect(x: 32, y: dislikesTopView.frame.maxY + 44, width: ConstValues.screenWidth - 2*32, height: 44))
  1001. dislikesACTextFieldWrapper.backgroundColor = AppColors.lightGray
  1002. dislikesACTextFieldWrapper.layer.cornerRadius = 22
  1003. dislikesACTextFieldWrapper.layer.opacity = 0
  1004.  
  1005. dislikesACTextField = ACTextField(
  1006. frame: CGRect(x: 32, y: 0, width: dislikesACTextFieldWrapper.frame.width - 2*32, height: dislikesACTextFieldWrapper.frame.height),
  1007. font: AppFonts.openSansBold20!,
  1008. mainFontColor: AppColors.textColor,
  1009. autocompleteFontColor: UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.3),
  1010. placeholderText: "Type an ingredient",
  1011. placeholderFontColor: AppColors.textColor.withAlphaComponent(0.3),
  1012. turnAutocompleteOn: true
  1013. )
  1014. dislikesACTextField.delegate = self
  1015. dislikesACTextField.updateAutocompleteSource(source: UserManagmentService.sharedInstance.getRawIngredients())
  1016.  
  1017. // -7 for x button to make more clickable and have right position
  1018. dislikesACTextFieldClearButton = UIButton(frame: CGRect(x: dislikesACTextField.frame.maxX - 7, y: (dislikesACTextFieldWrapper.frame.height / 2) - (32 / 2), width: 32, height: 32))
  1019. dislikesACTextFieldClearButton.setImage(UIImage(named: "ic_clear_text"), for: UIControlState.normal)
  1020. dislikesACTextFieldClearButton.imageEdgeInsets = UIEdgeInsets(top: 9, left: 9, bottom: 9, right: 9)
  1021. dislikesACTextFieldClearButton.contentMode = .scaleAspectFill
  1022. dislikesACTextFieldClearButton.addTarget(self, action: #selector(ACTextFieldClearBtnTapped(sender:)), for: UIControlEvents.touchUpInside)
  1023. dislikesACTextFieldClearButton.layer.opacity = 0
  1024.  
  1025. dislikesAddBtn = UIButton(frame: CGRect(x: 94, y: dislikesACTextFieldWrapper.frame.maxY + 200, width: ConstValues.screenWidth - 2*94, height: 44))
  1026. dislikesAddBtn.backgroundColor = .clear
  1027. dislikesAddBtn.layer.addSublayer(UIManagmentService.sharedInstance.addGradientColorOnButtonBorder(onView: dislikesAddBtn))
  1028. dislikesAddBtn.titleLabel?.font = AppFonts.openSansBold18
  1029. dislikesAddBtn.setTitleColor(AppColors.lightRedColor, for: UIControlState.normal)
  1030.  
  1031. dislikesAddBtn.setTitle("Add", for: UIControlState.normal)
  1032. dislikesAddBtn.addTarget(self, action: #selector(dislikesAddButtonPressed(sender:)), for: UIControlEvents.touchUpInside)
  1033.  
  1034. dislikesACTextFieldWrapper.addSubview(dislikesACTextField)
  1035. dislikesACTextFieldWrapper.addSubview(dislikesACTextFieldClearButton)
  1036. userPrefPage3.addSubview(dislikesACTextFieldWrapper)
  1037. userPrefPage3.addSubview(dislikesAddBtn)
  1038. }
  1039.  
  1040. // MARK: - GENERATE VIEWS
  1041. func generateTopViewOnView(viewAbove: UIView) -> UIView {
  1042. // INIT TOP VIEW (height of top card)
  1043. let heightOfView: CGFloat = 166
  1044. let topView = UIView(frame: CGRect(x: 0, y: 3, width: viewAbove.frame.width, height: heightOfView))
  1045.  
  1046. if viewAbove.frame.origin.x == mainMargin {
  1047. // to place the view inside the first card
  1048. allergiesTopSubView = UIView(frame: CGRect(
  1049. x: topView.frame.origin.x + mainMargin,
  1050. y: topView.frame.origin.y + 64,
  1051. width: userPrefPage1.frame.width - 2*mainMargin,
  1052. height: topView.frame.height - 67)
  1053. )
  1054. cardSubViewWidth = allergiesTopSubView.frame.width
  1055. topView.addSubview(allergiesTopSubView)
  1056. } else if viewAbove.frame.origin.x == ConstValues.screenWidth - mainMargin*2 {
  1057. // to place the view inside the second card
  1058. dietsTopSubView = UIView(frame: CGRect(
  1059. x: topView.frame.origin.x + mainMargin,
  1060. y: topView.frame.origin.y + 64,
  1061. width: userPrefPage2.frame.width - 2*mainMargin,
  1062. height: topView.frame.height - 67)
  1063. )
  1064. topView.addSubview(dietsTopSubView)
  1065. } else {
  1066. // to place the view inside the third card
  1067. dislikesTopSubView = UIView(frame: CGRect(
  1068. x: topView.frame.origin.x + mainMargin,
  1069. y: topView.frame.origin.y + 64,
  1070. width: userPrefPage2.frame.width - 2*mainMargin,
  1071. height: topView.frame.height - 67)
  1072. )
  1073. topView.addSubview(dislikesTopSubView)
  1074. }
  1075.  
  1076. // shadow on top view
  1077. topView.backgroundColor = .white
  1078. topView.clipsToBounds = true
  1079. topView.layer.masksToBounds = false
  1080. topView.layer.shadowOffset = CGSize(width: 0, height: 15)
  1081. topView.layer.shadowRadius = 15
  1082. topView.layer.shadowOpacity = 0.13
  1083.  
  1084. let topViewTapGesture = UITapGestureRecognizer(target: self, action: #selector(topViewTapped(sender:)))
  1085. topViewTapGesture.numberOfTapsRequired = 1
  1086. topViewTapGesture.numberOfTouchesRequired = 1
  1087. topView.addGestureRecognizer(topViewTapGesture)
  1088.  
  1089. return topView
  1090. }
  1091.  
  1092. // MARK: - ANIMATION FUNCTIONS
  1093. private func animateLabels() {
  1094. userNameLabel.layer.opacity = 1 - Float(mainScrollScrolled) * 2
  1095. userNameLabel.frame.origin.y = profileImageView.frame.origin.y + profileImageView.frame.height + 20
  1096. emailLabel.layer.opacity = 1 - Float(mainScrollScrolled) * 2
  1097. emailLabel.frame.origin.y = userNameLabel.frame.origin.y + userNameLabel.frame.height + 5
  1098. userEmailLabel.layer.opacity = 1 - Float(mainScrollScrolled) * 2
  1099. userEmailLabel.frame.origin.y = emailLabel.frame.origin.y + emailLabel.frame.height + 5
  1100. if (UserManagmentService.sharedInstance.getUser() as! User).imageUrl.isEmpty
  1101. && (UserManagmentService.sharedInstance.getUser() as! User).type == USER_LOGIN_TYPES.EMAIL {
  1102. editProfileImgBtn.layer.opacity = 1 - Float(mainScrollScrolled) * 2
  1103. }
  1104.  
  1105. let cetvrtince: CGFloat = profileImageView.frame.width / 4
  1106. editProfileImgBtn.frame.origin.x = profileImageView.frame.origin.x + (cetvrtince * 3) + (cetvrtince / 10)
  1107. editProfileImgBtn.frame.origin.y = profileImageView.frame.origin.y + cetvrtince - ((cetvrtince/10) * 7)
  1108. }
  1109.  
  1110. private func animateProfileImg() {
  1111. if mainScrollPercentageScrolled <= 83 {
  1112. profileImageView.transform = CGAffineTransform(scaleX: 1 - mainScrollScrolled, y: 1 - mainScrollScrolled)
  1113. profileImageShadowView.transform = CGAffineTransform(scaleX: 1 - mainScrollScrolled, y: 1 - mainScrollScrolled)
  1114. let moveToTop = mainScrollPercentageScrolled * CGFloat(profileImageToTopPercentage)
  1115. profileImageView.frame.origin.y = ((navToolbarView.frame.origin.y + navToolbarView.frame.height) + 20) - CGFloat(moveToTop)
  1116. profileImageShadowView.frame.origin.y = ((navToolbarView.frame.origin.y + navToolbarView.frame.height) + 20) - CGFloat(moveToTop)
  1117. }
  1118. }
  1119.  
  1120. private func animateUserPreferences() {
  1121. let moveOriginX = mainMargin - (mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)
  1122. // open allergies page
  1123. userPrefPage1.frame = CGRect(x: moveOriginX, y: 0, width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4), height: ConstValues.screenHeight)
  1124.  
  1125. animateCardSubViewsSize()
  1126.  
  1127. if horizontalScrollIndexPage == 0 {
  1128. // open diets page
  1129. userPrefPage2.frame = CGRect(
  1130. x: userPrefPage1.frame.maxX + moveOriginX,
  1131. y: 0,
  1132. width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4),
  1133. height: ConstValues.screenHeight
  1134. )
  1135.  
  1136. //open dislikes page
  1137. userPrefPage3.frame = CGRect(
  1138. x: userPrefPage3originX + mainScrollPercentageScrolled*(userPrefPage1ToLeftPercentage*2),
  1139. y: 0,
  1140. width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4),
  1141. height: ConstValues.screenHeight
  1142. )
  1143. } else if horizontalScrollIndexPage == 1 {
  1144. // open diets page
  1145. let curr = userPrefPage1.frame.origin.x + ConstValues.screenWidth
  1146. userPrefPage2.frame = CGRect(x: curr, y: 0, width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4), height: ConstValues.screenHeight)
  1147.  
  1148. //open dislikes page
  1149. userPrefPage3.frame = CGRect(
  1150. x: userPrefPage3originX + mainScrollPercentageScrolled*(userPrefPage1ToLeftPercentage*2),
  1151. y: 0,
  1152. width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4),
  1153. height: ConstValues.screenHeight
  1154. )
  1155. } else if horizontalScrollIndexPage == 2 {
  1156. // open diets page
  1157. var curr = userPrefPage1.frame.origin.x + ConstValues.screenWidth
  1158. userPrefPage2.frame = CGRect(x: curr, y: 0, width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4), height: ConstValues.screenHeight)
  1159.  
  1160. //open dislikes page
  1161. curr = userPrefPage1.frame.origin.x + ConstValues.screenWidth*2
  1162. userPrefPage3.frame = CGRect(x: curr, y: 0, width: smallUserPrefCardWidth + ((mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)*4), height: ConstValues.screenHeight)
  1163. }
  1164.  
  1165. // animate the inner-card resizing
  1166. allergiesTopView.frame = CGRect(x: 0, y: 0, width: userPrefPage1.frame.width, height: allergiesTopView.frame.height)
  1167. dietsTopView.frame = CGRect(x: 0, y: 0, width: userPrefPage2.frame.width, height: dietsTopView.frame.height)
  1168. dislikesTopView.frame = CGRect(x: 0, y: 0, width: userPrefPage3.frame.width, height: dislikesTopView.frame.height)
  1169.  
  1170. animateAlphaOnViews()
  1171. }
  1172.  
  1173. private func animateCardSubViewsSize() {
  1174. let moveOriginX = mainMargin - (mainScrollPercentageScrolled * userPrefPage1ToLeftPercentage)
  1175. allergiesTopSubView.frame = CGRect(
  1176. x: moveOriginX,
  1177. y: allergiesTopSubView.frame.origin.y,
  1178. width: cardSubViewWidth + (((ConstValues.screenWidth - cardSubViewWidth)/100)*mainScrollPercentageScrolled),
  1179. height: allergiesTopSubView.frame.height
  1180. )
  1181. allergiesTopScrollWrapper.frame.size.width = allergiesTopSubView.frame.width
  1182. allergiesBigDesc.frame.origin.x = (mainMargin / 100 * mainScrollPercentageScrolled)
  1183.  
  1184. dietsTopSubView.frame = CGRect(
  1185. x: moveOriginX,
  1186. y: dietsTopSubView.frame.origin.y,
  1187. width: cardSubViewWidth + (((ConstValues.screenWidth - cardSubViewWidth)/100)*mainScrollPercentageScrolled),
  1188. height: dietsTopSubView.frame.height
  1189. )
  1190. dietsTopScrollWrapper.frame.size.width = dietsTopSubView.frame.width
  1191. dietsBigDesc.frame.origin.x = (mainMargin / 100 * mainScrollPercentageScrolled)
  1192.  
  1193. dislikesTopSubView.frame = CGRect(
  1194. x: moveOriginX,
  1195. y: dislikesTopSubView.frame.origin.y,
  1196. width: cardSubViewWidth + (((ConstValues.screenWidth - cardSubViewWidth)/100)*mainScrollPercentageScrolled),
  1197. height: dislikesTopSubView.frame.height
  1198. )
  1199. dislikesTopScrollWrapper.frame.size.width = dietsTopSubView.frame.width
  1200. dislikesBigDesc.frame.origin.x = (mainMargin / 100 * mainScrollPercentageScrolled)
  1201. }
  1202.  
  1203. private func animateCornerRadiusOnCards() {
  1204. allergiesTopView.layer.cornerRadius = cardBorderRadius - ((cardBorderRadius/100)*(mainScrollPercentageScrolled))
  1205. dietsTopView.layer.cornerRadius = cardBorderRadius - ((cardBorderRadius/100)*(mainScrollPercentageScrolled))
  1206. dislikesTopView.layer.cornerRadius = cardBorderRadius - ((cardBorderRadius/100)*(mainScrollPercentageScrolled))
  1207. }
  1208.  
  1209. private func animateShadowOffsetOnCards() {
  1210. allergiesTopView.layer.shadowOffset = CGSize(width: 0, height: 15 + ((35-15)/100 * (mainScrollPercentageScrolled)))
  1211. dietsTopView.layer.shadowOffset = CGSize(width: 0, height: 15 + ((35-15)/100 * (mainScrollPercentageScrolled)))
  1212. dislikesTopView.layer.shadowOffset = CGSize(width: 0, height: 15 + ((35-15)/100 * (mainScrollPercentageScrolled)))
  1213. }
  1214.  
  1215. private func animateAlphaOnViews () {
  1216. if !isNoAlleryViewOpened {
  1217. allergiesBottomScroll.alpha = switchButton.isOn ? 0.5 : mainScrollScrolled
  1218. }
  1219. dietsBottomScroll.alpha = mainScrollScrolled
  1220. if Double(mainScrollScrolled) > 0.7 {
  1221. progressDotsView.alpha = mainScrollScrolled
  1222. } else { progressDotsView.alpha = mainScrollScrolled / 6 }
  1223. }
  1224.  
  1225. private func percentageAnimationOnViews() {
  1226. mainScrollPercentageScrolled = mainScrollScrolled * 100
  1227. // animate rest of the screen
  1228. animateLabels()
  1229. animateProfileImg()
  1230. animateUserPreferences()
  1231. navToolbarView.animateFadeInOut(opacity: Float(mainScrollScrolled), scrollPercentage: Int(mainScrollPercentageScrolled))
  1232. animateCornerRadiusOnCards()
  1233. animateShadowOffsetOnCards()
  1234.  
  1235. if !isNoAlleryViewOpened {
  1236. dontHaveAllerLbl.layer.opacity = Float(mainScrollScrolled)
  1237. switchButton.layer.opacity = Float(mainScrollScrolled)
  1238. }
  1239.  
  1240. addAllergiesView.layer.opacity = Float(mainScrollScrolled)
  1241. dietsBottomScroll.layer.opacity = Float(mainScrollScrolled)
  1242. dislikesACTextFieldWrapper.layer.opacity = Float(mainScrollScrolled)
  1243.  
  1244. if allergiesCardState == .noAllergiesSelected {
  1245. editAllergiesIcon.layer.opacity = Float(1-mainScrollScrolled)
  1246. } else {
  1247. allergiesSmallDesc.layer.opacity = Float(1-mainScrollScrolled)
  1248. allergiesRightGradientLayer.opacity = Float(1-(mainScrollScrolled*3))
  1249. allergiesSelectedStringLbl.layer.opacity = Float(1-mainScrollScrolled)
  1250. allergiesTopScrollWrapper.layer.opacity = Float(mainScrollScrolled)
  1251. }
  1252.  
  1253. if dietsCardState == .noDietsSelected {
  1254. editDietsIcon.layer.opacity = Float(1-mainScrollScrolled)
  1255. } else {
  1256. dietsSmallDesc.layer.opacity = Float(1-mainScrollScrolled)
  1257. dietsRightGradientLayer.opacity = Float(1-(mainScrollScrolled*3))
  1258. dietsSelectedStringLbl.layer.opacity = Float(1-mainScrollScrolled)
  1259. dietsTopScrollWrapper.layer.opacity = Float(mainScrollScrolled)
  1260. }
  1261.  
  1262. if dislikesCardState == .noDislikesSelected {
  1263. editDislikesIcon.layer.opacity = Float(1-mainScrollScrolled)
  1264. } else {
  1265. dislikesSmallDesc.layer.opacity = Float(1-mainScrollScrolled)
  1266. dislikesRightGradientLayer.opacity = Float(1-(mainScrollScrolled*3))
  1267. dislikesSelectedStringLbl.layer.opacity = Float(1-mainScrollScrolled)
  1268. dislikesTopScrollWrapper.layer.opacity = Float(mainScrollScrolled)
  1269. }
  1270. }
  1271.  
  1272. private func animateHorizontalScroll(scrollView: UIScrollView) {
  1273. var tempIndex = horizontalScrollIndexPage
  1274. if scrollView.contentOffset.x < ConstValues.screenWidth {
  1275. tempIndex = 0
  1276. } else if scrollView.contentOffset.x > ConstValues.screenWidth && scrollView.contentOffset.x < ConstValues.screenWidth*2 {
  1277. tempIndex = 1
  1278. } else if scrollView.contentOffset.x == ConstValues.screenWidth*2 {
  1279. tempIndex = 2
  1280. }
  1281.  
  1282. if !isMainScrollOpened {
  1283. if tempIndex == 0 {
  1284. let moveCardOriginX = ((ConstValues.screenWidth + mainMargin) - userPrefPage2originX)/100
  1285. let currScreenScrollPercentage = ((scrollView.contentOffset.x/ConstValues.screenWidth)*100)
  1286. userPrefPage2.frame.origin.x = userPrefPage2originX + (currScreenScrollPercentage * moveCardOriginX)
  1287. } else if tempIndex == 1 {
  1288. let moveCardOriginX = ((ConstValues.screenWidth*2 + mainMargin) - userPrefPage3originX)/100
  1289. let currScreenScrollPercentage = ((scrollView.contentOffset.x-ConstValues.screenWidth)/(ConstValues.screenWidth))*100
  1290. userPrefPage3.frame.origin.x = userPrefPage3originX + (currScreenScrollPercentage * moveCardOriginX)
  1291. } else if tempIndex == 2 {
  1292. // do nothing for now
  1293. }
  1294. }
  1295. }
  1296.  
  1297. private func staticAnimationOnViews(cardTypeToAnimate: SmallCardStates) {
  1298. switch cardTypeToAnimate {
  1299. case .noAllergiesSelected:
  1300. UIView.animate(withDuration: 0.1, animations: {
  1301. self.removeCardContent(card: "allergiesCard")
  1302. }, completion: { (_) in
  1303. UIView.animate(withDuration: 0.2, animations: {
  1304. if !self.isMainScrollOpened {
  1305. self.editAllergiesIcon.layer.opacity = 1
  1306. }
  1307. self.allergiesBigDesc.layer.opacity = 1
  1308. self.allergiesRightGradientLayer.opacity = 0
  1309. })
  1310. })
  1311. case .hasAllergiesSelectedSmallCard:
  1312. UIView.animate(withDuration: 0.1, animations: {
  1313. self.removeCardContent(card: "allergiesCard")
  1314. }, completion: { (_) in
  1315. UIView.animate(withDuration: 0.2, animations: {
  1316. self.allergiesSelectedStringLbl.layer.opacity = 1
  1317. self.allergiesRightGradientLayer.opacity = 1
  1318. self.allergiesSmallDesc.layer.opacity = 1
  1319. })
  1320. })
  1321. case .hasAllergiesSelectedBigCard:
  1322. UIView.animate(withDuration: 0.1, animations: {
  1323. self.removeCardContent(card: "allergiesCard")
  1324. }, completion: { (_) in
  1325. UIView.animate(withDuration: 0.2, animations: {
  1326. self.allergiesTopScrollWrapper.layer.opacity = 1
  1327. self.allergiesRightGradientLayer.opacity = 0
  1328. })
  1329. })
  1330. case .noDietsSelected:
  1331. UIView.animate(withDuration: 0.1, animations: {
  1332. self.removeCardContent(card: "dietsCard")
  1333. }, completion: { (_) in
  1334. UIView.animate(withDuration: 0.2, animations: {
  1335. if !self.isMainScrollOpened {
  1336. self.editDietsIcon.layer.opacity = 1
  1337. }
  1338. self.dietsBigDesc.layer.opacity = 1
  1339. self.dietsRightGradientLayer.opacity = 0
  1340. })
  1341. })
  1342. case .hasDietsSelectedSmallCard:
  1343. UIView.animate(withDuration: 0.1, animations: {
  1344. self.removeCardContent(card: "dietsCard")
  1345. }, completion: { (_) in
  1346. UIView.animate(withDuration: 0.2, animations: {
  1347. self.dietsSelectedStringLbl.layer.opacity = 1
  1348. self.dietsRightGradientLayer.opacity = 1
  1349. self.dietsSmallDesc.layer.opacity = 1
  1350. })
  1351. })
  1352. case .hasDietsSelectedBigCard:
  1353. UIView.animate(withDuration: 0.1, animations: {
  1354. self.removeCardContent(card: "dietsCard")
  1355. }, completion: { (_) in
  1356. UIView.animate(withDuration: 0.2, animations: {
  1357. self.dietsTopScrollWrapper.layer.opacity = 1
  1358. self.dietsRightGradientLayer.opacity = 0
  1359. })
  1360. })
  1361. case .noDislikesSelected:
  1362. UIView.animate(withDuration: 0.1, animations: {
  1363. self.removeCardContent(card: "dislikes")
  1364. }, completion: { (_) in
  1365. UIView.animate(withDuration: 0.2, animations: {
  1366. if !self.isMainScrollOpened {
  1367. self.editDislikesIcon.layer.opacity = 1
  1368. }
  1369. self.dislikesBigDesc.layer.opacity = 1
  1370. self.dislikesRightGradientLayer.opacity = 0
  1371. })
  1372. })
  1373. case .hasDislikesSelectedBigCard:
  1374. UIView.animate(withDuration: 0.1, animations: {
  1375. self.removeCardContent(card: "dislikes")
  1376. }, completion: { (_) in
  1377. UIView.animate(withDuration: 0.2, animations: {
  1378. self.dislikesTopScrollWrapper.layer.opacity = 1
  1379. self.dislikesRightGradientLayer.opacity = 0
  1380. })
  1381. })
  1382. case .hasDislikesSelectedSmallCard:
  1383. UIView.animate(withDuration: 0.1, animations: {
  1384. self.removeCardContent(card: "dislikes")
  1385. }, completion: { (_) in
  1386. UIView.animate(withDuration: 0.2, animations: {
  1387. self.dislikesSelectedStringLbl.layer.opacity = 1
  1388. self.dislikesSmallDesc.layer.opacity = 1
  1389. self.dislikesRightGradientLayer.opacity = 1
  1390. })
  1391. })
  1392. default:
  1393. print("default staticAnimationOnViews")
  1394. }
  1395. }
  1396.  
  1397. // MARK: - HELPER FUNCTIONS
  1398. private func areArraysEquivalent(first aFirstArray: [String], second aSecondArray: [String]) -> Bool {
  1399. return aFirstArray.sorted() == aSecondArray.sorted()
  1400. }
  1401.  
  1402. private func checkForSelectedItems(items: [[String: Any]]?, itemsType: String) {
  1403. if var items = items {
  1404. for i in 0 ..< items.count {
  1405. if items[i]["isSelected"] as! Bool {
  1406. if itemsType == "allergies" {
  1407. selectedAllergies.append(items[i])
  1408. initialSelectedAllergies.append(items[i])
  1409. } else {
  1410. selectedDiets.append(items[i])
  1411. initialSelectedDiets.append(items[i])
  1412. }
  1413. } else {
  1414. if itemsType == "allergies" {
  1415. unSelectedAllergies.append(items[i])
  1416. } else {
  1417. unSelectedDiets.append(items[i])
  1418. }
  1419. }
  1420. }
  1421. }
  1422. }
  1423.  
  1424. private func getIdsFromArrayDict(array: [[String: Any]]) -> [String] {
  1425. var tmpArr: [String] = [String]()
  1426. for i in 0 ..< array.count {
  1427. tmpArr.append(array[i]["id"] as! String)
  1428. }
  1429. return tmpArr
  1430. }
  1431.  
  1432. private func makeStringFromArray(array: [[String: Any]]) -> String {
  1433. var tmpString: String = String()
  1434. for i in 0 ..< array.count {
  1435. if i == (array.count - 1) {
  1436. tmpString += "\(String(describing: array[i]["name"]!))"
  1437. } else {
  1438. tmpString += "\(String(describing: array[i]["name"]!)), "
  1439. }
  1440. }
  1441. return tmpString
  1442. }
  1443.  
  1444. private func removingSelectedAllergie(_ selectedAllergie: [String: Any]) {
  1445.  
  1446. if selectedAllergie["allowRemoving"] as! Bool {
  1447. var tmpItem = selectedAllergie["itemToRemove"] as! [String: Any]
  1448. tmpItem.updateValue(false, forKey: "isSelected")
  1449.  
  1450. if !allergiesTopScroll.allowRemovingItems {
  1451. allergiesTopScroll.allowToRemoveItems()
  1452. }
  1453.  
  1454. allergiesBottomScroll.addButtonToScroll(item: tmpItem)
  1455. selectedAllergies = HelperMethodesService.sharedInstance.removeItemFromArray(array: selectedAllergies, item: tmpItem)
  1456. unSelectedAllergies.append(tmpItem)
  1457. allergiesSelectedStringLbl.text = makeStringFromArray(array: selectedAllergies)
  1458.  
  1459. EventsService.sharedInstance.logEvent(withName: "DeselectAllergies", properies: ["Id": tmpItem["id"] as! String, "Name": tmpItem["name"] as! String], timeSpentSince: nil)
  1460.  
  1461. if selectedAllergies.isEmpty {
  1462. staticAnimationOnViews(cardTypeToAnimate: .noAllergiesSelected)
  1463. allergiesCardState = .noAllergiesSelected
  1464. hasAllergieSelected = false
  1465. }
  1466. }
  1467. }
  1468.  
  1469. private func disableAllergiesScroll(isDisabled: Bool) {
  1470. if isDisabled {
  1471. noAllergiesToggleSelected = true
  1472. if allergiesCardState != .noAllergiesSelected {
  1473. staticAnimationOnViews(cardTypeToAnimate: .noAllergiesSelected)
  1474. }
  1475. allergiesCardState = .noAllergiesSelected
  1476. removeAllSelectedAllergies()
  1477. allergiesBottomScroll.alpha = 0.5
  1478. allergiesBottomScroll.isUserInteractionEnabled = false
  1479. } else {
  1480. allergiesBottomScroll.alpha = 1
  1481. allergiesBottomScroll.isUserInteractionEnabled = true
  1482. noAllergiesToggleSelected = false
  1483. }
  1484. }
  1485.  
  1486. private func logCustomEventCardOpen(horizontalScrollIndexPage: Int, logReverse: Bool) {
  1487. // log custom event
  1488. if horizontalScrollIndexPage == 0 {
  1489. EventsService.sharedInstance.logEvent(withName: "OpenAllergies", properies: nil, timeSpentSince: userPrefCardTimeSpend)
  1490. } else if horizontalScrollIndexPage == 1 {
  1491. EventsService.sharedInstance.logEvent(withName: "OpenDiets", properies: nil, timeSpentSince: userPrefCardTimeSpend)
  1492. } else {
  1493. EventsService.sharedInstance.logEvent(withName: "OpenDislikes", properies: nil, timeSpentSince: userPrefCardTimeSpend)
  1494. }
  1495. }
  1496.  
  1497. private func removeCardContent(card: String) {
  1498. if card == "allergiesCard" {
  1499. for view in self.allergiesTopSubView.subviews {
  1500. view.layer.opacity = 0
  1501. }
  1502. } else if card == "dietsCard" {
  1503. for view in self.dietsTopSubView.subviews {
  1504. view.layer.opacity = 0
  1505. }
  1506. } else {
  1507. for view in self.dislikesTopSubView.subviews {
  1508. view.layer.opacity = 0
  1509. }
  1510. }
  1511. }
  1512.  
  1513. @objc private func dismissKeyboard() {
  1514. if addAllergiesACTextField.isFirstResponder() {
  1515. addAllergiesACTextField.hideKeyboardResignFirstResponder()
  1516. }
  1517. if dislikesACTextField.isFirstResponder() {
  1518. dislikesACTextField.hideKeyboardResignFirstResponder()
  1519. }
  1520. }
  1521.  
  1522. private func navControllerRoutesShuffle() {
  1523. var tmpArr: [UIViewController] = [UIViewController]()
  1524. for viewController in (self.navigationController?.viewControllers)! {
  1525. if !viewController.isKind(of: ProfileViewController.self) && !viewController.isKind(of: EmailRegistrationViewController.self) {
  1526. tmpArr.append(viewController)
  1527. }
  1528. }
  1529. self.navigationController?.setViewControllers(tmpArr, animated: false)
  1530. }
  1531.  
  1532. @objc private func ACTextFieldClearBtnTapped(sender: UIButton) {
  1533. if horizontalScrollIndexPage == 2 {
  1534. clearDislikesSearchQuery()
  1535. }
  1536. if horizontalScrollIndexPage == 0 {
  1537. clearAddAllergiesSearchQuery()
  1538. }
  1539. }
  1540.  
  1541. private func clearDislikesSearchQuery() {
  1542. if dislikesACTextField.isFirstResponder() {
  1543. dislikesACTextField.clearTextField()
  1544. } else {
  1545. dislikesACTextField.resetTextField()
  1546. }
  1547. UIView.animate(withDuration: 0.2) {
  1548. self.dislikesACTextFieldClearButton.layer.opacity = 0
  1549. }
  1550. }
  1551.  
  1552. private func clearAddAllergiesSearchQuery() {
  1553. if addAllergiesACTextField.isFirstResponder() {
  1554. addAllergiesACTextField.clearTextField()
  1555. } else {
  1556. addAllergiesACTextField.resetTextField()
  1557. }
  1558. UIView.animate(withDuration: 0.2) {
  1559. self.addAllergiesACTextFieldClearBtn.layer.opacity = 0
  1560. }
  1561. }
  1562.  
  1563. @objc private func dislikesAddButtonPressed(sender: UIButton) {
  1564. if dislikesACTextField.filterByInput(input: dislikesACTextField.getTextFieldText())["name"] != nil {
  1565. var dislikeItem: [String: Any] = dislikesACTextField.filterByInput(input: dislikesSearchText)
  1566. let duplicateDislike = selectedDislikes.filter({ ($0["name"] as! String == dislikeItem["name"] as! String) })
  1567. if duplicateDislike.isEmpty {
  1568. UIView.animate(withDuration: 0.2) {
  1569. self.dislikesACTextFieldClearButton.layer.opacity = 0
  1570. }
  1571. if selectedDislikes.isEmpty {
  1572. dislikesCardState = .hasDislikesSelectedBigCard
  1573. staticAnimationOnViews(cardTypeToAnimate: .hasDislikesSelectedBigCard)
  1574. }
  1575. selectedDislikes.append(dislikeItem)
  1576. dislikesSelectedStringLbl.text = makeStringFromArray(array: selectedDislikes)
  1577. dislikesTopScroll.addButtonToScroll(item: dislikeItem)
  1578.  
  1579. dislikesACTextField.resetTextField()
  1580. EventsService.sharedInstance.logEvent(withName: "SelectDislike", properies: ["Id": dislikeItem["id"] as! String, "Name": dislikeItem["name"] as! String], timeSpentSince: nil)
  1581. } else {
  1582. UIManagmentService.sharedInstance.showNotification(toVC: self, withMessage: "You’ve already added this ingredient.")
  1583. dislikesACTextField.shakeTextField()
  1584. }
  1585. } else {
  1586. if !dislikesACTextField.getTextFieldText().isEmpty {
  1587. UIManagmentService.sharedInstance.showNotification(toVC: self, withMessage: "We have nothing to list related to this subject")
  1588. }
  1589. dislikesACTextField.shakeTextField()
  1590. }
  1591. }
  1592.  
  1593. @objc private func updateProfileCallOnBack() {
  1594. if !areArraysEquivalent(first: getIdsFromArrayDict(array: selectedAllergies),
  1595. second: getIdsFromArrayDict(array: initialSelectedAllergies)) || (noAllergiesToggleSelected != startingNoAllergiesToggleSelected)
  1596. || !areArraysEquivalent(first: getIdsFromArrayDict(array: selectedDiets), second: getIdsFromArrayDict(array: initialSelectedDiets))
  1597. || !areArraysEquivalent(first: getIdsFromArrayDict(array: selectedDislikes), second: getIdsFromArrayDict(array: initialSelectedDislikes)) {
  1598. NetworkWrapper.sharedInstance.setPreferencesForUser(
  1599. params: [
  1600. "allergies": getIdsFromArrayDict(array: selectedAllergies),
  1601. "diets": getIdsFromArrayDict(array: selectedDiets),
  1602. "dislikes": getIdsFromArrayDict(array: selectedDislikes),
  1603. "type": "Ingredient",
  1604. "noAllergy": noAllergiesToggleSelected
  1605. ]) { (response, _, _) in
  1606. if response != nil {
  1607. NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updatedPreferences"), object: nil)
  1608. NotificationCenter.default.post(name: Notification.Name("reload_recipes"), object: nil)
  1609. }
  1610. }
  1611. }
  1612. }
  1613.  
  1614. // MARK: - Button actions
  1615. @objc func profileImageTapped(sender: UITapGestureRecognizer) {
  1616. if isMainScrollOpened {
  1617. let bottomOffset = CGPoint(x: 0, y: 0)
  1618. mainScroll.setContentOffset(bottomOffset, animated: true)
  1619.  
  1620. if dislikesACTextField.isFirstResponder() {
  1621. dislikesACTextField.hideKeyboardResignFirstResponder()
  1622. }
  1623. }
  1624. }
  1625.  
  1626. @objc func editProfileImgBtnTapped(sender: UIButton) {
  1627. let editProfileVC = EditProfileViewController()
  1628. self.present(editProfileVC, animated: true, completion: nil)
  1629. }
  1630.  
  1631. @objc func topViewTapped(sender: UITapGestureRecognizer) {
  1632. if !isMainScrollOpened {
  1633. let topOffset = CGPoint(x: 0, y: mainScroll.contentSize.height - mainScroll.bounds.size.height)
  1634. mainScroll.setContentOffset(topOffset, animated: true)
  1635. } else {
  1636. if addAllergiesACTextField.isFirstResponder() {
  1637. addAllergiesACTextField.hideKeyboardResignFirstResponder()
  1638. }
  1639. if dislikesACTextField.isFirstResponder() {
  1640. dislikesACTextField.hideKeyboardResignFirstResponder()
  1641. }
  1642. }
  1643. }
  1644.  
  1645. @objc func switchValueDidChange(sender: UISwitch!) {
  1646. disableAllergiesScroll(isDisabled: sender.isOn)
  1647. }
  1648.  
  1649. @objc func sendButtonPressed (sender: UIButton) {
  1650. if addAllergiesACTextField.getTextFieldText() != "" {
  1651. UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
  1652. // UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
  1653. // sender.transform = CGAffineTransform(scaleX: 0.10, y: 1)
  1654. sender.alpha = 0
  1655. }, completion: nil)
  1656. animationView.isHidden = false
  1657. animationView.play()
  1658. NetworkWrapper.sharedInstance.submitNewAllergy(allergyName: newAllergieString, completion: { (data, _, _) in
  1659. self.animationView.isHidden = true
  1660. self.animationView.pause()
  1661. self.dismissAddAllergieView()
  1662. let tmpNewAllergieString = self.newAllergieString
  1663. self.newAllergieString = ""
  1664. self.isNoAlleryViewOpened = false
  1665. if data != nil {
  1666. UIManagmentService.sharedInstance.showNotification(toVC: self, withMessage: "Your allergy has been sent. We will consider your feedback!")
  1667. EventsService.sharedInstance.logEvent(withName: "AllergySuggestion", properies: ["allergySuggestionName": tmpNewAllergieString], timeSpentSince: nil)
  1668. } else {
  1669. UIManagmentService.sharedInstance.showNotification(toVC: self, withMessage: "Something went wrong, try adding it again")
  1670. }
  1671. })
  1672. } else { addAllergiesACTextField.shakeTextField() }
  1673. }
  1674.  
  1675. @objc func yesButtonPressed (sender: UIButton) {
  1676. UserDefaults.standard.setValue(true, forKey: "hasRemovedAllergy")
  1677. UserDefaults.standard.synchronize()
  1678. removingSelectedAllergie.updateValue(true, forKey: "allowRemoving")
  1679.  
  1680. dismissRemoveAllergieView()
  1681. }
  1682.  
  1683. @objc func cancelButtonPressed (sender: UIButton) {
  1684. if sender.tag == 9898 {
  1685. dismissRemoveAllergieView()
  1686. } else {
  1687. dismissAddAllergieView()
  1688. }
  1689. }
  1690.  
  1691. func dismissRemoveAllergieView () {
  1692. UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseIn, animations: {
  1693. self.removeAllergiesView.alpha = 0
  1694. }) { (_) in
  1695. self.removeAllergiesView.removeFromSuperview()
  1696. }
  1697. }
  1698.  
  1699. func dismissAddAllergieView () {
  1700. UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseIn, animations: {
  1701. self.addAllergiesView.alpha = 0
  1702. self.isNoAlleryViewOpened = false
  1703. }) { (_) in
  1704. self.addAllergiesView.removeFromSuperview()
  1705. self.allergiesBottomScroll.layer.opacity = 1
  1706. self.dontHaveAllerLbl.layer.opacity = 1
  1707. self.switchButton.layer.opacity = 1
  1708. }
  1709. }
  1710.  
  1711. private func removeAllSelectedAllergies() {
  1712. for i in 0 ..< selectedAllergies.count {
  1713. var tmpItem = selectedAllergies[i]
  1714. tmpItem.updateValue(false, forKey: "isSelected")
  1715.  
  1716. allergiesBottomScroll.addButtonToScroll(item: tmpItem)
  1717. unSelectedAllergies.append(tmpItem)
  1718. }
  1719. hasAllergieSelected = false
  1720. selectedAllergies = []
  1721. allergiesTopScroll.removeAllItems()
  1722. allergiesSelectedStringLbl.text = makeStringFromArray(array: selectedAllergies)
  1723. }
  1724.  
  1725. // MARK: - Delegates
  1726. func scrollViewDidScroll(_ scrollView: UIScrollView) {
  1727. if addAllergiesACTextField.isFirstResponder() {
  1728. addAllergiesACTextField.hideKeyboardResignFirstResponder()
  1729. }
  1730.  
  1731. if scrollView.tag == 1 {
  1732. mainScrollScrolled = scrollView.contentOffset.y / (scrollView.contentSize.height - scrollView.bounds.size.height)
  1733.  
  1734. // TODO: mainScrollScrolled goes beyond 1 (for iphone X) this needs to be fixed
  1735. if mainScrollScrolled >= 0 {
  1736. if mainScrollScrolled == 0 {
  1737. isMainScrollOpened = false
  1738. logCustomEventCardOpen(horizontalScrollIndexPage: horizontalScrollIndexPage, logReverse: false)
  1739. if !selectedAllergies.isEmpty {
  1740. allergiesCardState = .hasAllergiesSelectedSmallCard
  1741. } else {
  1742. allergiesCardState = .noAllergiesSelected
  1743. }
  1744. if !selectedDiets.isEmpty {
  1745. dietsCardState = .hasDietsSelectedSmallCard
  1746. } else {
  1747. dietsCardState = .noDietsSelected
  1748. }
  1749. } else if mainScrollScrolled >= 1 {
  1750. isMainScrollOpened = true
  1751. userPrefCardTimeSpend = Date()
  1752. if !selectedAllergies.isEmpty {
  1753. allergiesCardState = .hasAllergiesSelectedBigCard
  1754. } else {
  1755. allergiesCardState = .noAllergiesSelected
  1756. }
  1757. if !selectedDiets.isEmpty {
  1758. dietsCardState = .hasDietsSelectedBigCard
  1759. } else {
  1760. dietsCardState = .noDietsSelected
  1761. }
  1762. }
  1763. }
  1764. } else if scrollView.tag == 2 {
  1765. if isMainScrollOpened {
  1766. if dislikesACTextField.isFirstResponder() {
  1767. dislikesACTextField.hideKeyboardResignFirstResponder()
  1768. }
  1769. }
  1770. animateHorizontalScroll(scrollView: scrollView)
  1771. let indexPage: Int = Int(scrollView.contentOffset.x / scrollView.frame.size.width)
  1772. for i in 0 ..< 3 {
  1773. progressDotsView.subviews[i].backgroundColor = AppColors.lightGray
  1774. progressDotsView.subviews[indexPage].backgroundColor = AppColors.redColor
  1775. }
  1776. }
  1777. }
  1778.  
  1779. func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
  1780. if scrollView.tag == 2 {
  1781. if isMainScrollOpened {
  1782. logCustomEventCardOpen(horizontalScrollIndexPage: horizontalScrollIndexPage, logReverse: true)
  1783. userPrefCardTimeSpend = Date()
  1784. }
  1785.  
  1786. // remember horizontalScrollIndexPage for logging events
  1787. if scrollView.contentOffset.x == 0 {
  1788. horizontalScrollIndexPage = 0
  1789. } else if scrollView.contentOffset.x == ConstValues.screenWidth {
  1790. horizontalScrollIndexPage = 1
  1791. } else if scrollView.contentOffset.x == ConstValues.screenWidth*2 {
  1792. horizontalScrollIndexPage = 2
  1793. }
  1794. }
  1795. }
  1796.  
  1797. internal func unselectedItemTapped(button: UIButton, item: [String: Any], itemType: String) {
  1798. if itemType == "allergies" {
  1799. if button.titleLabel?.text?.lowercased() == "my allergy is not listed"{
  1800. allergiesBottomScroll.layer.opacity = 0
  1801. dontHaveAllerLbl.layer.opacity = 0
  1802. switchButton.layer.opacity = 0
  1803. initAddAllergiesView()
  1804. EventsService.sharedInstance.logEvent(withName: "AllergyNotListed", properies: nil, timeSpentSince: nil)
  1805. } else {
  1806.  
  1807. if item["isSelected"] as! Bool {
  1808. removingSelectedAllergie.updateValue(item, forKey: "itemToRemove")
  1809. if !UserDefaults.standard.bool(forKey: "hasRemovedAllergy") {
  1810. initRemoveAllergieView()
  1811. } else {
  1812. if !(removingSelectedAllergie["allowRemoving"] as! Bool) {
  1813. removingSelectedAllergie.updateValue(true, forKey: "allowRemoving")
  1814. }
  1815. }
  1816. } else {
  1817. var tmpItem = item
  1818. tmpItem.updateValue(true, forKey: "isSelected")
  1819.  
  1820. allergiesTopScroll.addButtonToScroll(item: tmpItem)
  1821. unSelectedAllergies = HelperMethodesService.sharedInstance.removeItemFromArray(array: unSelectedAllergies, item: tmpItem)
  1822. selectedAllergies.append(tmpItem)
  1823. allergiesSelectedStringLbl.text = makeStringFromArray(array: selectedAllergies)
  1824. hasAllergieSelected = true
  1825. if allergiesCardState != .hasAllergiesSelectedBigCard {
  1826. staticAnimationOnViews(cardTypeToAnimate: .hasAllergiesSelectedBigCard)
  1827. }
  1828. allergiesCardState = .hasAllergiesSelectedBigCard
  1829.  
  1830. EventsService.sharedInstance.logEvent(withName: "SelectAllergies", properies: ["Id": item["id"] as! String, "Name": item["name"] as! String], timeSpentSince: nil)
  1831. }
  1832. }
  1833.  
  1834. } else if itemType == "diets" {
  1835. // DIETS
  1836. if item["isSelected"] as! Bool {
  1837. var tmpItem = item
  1838. tmpItem.updateValue(false, forKey: "isSelected")
  1839.  
  1840. dietsBottomScroll.addButtonToScroll(item: tmpItem)
  1841. selectedDiets = HelperMethodesService.sharedInstance.removeItemFromArray(array: selectedDiets, item: tmpItem)
  1842. unSelectedDiets.append(tmpItem)
  1843. dietsSelectedStringLbl.text = makeStringFromArray(array: selectedDiets)
  1844.  
  1845. EventsService.sharedInstance.logEvent(withName: "DeselectDiets", properies: ["Id": item["id"] as! String, "Name": item["name"] as! String], timeSpentSince: nil)
  1846. if selectedDiets.isEmpty {
  1847. staticAnimationOnViews(cardTypeToAnimate: .noDietsSelected)
  1848. dietsCardState = .noDietsSelected
  1849. hasDietSelected = false
  1850. }
  1851. } else {
  1852. var tmpItem = item
  1853. tmpItem.updateValue(true, forKey: "isSelected")
  1854.  
  1855. dietsTopScroll.addButtonToScroll(item: tmpItem)
  1856. unSelectedDiets = HelperMethodesService.sharedInstance.removeItemFromArray(array: unSelectedDiets, item: tmpItem)
  1857. selectedDiets.append(tmpItem)
  1858. dietsSelectedStringLbl.text = makeStringFromArray(array: selectedDiets)
  1859. hasDietSelected = true
  1860. if dietsCardState != .hasDietsSelectedBigCard {
  1861. staticAnimationOnViews(cardTypeToAnimate: .hasDietsSelectedBigCard)
  1862. }
  1863. dietsCardState = .hasDietsSelectedBigCard
  1864. EventsService.sharedInstance.logEvent(withName: "SelectDiets", properies: ["Id": item["id"] as! String, "Name": item["name"] as! String], timeSpentSince: nil)
  1865. }
  1866. } else {
  1867. // DISLIKES
  1868. EventsService.sharedInstance.logEvent(withName: "DeselectDislikes", properies: ["Id": item["id"] as! String, "Name": item["name"] as! String], timeSpentSince: nil)
  1869. selectedDislikes = HelperMethodesService.sharedInstance.removeItemFromArray(array: selectedDislikes, item: item)
  1870. dislikesSelectedStringLbl.text = makeStringFromArray(array: selectedDislikes)
  1871. if selectedDislikes.isEmpty {
  1872. staticAnimationOnViews(cardTypeToAnimate: .noDislikesSelected)
  1873. dislikesCardState = .noDislikesSelected
  1874. }
  1875. }
  1876. }
  1877. }
  1878.  
  1879. extension ProfileDetailsViewController: NavToolbarViewDelegate {
  1880. internal func leftButtonTapped(button: UIButton) {
  1881. // if its deeplink the navigation is different
  1882. if isAllergiesDeeplink || isDietsDeeplink || isDeeplink {
  1883. self.dismiss(animated: false, completion: nil)
  1884. } else {
  1885. self.navigationController?.popViewController(animated: true)
  1886. }
  1887. }
  1888.  
  1889. func firstRightButtonTapped(button: UIButton) {
  1890. EventsService.sharedInstance.logEvent(withName: "SavedRecipes", properies: nil, timeSpentSince: nil)
  1891. let savedRecipesController = SavedRecipesViewController()
  1892. self.navigationController?.pushViewController(savedRecipesController, animated: true)
  1893. }
  1894.  
  1895. internal func secondRightButtonTapped(button: UIButton) {
  1896. // create an actionSheet
  1897. let actionSheetController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
  1898. // create an action
  1899.  
  1900. let shareWithFriends = UIAlertAction(title: "Invite Friends", style: .default, handler: { (action) in
  1901. let policiesVC = PoliciesViewController()
  1902. policiesVC.urlString = "http://invite.pixfood.com/create"
  1903. policiesVC.controllerName = action.title!
  1904. self.present(policiesVC, animated: true, completion: nil)
  1905. })
  1906.  
  1907. let editProfile = UIAlertAction(title: "Edit Profile", style: .default) { (action) in
  1908. let editProfileVC = EditProfileViewController()
  1909. self.present(editProfileVC, animated: true, completion: nil)
  1910. }
  1911.  
  1912. let faqAction = UIAlertAction(title: "FAQ", style: .default, handler: { (action) in
  1913. let policiesVC = PoliciesViewController()
  1914. policiesVC.urlString = "https://s3.amazonaws.com/mga-dev-web/faq.html"
  1915. policiesVC.controllerName = action.title!
  1916. self.present(policiesVC, animated: true, completion: nil)
  1917. })
  1918.  
  1919. let getInTouch = UIAlertAction(title: "Message Us", style: .default) { (action) in
  1920. let policiesVC = PoliciesViewController()
  1921. policiesVC.urlString = ""
  1922. policiesVC.controllerName = action.title!
  1923. self.present(policiesVC, animated: true, completion: nil)
  1924. }
  1925. let termsAndConditions = UIAlertAction(title: "Terms & Conditions", style: .default) { (action) in
  1926. let policiesVC = PoliciesViewController()
  1927. policiesVC.urlString = "https://s3.amazonaws.com/mga-dev-web/terms-conditions.html"
  1928. policiesVC.controllerName = action.title!
  1929. self.present(policiesVC, animated: true, completion: nil)
  1930. }
  1931.  
  1932. let privacyPolicy = UIAlertAction(title: "Privacy Policy", style: .default) { (action) in
  1933. let policiesVC = PoliciesViewController()
  1934. policiesVC.urlString = "https://s3.amazonaws.com/mga-dev-web/privacy-policy.html"
  1935. policiesVC.controllerName = action.title!
  1936. self.present(policiesVC, animated: true, completion: nil)
  1937. }
  1938.  
  1939. let openSourceLibraries = UIAlertAction(title: "Open Source Libraries", style: .default) { (action) in
  1940. let policiesVC = PoliciesViewController()
  1941. policiesVC.urlString = "https://s3.amazonaws.com/mga-dev-web/ios-libs.html"
  1942. policiesVC.controllerName = action.title!
  1943. self.present(policiesVC, animated: true, completion: nil)
  1944. }
  1945.  
  1946. let logOutAction: UIAlertAction = UIAlertAction (title: "Log Out", style: .default) { (_) in
  1947. print("Log Out Action pressed")
  1948. self.isLogoutPressed = true
  1949. EventsService.sharedInstance.logEvent(withName: "OpenProfile", properies: nil, timeSpentSince: self.methodStart!)
  1950.  
  1951. UserDefaults.standard.removeObject(forKey: "token")
  1952. UserDefaults.standard.removeObject(forKey: "userID")
  1953. UserDefaults.standard.removeObject(forKey: "userData")
  1954. UserDefaults.standard.removeObject(forKey: "userStatus")
  1955. UserDefaults.standard.synchronize()
  1956.  
  1957. UserManagmentService.sharedInstance.removeAllSavedRecipesForUser()
  1958. NotificationCenter.default.post(name: Notification.Name("reload_recipes"), object: nil)
  1959. EventsService.sharedInstance.logEvent(withName: "LogOut", properies: nil, timeSpentSince: nil)
  1960.  
  1961. // FB logout
  1962. LoginManager().logOut()
  1963.  
  1964. // RESET USER ON MIXPANEL
  1965. let mixpanel = Mixpanel.mainInstance()
  1966. mixpanel.clearSuperProperties()
  1967. mixpanel.reset()
  1968. //generate random number for distinct id and Anonymous-random
  1969. let random: Int = Int(arc4random())
  1970. let anonymousId = "\(random)"
  1971. // identify new Anonymous user with random id and name
  1972. mixpanel.identify(distinctId: anonymousId)
  1973. mixpanel.identify(distinctId: anonymousId, usePeople: true)
  1974. mixpanel.people.setOnce(properties: ["$first_name": "Anonymous-\(anonymousId)"])
  1975.  
  1976. // BACK BUTTON TAPPED
  1977. NotificationCenter.default.post(name: Notification.Name("fb-login"), object: nil)
  1978. self.leftButtonTapped(button: UIButton())
  1979.  
  1980. }
  1981.  
  1982. actionSheetController.addAction(shareWithFriends)
  1983. if (UserManagmentService.sharedInstance.getUser() as! User).type == USER_LOGIN_TYPES.EMAIL {
  1984. actionSheetController.addAction(editProfile)
  1985. }
  1986. actionSheetController.addAction(faqAction)
  1987. actionSheetController.addAction(getInTouch)
  1988. actionSheetController.addAction(termsAndConditions)
  1989. actionSheetController.addAction(privacyPolicy)
  1990. actionSheetController.addAction(openSourceLibraries)
  1991.  
  1992. if UserManagmentService.sharedInstance.isUserLogedIn() {
  1993. actionSheetController.addAction(logOutAction)
  1994. }
  1995. actionSheetController.addAction(UIAlertAction(title: "Cancel", style: .cancel) { _ -> Void in })
  1996.  
  1997. // present an actionSheet...
  1998. self.present(actionSheetController, animated: true, completion: nil)
  1999. }
  2000. }
  2001.  
  2002. extension ProfileDetailsViewController: ACTextFieldDelegate {
  2003. func textFieldDidBeginEditing(textField: UITextField) { }
  2004.  
  2005. func textFieldDidEndEditing(textField: UITextField) {
  2006. if let text = textField.text {
  2007. dislikesSearchText = text
  2008. } else { dislikesSearchText = "" }
  2009. }
  2010.  
  2011. func textFieldDidChange(textField: UITextField, range: NSRange, replacementString: String) {
  2012. let currentText: String = textField.text! + replacementString
  2013. let opacity: Float = currentText.isEmpty || (replacementString.isEmpty && textField.text!.count == 1) ? 0 : 1
  2014. if dislikesACTextField.isFirstResponder() {
  2015. UIView.animate(withDuration: 0.2) {
  2016. self.dislikesACTextFieldClearButton.layer.opacity = opacity
  2017. }
  2018. }
  2019.  
  2020. if addAllergiesACTextField.isFirstResponder() {
  2021. UIView.animate(withDuration: 0.2) {
  2022. self.addAllergiesACTextFieldClearBtn.layer.opacity = opacity
  2023. }
  2024. }
  2025.  
  2026. }
  2027. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement