// // RedeemViewController.swift // GME Remit // // Created by InKwon Devik Kim on 11/04/2019. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import Kingfisher class RedeemViewController: UIViewController { // MARK: Properties var presenter: RedeemModuleInterface? private var model: RewardProduct? { didSet { if let imageData = model?.productImgPath, let url = URL(string: imageData) { selectedItemImageView.kf.setImage(with: url) } guard let selectedItemName = model?.productName, let selectedItemPoint = model?.pointPrice?.likeCommaMoney() else { return } let message = "selected_product_message_text" .localized() .replacingOccurrences(of: "xxx", with: selectedItemName) .replacingOccurrences(of: "ooo", with: selectedItemPoint) selectInformationLabel.text = message } } private var ordered: Redeem? private enum AddressType: Int { case branch = 0 case custom } private enum UserType: Int { case user case custom } private var selectedUserType = UserType.user { didSet { let name: String? let phoneNumber: String? let isEnable: Bool switch selectedUserType { case .user: isEnable = false name = GMEDB.shared.user.string(.fullName) phoneNumber = GMEDB.shared.user.string(.mobileNumber) case .custom: isEnable = true name = "" phoneNumber = "" } userNameTextField.isEnabled = isEnable userPhoneNumberTextField.isEnabled = isEnable userNameTextField.text = name userPhoneNumberTextField.text = phoneNumber userNameTextField.sendActions(for: .editingChanged) userPhoneNumberTextField.sendActions(for: .editingChanged) userInfoView.isHidden = false selectAddressInfoLabel.isHidden = false addressSegmentView.isHidden = false UIView.animate(withDuration: 0.3, animations: {[weak self] in guard let `self` = self else { return } self.userInfoView.alpha = 1 self.selectAddressInfoLabel.alpha = 1 self.addressSegmentView.alpha = 1 }, completion: nil) } } private var selectedAddressType = AddressType.branch { didSet { switch selectedAddressType { case .branch: selectedAddress = nil detailAddressTextField.text = "" branchesView.isHidden = false addressView.isHidden = true UIView.animate(withDuration: 0.3, animations: { [weak self] in guard let `self` = self else {return} self.branchesView.alpha = 1 self.addressView.alpha = 0 }, completion: nil) case .custom: selectedBranch = nil branchesView.isHidden = true addressView.isHidden = false UIView.animate(withDuration: 0.3, animations: {[weak self] in guard let `self` = self else {return} self.branchesView.alpha = 0 self.addressView.alpha = 1 }, completion: nil) } submitButton.isHidden = false perform(#selector(self.moveToBottom), with: nil, afterDelay: 0.3) } } private var selectedBranch: Branch? { didSet { branchTextField.text = selectedBranch?.agentName branchTextField.sendActions(for: .editingChanged) } } private var selectedAddress: Juso? { didSet { zipcodeTextField.text = selectedAddress?.zipNo addressTextField.text = selectedAddress?.roadAddr detailAddressTextField.sendActions(for: .editingChanged) } } private lazy var branchesPickerView = UIPickerView() private var branches: [Branch]? // MARK: IBOutlets @IBOutlet private weak var selectedItemInfoView: UIView! @IBOutlet private weak var selectedItemImageView: UIImageView! @IBOutlet private weak var selectInformationLabel: UILabel! @IBOutlet private weak var userInfoSegmentedControl: UISegmentedControl! @IBOutlet private weak var addressSegmentedControl: UISegmentedControl! @IBOutlet private weak var userNameTextField: UITextField! @IBOutlet private weak var userPhoneNumberTextField: UITextField! @IBOutlet private weak var branchTextField: UITextField! @IBOutlet private weak var detailAddressTextField: UITextField! @IBOutlet private weak var addressTextField: UITextField! @IBOutlet private weak var zipcodeTextField: UITextField! @IBOutlet private weak var submitButton: UIButton! @IBOutlet private weak var searchButton: UIButton! @IBOutlet private weak var branchesView: UIStackView! @IBOutlet private weak var addressView: UIStackView! @IBOutlet private weak var userInfoView: UIStackView! @IBOutlet private weak var selectAddressInfoLabel: UILabel! @IBOutlet private weak var addressSegmentView: UIView! @IBOutlet private weak var scrollView: UIScrollView! @IBOutlet weak var receiverTitleLabel: UILabel! @IBOutlet weak var phoneNumberTitleLabel: UILabel! @IBOutlet weak var branchInfotmationTitleLabel: UILabel! // MARK: VC's Life cycle override func viewDidLoad() { super.viewDidLoad() setup() presenter?.viewIsReady() presenter?.fetchBranches() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) title = "reward_group_title_text".localized() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) title = "" } // MARK: IBActions @IBAction private func cancelButtonTouch(_ sender: UIBarButtonItem) { dismiss(animated: true, completion: nil) } @IBAction private func touchSearchAddressButton(_ sender: UIButton) { presenter?.showSearchAddressVC() } @IBAction private func touchBranches(_ sender: UIButton) { presenter?.showBranchesVC() } @IBAction private func touchSubmitButton(_ sender: UIButton) { let address = "\(detailAddressTextField.text ?? ""), \(addressTextField.text ?? "")" let confirmVC = ConfirmViewController(nibName: "ConfirmViewController", bundle: nil) var configure = ConfirmViewControllerConfiguration() configure.content1 = userNameTextField.text configure.content2 = userPhoneNumberTextField.text configure.multiLineContent = (selectedAddressType == .custom) ? address : selectedBranch?.agentName confirmVC.setConfigure(with: configure) confirmVC.delegate = self present(confirmVC, animated: true, completion: nil) } // MARK: Other Functions private func setup() { // all setup should be done here branchesPickerView.delegate = self branchesPickerView.dataSource = self userNameTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) userPhoneNumberTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) branchTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) detailAddressTextField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) setButton() setSegmentedControl() // self.setDefaultState() setOnlyBranchMode() setMultiLanguage() navigationController?.interactivePopGestureRecognizer?.delegate = self navigationController?.interactivePopGestureRecognizer?.isEnabled = true branchInfotmationTitleLabel.textColor = .themeRed } } // MARK: RedeemViewInterface extension RedeemViewController: RedeemViewInterface { func setModel(model: RewardProduct?) { self.model = model } func setBranches(with model: [Branch]?) { branches = model } func setBranchesError(with error: Error) { alert(type: .error, message: error.localizedDescription) } func submitSuccess() { alert( type: .normal, message: "order_completed_message_text".localized(), title: "order_completed_message_title_text".localized() ) {[weak self] in guard let `self` = self else {return} self.presenter?.refreshRewardPoint() } } func submitFailure(with error: Error) { alert(type: .error, message: error.localizedDescription) } func startLoading() { showProgressHud() } func endLoading() { hideProgressHud() } func failureRefreshRewardPoint(with error: Error) { alert(type: .error, message: error.localizedDescription, title: "Alert") {[weak self] in guard let `self` = self else { return } self.presenter?.goRewardHome() } } func successRefreshRewardPoint() { presenter?.goRewardHome() } } // MARK: - UIPickerViewDataSource, UIPickerViewDelegate extension RedeemViewController: UIPickerViewDataSource, UIPickerViewDelegate { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return branches?.count ?? 0 } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return branches?[row].agentName } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { selectedBranch = branches?[row] } } // MARK: - SearchAddressDelegate extension RedeemViewController: SearchAddressDelegate { func searchAddress(viewController: SearchAddressViewController, selectedJuso: Juso) { selectedAddress = selectedJuso viewController.dismiss(animated: true, completion: nil) } } // MARK: - Other Methods extension RedeemViewController { private func setButton() { submitButton.layer.cornerRadius = 5 } private func setDefaultState() { branchesView.isHidden = true addressView.isHidden = true userInfoView.isHidden = true submitButton.isHidden = true selectAddressInfoLabel.isHidden = true addressSegmentView.isHidden = true userInfoView.alpha = 0 selectAddressInfoLabel.alpha = 0 addressSegmentView.alpha = 0 branchesView.alpha = 0 addressView.alpha = 0 addressTextField.layer.cornerRadius = 5 branchTextField.inputView = branchesPickerView } private func setSegmentedControl() { let font = UIFont.sanfrancisco(.medium, size: 14) addressSegmentedControl.setTitleTextAttributes( [NSAttributedString.Key.font: font], for: .normal ) addressSegmentedControl.addTarget( self, action: #selector(addressTypeChange(_:)), for: .valueChanged ) userInfoSegmentedControl.setTitleTextAttributes( [NSAttributedString.Key.font: font], for: .normal ) userInfoSegmentedControl.addTarget( self, action: #selector(userInfoChange(_:)), for: .valueChanged ) } private func setOnlyBranchMode() { userNameTextField.isEnabled = false userPhoneNumberTextField.isEnabled = false userNameTextField.text = GMEDB.shared.user.string(.fullName) userPhoneNumberTextField.text = GMEDB.shared.user.string(.mobileNumber) userNameTextField.sendActions(for: .editingChanged) userPhoneNumberTextField.sendActions(for: .editingChanged) branchTextField.inputView = branchesPickerView } private func setMultiLanguage() { receiverTitleLabel.text = "receiver_text".localized() phoneNumberTitleLabel.text = "mobile_number_text".localized() selectAddressInfoLabel.text = "select_branch_for_redeem_your_reward_text".localized() branchTextField.placeholder = "select_branch_text".localized() branchInfotmationTitleLabel.text = "you_visit_nearest_gme_branch_to_redeem_text".localized() selectInformationLabel.text = "selected_product_message_text".localized() submitButton.setTitle("submit_text".localized(), for: .normal) } @objc private func addressTypeChange(_ sender: UISegmentedControl) { selectedAddressType = AddressType(rawValue: sender.selectedSegmentIndex) ?? .branch } @objc private func userInfoChange(_ sender: UISegmentedControl) { selectedUserType = UserType(rawValue: sender.selectedSegmentIndex) ?? .user } @objc private func editingChanged(_ textField: UITextField) { guard let name = userNameTextField.text, let phoneNumber = userPhoneNumberTextField.text, let branch = branchTextField.text, let detail = detailAddressTextField.text, let address = addressTextField.text else { return } var isValid = name.count > 0 && phoneNumber.count > 0 switch selectedAddressType { case .branch: isValid = isValid && branch.count > 0 case .custom: isValid = isValid && address.count > 0 && detail.count > 0 } submitButton.isEnabled = isValid submitButton.backgroundColor = isValid ? .themeRed : .lightGray } @objc private func moveToBottom() { if scrollView.contentSize.height - scrollView.bounds.size.height > 0 { let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height) scrollView.setContentOffset(bottomOffset, animated: true) } } } // MARK: - ConfirmViewControllerDelegate extension RedeemViewController: ConfirmViewControllerDelegate { func confirm(_ viewController: ConfirmViewController) { let recvType = selectedAddressType == .custom ? "1" : "2" let address = "\(detailAddressTextField.text ?? ""), \(addressTextField.text ?? "")" ordered = Redeem( userID: GMEDB.shared.user.string(.userId), productCode: model?.productCode, usePoint: model?.pointPrice, orderType: "1", recvType: recvType, branchCode: selectedBranch?.agentID, recvAddress: address, recvZipCode: selectedAddress?.zipNo, recvPhoneNumber: userPhoneNumberTextField.text, recvName: userNameTextField.text ) presenter?.submit(with: ordered) } func cancel(_ viewController: ConfirmViewController) { } } // MARK: - UIGestureRecognizerDelegate extension RedeemViewController: UIGestureRecognizerDelegate { func gestureRecognizer( _ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer ) -> Bool { return true } }