mvcgen 0.1.14 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mvcgen/filemanager.rb +1 -1
  3. data/lib/mvcgen/generator.rb +36 -33
  4. data/lib/mvcgen/version.rb +1 -1
  5. data/lib/templates/default/mvcspec.yml +1 -1
  6. data/lib/templates/default/podfile/Podfile +73 -0
  7. data/lib/templates/default/swift/AppDelegate.swift +181 -0
  8. data/lib/templates/default/swift/Assets.xcassets/AppIcon.appiconset/Contents.json +133 -0
  9. data/lib/templates/default/swift/Assets.xcassets/Back.imageset/Contents.json +21 -0
  10. data/lib/templates/default/swift/Assets.xcassets/Back.imageset/icons8-back-filled-100-2.png +0 -0
  11. data/lib/templates/default/swift/Assets.xcassets/Contents.json +6 -0
  12. data/lib/templates/default/swift/Assets.xcassets/Down.imageset/Contents.json +21 -0
  13. data/lib/templates/default/swift/Assets.xcassets/Down.imageset/icons8-expand-arrow-filled-100.png +0 -0
  14. data/lib/templates/default/swift/Assets.xcassets/Forward.imageset/Contents.json +21 -0
  15. data/lib/templates/default/swift/Assets.xcassets/Forward.imageset/icons8-forward-filled-100.png +0 -0
  16. data/lib/templates/default/swift/Assets.xcassets/Key.imageset/Contents.json +1 -0
  17. data/lib/templates/default/swift/Assets.xcassets/Key.imageset/universal_Key.pdf +0 -0
  18. data/lib/templates/default/swift/Assets.xcassets/Shopping-cart.imageset/Contents.json +1 -0
  19. data/lib/templates/default/swift/Assets.xcassets/Shopping-cart.imageset/universal_Shopping-cart.pdf +0 -0
  20. data/lib/templates/default/swift/Assets.xcassets/Tick.imageset/Contents.json +21 -0
  21. data/lib/templates/default/swift/Assets.xcassets/Tick.imageset/icons8-Checkmark-96 (1).png +0 -0
  22. data/lib/templates/default/swift/Assets.xcassets/Up.imageset/Contents.json +22 -0
  23. data/lib/templates/default/swift/Assets.xcassets/Up.imageset/icons8-collapse-arrow-100.png +0 -0
  24. data/lib/templates/default/swift/Assets.xcassets/Up.imageset/icons8-collapse-arrow-50.png +0 -0
  25. data/lib/templates/default/swift/Assets.xcassets/Uruguay.imageset/Contents.json +21 -0
  26. data/lib/templates/default/swift/Assets.xcassets/Uruguay.imageset/icons8-uruguay-40.png +0 -0
  27. data/lib/templates/default/swift/Assets.xcassets/Wallet.imageset/Contents.json +1 -0
  28. data/lib/templates/default/swift/Assets.xcassets/Wallet.imageset/universal_Wallet.pdf +0 -0
  29. data/lib/templates/default/swift/Assets.xcassets/Welcome_001.imageset/Contents.json +12 -0
  30. data/lib/templates/default/swift/Assets.xcassets/Welcome_001.imageset/Icons_NotATour_Welcome_001.pdf +0 -0
  31. data/lib/templates/default/swift/Assets.xcassets/Welcome_002.imageset/Contents.json +12 -0
  32. data/lib/templates/default/swift/Assets.xcassets/Welcome_002.imageset/Icons_NotATour_Welcome_002.pdf +0 -0
  33. data/lib/templates/default/swift/Assets.xcassets/Welcome_003.imageset/Contents.json +12 -0
  34. data/lib/templates/default/swift/Assets.xcassets/Welcome_003.imageset/Icons_NotATour_Welcome_003.pdf +0 -0
  35. data/lib/templates/default/swift/Assets.xcassets/Welcome_004.imageset/Contents.json +12 -0
  36. data/lib/templates/default/swift/Assets.xcassets/Welcome_004.imageset/Icons_NotATour_Welcome_004.pdf +0 -0
  37. data/lib/templates/default/swift/Assets.xcassets/alert_beach.imageset/Contents.json +21 -0
  38. data/lib/templates/default/swift/Assets.xcassets/alert_beach.imageset/icons8-beach-64.png +0 -0
  39. data/lib/templates/default/swift/Assets.xcassets/alert_nobaggage.imageset/Contents.json +21 -0
  40. data/lib/templates/default/swift/Assets.xcassets/alert_nobaggage.imageset/icons8-no-baggage-100.png +0 -0
  41. data/lib/templates/default/swift/Assets.xcassets/alert_signpost.imageset/Contents.json +21 -0
  42. data/lib/templates/default/swift/Assets.xcassets/alert_signpost.imageset/icons8-signpost-64.png +0 -0
  43. data/lib/templates/default/swift/Assets.xcassets/alert_sunbed.imageset/Contents.json +21 -0
  44. data/lib/templates/default/swift/Assets.xcassets/alert_sunbed.imageset/sunbed.png +0 -0
  45. data/lib/templates/default/swift/Assets.xcassets/arrow.imageset/Contents.json +21 -0
  46. data/lib/templates/default/swift/Assets.xcassets/arrow.imageset/arrow.pdf +0 -0
  47. data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/Contents.json +22 -0
  48. data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/baggage.png +0 -0
  49. data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/baggage@2x.png +0 -0
  50. data/lib/templates/default/swift/Assets.xcassets/burger.imageset/Contents.json +21 -0
  51. data/lib/templates/default/swift/Assets.xcassets/burger.imageset/burger.pdf +0 -0
  52. data/lib/templates/default/swift/Assets.xcassets/calendar-white.imageset/Contents.json +12 -0
  53. data/lib/templates/default/swift/Assets.xcassets/calendar-white.imageset/icons8-calendar.pdf +70 -0
  54. data/lib/templates/default/swift/Assets.xcassets/calendar.imageset/Contents.json +12 -0
  55. data/lib/templates/default/swift/Assets.xcassets/calendar.imageset/calendar.pdf +0 -0
  56. data/lib/templates/default/swift/Assets.xcassets/dots.imageset/Contents.json +24 -0
  57. data/lib/templates/default/swift/Assets.xcassets/dots.imageset/dots.pdf +0 -0
  58. data/lib/templates/default/swift/Assets.xcassets/edit.imageset/Contents.json +12 -0
  59. data/lib/templates/default/swift/Assets.xcassets/edit.imageset/edit.pdf +0 -0
  60. data/lib/templates/default/swift/Assets.xcassets/emptylogin.imageset/Contents.json +12 -0
  61. data/lib/templates/default/swift/Assets.xcassets/emptylogin.imageset/empty state loging.pdf +0 -0
  62. data/lib/templates/default/swift/Assets.xcassets/envelope.imageset/Contents.json +12 -0
  63. data/lib/templates/default/swift/Assets.xcassets/envelope.imageset/icons8-envelope.pdf +70 -0
  64. data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/Contents.json +22 -0
  65. data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/icons8-expand-arrow-100.png +0 -0
  66. data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/icons8-expand-arrow-50.png +0 -0
  67. data/lib/templates/default/swift/Assets.xcassets/facebook.imageset/Contents.json +24 -0
  68. data/lib/templates/default/swift/Assets.xcassets/facebook.imageset/icons8-facebook-f.pdf +68 -0
  69. data/lib/templates/default/swift/Assets.xcassets/filter-white.imageset/Contents.json +12 -0
  70. data/lib/templates/default/swift/Assets.xcassets/filter-white.imageset/icons8-adjust (3).pdf +0 -0
  71. data/lib/templates/default/swift/Assets.xcassets/filter.imageset/Contents.json +15 -0
  72. data/lib/templates/default/swift/Assets.xcassets/filter.imageset/filter.pdf +0 -0
  73. data/lib/templates/default/swift/Assets.xcassets/food.imageset/Contents.json +21 -0
  74. data/lib/templates/default/swift/Assets.xcassets/food.imageset/food.png +0 -0
  75. data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/Contents.json +23 -0
  76. data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1.png +0 -0
  77. data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1@2x.png +0 -0
  78. data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1@3x.png +0 -0
  79. data/lib/templates/default/swift/Assets.xcassets/heart-active.imageset/Contents.json +12 -0
  80. data/lib/templates/default/swift/Assets.xcassets/heart-active.imageset/favortio activo.pdf +0 -0
  81. data/lib/templates/default/swift/Assets.xcassets/heart.imageset/Contents.json +12 -0
  82. data/lib/templates/default/swift/Assets.xcassets/heart.imageset/favorito inactivo.pdf +0 -0
  83. data/lib/templates/default/swift/Assets.xcassets/icons8-delete.imageset/Contents.json +12 -0
  84. data/lib/templates/default/swift/Assets.xcassets/icons8-delete.imageset/icons8-delete (3).pdf +69 -0
  85. data/lib/templates/default/swift/Assets.xcassets/lock.imageset/Contents.json +12 -0
  86. data/lib/templates/default/swift/Assets.xcassets/lock.imageset/icons8-lock.pdf +69 -0
  87. data/lib/templates/default/swift/Assets.xcassets/man-avatar.imageset/Contents.json +12 -0
  88. data/lib/templates/default/swift/Assets.xcassets/man-avatar.imageset/man-avatar.pdf +1149 -1
  89. data/lib/templates/default/swift/Assets.xcassets/new-notification.imageset/Contents.json +21 -0
  90. data/lib/templates/default/swift/Assets.xcassets/new-notification.imageset/icons8-filled-circle-filled-100.png +0 -0
  91. data/lib/templates/default/swift/Assets.xcassets/no-fav.imageset/Contents.json +21 -0
  92. data/lib/templates/default/swift/Assets.xcassets/no-fav.imageset/page-1@2x.png +0 -0
  93. data/lib/templates/default/swift/Assets.xcassets/notificaciones.imageset/Contents.json +12 -0
  94. data/lib/templates/default/swift/Assets.xcassets/notificaciones.imageset/notificaciones.pdf +0 -0
  95. data/lib/templates/default/swift/Assets.xcassets/notification.imageset/Contents.json +21 -0
  96. data/lib/templates/default/swift/Assets.xcassets/notification.imageset/icons8-notification-100.png +0 -0
  97. data/lib/templates/default/swift/Assets.xcassets/other.imageset/Contents.json +21 -0
  98. data/lib/templates/default/swift/Assets.xcassets/other.imageset/other.png +0 -0
  99. data/lib/templates/default/swift/Assets.xcassets/page-1.imageset/Contents.json +21 -0
  100. data/lib/templates/default/swift/Assets.xcassets/page-1.imageset/page-1@2x.png +0 -0
  101. data/lib/templates/default/swift/Assets.xcassets/page-3.imageset/Contents.json +21 -0
  102. data/lib/templates/default/swift/Assets.xcassets/page-3.imageset/page-1@2x.png +0 -0
  103. data/lib/templates/default/swift/Assets.xcassets/photo.imageset/Contents.json +24 -0
  104. data/lib/templates/default/swift/Assets.xcassets/photo.imageset/photo.pdf +0 -0
  105. data/lib/templates/default/swift/Assets.xcassets/plus-white.imageset/Contents.json +21 -0
  106. data/lib/templates/default/swift/Assets.xcassets/plus-white.imageset/icons8-plus-math-26.png +0 -0
  107. data/lib/templates/default/swift/Assets.xcassets/plus.imageset/+.pdf +0 -0
  108. data/lib/templates/default/swift/Assets.xcassets/plus.imageset/Contents.json +12 -0
  109. data/lib/templates/default/swift/Assets.xcassets/register.imageset/Contents.json +12 -0
  110. data/lib/templates/default/swift/Assets.xcassets/register.imageset/registro.pdf +0 -0
  111. data/lib/templates/default/swift/Assets.xcassets/search.imageset/Contents.json +15 -0
  112. data/lib/templates/default/swift/Assets.xcassets/search.imageset/search.pdf +0 -0
  113. data/lib/templates/default/swift/Assets.xcassets/settings.imageset/Contents.json +23 -0
  114. data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-100.png +0 -0
  115. data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-50.png +0 -0
  116. data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-500.png +0 -0
  117. data/lib/templates/default/swift/Assets.xcassets/shape.imageset/Contents.json +23 -0
  118. data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape.png +0 -0
  119. data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape@2x.png +0 -0
  120. data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape@3x.png +0 -0
  121. data/lib/templates/default/swift/Assets.xcassets/signpost.imageset/Contents.json +21 -0
  122. data/lib/templates/default/swift/Assets.xcassets/signpost.imageset/icons8-signpost-50.png +0 -0
  123. data/lib/templates/default/swift/Assets.xcassets/stars.imageset/Contents.json +24 -0
  124. data/lib/templates/default/swift/Assets.xcassets/stars.imageset/stars.pdf +0 -0
  125. data/lib/templates/default/swift/Assets.xcassets/terms.imageset/Contents.json +12 -0
  126. data/lib/templates/default/swift/Assets.xcassets/terms.imageset/terminos y condiciones.pdf +0 -0
  127. data/lib/templates/default/swift/Assets.xcassets/tickets.imageset/Contents.json +12 -0
  128. data/lib/templates/default/swift/Assets.xcassets/tickets.imageset/tickets.pdf +0 -0
  129. data/lib/templates/default/swift/Assets.xcassets/user.imageset/Contents.json +22 -0
  130. data/lib/templates/default/swift/Assets.xcassets/user.imageset/icons8-account-100.png +0 -0
  131. data/lib/templates/default/swift/Assets.xcassets/user.imageset/icons8-account-50.png +0 -0
  132. data/lib/templates/default/swift/Assets.xcassets/visa.imageset/Contents.json +21 -0
  133. data/lib/templates/default/swift/Assets.xcassets/visa.imageset/visa.png +0 -0
  134. data/lib/templates/default/swift/Config/Config.swift +1 -1
  135. data/lib/templates/default/swift/Controllers/Login/ForgetPasswordVC.swift +125 -0
  136. data/lib/templates/default/swift/Controllers/Login/LoginVC.swift +244 -0
  137. data/lib/templates/default/swift/Controllers/Login/RegisterVC.swift +213 -0
  138. data/lib/templates/default/swift/Controllers/Notifications/Cells/NotificationCell.swift +51 -0
  139. data/lib/templates/default/swift/Controllers/Notifications/NotificationsVC.swift +164 -0
  140. data/lib/templates/default/swift/Controllers/OtherLogin/ForgetPasswordTVC.swift +98 -0
  141. data/lib/templates/default/swift/Controllers/OtherLogin/LoginTVC.swift +245 -0
  142. data/lib/templates/default/swift/Controllers/OtherLogin/OtherRegisterVC.swift +299 -0
  143. data/lib/templates/default/swift/Controllers/OtherLogin/SelectLanguageCell.swift +17 -0
  144. data/lib/templates/default/swift/Controllers/OtherLogin/SelectLanguageVC.swift +116 -0
  145. data/lib/templates/default/swift/Controllers/OtherLogin/TermsAndConditionsVC.swift +76 -0
  146. data/lib/templates/default/swift/Controllers/Profile/AboutUsVC.swift +93 -0
  147. data/lib/templates/default/swift/Controllers/Profile/Cells/AboutUsImageCell.swift +66 -0
  148. data/lib/templates/default/swift/Controllers/Profile/Cells/DescriptionCell.swift +16 -0
  149. data/lib/templates/default/swift/Controllers/Profile/Cells/DestinationCell.swift +35 -0
  150. data/lib/templates/default/swift/Controllers/Profile/Cells/DestinationCellView.xib +84 -0
  151. data/lib/templates/default/swift/Controllers/Profile/Cells/FavoriteCollectionCell.swift +24 -0
  152. data/lib/templates/default/swift/Controllers/Profile/Cells/ImagesCollectionViewCell.swift +15 -0
  153. data/lib/templates/default/swift/Controllers/Profile/ProfileContainerVC.swift +72 -0
  154. data/lib/templates/default/swift/Controllers/Profile/ProfileTVC.swift +581 -0
  155. data/lib/templates/default/swift/Controllers/Tutorial/TutorialVC.swift +121 -0
  156. data/lib/templates/default/swift/Extensions/ArrayDuplicates.swift +35 -0
  157. data/lib/templates/default/swift/Extensions/Buttons.swift +1 -1
  158. data/lib/templates/default/swift/Extensions/CustomCamera.swift +65 -0
  159. data/lib/templates/default/swift/Extensions/GradientView.swift +121 -0
  160. data/lib/templates/default/swift/Extensions/HideKeyboard.swift +22 -0
  161. data/lib/templates/default/swift/Extensions/Images.swift +82 -0
  162. data/lib/templates/default/swift/Extensions/InnerShadowExtension.swift +83 -0
  163. data/lib/templates/default/swift/Extensions/TableViewEmptyView.swift +30 -0
  164. data/lib/templates/default/swift/Extensions/TapEffectExtension.swift +48 -0
  165. data/lib/templates/default/swift/Extensions/{ColorHex.swift → UIColorExtensions.swift} +2 -2
  166. data/lib/templates/default/swift/Extensions/UnderlinedTextView.swift +61 -0
  167. data/lib/templates/default/swift/Extensions/UnderlinedWithIconTextField.swift +55 -0
  168. data/lib/templates/default/swift/Helper/APIHelper.swift +4 -4
  169. data/lib/templates/default/swift/Helper/APIManager.swift +81 -14
  170. data/lib/templates/default/swift/Helper/APIRequestBody.swift +1 -1
  171. data/lib/templates/default/swift/Helper/AWSManager.swift +1 -1
  172. data/lib/templates/default/swift/Helper/FilesManager.swift +1 -1
  173. data/lib/templates/default/swift/Helper/S3Manager.swift +1 -1
  174. data/lib/templates/default/swift/Helper/Utils.swift +3 -1
  175. data/lib/templates/default/swift/Info.plist +53 -0
  176. data/lib/templates/default/swift/Models/Country.swift +28 -0
  177. data/lib/templates/default/swift/Models/Managers/UserManager.swift +1 -1
  178. data/lib/templates/default/swift/Models/Notif.swift +71 -0
  179. data/lib/templates/default/swift/Models/Responses/BaseResponse.swift +1 -1
  180. data/lib/templates/default/swift/Models/Responses/NotificationResponse.swift +24 -0
  181. data/lib/templates/default/swift/Models/Responses/UserResponse.swift +1 -1
  182. data/lib/templates/default/swift/Models/Responses/UserSingupResponse.swift +1 -1
  183. data/lib/templates/default/swift/Models/User.swift +2 -2
  184. data/lib/templates/default/swift/UI/Storyboards/Home.storyboard +2113 -0
  185. data/lib/templates/default/swift/UI/Storyboards/Login.storyboard +814 -0
  186. data/lib/templates/default/swift/UI/Storyboards/OtherLogin.storyboard +1031 -0
  187. data/lib/templates/default/swift/UI/Views/EmptyTableView/EmptyTableLabelView.swift +18 -0
  188. data/lib/templates/default/swift/UI/Views/EmptyTableView/NoNotificationView.swift +16 -0
  189. data/lib/templates/default/swift/UI/Views/EmptyTableView/Xibs/EmptyTableLabelView.xib +72 -0
  190. data/lib/templates/default/swift/UI/Views/EmptyTableView/Xibs/NoNotificationsView.xib +61 -0
  191. metadata +176 -4
