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.

310 lines
10 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // TablePickerViewController.swift
  3. //
  4. //
  5. // Created by shishir sapkota
  6. //
  7. import UIKit
  8. enum PickerTitle: String {
  9. case country = "Country"
  10. case state = "Provience"
  11. case district = "District"
  12. case relation = "Relation"
  13. case transferReasons = "Transfer Reason"
  14. case bank = "Bank"
  15. case branch = "Branch"
  16. case currency = "Currency"
  17. case occupation = "Occupation"
  18. case verificationIdTypes = "Idi Type"
  19. case sourceOfFund = "Source Of Fund"
  20. }
  21. class CountryPickerViewController: UIViewController {
  22. struct StringConstants {
  23. let searchPlaceholder = "search_country_text".localized()
  24. let cancelText = "cancel_text".localized()
  25. let titleText = "select_country_text".localized()
  26. let emptyText = "no_result_found_text".localized()
  27. }
  28. struct Constants {
  29. static let seperatorColor = "#DFDFDF"
  30. static let tintColor = UIColor.red
  31. static let gradientviewLeftColor = UIColor.init(hex: "#FF0000")
  32. static let gradientviewRightColor = UIColor.init(hex: "#9C272D")
  33. }
  34. @IBOutlet weak var titleView: UIView!
  35. @IBOutlet weak var tableVIew: UITableView!
  36. @IBOutlet weak var searchTextField: UITextField!
  37. @IBOutlet weak var titleLabel: UILabel!
  38. @IBOutlet weak var noResultFoundLabel: UILabel!
  39. @IBOutlet weak var cancelButton: UIButton!
  40. @IBOutlet weak var searchStackView: UIStackView!
  41. @IBOutlet weak var searchStackViewConstraint: NSLayoutConstraint!
  42. @IBOutlet weak var mainview: UIView!
  43. var isLanguageSelection = false
  44. var data: [SendMoneyCountryViewModel] = []
  45. var filteredPlaces: [SendMoneyCountryViewModel] = [] {
  46. didSet {
  47. self.tableVIew.reloadData()
  48. self.setNoResultText()
  49. self.filteredPlaces.isEmpty ? (self.noResultFoundLabel.isHidden = false) : (self.noResultFoundLabel.isHidden = true)
  50. }
  51. }
  52. var allowMultipleSelection = false
  53. var allowSelection = true
  54. var doneAction: (([SendMoneyCountryViewModel]) -> ())?
  55. var defaultSelectedData: [SendMoneyCountryViewModel?] = []
  56. var searchText = ""
  57. var type: PickerTitle?
  58. override func viewDidLoad() {
  59. super.viewDidLoad()
  60. self.setupTableView()
  61. self.addGradientView()
  62. self.setupSearchService()
  63. self.setupPlaces()
  64. self.titleView.layer.cornerRadius = 10
  65. self.mainview.layer.cornerRadius = 10
  66. isLanguageSelection ? (self.searchStackViewConstraint.constant = 0) : (self.searchStackViewConstraint.constant = 45)
  67. configureLanguage()
  68. // setupForAnimation()
  69. }
  70. override func viewWillAppear(_ animated: Bool) {
  71. super.viewWillAppear(animated)
  72. // self.animate()
  73. }
  74. func setupForAnimation() {
  75. self.tableVIew.transform = CGAffineTransform.init(translationX: 0, y: self.view.frame.height)
  76. }
  77. func animate() {
  78. UIView.animate(withDuration: 1) {
  79. self.tableVIew.transform = CGAffineTransform.identity
  80. }
  81. guard let tableview = self.tableVIew else {return}
  82. tableview.reloadData()
  83. let cells = tableview.visibleCells
  84. let tableHeight = self.view.bounds.size.height
  85. cells.forEach({
  86. $0.transform = CGAffineTransform(translationX: 0, y: tableHeight)
  87. })
  88. var delayCounter = 0
  89. cells.forEach { (cell) in
  90. UIView.animate(withDuration: 0.4, delay: (Double(delayCounter) * 0.05), usingSpringWithDamping: 0.7, initialSpringVelocity: 0, options: .curveEaseOut, animations: {
  91. cell.transform = CGAffineTransform.identity
  92. }, completion: nil)
  93. delayCounter += 1
  94. }
  95. }
  96. private func setNoResultText() {
  97. self.noResultFoundLabel.text = StringConstants().emptyText
  98. }
  99. func configureLanguage() {
  100. // doing doind doingi
  101. setupPlaceholderText()
  102. self.cancelButton.setTitle(StringConstants().cancelText, for: .normal)
  103. setTitle()
  104. }
  105. private func setupPlaceholderText() {
  106. var text = ""
  107. guard let type = type else {return}
  108. switch type {
  109. case .bank:
  110. text = "search_bank_text".localized()
  111. case .branch:
  112. text = "search_branch_text".localized()
  113. case .country:
  114. text = "search_country_text".localized()
  115. case .currency:
  116. text = "search_currency_text".localized()
  117. case .district:
  118. text = "search_district_text".localized()
  119. case .occupation:
  120. text = "search_occupation_text".localized()
  121. case .relation:
  122. text = "search_relation_text".localized()
  123. case .sourceOfFund:
  124. text = "search_source_of_fund".localized()
  125. case .state:
  126. text = "search_province_text".localized()
  127. case .transferReasons:
  128. text = "search_transfer_reason_text".localized()
  129. case .verificationIdTypes:
  130. text = "search_text".localized()
  131. }
  132. self.searchTextField.placeholder = text
  133. }
  134. private func setTitle() {
  135. var text = ""
  136. guard let type = type else {return}
  137. switch type {
  138. case .bank:
  139. text = "select_currency_text".localized()
  140. case .branch:
  141. text = "select_branch_text".localized()
  142. case .country:
  143. text = "select_country_text".localized()
  144. case .currency:
  145. text = "search_currency_text".localized()
  146. case .district:
  147. text = "select_district_text".localized()
  148. case .occupation:
  149. text = "select_occupation_text".localized()
  150. case .relation:
  151. text = "select_relation_text".localized()
  152. case .sourceOfFund:
  153. text = "select_source_of_fund_text".localized()
  154. case .state:
  155. text = "province_placeholder_text".localized()
  156. case .transferReasons:
  157. text = "select_transfer_reason_text".localized()
  158. case .verificationIdTypes:
  159. text = "verification_id_placeholder_text".localized()
  160. }
  161. self.titleLabel.text = text.capitalized
  162. }
  163. private func setupTableView() {
  164. self.tableVIew.delegate = self
  165. self.tableVIew.dataSource = self
  166. self.tableVIew.separatorColor = UIColor.init(hex: Constants.seperatorColor)
  167. self.tableVIew.allowsMultipleSelection = self.allowMultipleSelection
  168. self.tableVIew.allowsSelection = self.allowSelection
  169. self.noResultFoundLabel.isHidden = true
  170. }
  171. private func setupPlaces() {
  172. self.filteredPlaces = self.data
  173. }
  174. private func setupSearchTextFieldUi() {
  175. let searchIconImageView = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
  176. searchIconImageView.tintColor = Constants.tintColor
  177. self.searchTextField.leftView = searchIconImageView
  178. self.searchTextField.leftViewMode = .always
  179. }
  180. private func setupSearchService() {
  181. self.searchTextField.addTarget(self, action: #selector(self.search(sender:)), for: UIControlEvents.editingChanged)
  182. }
  183. private func addGradientView() {
  184. }
  185. @objc private func search(sender: UITextField) {
  186. let searchString = sender.text!
  187. self.searchText = searchString
  188. if searchString.isEmpty {
  189. self.filteredPlaces = self.data
  190. return
  191. }
  192. self.filteredPlaces = self.data.filter({
  193. return searchString.isEmpty ||
  194. ($0.name ?? "").lowercased().contains(searchString.lowercased())
  195. }).sorted(by: { (a, _) -> Bool in
  196. return (a.name?.lowercased() ?? "").hasPrefix(searchString.lowercased())
  197. })
  198. }
  199. // MARK: IBActions
  200. @IBAction func close(_ sender: Any?) {
  201. let selectedIndexPaths = self.tableVIew.indexPathsForSelectedRows ?? self.tableVIew.indexPathForSelectedRow.map({[$0]})
  202. let selectedData = selectedIndexPaths?.compactMap { indexPath -> SendMoneyCountryViewModel? in
  203. let value = filteredPlaces.elementAt(index: indexPath.row)
  204. return value
  205. }
  206. self.doneAction?(selectedData ?? [])
  207. self.dismiss(animated: true, completion: nil)
  208. }
  209. @IBAction func clear(_ sender: Any) {
  210. self.tableVIew.indexPathsForSelectedRows?.forEach({self.tableVIew.deselectRow(at: $0, animated: true)})
  211. self.tableVIew.indexPathForSelectedRow.map({self.tableVIew.deselectRow(at: $0, animated: true)})
  212. self.defaultSelectedData = []
  213. self.tableVIew.reloadData()
  214. }
  215. @IBAction func dismiss(_ sender: Any) {
  216. self.dismiss(animated: true, completion: nil)
  217. }
  218. }
  219. extension CountryPickerViewController: UITableViewDelegate {
  220. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  221. let cell = tableView.cellForRow(at: indexPath) as! CountryPickerTableViewCell
  222. cell.selectedPlace = self.filteredPlaces.elementAt(index: indexPath.row)
  223. cell.setup()
  224. if !self.allowMultipleSelection {
  225. self.close(nil)
  226. }
  227. }
  228. func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
  229. if let cell = tableView.cellForRow(at: indexPath) as? CountryPickerTableViewCell {
  230. cell.selectedPlace = nil
  231. cell.setup()
  232. } else {
  233. print("something happened here??")
  234. }
  235. }
  236. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  237. return 75
  238. }
  239. }
  240. extension CountryPickerViewController: UITableViewDataSource {
  241. func numberOfSections(in tableView: UITableView) -> Int {
  242. return 1
  243. }
  244. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  245. return filteredPlaces.count
  246. }
  247. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  248. return self.configureImageCell(tableView: tableView, indexPath: indexPath)
  249. }
  250. func configureImageCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell {
  251. let cell = tableVIew.dequeueReusableCell(withIdentifier: "CountryPickerTableViewCell", for: indexPath) as! CountryPickerTableViewCell
  252. if let _default = self.defaultSelectedData.first {
  253. cell.selectedPlace = _default
  254. }
  255. cell.place = self.filteredPlaces.elementAt(index: indexPath.row)
  256. cell.setup()
  257. return cell
  258. }
  259. }