|
|
// // TablePickerViewController.swift // // // Created by shishir sapkota //
import UIKit
enum PickerTitle: String { case country = "Country" case state = "Provience" case district = "District" case relation = "Relation" case transferReasons = "Transfer Reason" case bank = "Bank" case branch = "Branch" case currency = "Currency" case occupation = "Occupation" case verificationIdTypes = "Idi Type" case sourceOfFund = "Source Of Fund" }
class CountryPickerViewController: UIViewController { struct StringConstants { let searchPlaceholder = "search_country_text".localized() let cancelText = "cancel_text".localized() let titleText = "select_country_text".localized() let emptyText = "no_result_found_text".localized() } struct Constants { static let seperatorColor = "#DFDFDF" static let tintColor = UIColor.red static let gradientviewLeftColor = UIColor.init(hex: "#FF0000") static let gradientviewRightColor = UIColor.init(hex: "#9C272D") } @IBOutlet weak var titleView: UIView! @IBOutlet weak var tableVIew: UITableView! @IBOutlet weak var searchTextField: UITextField! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var noResultFoundLabel: UILabel! @IBOutlet weak var cancelButton: UIButton! @IBOutlet weak var searchStackView: UIStackView! @IBOutlet weak var searchStackViewConstraint: NSLayoutConstraint! @IBOutlet weak var mainview: UIView! var isLanguageSelection = false var data: [SendMoneyCountryViewModel] = [] var filteredPlaces: [SendMoneyCountryViewModel] = [] { didSet { self.tableVIew.reloadData() self.setNoResultText() self.filteredPlaces.isEmpty ? (self.noResultFoundLabel.isHidden = false) : (self.noResultFoundLabel.isHidden = true) } } var allowMultipleSelection = false var allowSelection = true var doneAction: (([SendMoneyCountryViewModel]) -> ())? var defaultSelectedData: [SendMoneyCountryViewModel?] = [] var searchText = "" var type: PickerTitle?
override func viewDidLoad() { super.viewDidLoad() self.setupTableView() self.addGradientView() self.setupSearchService() self.setupPlaces() self.titleView.layer.cornerRadius = 10 self.mainview.layer.cornerRadius = 10 isLanguageSelection ? (self.searchStackViewConstraint.constant = 0) : (self.searchStackViewConstraint.constant = 45) configureLanguage() // setupForAnimation() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // self.animate() } func setupForAnimation() { self.tableVIew.transform = CGAffineTransform.init(translationX: 0, y: self.view.frame.height) } func animate() { UIView.animate(withDuration: 1) { self.tableVIew.transform = CGAffineTransform.identity } guard let tableview = self.tableVIew else {return} tableview.reloadData() let cells = tableview.visibleCells let tableHeight = self.view.bounds.size.height cells.forEach({ $0.transform = CGAffineTransform(translationX: 0, y: tableHeight) }) var delayCounter = 0 cells.forEach { (cell) in UIView.animate(withDuration: 0.4, delay: (Double(delayCounter) * 0.05), usingSpringWithDamping: 0.7, initialSpringVelocity: 0, options: .curveEaseOut, animations: { cell.transform = CGAffineTransform.identity }, completion: nil) delayCounter += 1 } } private func setNoResultText() { self.noResultFoundLabel.text = StringConstants().emptyText } func configureLanguage() { // doing doind doingi setupPlaceholderText() self.cancelButton.setTitle(StringConstants().cancelText, for: .normal) setTitle() } private func setupPlaceholderText() { var text = "" guard let type = type else {return} switch type { case .bank: text = "search_bank_text".localized() case .branch: text = "search_branch_text".localized() case .country: text = "search_country_text".localized() case .currency: text = "search_currency_text".localized() case .district: text = "search_district_text".localized() case .occupation: text = "search_occupation_text".localized() case .relation: text = "search_relation_text".localized() case .sourceOfFund: text = "search_source_of_fund".localized() case .state: text = "search_province_text".localized() case .transferReasons: text = "search_transfer_reason_text".localized() case .verificationIdTypes: text = "search_text".localized() } self.searchTextField.placeholder = text } private func setTitle() { var text = "" guard let type = type else {return} switch type { case .bank: text = "select_currency_text".localized() case .branch: text = "select_branch_text".localized() case .country: text = "select_country_text".localized() case .currency: text = "search_currency_text".localized() case .district: text = "select_district_text".localized() case .occupation: text = "select_occupation_text".localized() case .relation: text = "select_relation_text".localized() case .sourceOfFund: text = "select_source_of_fund_text".localized() case .state: text = "province_placeholder_text".localized() case .transferReasons: text = "select_transfer_reason_text".localized() case .verificationIdTypes: text = "verification_id_placeholder_text".localized() } self.titleLabel.text = text.capitalized } private func setupTableView() { self.tableVIew.delegate = self self.tableVIew.dataSource = self self.tableVIew.separatorColor = UIColor.init(hex: Constants.seperatorColor) self.tableVIew.allowsMultipleSelection = self.allowMultipleSelection self.tableVIew.allowsSelection = self.allowSelection self.noResultFoundLabel.isHidden = true } private func setupPlaces() { self.filteredPlaces = self.data } private func setupSearchTextFieldUi() { let searchIconImageView = UIImageView(image: #imageLiteral(resourceName: "ic_search")) searchIconImageView.tintColor = Constants.tintColor self.searchTextField.leftView = searchIconImageView self.searchTextField.leftViewMode = .always } private func setupSearchService() { self.searchTextField.addTarget(self, action: #selector(self.search(sender:)), for: UIControlEvents.editingChanged) } private func addGradientView() {
} @objc private func search(sender: UITextField) { let searchString = sender.text! self.searchText = searchString if searchString.isEmpty { self.filteredPlaces = self.data return } self.filteredPlaces = self.data.filter({ return searchString.isEmpty || ($0.name ?? "").lowercased().contains(searchString.lowercased()) }).sorted(by: { (a, _) -> Bool in return (a.name?.lowercased() ?? "").hasPrefix(searchString.lowercased()) }) } // MARK: IBActions @IBAction func close(_ sender: Any?) { let selectedIndexPaths = self.tableVIew.indexPathsForSelectedRows ?? self.tableVIew.indexPathForSelectedRow.map({[$0]}) let selectedData = selectedIndexPaths?.compactMap { indexPath -> SendMoneyCountryViewModel? in let value = filteredPlaces.elementAt(index: indexPath.row) return value } self.doneAction?(selectedData ?? []) self.dismiss(animated: true, completion: nil) } @IBAction func clear(_ sender: Any) { self.tableVIew.indexPathsForSelectedRows?.forEach({self.tableVIew.deselectRow(at: $0, animated: true)}) self.tableVIew.indexPathForSelectedRow.map({self.tableVIew.deselectRow(at: $0, animated: true)}) self.defaultSelectedData = [] self.tableVIew.reloadData() } @IBAction func dismiss(_ sender: Any) { self.dismiss(animated: true, completion: nil) } }
extension CountryPickerViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let cell = tableView.cellForRow(at: indexPath) as! CountryPickerTableViewCell cell.selectedPlace = self.filteredPlaces.elementAt(index: indexPath.row) cell.setup() if !self.allowMultipleSelection { self.close(nil) } } func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { if let cell = tableView.cellForRow(at: indexPath) as? CountryPickerTableViewCell { cell.selectedPlace = nil cell.setup() } else { print("something happened here??") } }
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 75 } }
extension CountryPickerViewController: UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return filteredPlaces.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { return self.configureImageCell(tableView: tableView, indexPath: indexPath) } func configureImageCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell { let cell = tableVIew.dequeueReusableCell(withIdentifier: "CountryPickerTableViewCell", for: indexPath) as! CountryPickerTableViewCell if let _default = self.defaultSelectedData.first { cell.selectedPlace = _default } cell.place = self.filteredPlaces.elementAt(index: indexPath.row) cell.setup() return cell } }
|