@@ -0,0 +1,83 @@
1
+ //
2
+ // InnerShadowExtension.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+
11
+ extension UIView {
12
+ // different inner shadow styles
13
+ public enum innerShadowSide
14
+ {
15
+ case all, left, right, top, bottom, topAndLeft, topAndRight, bottomAndLeft, bottomAndRight, exceptLeft, exceptRight, exceptTop, exceptBottom
16
+ }
17
+
18
+ // define function to add inner shadow
19
+ public func addInnerShadow(onSide: innerShadowSide, shadowColor: UIColor, shadowSize: CGFloat, cornerRadius: CGFloat = 0.0, shadowOpacity: Float)
20
+ {
21
+ // define and set a shaow layer
22
+ let shadowLayer = CAShapeLayer()
23
+ shadowLayer.frame = bounds
24
+ shadowLayer.shadowColor = shadowColor.cgColor
25
+ shadowLayer.shadowOffset = CGSize(width: 0.0, height: 0.0)
26
+ shadowLayer.shadowOpacity = shadowOpacity
27
+ shadowLayer.shadowRadius = shadowSize
28
+ shadowLayer.fillRule = kCAFillRuleEvenOdd
29
+
30
+ // define shadow path
31
+ let shadowPath = CGMutablePath()
32
+
33
+ // define outer rectangle to restrict drawing area
34
+ let insetRect = bounds.insetBy(dx: -shadowSize * 2.0, dy: -shadowSize * 2.0)
35
+
36
+ // define inner rectangle for mask
37
+ let innerFrame: CGRect = { () -> CGRect in
38
+ switch onSide
39
+ {
40
+ case .all:
41
+ return CGRect(x: 0.0, y: 0.0, width: frame.size.width, height: frame.size.height)
42
+ case .left:
43
+ return CGRect(x: 0.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 4.0)
44
+ case .right:
45
+ return CGRect(x: -shadowSize * 2.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 4.0)
46
+ case .top:
47
+ return CGRect(x: -shadowSize * 2.0, y: 0.0, width: frame.size.width + shadowSize * 4.0, height: frame.size.height + shadowSize * 2.0)
48
+ case.bottom:
49
+ return CGRect(x: -shadowSize * 2.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 4.0, height: frame.size.height + shadowSize * 2.0)
50
+ case .topAndLeft:
51
+ return CGRect(x: 0.0, y: 0.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 2.0)
52
+ case .topAndRight:
53
+ return CGRect(x: -shadowSize * 2.0, y: 0.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 2.0)
54
+ case .bottomAndLeft:
55
+ return CGRect(x: 0.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 2.0)
56
+ case .bottomAndRight:
57
+ return CGRect(x: -shadowSize * 2.0, y: -shadowSize * 2.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height + shadowSize * 2.0)
58
+ case .exceptLeft:
59
+ return CGRect(x: -shadowSize * 2.0, y: 0.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height)
60
+ case .exceptRight:
61
+ return CGRect(x: 0.0, y: 0.0, width: frame.size.width + shadowSize * 2.0, height: frame.size.height)
62
+ case .exceptTop:
63
+ return CGRect(x: 0.0, y: -shadowSize * 2.0, width: frame.size.width, height: frame.size.height + shadowSize * 2.0)
64
+ case .exceptBottom:
65
+ return CGRect(x: 0.0, y: 0.0, width: frame.size.width, height: frame.size.height + shadowSize * 2.0)
66
+ }
67
+ }()
68
+
69
+ // add outer and inner rectangle to shadow path
70
+ shadowPath.addRect(insetRect)
71
+ shadowPath.addRect(innerFrame)
72
+
73
+ // set shadow path as show layer's
74
+ shadowLayer.path = shadowPath
75
+
76
+ // add shadow layer as a sublayer
77
+ layer.addSublayer(shadowLayer)
78
+
79
+ // hide outside drawing area
80
+ clipsToBounds = true
81
+ }
82
+ }
83
+
@@ -0,0 +1,30 @@
1
+ //
2
+ // TableViewEmptyView.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+
11
+
12
+ extension UITableView {
13
+
14
+ func setEmptyTableLabelView(message: String, emptyIcon: String) {
15
+
16
+ let emptyTableLabelViewNib = UINib(nibName: "EmptyTableLabelView", bundle: nil)
17
+ let emptyTableLabelView = emptyTableLabelViewNib.instantiate(withOwner: nil, options: nil)[0] as! EmptyTableLabelView
18
+ emptyTableLabelView.label.text = message
19
+ emptyTableLabelView.iconImageView.image = UIImage(named: emptyIcon)
20
+ emptyTableLabelView.tag = 100
21
+ self.backgroundView = emptyTableLabelView
22
+
23
+ }
24
+
25
+ func hideEmptyTableLabelView(){
26
+ if let viewWithTag = self.viewWithTag(100) {
27
+ viewWithTag.isHidden = true
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,48 @@
1
+ //
2
+ // TapEffectExtension.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+
11
+ extension UIViewController {
12
+
13
+ func setUnselectedColors(backgroundView: UIView, label: UILabel) {
14
+ backgroundView.backgroundColor = UIColor.white
15
+ label.textColor = UIColor.black
16
+ }
17
+
18
+ func setSelectedColors(backgroundView: UIView, label: UILabel) {
19
+ backgroundView.backgroundColor = Colors.firstGradientColor
20
+ label.textColor = UIColor.white
21
+ }
22
+
23
+ func animateViewBounceAndZoom(viewToAnimate: UIView) {
24
+
25
+ scaleView(by: 0.8, viewToTransform: viewToAnimate)
26
+
27
+ UIView.animate(withDuration: 0.3/2, animations: {
28
+ self.scaleView(by: 1.1, viewToTransform: viewToAnimate)
29
+ }, completion: { finished in
30
+ UIView.animate(withDuration: 0.5/2, animations: {
31
+ self.resetViewScale(viewToTransform: viewToAnimate)
32
+ }, completion: { finished in
33
+ UIView.animate(withDuration: 0.3/2, animations: {
34
+ self.scaleView(by: 1.0, viewToTransform: viewToAnimate)
35
+ })
36
+ })
37
+ })
38
+ }
39
+
40
+ func scaleView(by scale: CGFloat, viewToTransform: UIView) {
41
+
42
+ viewToTransform.transform = CGAffineTransform.identity.scaledBy(x: scale, y: scale)
43
+ }
44
+
45
+ func resetViewScale(viewToTransform: UIView) {
46
+ viewToTransform.transform = CGAffineTransform.identity
47
+ }
48
+ }
@@ -1,9 +1,9 @@
1
1
  //
2
- // ColorHex.swift
2
+ // UIColorExtensions.swift
3
3
  // MVCGEN
4
4
  //
5
5
  // Created by Daniel Martinez on 23/7/18.
6
- // Copyright © 2018 DanielMartinez. All rights reserved.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
7
  //
8
8
 
9
9
  import UIKit
@@ -0,0 +1,61 @@
1
+ //
2
+ // UnderlinedTextView.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+
11
+ class UnderlinedTextView: UITextView {
12
+
13
+ var border: UIView!
14
+ var originalBorderFrame: CGRect!
15
+ var originalInsetBottom: CGFloat = 0.0
16
+
17
+ override init(frame: CGRect, textContainer: NSTextContainer?) {
18
+ super.init(frame: frame, textContainer: textContainer)
19
+ self.border = UIView()
20
+ self.originalBorderFrame = CGRect(origin: CGPoint(x: 0, y: frame.height - 1.5), size: CGSize(width: frame.width, height: 1.5))
21
+ addBottomBorderWithColor(color: UIColor.lightGray, width: 1.5)
22
+ }
23
+
24
+ required init?(coder aDecoder: NSCoder) {
25
+
26
+ super.init(coder: aDecoder)
27
+ self.border = UIView()
28
+ self.originalBorderFrame = CGRect(origin: CGPoint(x: 0, y: frame.height - 1.5), size: CGSize(width: frame.width, height: 1.5))
29
+ self.addObserver(self, forKeyPath: "contentOffset", options: .new, context: nil)
30
+ addBottomBorderWithColor(color: UIColor.lightGray, width: 1.5)
31
+ }
32
+
33
+ deinit {
34
+ removeObserver(self, forKeyPath: "contentOffset")
35
+ }
36
+
37
+ override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
38
+ if keyPath == "contentOffset" {
39
+ border.frame = originalBorderFrame.offsetBy(dx: 0, dy: contentOffset.y)
40
+
41
+ }
42
+ }
43
+
44
+ func addBottomBorderWithColor(color: UIColor, width: CGFloat) {
45
+ border.backgroundColor = color
46
+
47
+ border.frame = CGRect(origin: CGPoint(x: 0, y: frame.height+contentOffset.y-width), size: CGSize(width: self.frame.width, height: width))
48
+ originalBorderFrame = CGRect(origin: CGPoint(x: 0, y: frame.height-width), size: CGSize(width: self.frame.width, height: width))
49
+ textContainerInset.bottom = originalInsetBottom + width
50
+ self.textInputView.addSubview(border)
51
+ }
52
+
53
+ func changeBorderColor(newColor: UIColor) {
54
+ border.removeFromSuperview()
55
+
56
+ addBottomBorderWithColor(color: newColor, width: 1.5)
57
+ //border.backgroundColor = newColor
58
+ self.originalBorderFrame = CGRect(origin: CGPoint(x: 0, y: frame.height - 1.0), size: CGSize(width: frame.width, height: 1.0))
59
+ // self.textInputView.addSubview(border)
60
+ }
61
+ }
@@ -0,0 +1,55 @@
1
+ //
2
+ // UITextFieldExtension.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+
11
+ class UnderlinedWithIconTextField: UITextField {
12
+
13
+ var border = CALayer()
14
+
15
+ let padding = UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 0)
16
+
17
+ func underlined(color: UIColor, width: CGFloat){
18
+
19
+ let newBorder = CALayer()
20
+ if let contains = self.layer.sublayers?.contains(border) {
21
+ if contains {
22
+ self.layer.replaceSublayer(border, with: newBorder)
23
+ }
24
+ }
25
+
26
+ newBorder.borderColor = color.cgColor
27
+ // TODO: check isnt trailling same width
28
+ newBorder.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width , height: width)
29
+ newBorder.borderWidth = width
30
+ self.layer.addSublayer(newBorder)
31
+ border = newBorder
32
+ self.layer.masksToBounds = true
33
+ }
34
+
35
+ func addLeftIcon(_ named: String) {
36
+ let image = UIImage(named: named)
37
+ let imageView = UIImageView()
38
+
39
+ var iconOriginalWidth = image!.size.width
40
+ if iconOriginalWidth > 15 {
41
+ iconOriginalWidth = 15
42
+ }
43
+ imageView.frame = CGRect(x: 0, y: 0, width: iconOriginalWidth + 30, height: image!.size.height)
44
+ imageView.image = image
45
+ imageView.contentMode = .scaleAspectFit
46
+
47
+ let leftView = UIView.init(frame: CGRect(x: 0, y: 0, width: iconOriginalWidth+30, height: image!.size.height))
48
+ leftView.addSubview(imageView)
49
+ imageView.bounds = imageView.frame.insetBy(dx: 15.0, dy: 0.0);
50
+
51
+ self.leftView = leftView
52
+ self.leftViewMode = UITextFieldViewMode.always
53
+
54
+ }
55
+ }
@@ -3,7 +3,7 @@
3
3
  // MVCGEN
