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

//
// 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
}
}