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
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. }
  194. }
  195. // MARK: RedeemViewInterface
  196. extension RedeemViewController: RedeemViewInterface {
  197. func setModel(model: RewardProduct?) {
  198. self.model = model
  199. }
  200. func setBranches(with model: [Branch]?) {
  201. branches = model
  202. }
  203. func setBranchesError(with error: Error){
  204. alert(type: .error, message: error.localizedDescription)
  205. }
  206. func submitSuccess(){
  207. alert(
  208. type: .normal,
  209. message: "order_completed_message_text".localized(),
  210. title: "order_completed_message_title_text".localized()
  211. ){[weak self] in
  212. guard let `self` = self else {return}
  213. self.presenter?.refreshRewardPoint()
  214. }
  215. }
  216. func submitFailure(with error: Error) {
  217. alert(type: .error, message: error.localizedDescription)
  218. }
  219. func startLoading(){
  220. showProgressHud()
  221. }
  222. func endLoading(){
  223. hideProgressHud()
  224. }
  225. func failureRefreshRewardPoint(with error: Error) {
  226. alert(type: .error, message: error.localizedDescription, title: "Alert"){[weak self] in
  227. guard let `self` = self else { return }
  228. self.presenter?.goRewardHome()
  229. }
  230. }
  231. func successRefreshRewardPoint() {
  232. presenter?.goRewardHome()
  233. }
  234. }
  235. // MARK: - UIPickerViewDataSource, UIPickerViewDelegate
  236. extension RedeemViewController: UIPickerViewDataSource, UIPickerViewDelegate {
  237. func numberOfComponents(in pickerView: UIPickerView) -> Int {
  238. return 1
  239. }
  240. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
  241. return branches?.count ?? 0
  242. }
  243. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
  244. return branches?[row].agentName
  245. }
  246. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  247. selectedBranch = branches?[row]
  248. }
  249. }
  250. // MARK: - SearchAddressDelegate
  251. extension RedeemViewController: SearchAddressDelegate {
  252. func SearchAddress(viewController: SearchAddressViewController, selectedJuso: Juso) {
  253. selectedAddress = selectedJuso
  254. viewController.dismiss(animated: true, completion: nil)
  255. }
  256. }
  257. // MARK: - Other Methods
  258. extension RedeemViewController {
  259. private func setButton(){
  260. submitButton.rounded()
  261. }
  262. private func setDefaultState() {
  263. branchesView.isHidden = true
  264. addressView.isHidden = true
  265. userInfoView.isHidden = true
  266. submitButton.isHidden = true
  267. selectAddressInfoLabel.isHidden = true
  268. addressSegmentView.isHidden = true
  269. userInfoView.alpha = 0
  270. selectAddressInfoLabel.alpha = 0
  271. addressSegmentView.alpha = 0
  272. branchesView.alpha = 0
  273. addressView.alpha = 0
  274. addressTextField.layer.cornerRadius = 5
  275. branchTextField.inputView = branchesPickerView
  276. }
  277. private func setSegmentedControl() {
  278. let font = UIFont(name: "SanFranciscoDisplay-Medium", size: 14)!
  279. addressSegmentedControl.setTitleTextAttributes(
  280. [NSAttributedString.Key.font: font],
  281. for: .normal
  282. )
  283. addressSegmentedControl.addTarget(
  284. self,
  285. action: #selector(addressTypeChange(_:)),
  286. for: .valueChanged
  287. )
  288. userInfoSegmentedControl.setTitleTextAttributes(
  289. [NSAttributedString.Key.font: font],
  290. for: .normal
  291. )
  292. userInfoSegmentedControl.addTarget(
  293. self,
  294. action: #selector(userInfoChange(_:)),
  295. for: .valueChanged
  296. )
  297. }
  298. private func setOnlyBranchMode(){
  299. userNameTextField.isEnabled = false
  300. userPhoneNumberTextField.isEnabled = false
  301. userNameTextField.text = GMEDB.shared.user.string(.fullName)
  302. userPhoneNumberTextField.text = GMEDB.shared.user.string(.mobileNumber)
  303. userNameTextField.sendActions(for: .editingChanged)
  304. userPhoneNumberTextField.sendActions(for: .editingChanged)
  305. branchTextField.inputView = branchesPickerView
  306. }
  307. private func setMultiLanguage(){
  308. receiverTitleLabel.text = "receiver_text".localized()
  309. phoneNumberTitleLabel.text = "mobile_number_text".localized()
  310. selectAddressInfoLabel.text = "select_branch_for_redeem_your_reward_text".localized()
  311. branchTextField.placeholder = "select_branch_text".localized()
  312. branchInfotmationTitleLabel.text = "you_visit_nearest_gme_branch_to_redeem_text".localized()
  313. selectInformationLabel.text = "selected_product_message_text".localized()
  314. submitButton.setTitle("submit_text".localized(), for: .normal)
  315. }
  316. @objc
  317. private func addressTypeChange(_ sender: UISegmentedControl) {
  318. selectedAddressType = AddressType(rawValue: sender.selectedSegmentIndex) ?? .branch
  319. }
  320. @objc
  321. private func userInfoChange(_ sender: UISegmentedControl) {
  322. selectedUserType = UserType(rawValue: sender.selectedSegmentIndex) ?? .user
  323. }
  324. @objc
  325. private func editingChanged(_ textField: UITextField){
  326. guard
  327. let name = userNameTextField.text,
  328. let phoneNumber = userPhoneNumberTextField.text,
  329. let branch = branchTextField.text,
  330. let detail = detailAddressTextField.text,
  331. let address = addressTextField.text else { return }
  332. var isValid = name.count > 0 && phoneNumber.count > 0
  333. switch selectedAddressType {
  334. case .branch:
  335. isValid = isValid && branch.count > 0
  336. case .custom:
  337. isValid = isValid && address.count > 0 && detail.count > 0
  338. }
  339. submitButton.isEnabled = isValid
  340. submitButton.backgroundColor = isValid ? AppConstants.themeRedColor : .lightGray
  341. }
  342. @objc private func moveToBottom(){
  343. if scrollView.contentSize.height - scrollView.bounds.size.height > 0 {
  344. let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
  345. scrollView.setContentOffset(bottomOffset, animated: true)
  346. }
  347. }
  348. }
  349. // MARK: - ConfirmViewControllerDelegate
  350. extension RedeemViewController: ConfirmViewControllerDelegate {
  351. func confirm(_ viewController: ConfirmViewController) {
  352. let recvType = selectedAddressType == .custom ? "1" : "2"
  353. let address = "\(detailAddressTextField.text ?? ""), \(addressTextField.text ?? "")"
  354. ordered = Redeem(
  355. userID: GMEDB.shared.user.string(.email),
  356. productCode: model?.productCode,
  357. usePoint: model?.pointPrice,
  358. orderType: "1",
  359. recvType: recvType,
  360. branchCode: selectedBranch?.agentID,
  361. recvAddress: address,
  362. recvZipCode: selectedAddress?.zipNo,
  363. recvPhoneNumber: userPhoneNumberTextField.text,
  364. recvName: userNameTextField.text
  365. )
  366. presenter?.submit(with: ordered)
  367. }
  368. func cancel(_ viewController: ConfirmViewController) {
  369. }
  370. }
  371. // MARK: - UIGestureRecognizerDelegate
  372. extension RedeemViewController: UIGestureRecognizerDelegate {
  373. func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
  374. return true
  375. }
  376. }