4
4
  //
5
5
  // Created by Daniel Martinez on 23/7/18.
6
- // Copyright © 2018 DanielMartinez. All rights reserved.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
7
  //
8
8
 
9
9
  import Alamofire
@@ -23,7 +23,7 @@ class APIHelper {
23
23
  lazy var errorBanner = NotificationBanner(title: "", subtitle: "", style: .danger)
24
24
 
25
25
  func getHeaders() -> [String : String]? {
26
- if let userId = UserDefaults.standard.value(forKey: Constants.userId) as? String, let token = UserDefaults.standard.value(forKey: Constants.userAuthTokenKey) as? String {
26
+ if let userId = UserDefaults.standard.value(forKey: UserDefaultsConstants.savedUserKey) as? String, let token = UserDefaults.standard.value(forKey: UserDefaultsConstants.userAuthTokenKey) as? String {
27
27
  // Token stored in UserDefaults.
28
28
  var userAuthB64 = "Basic "
29
29
  let userAuth = "\(userId):\(token)"
@@ -63,8 +63,8 @@ class APIHelper {
63
63
  case 300..<400:
64
64
  // Bad auth error
65
65
  print("error is \(error)")
66
- // let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
67
- // appDelegate.logout()
66
+ let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
67
+ appDelegate.logout()
68
68
  case 801:
69
69
  break
70
70
  default:
@@ -3,7 +3,7 @@
3
3
  // MVCGEN
4
4
  //
5
5
  // Created by Daniel Martinez on 23/7/18.
6
- // Copyright © 2018 DanielMartinez. All rights reserved.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
7
  //
8
8
 
9
9
  import Alamofire
@@ -43,13 +43,14 @@ class APIManager {
43
43
  break
44
44
  case false:
45
45
  let errorCode = responseValue.errorCode
46
- APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: responseValue.message)
46
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
47
+ APIHelper.sharedInstance.wsResponse(onError: errorCode)
47
48
  completion(.failure)
48
49
  break
49
50
  }
50
51
  }
51
52
  case .failure(_):
52
- APIHelper.sharedInstance.showErrorMessage(with: errorMsg, and: "")
53
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
53
54
  completion(.failure)
54
55
  break
55
56
  }
@@ -87,8 +88,8 @@ class APIManager {
87
88
  // break
88
89
  // case false:
89
90
  // let errorCode = responseValue.errorCode
90
- // APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: responseValue.message)
91
- // completion(.failure)
91
+ // APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
92
+ // APIHelper.sharedInstance.wsResponse(onError: errorCode)
92
93
  // break
93
94
  // }
94
95
  // }
@@ -96,7 +97,7 @@ class APIManager {
96
97
 
97
98
  // }
98
99
  // case .failure(_):
99
- // APIHelper.sharedInstance.showErrorMessage(with: errorMsg, and: "")
100
+ // APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
100
101
  // completion(.failure)
101
102
  // break
102
103
  // }
@@ -124,13 +125,14 @@ class APIManager {
124
125
  break
125
126
  case false:
126
127
  let errorCode = responseValue.errorCode
127
- APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: responseValue.message)
128
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
129
+ APIHelper.sharedInstance.wsResponse(onError: errorCode)
128
130
  completion(.failure)
129
131
  break
130
132
  }
131
133
  }
132
134
  case .failure(_):
133
- APIHelper.sharedInstance.showErrorMessage(with: errorMsg, and: "")
135
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
134
136
  completion(.failure)
135
137
  break
136
138
  }
@@ -150,13 +152,14 @@ class APIManager {
150
152
  break
151
153
  case false:
152
154
  let errorCode = baseResponse.errorCode
153
- APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: baseResponse.message)
155
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
156
+ APIHelper.sharedInstance.wsResponse(onError: errorCode)
154
157
  completion(.failure)
155
158
  break
156
159
  }
