You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

313 lines
10 KiB

6 years ago
  1. //
  2. // MessageComposeViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal on 2/10/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. class MessageComposeViewController: UIViewController {
  10. private var isScrolled: Bool = false
  11. var supportIndex: Int!
  12. @IBOutlet weak var textFieldSubject: UITextField!
  13. @IBOutlet weak var textFieldControlNumber: UITextField!
  14. @IBOutlet weak var textViewMessage: UITextView!
  15. @IBOutlet weak var constraintTopMargin: NSLayoutConstraint!
  16. @IBOutlet weak var constraintTextFieldHeight: NSLayoutConstraint!
  17. @IBOutlet weak var constraintEditableTopMargin: NSLayoutConstraint!
  18. private var messageviewmodel = MessageViewModel()
  19. private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
  20. @IBAction func cancelMessage(_ sender: Any) {
  21. navigationController?.popViewController(animated: true)
  22. dismiss(animated: true, completion: nil)
  23. }
  24. @objc func appMovedToForeground() {
  25. resignAllResponders()
  26. if isScrolled {
  27. isScrolled = !isScrolled
  28. }
  29. }
  30. override func viewDidLoad() {
  31. super.viewDidLoad()
  32. NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)
  33. registerTapListener()
  34. setUpNavBar(id: 202, title: "")
  35. setUpAnotherLoginListener(genericviewmodel: messageviewmodel)
  36. textViewMessage.clipsToBounds = true
  37. textViewMessage.layer.cornerRadius = 5
  38. textViewMessage.layer.borderWidth = 0.5
  39. textViewMessage.layer.borderColor = UIColor(hex: 0xc7c7cd).cgColor //UIColor.lightGray.cgColor
  40. textFieldSubject.delegate = self
  41. textFieldControlNumber.delegate = self
  42. guard supportIndex != nil else {
  43. self.popUpMessageInfo(value: 16, title: "No message", message: "try again")
  44. return
  45. }
  46. messageviewmodel.messageSubmittedConnectionTimeOut.value = nil
  47. /**
  48. connection timeout
  49. */
  50. messageviewmodel.messageSubmittedConnectionTimeOut.bind { [unowned self] in
  51. guard $0 != nil else {
  52. return
  53. }
  54. self.enableUserInteractions()
  55. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  56. self.popUpMessage(value: 20)
  57. }
  58. messageviewmodel.internetConnection.value = nil
  59. messageviewmodel.internetConnection.bind { [unowned self] in
  60. guard $0 != nil else {
  61. return
  62. }
  63. self.enableUserInteractions()
  64. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  65. self.popUpMessage(value: 15)
  66. }
  67. messageviewmodel.messageSubmitted.bind { [unowned self] in
  68. guard $0 != nil else {
  69. return
  70. }
  71. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  72. self.enableUserInteractions()
  73. guard $0! else {
  74. self.popUpMessageError(value: 10, message: self.messageviewmodel.getErrorMessage())
  75. return
  76. }
  77. guard let navController = self.navigationController else {
  78. return
  79. }
  80. if let popUpViewController = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "popUpInfo") as? PopUpGeneralInfo {
  81. switch (self.supportIndex) {
  82. case 0:
  83. popUpViewController.indexValue = 18
  84. case 1:
  85. popUpViewController.indexValue = 1
  86. case 2:
  87. popUpViewController.indexValue = 2
  88. default:
  89. return
  90. }
  91. navController.addChildViewController(popUpViewController)
  92. popUpViewController.view.frame = navController.view.bounds
  93. navController.view.addSubview(popUpViewController.view)
  94. popUpViewController.didMove(toParentViewController: navController)
  95. }
  96. }
  97. textViewMessage.delegate = self
  98. switch supportIndex {
  99. case 0:
  100. textFieldControlNumber.isHidden = true
  101. textViewMessage.text = "Message"
  102. textViewMessage.textColor = UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0)
  103. constraintEditableTopMargin.constant = constraintEditableTopMargin.constant - constraintTopMargin.constant - constraintTextFieldHeight.constant
  104. messageviewmodel.setSupportType(supportType: "enquiry")
  105. case 1:
  106. textFieldControlNumber.isHidden = false
  107. textViewMessage.text = "Amendment Request"
  108. textViewMessage.textColor = UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0)
  109. messageviewmodel.setSupportType(supportType: "amendment")
  110. case 2:
  111. textFieldControlNumber.isHidden = true
  112. textViewMessage.text = "Suggestions/ Feedback"
  113. textViewMessage.textColor = UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0)
  114. constraintEditableTopMargin.constant = constraintEditableTopMargin.constant - constraintTopMargin.constant - constraintTextFieldHeight.constant
  115. messageviewmodel.setSupportType(supportType: "feedback")
  116. default:
  117. return
  118. }
  119. }
  120. @IBAction func submitMessage(_ sender: Any) {
  121. self.resignAllResponders()
  122. switch supportIndex {
  123. case 1:
  124. messageviewmodel.setParam(subject: textFieldSubject.text!, message: textViewMessage.text!, controlNumber: textFieldControlNumber.text!)
  125. case 0, 2:
  126. messageviewmodel.setParam(subject: textFieldSubject.text!, message: textViewMessage.text!, controlNumber: "")
  127. default:
  128. return
  129. }
  130. switch messageviewmodel.validateFields(supportIndex: self.supportIndex) {
  131. case .Valid:
  132. disableUserInteractions()
  133. showActivityIndicator(activityIndicator: activityIndicator)
  134. messageviewmodel.submitMessage(supportIndex: supportIndex)
  135. case .InValid(let error):
  136. self.popUpMessageError(value: 11, message: error)
  137. }
  138. }
  139. override func didReceiveMemoryWarning() {
  140. super.didReceiveMemoryWarning()
  141. // Dispose of any resources that can be recreated.
  142. }
  143. func resignAllResponders() {
  144. textFieldSubject.resignFirstResponder()
  145. textFieldControlNumber.resignFirstResponder()
  146. textViewMessage.resignFirstResponder()
  147. }
  148. }
  149. extension MessageComposeViewController: UITextViewDelegate {
  150. func textViewDidBeginEditing(_ textView: UITextView) {
  151. if textView.textColor == UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0) {
  152. textView.text = ""
  153. textView.textColor = UIColor(red:0.29, green:0.29, blue:0.29, alpha:1.0)
  154. }
  155. checkScroll()
  156. }
  157. func textViewDidEndEditing(_ textView: UITextView) {
  158. if textView.text.isEmpty {
  159. textView.textColor = UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0)
  160. switch supportIndex {
  161. case 0:
  162. textView.text = "Message"
  163. case 1:
  164. textView.text = "Amendment Request"
  165. case 2:
  166. textView.text = "Suggestions/ Feedback"
  167. default:
  168. return
  169. }
  170. }
  171. checkScroll()
  172. }
  173. }
  174. extension MessageComposeViewController: UITextFieldDelegate {
  175. func textFieldDidBeginEditing(_ textField: UITextField) {
  176. checkScroll()
  177. }
  178. func textFieldDidEndEditing(_ textField: UITextField) {
  179. checkScroll()
  180. }
  181. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  182. if textField == textFieldSubject {
  183. if self.supportIndex == 1 {
  184. textFieldControlNumber.becomeFirstResponder()
  185. } else {
  186. //textViewMessage.text = nil
  187. textViewMessage.becomeFirstResponder()
  188. }
  189. } else if textField == textFieldControlNumber {
  190. textViewMessage.becomeFirstResponder()
  191. } else {
  192. textViewMessage.resignFirstResponder()
  193. }
  194. return true
  195. }
  196. }
  197. extension MessageComposeViewController: ScrollableProtocol {
  198. var offset: CGFloat {
  199. get {
  200. return textFieldSubject.frame.origin.y - 10
  201. }
  202. }
  203. var viewScrolled: Bool {
  204. get {
  205. return isScrolled
  206. }
  207. }
  208. func checkScroll() {
  209. if !viewScrolled {
  210. performScroll(direction: 0)
  211. isScrolled = !isScrolled
  212. } else {
  213. performScroll(direction: 1)
  214. isScrolled = !isScrolled
  215. }
  216. }
  217. func registerTapListener() {
  218. let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard))
  219. view.addGestureRecognizer(tap)
  220. }
  221. @objc func clearKeyboard() {
  222. textViewMessage.resignFirstResponder()
  223. textFieldSubject.resignFirstResponder()
  224. textFieldControlNumber.resignFirstResponder()
  225. if viewScrolled {
  226. performScroll(direction: 1)
  227. isScrolled = !isScrolled
  228. }
  229. }
  230. func performScroll(direction: Int) {
  231. if direction == 0 {
  232. UIView.animate(withDuration: 0.3, animations: {
  233. self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset * -1)
  234. })
  235. } else if direction == 1 {
  236. UIView.animate(withDuration: 0.3, animations: {
  237. self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset)
  238. })
  239. }
  240. }
  241. }