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.

495 lines
14 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. //
  2. // RedeemViewController.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon Devik Kim on 11/04/2019.
  6. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import Kingfisher
  10. class RedeemViewController: UIViewController {
  11. // MARK: Properties
  12. var presenter: RedeemModuleInterface?
  13. private var model: RewardProduct? {
  14. didSet {
  15. if let imageData = model?.productImgPath,
  16. let url = URL(string: imageData) {
  17. selectedItemImageView.kf.setImage(with: url)
  18. }
  19. guard
  20. let selectedItemName = model?.productName,
  21. let selectedItemPoint = model?.pointPrice?.likeCommaMoney() else {
  22. return
  23. }
  24. let message = "selected_product_message_text"
  25. .localized()
  26. .replacingOccurrences(of: "xxx", with: selectedItemName)
  27. .replacingOccurrences(of: "ooo", with: selectedItemPoint)
  28. selectInformationLabel.text = message
  29. }
  30. }
  31. private var ordered: Redeem?
  32. private enum AddressType: Int {
  33. case branch = 0
  34. case custom
  35. }
  36. private enum UserType: Int {
  37. case user
  38. case custom
  39. }
  40. private var selectedUserType = UserType.user {
  41. didSet {
  42. let name: String?
  43. let phoneNumber: String?
  44. let isEnable: Bool
  45. switch selectedUserType {
  46. case .user:
  47. isEnable = false
  48. name = GMEDB.shared.user.string(.fullName)
  49. phoneNumber = GMEDB.shared.user.string(.mobileNumber)
  50. case .custom:
  51. isEnable = true
  52. name = ""
  53. phoneNumber = ""
  54. }
  55. userNameTextField.isEnabled = isEnable
  56. userPhoneNumberTextField.isEnabled = isEnable
  57. userNameTextField.text = name
  58. userPhoneNumberTextField.text = phoneNumber
  59. userNameTextField.sendActions(for: .editingChanged)
  60. userPhoneNumberTextField.sendActions(for: .editingChanged)
  61. userInfoView.isHidden = false
  62. selectAddressInfoLabel.isHidden = false
  63. addressSegmentView.isHidden = false
  64. UIView.animate(withDuration: 0.3, animations: {[weak self] in
  65. guard let `self` = self else { return }
  66. self.userInfoView.alpha = 1
  67. self.selectAddressInfoLabel.alpha = 1
  68. self.addressSegmentView.alpha = 1
  69. }, completion: nil)
  70. }
  71. }
  72. private var selectedAddressType = AddressType.branch {
  73. didSet {
  74. switch selectedAddressType {
  75. case .branch:
  76. selectedAddress = nil
  77. detailAddressTextField.text = ""
  78. branchesView.isHidden = false
  79. addressView.isHidden = true
  80. UIView.animate(withDuration: 0.3, animations: { [weak self] in
  81. guard let `self` = self else {return}
  82. self.branchesView.alpha = 1
  83. self.addressView.alpha = 0
  84. }, completion: nil)
  85. case .custom:
  86. selectedBranch = nil
  87. branchesView.isHidden = true
  88. addressView.isHidden = false
  89. UIView.animate(withDuration: 0.3, animations: {[weak self] in
  90. guard let `self` = self else {return}
  91. self.branchesView.alpha = 0
  92. self.addressView.alpha = 1
  93. }, completion: nil)
  94. }
  95. submitButton.isHidden = false
  96. perform(#selector(self.moveToBottom), with: nil, afterDelay: 0.3)
  97. }
  98. }
  99. private var selectedBranch: Branch? {
  100. didSet {
  101. branchTextField.text = selectedBranch?.agentName
  102. branchTextField.sendActions(for: .editingChanged)
  103. }
  104. }
  105. private var selectedAddress: Juso? {
  106. didSet {
  107. zipcodeTextField.text = selectedAddress?.zipNo
  108. addressTextField.text = selectedAddress?.roadAddr
  109. detailAddressTextField.sendActions(for: .editingChanged)
  110. }
  111. }
  112. private lazy var branchesPickerView = UIPickerView()
  113. private var branches: [Branch]?
  114. // MARK: IBOutlets
  115. @IBOutlet private weak var selectedItemInfoView: UIView!
  116. @IBOutlet private weak var selectedItemImageView: UIImageView!
  117. @IBOutlet private weak var selectInformationLabel: UILabel!
  118. @IBOutlet private weak var userInfoSegmentedControl: UISegmentedControl!
  119. @IBOutlet private weak var addressSegmentedControl: UISegmentedControl!
  120. @IBOutlet private weak var userNameTextField: UITextField!
  121. @IBOutlet private weak var userPhoneNumberTextField: UITextField!
  122. @IBOutlet private weak var branchTextField: UITextField!
  123. @IBOutlet private weak var detailAddressTextField: UITextField!
  124. @IBOutlet private weak var addressTextField: UITextField!
  125. @IBOutlet private weak var zipcodeTextField: UITextField!
  126. @IBOutlet private weak var submitButton: UIButton!
  127. @IBOutlet private weak var searchButton: UIButton!
  128. @IBOutlet private weak var branchesView: UIStackView!
  129. @IBOutlet private weak var addressView: UIStackView!
  130. @IBOutlet private weak var userInfoView: UIStackView!
  131. @IBOutlet private weak var selectAddressInfoLabel: UILabel!
  132. @IBOutlet private weak var addressSegmentView: UIView!
  133. @IBOutlet private weak var scrollView: UIScrollView!
  134. @IBOutlet weak var receiverTitleLabel: UILabel!
  135. @IBOutlet weak var phoneNumberTitleLabel: UILabel!
  136. @IBOutlet weak var branchInfotmationTitleLabel: UILabel!
  137. // MARK: VC's Life cycle
  138. override func viewDidLoad() {
  139. super.viewDidLoad()
  140. setup()
  141. presenter?.viewIsReady()
  142. presenter?.fetchBranches()
  143. }
  144. override func viewWillAppear(_ animated: Bool) {
  145. super.viewWillAppear(animated)
  146. title = "reward_group_title_text".localized()
  147. }
  148. override func viewWillDisappear(_ animated: Bool) {
  149. super.viewWillDisappear(animated)
  150. title = ""
  151. }
  152. // MARK: IBActions
  153. @IBAction
  154. private func cancelButtonTouch(_ sender: UIBarButtonItem) {
  155. dismiss(animated: true, completion: nil)
  156. }
  157. @IBAction
  158. private func touchSearchAddressButton(_ sender: UIButton) {
  159. presenter?.showSearchAddressVC()
  160. }
  161. @IBAction
  162. private func touchBranches(_ sender: UIButton) {
  163. presenter?.showBranchesVC()
  164. }
  165. @IBAction
  166. private func touchSubmitButton(_ sender: UIButton) {
  167. let address = "\(detailAddressTextField.text ?? ""), \(addressTextField.text ?? "")"
  168. let confirmVC = ConfirmViewController(nibName: "ConfirmViewController", bundle: nil)
  169. var configure = ConfirmViewControllerConfiguration()
  170. configure.content1 = userNameTextField.text
  171. configure.content2 = userPhoneNumberTextField.text
  172. configure.multiLineContent = (selectedAddressType == .custom) ? address : selectedBranch?.agentName
  173. confirmVC.setConfigure(with: configure)
  174. confirmVC.delegate = self
  175. present(confirmVC, animated: true, completion: nil)
  176. }
  177. // MARK: Other Functions
  178. private func setup() {
  179. // all setup should be done here
  180. branchesPickerView.delegate = self
  181. branchesPickerView.dataSource = self
  182. userNameTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged)
  183. userPhoneNumberTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged)
  184. branchTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged)
  185. detailAddressTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged)
  186. setButton()
  187. setSegmentedControl()
  188. // self.setDefaultState()
  189. setOnlyBranchMode()
  190. setMultiLanguage()
  191. navigationController?.interactivePopGestureRecognizer?.delegate = self
  192. navigationController?.interactivePopGestureRecognizer?.isEnabled = true
  193. branchInfotmationTitleLabel.textColor = .themeRed
  194. }
  195. }
  196. // MARK: RedeemViewInterface
  197. extension RedeemViewController: RedeemViewInterface {
  198. func setModel(model: RewardProduct?) {
  199. self.model = model
  200. }
  201. func setBranches(with model: [Branch]?) {
  202. branches = model
  203. }
  204. func setBranchesError(with error: Error) {
  205. alert(type: .error, message: error.localizedDescription)
  206. }
  207. func submitSuccess() {
  208. alert(
  209. type: .normal,
  210. message: "order_completed_message_text".localized(),
  211. title: "order_completed_message_title_text".localized()
  212. ) {[weak self] in
  213. guard let `self` = self else {return}
  214. self.presenter?.refreshRewardPoint()
  215. }
  216. }
  217. func submitFailure(with error: Error) {
  218. alert(type: .error, message: error.localizedDescription)
  219. }
  220. func startLoading() {
  221. showProgressHud()
  222. }
  223. func endLoading() {
  224. hideProgressHud()
  225. }
  226. func failureRefreshRewardPoint(with error: Error) {
  227. alert(type: .error, message: error.localizedDescription, title: "Alert") {[weak self] in
  228. guard let `self` = self else { return }
  229. self.presenter?.goRewardHome()
  230. }
  231. }
  232. func successRefreshRewardPoint() {
  233. presenter?.goRewardHome()
  234. }
  235. }
  236. // MARK: - UIPickerViewDataSource, UIPickerViewDelegate
  237. extension RedeemViewController: UIPickerViewDataSource, UIPickerViewDelegate {
  238. func numberOfComponents(in pickerView: UIPickerView) -> Int {
  239. return 1
  240. }
  241. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
  242. return branches?.count ?? 0
  243. }
  244. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
  245. return branches?[row].agentName
  246. }
  247. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  248. selectedBranch = branches?[row]
  249. }
  250. }
  251. // MARK: - SearchAddressDelegate
  252. extension RedeemViewController: SearchAddressDelegate {
  253. func searchAddress(viewController: SearchAddressViewController, selectedJuso: Juso) {
  254. selectedAddress = selectedJuso
  255. viewController.dismiss(animated: true, completion: nil)
  256. }
  257. }
  258. // MARK: - Other Methods
  259. extension RedeemViewController {
  260. private func setButton() {
  261. submitButton.layer.cornerRadius = 5
  262. }
  263. private func setDefaultState() {
  264. branchesView.isHidden = true
  265. addressView.isHidden = true
  266. userInfoView.isHidden = true
  267. submitButton.isHidden = true
  268. selectAddressInfoLabel.isHidden = true
  269. addressSegmentView.isHidden = true
  270. userInfoView.alpha = 0
  271. selectAddressInfoLabel.alpha = 0
  272. addressSegmentView.alpha = 0
  273. branchesView.alpha = 0
  274. addressView.alpha = 0
  275. addressTextField.layer.cornerRadius = 5
  276. branchTextField.inputView = branchesPickerView
  277. }
  278. private func setSegmentedControl() {
  279. let font = UIFont.sanfrancisco(.medium, size: 14)
  280. addressSegmentedControl.setTitleTextAttributes(
  281. [NSAttributedString.Key.font: font],
  282. for: .normal
  283. )
  284. addressSegmentedControl.addTarget(
  285. self,
  286. action: #selector(addressTypeChange(_:)),
  287. for: .valueChanged
  288. )
  289. userInfoSegmentedControl.setTitleTextAttributes(
  290. [NSAttributedString.Key.font: font],
  291. for: .normal
  292. )
  293. userInfoSegmentedControl.addTarget(
  294. self,
  295. action: #selector(userInfoChange(_:)),
  296. for: .valueChanged
  297. )
  298. }
  299. private func setOnlyBranchMode() {
  300. userNameTextField.isEnabled = false
  301. userPhoneNumberTextField.isEnabled = false
  302. userNameTextField.text = GMEDB.shared.user.string(.fullName)
  303. userPhoneNumberTextField.text = GMEDB.shared.user.string(.mobileNumber)
  304. userNameTextField.sendActions(for: .editingChanged)
  305. userPhoneNumberTextField.sendActions(for: .editingChanged)
  306. branchTextField.inputView = branchesPickerView
  307. }
  308. private func setMultiLanguage() {
  309. receiverTitleLabel.text = "receiver_text".localized()
  310. phoneNumberTitleLabel.text = "mobile_number_text".localized()
  311. selectAddressInfoLabel.text = "select_branch_for_redeem_your_reward_text".localized()
  312. branchTextField.placeholder = "select_branch_text".localized()
  313. branchInfotmationTitleLabel.text = "you_visit_nearest_gme_branch_to_redeem_text".localized()
  314. selectInformationLabel.text = "selected_product_message_text".localized()
  315. submitButton.setTitle("submit_text".localized(), for: .normal)
  316. }
  317. @objc
  318. private func addressTypeChange(_ sender: UISegmentedControl) {
  319. selectedAddressType = AddressType(rawValue: sender.selectedSegmentIndex) ?? .branch
  320. }
  321. @objc
  322. private func userInfoChange(_ sender: UISegmentedControl) {
  323. selectedUserType = UserType(rawValue: sender.selectedSegmentIndex) ?? .user
  324. }
  325. @objc
  326. private func editingChanged(_ textField: UITextField) {
  327. guard
  328. let name = userNameTextField.text,
  329. let phoneNumber = userPhoneNumberTextField.text,
  330. let branch = branchTextField.text,
  331. let detail = detailAddressTextField.text,
  332. let address = addressTextField.text else { return }
  333. var isValid = name.count > 0 && phoneNumber.count > 0
  334. switch selectedAddressType {
  335. case .branch:
  336. isValid = isValid && branch.count > 0
  337. case .custom:
  338. isValid = isValid && address.count > 0 && detail.count > 0
  339. }
  340. submitButton.isEnabled = isValid
  341. submitButton.backgroundColor = isValid ? .themeRed : .lightGray
  342. }
  343. @objc private func moveToBottom() {
  344. if scrollView.contentSize.height - scrollView.bounds.size.height > 0 {
  345. let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
  346. scrollView.setContentOffset(bottomOffset, animated: true)
  347. }
  348. }
  349. }
  350. // MARK: - ConfirmViewControllerDelegate
  351. extension RedeemViewController: ConfirmViewControllerDelegate {
  352. func confirm(_ viewController: ConfirmViewController) {
  353. let recvType = selectedAddressType == .custom ? "1" : "2"
  354. let address = "\(detailAddressTextField.text ?? ""), \(addressTextField.text ?? "")"
  355. ordered = Redeem(
  356. userID: GMEDB.shared.user.string(.userId),
  357. productCode: model?.productCode,
  358. usePoint: model?.pointPrice,
  359. orderType: "1",
  360. recvType: recvType,
  361. branchCode: selectedBranch?.agentID,
  362. recvAddress: address,
  363. recvZipCode: selectedAddress?.zipNo,
  364. recvPhoneNumber: userPhoneNumberTextField.text,
  365. recvName: userNameTextField.text
  366. )
  367. presenter?.submit(with: ordered)
  368. }
  369. func cancel(_ viewController: ConfirmViewController) {
  370. }
  371. }
  372. // MARK: - UIGestureRecognizerDelegate
  373. extension RedeemViewController: UIGestureRecognizerDelegate {
  374. func gestureRecognizer(
  375. _ gestureRecognizer: UIGestureRecognizer,
  376. shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer
  377. ) -> Bool {
  378. return true
  379. }
  380. }