157
160
  }
158
161
  case .failure(_):
159
- APIHelper.sharedInstance.showErrorMessage(with: errorMsg, and: "")
162
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
160
163
  completion(.failure)
161
164
  break
162
165
  }
@@ -176,13 +179,14 @@ class APIManager {
176
179
  break
177
180
  case false:
178
181
  let errorCode = baseResponse.errorCode
179
- APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: baseResponse.message)
182
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
183
+ APIHelper.sharedInstance.wsResponse(onError: errorCode)
180
184
  completion(.failure,nil)
181
185
  break
182
186
  }
183
187
  }
184
188
  case .failure(_):
185
- APIHelper.sharedInstance.showErrorMessage(with: errorMsg, comment: ""), and: "")
189
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
186
190
  completion(.failure,nil)
187
191
  break
188
192
  }
@@ -202,16 +206,79 @@ class APIManager {
202
206
  break
203
207
  case false:
204
208
  let errorCode = baseResponse.errorCode
205
- APIHelper.sharedInstance.wsResponse(onError: errorCode, andMessage: baseResponse.message)
209
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
210
+ APIHelper.sharedInstance.wsResponse(onError: errorCode)
206
211
  completion(.failure)
207
212
  break
208
213
  }
209
214
  }
210
215
  case .failure(_):
211
- APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Error connecting to services. Please try again", comment: ""), and: "")
216
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
212
217
  completion(.failure)
213
218
  break
214
219
  }
215
220
  }
216
221
  }
222
+
223
+ // MARK: Notifications
224
+
225
+ func getNotifications(completion: @escaping(VoidResult, [Notif]) -> Void){
226
+ Alamofire.request(APIHelper.sharedInstance.servicesURL + Endpoints.getNotifications, method: .get, parameters: nil,
227
+ encoding: JSONEncoding.default,
228
+ headers: APIHelper.sharedInstance.getHeaders()).responseObject { (response: DataResponse<NotificationResponse>) in
229
+ switch response.result {
230
+ case .success(_):
231
+
232
+ if let notificationResponse = response.result.value {
233
+ switch notificationResponse.result {
234
+ case true:
235
+ completion(.success, notificationResponse.data ?? [])
236
+ case false:
237
+ let errorCode = notificationResponse.errorCode
238
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
239
+ APIHelper.sharedInstance.wsResponse(onError: errorCode)
240
+ completion(.failure, [])
241
+ }
242
+ }
243
+ break
244
+ case .failure(_):
245
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
246
+ completion(.failure, [])
247
+ break
248
+ }
249
+ }
250
+ }
251
+
252
+ func readNotifications(completion: @escaping(VoidResult) -> Void){
253
+
254
+ var parms: [String : Any] = [:]
255
+
256
+ // TODO check utc
257
+ parms["date"] = Date().string(custom: "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
258
+
259
+ Alamofire.request(APIHelper.sharedInstance.servicesURL + Endpoints.readNotifications, method: .post, parameters: parms,
260
+ encoding: JSONEncoding.default,
261
+ headers: APIHelper.sharedInstance.getHeaders()).responseObject { (response: DataResponse<BaseResponse>) in
262
+ switch response.result {
263
+ case .success(_):
264
+
265
+ if let baseResponse = response.result.value {
266
+ switch baseResponse.result {
267
+ case true:
268
+ completion(.success)
269
+ case false:
270
+ let errorCode = baseResponse.errorCode
271
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
272
+ APIHelper.sharedInstance.wsResponse(onError: errorCode)
273
+ completion(.failure)
274
+ }
275
+ }
276
+ break
277
+ case .failure(_):
278
+ APIHelper.sharedInstance.showErrorMessage(with: self.errorMsg, and: "")
279
+ completion(.failure)
280
+ break
281
+ }
282
+ }
283
+ }
217
284
  }