You are on page 1of 25

//

// HomePageVC.swift
// matrimonyy
//
// Created by iOS Developer on 24/02/21.
// Copyright © 2021 iOS Developer. All rights reserved.
//

import UIKit
import MarqueeLabel
import Popover
import SwiftyJSON
import Photos
import mesibo
import MesiboUI
import MesiboCall
import CoreLocation
class HomePageVC: CommonApiCall, UITabBarDelegate{
@IBOutlet weak var homePageCollectionView: UICollectionView!
@IBOutlet weak var searchCollectionView: UICollectionView!
@IBOutlet weak var scrollButton: UIButton!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var moveToTopButton: UIButton!
let objMesiboHelperVC = MesiboHelperVC()
let refreshControl = UIRefreshControl()
var scrollid = 0
var selectedTab = 0
var popover: Popover!
var isDataLoaded = true
var sortBy = 0
var selectedConnectMemberID = -1
var selectSearchPopoverOption = -1
var isVerifedButtonClick = 0
var isSelfie, isBCG, isSocially: Bool?
var memberVerifiedOptions = [[String:String]]()
let objHomePageDefaultMembersParameters = HomePageDefaultMembersParameters()
let objHomePageSearchTabParameters = HomePageSearchTabParameters()
let objHomePageMembersModel = HomePageMembersModel()
let objMemberInfoParameters = MemberInfoParameters()
var autoScrollCount = 0
var timer = Timer()

override func viewDidLoad() {


super.viewDidLoad()
setMenu(self.view)
moveToTopButton.isHidden = true
Util.userDefault.set("10", forKey: UserDefaultIdentifier.ScreenID)
cellIntialisation()
refreshControl.tintColor = UIColor.init(hex: hexColorConstants.purple)
refreshControl.addTarget(self, action: #selector(refreshWeatherData(_:)),
for: .valueChanged)
homePageCollectionView.refreshControl = refreshControl
getDefaultSearchList()
}

func cellIntialisation(){
homePageCollectionView.register(UINib(nibName:
CellIdentifier.HomeUserDetailsCollectionViewCell, bundle: nil),
forCellWithReuseIdentifier: CellIdentifier.HomeUserDetailsCollectionViewCell)
searchCollectionView.register(UINib(nibName:
CellIdentifier.HomeSearchOptionCollectionViewCell, bundle: nil),
forCellWithReuseIdentifier: CellIdentifier.HomeSearchOptionCollectionViewCell)
}

@IBAction func filterButtonAction(_ sender: Any) {


let view =
(Bundle.main.loadNibNamed(CellIdentifier.FilterHomaPagePopoverView , owner: self,
options: nil)?[0] as? FilterHomaPagePopoverView)!
let popoverOptions: [PopoverOption] = [.type(.auto),
.blackOverlayColor(.clear), .cornerRadius(5),.arrowSize(CGSize(width: 15, height:
10)), .color(.white), .showBlackOverlay(false)]
view.selfieVerifiedButton.tag = 3
view.bcgVerifiedButton.tag = 4
view.sociallyConnectedButton.tag = 5
view.latestFirstButton.tag = 0
view.recentFirstButton.tag = 1
view.nearbyLocationButton.tag = 2

view.selfieVerifiedButton.addTarget(self,action:#selector(didTapFilterOptionButton)
, for: .touchUpInside)

view.bcgVerifiedButton.addTarget(self,action:#selector(didTapFilterOptionButton),
for: .touchUpInside)

view.sociallyConnectedButton.addTarget(self,action:#selector(didTapFilterOptionButt
on), for: .touchUpInside)

view.latestFirstButton.addTarget(self,action:#selector(didTapFilterOptionButton),
for: .touchUpInside)

view.recentFirstButton.addTarget(self,action:#selector(didTapFilterOptionButton),
for: .touchUpInside)

view.nearbyLocationButton.addTarget(self,action:#selector(didTapFilterOptionButton)
, for: .touchUpInside)

if isSelfie != nil{
if isSelfie!{
view.selfieVerifiedButton.setImage(#imageLiteral(resourceName:
"checkSelected"), for: .normal)
}else{
view.selfieVerifiedButton.setImage(#imageLiteral(resourceName:
"checkDefault"), for: .normal)
}
}

if isBCG != nil{
if isBCG!{
view.bcgVerifiedButton.setImage(#imageLiteral(resourceName:
"checkSelected"), for: .normal)
}else{
view.bcgVerifiedButton.setImage(#imageLiteral(resourceName:
"checkDefault"), for: .normal)
}
}

if isSocially != nil{
if isSocially!{
view.sociallyConnectedButton.setImage(#imageLiteral(resourceName:
"checkSelected"), for: .normal)
}else{
view.sociallyConnectedButton.setImage(#imageLiteral(resourceName:
"checkDefault"), for: .normal)
}
}

popover = Popover(options: popoverOptions)


// popover.willShowHandler = {
// print("willShowHandler")
// }
// popover.didShowHandler = {
// print("didDismissHandler")
// }
popover.willDismissHandler = { [self] in
objHomePageDefaultMembersParameters.tempUserDetailLists =
updateList(isBCG: isBCG ?? false, isSelfie: isSelfie ?? false, isSocially:
isSocially ?? false)

reloadHomePageCollectionView(objHomePageDefaultMembersParameters.tempUserDetailList
s.count)
}
// popover.didDismissHandler = {
// print("didDismissHandler")
// }
popover.show(view, fromView: sender as! UIButton)
}

@IBAction func menuBarButtonAction(_ sender: Any) {


// showToast(message: "Menu Comming Soon")
present(menu!, animated: true, completion: nil)
}

@IBAction func moveToTopButtonAction(_ sender: Any) {


homePageCollectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at:
.top, animated: true)
}

@IBAction func scrollButtonAction(_ sender: Any) {


scrollButton.isSelected = !scrollButton.isSelected
if scrollButton.isSelected{
DispatchQueue.main.async {
self.showToast(message: "Auto Scroll On")
self.scrollButton.setBackgroundImage(UIImage(named: "scroll_on"),
for: .normal)
self.timer = Timer.scheduledTimer(timeInterval: 4.0, target: self,
selector: #selector(self.changeImage), userInfo: nil, repeats: true)
}
}else{
showToast(message: "Auto Scroll Off")
scrollButton.setBackgroundImage(UIImage(named: "scroll"), for: .normal)
timer.invalidate()
}
}

@objc func changeImage() {


if autoScrollCount <
objHomePageDefaultMembersParameters.tempUserDetailLists.count{
let index = IndexPath.init(item: autoScrollCount, section: 0)
homePageCollectionView.scrollToItem(at: index, at: .bottom, animated:
true)
autoScrollCount += 1
}else{
autoScrollCount = 0
scrollButton.isSelected = false
scrollButton.setBackgroundImage(UIImage(named: "scroll"), for: .normal)
timer.invalidate()
}
}

@IBAction func searchAddButtonAction(_ sender: Any) {


if objHomePageSearchTabParameters.tabDetailLists.count > 4{
showToast(message: "Maximum 4 search allowed.")
}else{
// searchCollectionView.reloadData()
let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.CustomeSearchVC) as? CustomeSearchVC
vc?.vcTitle = "Custom \
(objHomePageSearchTabParameters.tabDetailLists.count + 1)"
vc?.searchProfileId = 0
navigationController?.pushViewController(vc!, animated: true)
}
}

override func viewWillAppear(_ animated: Bool) {


super.viewWillAppear(animated)
print("############ view appear #################")
navigationController?.setNavigationBarHidden(true, animated: true)
if MySingleton.sharedInstance.isUpdateHomeApi{
getDefaultSearchList()
}
}

override func apiResponse(_ Index:Int, apiCall:Int) {


switch apiCall {
case CommanApiCallIdentifier.sendInterest:
objHomePageDefaultMembersParameters.tempUserDetailLists.remove(at:
Index)

reloadHomePageCollectionView(objHomePageDefaultMembersParameters.tempUserDetailList
s.count)
break

case CommanApiCallIdentifier.ignoreMember:

DatabaseManager.getDBInstance().deleteHomePageMembersById(objHomePageDefaultMembers
Parameters.tempUserDetailLists[Index].memberID ?? 0)
objHomePageDefaultMembersParameters.tempUserDetailLists.remove(at:
Index)

reloadHomePageCollectionView(objHomePageDefaultMembersParameters.tempUserDetailList
s.count)
break
default:
break
}
}

//MARK:- HomePageVC Collectionview Data Source


extension
HomePageVC:UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDele
gateFlowLayout,UIScrollViewDelegate{

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection


section: Int) -> Int{
if collectionView == searchCollectionView{
return objHomePageSearchTabParameters.tabDetailLists.count
}else if collectionView == homePageCollectionView{
return objHomePageDefaultMembersParameters.tempUserDetailLists.count
}else{
return 0
}
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt


indexPath: IndexPath) -> UICollectionViewCell {
if collectionView == searchCollectionView{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier:
CellIdentifier.HomeSearchOptionCollectionViewCell, for: indexPath) as!
HomeSearchOptionCollectionViewCell
cell.titleLabel.text =
objHomePageSearchTabParameters.tabDetailLists[indexPath.row].searchProfileName

cell.optionButtonAction.addTarget(self,action:#selector(didTapSearchOptionButton),
for: .touchUpInside)
cell.optionButtonAction.tag = indexPath.row
if selectedTab == indexPath.row{
cell.backView.backgroundColor = UIColor.init(hex:
hexColorConstants.purple)
cell.titleLabel.textColor = .white
}else{
cell.backView.backgroundColor = .white
cell.titleLabel.textColor = .black
}
return cell
}else if collectionView == homePageCollectionView{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier:
CellIdentifier.HomeUserDetailsCollectionViewCell, for: indexPath) as!
HomeUserDetailsCollectionViewCell
MarqueeLabel.controllerViewDidAppear(self)
let object =
objHomePageDefaultMembersParameters.tempUserDetailLists[indexPath.row]
cell.object = object
cell.sortBy = sortBy
cell.doInit()
cell.connectUserButton.tag = indexPath.row
cell.verifedOptionButton.tag = indexPath.row

cell.connectUserButton.addTarget(self,action:#selector(didTapConnectUserButton),
for: .touchUpInside)
cell.verifedOptionButton.addTarget(self,action:#selector(didTapVerifiedOptionButton
), for: .touchUpInside)

cell.sendInterestButton.addTarget(self,action:#selector(didTapSendIntrestButton),
for: .touchUpInside)
cell.favButton.addTarget(self,action:#selector(didTapSendFaveButton),
for: .touchUpInside)
cell.ignorButton.addTarget(self,action:#selector(didTapIgnorButton),
for: .touchUpInside)
cell.sendInterestButton.tag = indexPath.row
cell.favButton.tag = indexPath.row
cell.ignorButton.tag = indexPath.row
cell.profileImageButton.tag = indexPath.row

cell.profileImageButton.addTarget(self,action:#selector(didTapProfileButton),
for: .touchUpInside)

cell.mapButton.addTarget(self,action:#selector(didTapMapButton),
for: .touchUpInside)

return cell
}else{
return UICollectionViewCell()
}
}

func collectionView(_ collectionView: UICollectionView, layout


collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath)
-> CGSize {
if collectionView == searchCollectionView{
let label = UILabel(frame: CGRect.zero)
label.text =
objHomePageSearchTabParameters.tabDetailLists[indexPath.row].searchProfileName
label.sizeToFit()
return CGSize(width: label.frame.width + 90, height: 60)
}else if collectionView == homePageCollectionView{
return CGSize(width: collectionView.frame.width, height:
collectionView.frame.height-10)
}else{
return .zero
}
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt


indexPath: IndexPath) {
if collectionView == searchCollectionView{
selectedTab = indexPath.row

getTabSelectedMemberList(objHomePageSearchTabParameters.tabDetailLists[indexPath.ro
w].searchProfileId ?? 0)
}else if collectionView == homePageCollectionView{
if Util.userDefault.bool(forKey: UserDefaultIdentifier.isPaid){
let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.UserDetailProfileVC) as? UserDetailProfileVC
vc?.isHome = true
vc?.toMemberId =
objHomePageDefaultMembersParameters.tempUserDetailLists[indexPath.row].memberID ??
0
navigationController?.pushViewController(vc!, animated: true)
}else{
let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.SubscriptionPlanVC) as? SubscriptionPlanVC
navigationController?.pushViewController(vc!, animated: true)
}
}
}

func collectionView(_ collectionView: UICollectionView, willDisplay cell:


UICollectionViewCell, forItemAt indexPath: IndexPath) {
if collectionView == homePageCollectionView{
if !scrollButton.isSelected{
autoScrollCount = indexPath.row
}
}
}

func scrollViewDidScroll(_ scrollView: UIScrollView){


let position = scrollView.contentOffset.y
if position > (homePageCollectionView.contentSize.height-400-
scrollView.frame.size.height){
let list =
Util.getRemaningMemberId(objHomePageDefaultMembersParameters.tempUserDetailLists)
let dbList =
DatabaseManager.getDBInstance().getRemainigMemberData(list)

if 0 != dbList.count{
if isDataLoaded{
isDataLoaded = false
getMoreMemberProfileList(dbList.sample(5))
}
}
}
}

@objc func didTapProfileButton(_ sender: UIButton){


let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.ImagePopupVC) as? ImagePopupVC
vc?.objUserPhotosList =
objHomePageDefaultMembersParameters.tempUserDetailLists[sender.tag].objUserPhotosLi
st
navigationController?.present(vc!, animated: true, completion: nil)
}

@objc func didTapMapButton(_ sender: UIButton){


let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.NearByMapVC) as? NearByMapVC
vc?.objHomePageDefaultMembersParameters =
objHomePageDefaultMembersParameters
navigationController?.present(vc!, animated: true, completion: nil)
}

@objc func didTapSendIntrestButton(_ sender: UIButton){


let object =
objHomePageDefaultMembersParameters.tempUserDetailLists[sender.tag]
callSendInterestAPI(object.memberID ?? 0, Index: sender.tag)
}

@objc func didTapIgnorButton(_ sender: UIButton){


let object =
objHomePageDefaultMembersParameters.tempUserDetailLists[sender.tag]
callIgnoreAPI(object.memberID ?? 0, Index: sender.tag)
}

@objc func didTapSendFaveButton(_ sender: UIButton){


let object =
objHomePageDefaultMembersParameters.tempUserDetailLists[sender.tag]
callSendFavAPI(object.memberID ?? 0,sender: sender)
}

@objc func refreshWeatherData(_ sender: Any) {


fetchWeatherData()
}

func fetchWeatherData() {
DispatchQueue.main.async {
print("Refresh View")
self.getDefaultSearchList()
self.refreshControl.endRefreshing()
}
}

//MARK:- API Calls


extension HomePageVC{

func callSendFavAPI(_ toMemberId:Int, sender: UIButton){


let url = MySingleton.sharedInstance.baseURL + ApiConstant.ShortList + "?
memberid=\(memberID)&tomemberid=\(toMemberId)"
let parameters = ["":""]
print(url)

requestPOSTURL(url, VC: self, params:parameters as [String : AnyObject],


isShowProgressBar: true, token: token ,success:{ (data)in
print(data)
if data["status"].int == 1{
self.showToast(message: data["message"].string ?? "")

self.objHomePageDefaultMembersParameters.tempUserDetailLists[sender.tag].isShortlis
ted = true
sender.setImage(#imageLiteral(resourceName: "like_color"), for:
.normal)
}
}) { (error) in
print(error)
}
}

func callEmailShowAPI(_ toMemberId:Int){


let url = MySingleton.sharedInstance.baseURL +
ApiConstant.EmailViewMemberHistory + "?memberid=\(memberID)&tomemberid=\
(toMemberId)"
let parameters = ["":""]
print(url)

requestPOSTURL(url, VC: self, params:parameters as [String : AnyObject],


isShowProgressBar: true, token: token ,success:{ (data)in
print(data)
if data["status"].int == 1{
let tempData = data["data"]
let name = "\(tempData["firstName"].string ?? "") \
(tempData["lastName"].string ?? "")"
self.popover.dismiss()
self.showEmailSendAlert(tempData["email"].string ?? "",userName:
name, memberID:self.memberID, toMemberID:self.memberID)
}
}) { (error) in
print(error)
}
}

func getMoreMemberProfileList(_ list:[Int]){


let str = list.map{ String($0) }.joined(separator: ",")
let url = MySingleton.sharedInstance.baseURL + ApiConstant.SearchByMemberId
+ "?frommemberid=\(memberID)&members=\(str)"
let parameters = ["":""]
print(url)

requestGETURL(url, VC: self, params:parameters as [String : AnyObject],


isShowProgressBar: true, token: token ,success:{(data)in
print(data)
if data["status"].int == 1{
let tempData = data["data"]
let memberProfiles = tempData["memberProfiles"].arrayObject

self.objHomePageDefaultMembersParameters.getResponse(memberProfiles! as NSArray)
self.isDataLoaded = true
self.homePageCollectionView.reloadData()
}
}) { (error) in
print(error)
}
}

func getTabSelectedMemberList(_ tabId:Int){


let url = MySingleton.sharedInstance.baseURL +
ApiConstant.SearchBySearchProfileId + "?searchProfileId=\
(tabId)&pageIndex=1&pageSize=5"
let parameters = ["":""]
print(url)

requestGETURL(url, VC: self, params:parameters as [String : AnyObject],


isShowProgressBar: true, token: token ,success:{ [self] (data)in
print(data)
if data["status"].int == 1{
let tempData = data["data"]
isBCG = false
isSocially = false
isSelfie = false
isDataLoaded = true
setMemberData(tempData["members"])
setMemberProfiles(tempData["memberProfiles"])
homePageCollectionView.reloadData()
searchCollectionView.reloadData()
refreshControl.endRefreshing()
}
}) { (error) in
print(error)
}
}

func getDefaultTabMemberList(_ tabId:Int){


let url = MySingleton.sharedInstance.baseURL +
ApiConstant.MakeCustomSearchProfileDefault + "?searchProfileId=\(tabId)&memberid=\
(memberID)"
let parameters = ["":""]
print(url)

requestPOSTURL(url, VC: self, params:parameters as [String : AnyObject],


isShowProgressBar: true, token: token ,success:{ [self] (data)in
print(data)
if data["status"].int == 1{
popover.dismiss()
selectedTab = selectSearchPopoverOption
getTabSelectedMemberList(tabId)
}
}) { (error) in
print(error)
}
}

func callDeleteTabMemberList(_ tabId:Int){


let url = MySingleton.sharedInstance.baseURL +
ApiConstant.DeleteCustomSearchProfile + "?searchProfileId=\(tabId)"
let parameters = ["":""]
print(url)

requestPOSTURL(url, VC: self, params:parameters as [String : AnyObject],


isShowProgressBar: true, token: token ,success:{ [self] (data)in
print(data)
if data["status"].int == 1{
popover.dismiss()
getDefaultSearchList()

}
}) { (error) in
print(error)
}
}

func getDefaultSearchList(){
let url = MySingleton.sharedInstance.baseURL + ApiConstant.GetDefaultSearch
+ "?memberid=\(memberID)&pageIndex=1&pageSize=5"
let parameters = ["":""]
print(url)

requestGETURL(url, VC: self, params:parameters as [String : AnyObject],


isShowProgressBar: true, token: token ,success:{ [self] (data)in
print(data)
if data["status"].int == 1{
MySingleton.sharedInstance.isUpdateHomeApi = false
let tempData = data["data"]
let memberinfo = tempData["memberinfo"]
let isPaid = memberinfo["isPaid"].bool ?? false
let statusInfo = memberinfo["statusInfo"]
let statusCode = statusInfo["code"].int
if statusCode == 1{
Util.userDefault.setValue(true, forKey:
UserDefaultIdentifier.userStatusActive)
}else{
Util.userDefault.setValue(false, forKey:
UserDefaultIdentifier.userStatusActive)
let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.StatusCheckVC) as? StatusCheckVC
vc?.statusCode = statusCode ?? -5
self.navigationController?.pushViewController(vc!, animated:
true)
}
Util.userDefault.set(isPaid, forKey: UserDefaultIdentifier.isPaid)
sortBy = 0
isBCG = false
isSocially = false
isSelfie = false
isDataLoaded = true
objMemberInfoParameters.doInit(tempData["memberinfo"])
setMemberData(tempData["members"])
setMemberProfiles(tempData["memberProfiles"])
setTabs(tempData["tabs"])
self.startMesibo()
refreshControl.endRefreshing()
homePageCollectionView.scrollToItem(at: IndexPath(item: 0, section:
0), at: .top, animated: true)
}
}) { (error) in
print(error)
}
}

func setMemberData(_ list:JSON){


let members = list.arrayObject
if members?.count != nil && members?.count != 0{
titleLabel.text = "Matches(\(members?.count ?? 0))"
objHomePageMembersModel.dataList.removeAll()
objHomePageMembersModel.getResponse(members! as NSArray)
if objHomePageMembersModel.dataList.count != 0{
_ = DatabaseManager.getDBInstance().deleteHomePageMembersAll()
for modelInfo in objHomePageMembersModel.dataList{
_ =
DatabaseManager.getDBInstance().saveHomePageMembersData(modelInfo)
}
}
}else{
titleLabel.text = "Matches(\(members?.count ?? 0))"
}
}

func setMemberProfiles(_ list:JSON){


let memberProfiles = list.arrayObject
if memberProfiles?.count != nil && memberProfiles?.count != 0{
objHomePageDefaultMembersParameters.userDetailLists.removeAll()
objHomePageDefaultMembersParameters.tempUserDetailLists.removeAll()
objHomePageDefaultMembersParameters.getResponse(memberProfiles! as
NSArray)
homePageCollectionView.isScrollEnabled = true
moveToTopButton.isHidden = false
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width:
homePageCollectionView.bounds.size.width, height:
homePageCollectionView.bounds.size.height))
noDataLabel.text = ""
homePageCollectionView.backgroundView = noDataLabel
}else{
objHomePageDefaultMembersParameters.userDetailLists.removeAll()
objHomePageDefaultMembersParameters.tempUserDetailLists.removeAll()
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width:
homePageCollectionView.bounds.size.width, height:
homePageCollectionView.bounds.size.height))
noDataLabel.text = AlertIdentifier.defaultMsgOnHomePage
moveToTopButton.isHidden = true
noDataLabel.textColor = .black
noDataLabel.textAlignment = .center
noDataLabel.numberOfLines = 0
homePageCollectionView.backgroundView = noDataLabel
_ = DatabaseManager.getDBInstance().deleteHomePageMembersAll()
homePageCollectionView.isScrollEnabled = false
}
homePageCollectionView.reloadData()
}

func setTabs(_ list:JSON){


let tabs = list.arrayObject
if tabs?.count != 0 && tabs?.count != nil{
objHomePageSearchTabParameters.tabDetailLists.removeAll()
objHomePageSearchTabParameters.getResponse(tabs! as NSArray )
for i in 0...(objHomePageSearchTabParameters.tabDetailLists.count-1){
if
objHomePageSearchTabParameters.tabDetailLists[i].isDefaultSearchProfile ?? false{
selectedTab = i
}
}
searchCollectionView.isScrollEnabled = true
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width:
searchCollectionView.bounds.size.width, height:
searchCollectionView.bounds.size.height))
noDataLabel.text = ""
searchCollectionView.backgroundView = noDataLabel
}else{
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width:
searchCollectionView.bounds.size.width, height:
searchCollectionView.bounds.size.height))
noDataLabel.text = AlertIdentifier.noSearchOption
noDataLabel.numberOfLines = 0
noDataLabel.textColor = .black
noDataLabel.textAlignment = .center
searchCollectionView.backgroundView = noDataLabel
searchCollectionView.isScrollEnabled = false
}
searchCollectionView.reloadData()
}

func reloadHomePageCollectionView(_ count:Int){


if count != 0{
homePageCollectionView.isScrollEnabled = true
moveToTopButton.isHidden = false
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width:
homePageCollectionView.bounds.size.width, height:
homePageCollectionView.bounds.size.height))
noDataLabel.text = ""
homePageCollectionView.backgroundView = noDataLabel
}else{
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width:
homePageCollectionView.bounds.size.width, height:
homePageCollectionView.bounds.size.height))
noDataLabel.text = AlertIdentifier.defaultMsgOnHomePage
moveToTopButton.isHidden = true
noDataLabel.numberOfLines = 0
noDataLabel.textColor = .black
noDataLabel.textAlignment = .center
homePageCollectionView.backgroundView = noDataLabel
homePageCollectionView.isScrollEnabled = false
}
homePageCollectionView.reloadData()
}

//MARK:- Popover Button Actions


extension HomePageVC: UITableViewDataSource, UITableViewDelegate{

@objc func didTapConnectUserButton(_ sender: UIButton){


isVerifedButtonClick = 2
selectedConnectMemberID = sender.tag
let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 60, height:
310))
tableView.register(UINib(nibName:
CellIdentifier.ConnectUsersPopoverButtonTableViewCell, bundle: nil),
forCellReuseIdentifier: CellIdentifier.ConnectUsersPopoverButtonTableViewCell)
tableView.delegate = self
tableView.dataSource = self
tableView.isScrollEnabled = true
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
let popoverOptions: [PopoverOption] = [.type(.auto),
.blackOverlayColor(.clear), .cornerRadius(30),.arrowSize(CGSize.zero),
.color(#colorLiteral(red: 0.2862745098, green: 0, blue: 0.4196078431, alpha:
0.1951399823)), .showBlackOverlay(false)]
popover = Popover(options: popoverOptions)
popover.backgroundColor = .clear
popover.layer.cornerRadius = 30
popover.borderWidth = 1
popover.layer.borderColor = UIColor.init(hex:
hexColorConstants.purple).cgColor
popover.show(tableView, fromView: sender)
}

@objc func didTapVerifiedOptionButton(_ sender: UIButton){


isVerifedButtonClick = 1
memberVerifiedOptions.removeAll()
let dictObject =
objHomePageDefaultMembersParameters.tempUserDetailLists[sender.tag]
if dictObject.isProfilePicVerified ?? false{
memberVerifiedOptions.append(["name":"Selfie
Verified","image":"photoverfied"])
}
if dictObject.isMobileVerified ?? false{
memberVerifiedOptions.append(["name":"Phone
Verified","image":"callverified"])
}
if dictObject.isEmailVerified ?? false{
memberVerifiedOptions.append(["name":"Email
Verified","image":"emailverified"])
}
if dictObject.isBCGAccepted ?? false{
memberVerifiedOptions.append(["name":"BCG
Verified","image":"bcgverified"])
}
if dictObject.isAddressVerified ?? false{
memberVerifiedOptions.append(["name":"Location
Verified","image":"locationverified"])
}
if dictObject.isSocialConnectVerified ?? false{
memberVerifiedOptions.append(["name":"Socially
Verified","image":"socialverified"])
}
let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 200, height:
310))
tableView.register(UINib(nibName:
CellIdentifier.ConnectUsersPopoverButtonTableViewCell, bundle: nil),
forCellReuseIdentifier: CellIdentifier.ConnectUsersPopoverButtonTableViewCell)
tableView.delegate = self
tableView.dataSource = self
tableView.isScrollEnabled = false
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
let popoverOptions: [PopoverOption] = [.type(.down),
.blackOverlayColor(.clear), .cornerRadius(30),.arrowSize(CGSize.zero),
.color(.clear), .showBlackOverlay(false)]
popover = Popover(options: popoverOptions)
popover.backgroundColor = .clear
popover.show(tableView, fromView: sender)
}

@objc func didTapSearchOptionButton(_ sender: UIButton){


let view = (Bundle.main.loadNibNamed(CellIdentifier.SearchHomePopoverView ,
owner: self, options: nil)?[0] as? SearchHomePopoverView)!
if sender.tag == 0{
view.deleteButton.isHidden = true
view.editButton.isHidden = true
}else{
view.deleteButton.isHidden = false
view.editButton.isHidden = false
}
view.defaultButton.addTarget(self,action:#selector(didTapSearchButton),
for: .touchUpInside)
view.deleteButton.addTarget(self,action:#selector(didTapSearchButton), for:
.touchUpInside)
view.editButton.addTarget(self,action:#selector(didTapSearchButton),
for: .touchUpInside)

selectSearchPopoverOption = sender.tag

view.defaultButton.tag = 0
view.deleteButton.tag = 2
view.editButton.tag = 1

let popoverOptions: [PopoverOption] = [.type(.auto),


.blackOverlayColor(.clear), .cornerRadius(5),.arrowSize(CGSize(width: 15, height:
10)), .color(.white), .showBlackOverlay(false)]
popover = Popover(options: popoverOptions)
popover.show(view, fromView: sender)
}

@objc func didTapFilterOptionButton(_ sender: UIButton){


switch sender.tag {
case 0:
sortBy = 1
popover.dismiss()
let array =
objHomePageDefaultMembersParameters.tempUserDetailLists.sorted(by:
{ ($0.lastUpdated ?? "").compare($1.lastUpdated ?? "") == .orderedDescending })
objHomePageDefaultMembersParameters.tempUserDetailLists.removeAll()

objHomePageDefaultMembersParameters.tempUserDetailLists.append(contentsOf: array)
DispatchQueue.main.async {
self.homePageCollectionView.reloadData()
}
break

case 1:
sortBy = 2
popover.dismiss()
let array =
objHomePageDefaultMembersParameters.tempUserDetailLists.sorted(by:
{ ($0.lastLogin ?? "").compare($1.lastLogin ?? "") == .orderedDescending })
objHomePageDefaultMembersParameters.tempUserDetailLists.removeAll()

objHomePageDefaultMembersParameters.tempUserDetailLists.append(contentsOf: array)
DispatchQueue.main.async {
self.homePageCollectionView.reloadData()
}
break

case 2:
sortBy = 3
popover.dismiss()
let array =
objHomePageDefaultMembersParameters.tempUserDetailLists.sorted(by:
{ $0.distenceInKm ?? 0.0 < $1.distenceInKm ?? 0.0 })
objHomePageDefaultMembersParameters.tempUserDetailLists.removeAll()

objHomePageDefaultMembersParameters.tempUserDetailLists.append(contentsOf: array)
DispatchQueue.main.async {
self.homePageCollectionView.reloadData()
}
break

case 3:
if !(isSelfie ?? false){
isSelfie = true
sender.setImage(#imageLiteral(resourceName: "checkSelected"),
for: .normal)
}else{
isSelfie = false
sender.setImage(#imageLiteral(resourceName: "checkDefault"),
for: .normal)
}
break

case 4:
if !(isBCG ?? false){
sender.setImage(#imageLiteral(resourceName: "checkSelected"),
for: .normal)
isBCG = true
}else{
sender.setImage(#imageLiteral(resourceName: "checkDefault"),
for: .normal)
isBCG = false
}
break

case 5:
if !(isSocially ?? false){
isSocially = true
sender.setImage(#imageLiteral(resourceName: "checkSelected"),
for: .normal)
}else{
sender.setImage(#imageLiteral(resourceName: "checkDefault"),
for: .normal)
isSocially = false
}
break

default:
break
}
}

//MARK:- PopoverTable View Actions


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath)
-> CGFloat {
return UITableView.automaticDimension
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) ->


Int {
if isVerifedButtonClick == 1{
return memberVerifiedOptions.count
}else if isVerifedButtonClick == 2{
return ListIdentifires.HomePageUserConnectOptionIcon.count
}else{
return 0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCell {
if isVerifedButtonClick == 1{
let dictionary = memberVerifiedOptions[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier:
CellIdentifier.ConnectUsersPopoverButtonTableViewCell, for: indexPath) as!
ConnectUsersPopoverButtonTableViewCell

cell.button.addTarget(self,action:#selector(didTapVerifiedButtonButton), for:
.touchUpInside)
cell.button.setImage(UIImage(named: dictionary["image"] ?? ""), for:
.normal)
cell.button.tag = indexPath.row
cell.button.contentHorizontalAlignment = .right
cell.button.cornerRadius = 25
cell.contentView.backgroundColor = .clear
cell.selectionStyle = .none
return cell
}else if isVerifedButtonClick == 2{
let cell = tableView.dequeueReusableCell(withIdentifier:
CellIdentifier.ConnectUsersPopoverButtonTableViewCell, for: indexPath) as!
ConnectUsersPopoverButtonTableViewCell
cell.button.addTarget(self,action:#selector(didTapButton), for:
.touchUpInside)

cell.button.setImage(ListIdentifires.HomePageUserConnectOptionIcon[indexPath.row],
for: .normal)
cell.buttonWidth.constant = 50
cell.button.tag = indexPath.row
cell.contentView.backgroundColor = .clear
cell.button.contentHorizontalAlignment = .center
cell.selectionStyle = .none
return cell
}else{
return UITableViewCell()
}
}

@objc func didTapButton(_ sender: UIButton){


if Util.userDefault.bool(forKey: UserDefaultIdentifier.isPaid){
let object =
objHomePageDefaultMembersParameters.tempUserDetailLists[selectedConnectMemberID]
switch sender.tag {
case 0:
// showToast(message: "Chat audio & video feature comming soon")
openMesibo()
break

case 1:
contact.givenName = (object.firstName ?? "") + (object.lastName ??
"")
callNumberShowAPI(object.memberID ?? 0)
break

case 2:
if object.isSocialConnectVerified ?? false{
popover.dismiss()
let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.SociallyConnectedPopupVC) as? SociallyConnectedPopupVC
vc?.toMemberId = object.memberID ?? 0
vc?.urlImage = object.profilePic ?? ""
navigationController?.present(vc!, animated: true, completion:
nil)
}else{
showToast(message: AlertIdentifier.notConnectSocially)
}
break

case 3:
popover.dismiss()
let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.SelectSMSVC) as? SelectSMSVC
vc?.toMemberId = object.memberID ?? 0
navigationController?.present(vc!, animated: true, completion: nil)
break

case 4:
callEmailShowAPI(object.memberID ?? 0)
break

default:
break
}
}else{
popover.dismiss()
let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.SubscriptionPlanVC) as? SubscriptionPlanVC
navigationController?.pushViewController(vc!, animated: true)
}
}

@objc func didTapSearchButton(_ sender: UIButton){


switch sender.tag {
case 0:

getDefaultTabMemberList(objHomePageSearchTabParameters.tabDetailLists[selectSearchP
opoverOption].searchProfileId ?? 0)
break

case 1:
popover.dismiss()
let vc = UIStoryboard.init(name: "Main", bundle:
Bundle.main).instantiateViewController(withIdentifier:
StoryboardIdentifier.CustomeSearchVC) as? CustomeSearchVC
vc?.searchProfileId =
objHomePageSearchTabParameters.tabDetailLists[selectSearchPopoverOption].searchProf
ileId ?? 0
navigationController?.pushViewController(vc!, animated: true)
break

case 2:

callDeleteTabMemberList(objHomePageSearchTabParameters.tabDetailLists[selectSearchP
opoverOption].searchProfileId ?? 0)
break

default:
break
}
}

@objc func didTapVerifiedButtonButton(_ sender: UIButton){


let dictionary = memberVerifiedOptions[sender.tag]
sender.isSelected = !sender.isSelected
if sender.isSelected{
sender.imageEdgeInsets = UIEdgeInsets(top: 0, left: 150, bottom: 0,
right: 0)
sender.titleEdgeInsets = UIEdgeInsets(top: 0, left: -20, bottom: 0,
right: 0)
sender.setTitle(dictionary["name"] ?? "", for: .selected)
sender.backgroundColor = .lightGray
sender.contentHorizontalAlignment = .left
}else{
sender.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0,
right: 0)
sender.titleEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0,
right: 0)
sender.setTitle("", for: .normal)
sender.backgroundColor = .clear
sender.contentHorizontalAlignment = .right
}
}

func updateList(isBCG:Bool,isSelfie:Bool,isSocially:Bool) ->


[HomePageDefaultMembersParameters]{
var object = [HomePageDefaultMembersParameters]()
if isBCG && isSelfie && isSocially{
for item in objHomePageDefaultMembersParameters.userDetailLists {
if (item.isBCGAccepted ?? false) && (item.isProfilePicVerified ??
false) && (item.isSocialConnectVerified ?? false){
object.append(item)
}
}
}else if isBCG && isSelfie{
for item in objHomePageDefaultMembersParameters.userDetailLists {
if (item.isBCGAccepted ?? false) && (item.isProfilePicVerified ??
false){
object.append(item)
}
}
}else if isBCG && isSocially{
for item in objHomePageDefaultMembersParameters.userDetailLists {
if (item.isBCGAccepted ?? false) &&
(item.isSocialConnectVerified ?? false){
object.append(item)
}
}
}else if isSocially && isSelfie{
for item in objHomePageDefaultMembersParameters.userDetailLists {
if (item.isProfilePicVerified ?? false) &&
(item.isSocialConnectVerified ?? false){
object.append(item)
}
}
}else if isSelfie{
for item in objHomePageDefaultMembersParameters.userDetailLists {
if item.isProfilePicVerified ?? false{
object.append(item)
}
}
}else if isBCG{
for item in objHomePageDefaultMembersParameters.userDetailLists {
if item.isBCGAccepted ?? false{
object.append(item)
}
}
}else if isSocially{
for item in objHomePageDefaultMembersParameters.userDetailLists {
if item.isSocialConnectVerified ?? false{
object.append(item)
}
}
}else{
object = objHomePageDefaultMembersParameters.userDetailLists
}
return object
}

extension HomePageVC: MesiboDelegate, MesiboCallIncomingListener{


func openMesibo(){
popover.dismiss()
let object =
objHomePageDefaultMembersParameters.tempUserDetailLists[selectedConnectMemberID]
// checkCameraAccess()
mesiboInit(objMemberInfoParameters.mesiboToken, remoteUserAddress: "\
(object.memberID ?? 0)", remoteUserName: object.firstName)
}

func startMesibo(){
Mesibo.getInstance()!.addListener(self)
Mesibo.getInstance()!.setSecureConnection(true)
Mesibo.getInstance()!.setAccessToken(objMemberInfoParameters.mesiboToken)
Mesibo.getInstance()!.setDatabase("mesibo.db", resetTables: 0)
Mesibo.getInstance()!.start()
}

func mesiboInit(_ token: String?, remoteUserAddress address: String?,


remoteUserName name: String?) {
navigationController?.setNavigationBarHidden(false, animated: true)

//set profile which is required by UI


let mProfile = MesiboUserProfile()
mProfile.name = name
mProfile.address = address
MesiboUI.launchMessageViewController(self, profile: mProfile)

//OPTIONAL, initialize calls


// MesiboCall.getInstance().setListener(self)
MesiboCall.start(with: nil, name: "Matrimonny", icon: UIImage(named:
"applogo"), callKit: true)
// following code will read messages from the database and
// will also send read receipts for db and real-time messages

// set app mode in foreground for read-receipt to be sent


Mesibo.getInstance()!.setAppInForeground(self, screenId: 0, foreground:
true)

let mReadSession = MesiboReadSession()


mReadSession.initSession(address, groupid: 0, query: nil, delegate: self)
mReadSession.enableReadReceipt(true)
mReadSession.read(100)
}

func mesiboCall_(onNotify type: Int32, profile: MesiboUserProfile, video: Bool)


-> Bool {
return true
}

func mesiboCall_(onShowViewController parent: Any?, vc: Any?) {


var parent = parent

let uvc = vc as? UIViewController

if uvc?.isBeingPresented ?? false {
return
}

if parent == nil {
parent = self
}

let p = parent as? UIViewController

Mesibo.getInstance()!.run(inThread: true, handler: {


if let uvc = uvc {
p?.present(uvc, animated: true)
}
})

func mesiboCall_(onIncoming profile: MesiboUserProfile, video: Bool) ->


MesiboCallProperties? {
return MesiboCallProperties(false)
}

func mesiboCall_(onError cp: MesiboCallProperties, error: Int32) {


print("MesiboCall error ======>>> ", error.description)
}

func mesiboCall_(onShowUserInterface call: Any?, properties cp:


MesiboCallProperties?) -> Bool {
return false
}

func mesiboCall_(onDismissViewController vc: Any?) {


navigationController?.setNavigationBarHidden(true, animated: true)
}

public func mesibo_(onConnectionStatus status: Int32) {


print("Connection status: \(status)")
}

func mesibo_(onMessage params: MesiboParams?, data: Data?) {

// You will receive messages here


var message: String? = nil
if let data = data {
message = String(data: data, encoding: .utf8)
}

if MESIBO_ORIGIN_REALTIME == params?.origin && 0 == params?.type {


print("Mesibo Msg ===> ", message ?? "")
// DispatchQueue.main.async {
// MesiboCall.getInstance().callUi(self, address: "387", video:
true)
// }
}

}
//
func mesibo_(on message: MesiboMessage?) {
}

func mesibo_(onMessageStatus params: MesiboParams?) {

// var str: String? = nil


// if let status = params?.status {
// str = "Message Status: \(status)"
// }

// mMessageStatus.text = str

func checkCameraAccess() {
let status = AVCaptureDevice.authorizationStatus(for: .video)
switch status {
case .authorized:
checkMicPermission(true)
print("request .authorised")
break
//handle authorized status
case .denied, .restricted :
print(" .denied, .restricted")
deniedAlert()
// Show Message to give permission in Settings

break
//handle denied status
case .notDetermined:
// ask for permissions
AVCaptureDevice.requestAccess(for: .video) { success in
DispatchQueue.main.async {
if success {
self.checkMicPermission(true)
print("Permission granted, proceed")
} else {
self.deniedAlert()
print("Permission denied")
}
}
}
@unknown default:
fatalError()
}
}

func deniedAlert(){
let alertController = UIAlertController(title: "Please Allow Access",
message: AlertIdentifier.deniedAlert, preferredStyle: .alert)
alertController.view.tintColor = UIColor.init(hex:
hexColorConstants.purple)
let settingsAction = UIAlertAction(title: "Settings", style: .default)
{ (alertAction) in

if let appSettings = NSURL(string: UIApplication.openSettingsURLString)


{
UIApplication.shared.open(appSettings as URL, options: [:],
completionHandler: nil)
}
}
alertController.addAction(settingsAction)
// If user cancels, do nothing, next time Pick Video is called, they will
be asked again to give permission
let cancelAction = UIAlertAction(title: "Not Now", style: .cancel, handler:
nil)
alertController.addAction(cancelAction)
// Run GUI stuff on main thread

self.present(alertController, animated: true, completion: nil)


}

func checkMicPermission(_ isVideoCall:Bool) {


let object =
objHomePageDefaultMembersParameters.tempUserDetailLists[selectedConnectMemberID]
switch AVAudioSession.sharedInstance().recordPermission {
case .granted:
DispatchQueue.main.async {
MesiboCall.getInstance().callUi(self, address: "\(object.memberID ??
0)", video: isVideoCall)
}
print("mic Permission granted , line 305")
break
case .denied:
deniedAlert()
print("mic Permission not granted , line 309")
break
case .undetermined:
AVAudioSession.sharedInstance().requestRecordPermission({ (granted) in
if granted {
DispatchQueue.main.async {
MesiboCall.getInstance().callUi(self, address: "\
(object.memberID ?? 0)", video: isVideoCall)
}
print("mic Permission granted , line 312")
} else {
self.deniedAlert()
print("mic Permission denied , line 314")
}
})
default:
break
}
}

public func mesibo_(onGetMenu parent: Any!, type: Int32, profile:


MesiboUserProfile!) -> [Any]! {

var btns: [AnyHashable]? = nil

if type == 0 {
let button = UIButton(type: .custom)
button.setImage(#imageLiteral(resourceName:
"locationverified"), for: .normal)
button.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
button.tag = 0

let button1 = UIButton(type: .custom)


button1.setImage(#imageLiteral(resourceName: "Group 549"), for:
.normal)
button1.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
button1.tag = 1

btns = [button, button1]


} else {
if profile != nil && profile?.address != nil {
let button = UIButton(type: .custom)
button.setImage(#imageLiteral(resourceName: "normalcall"),
for: .normal)
button.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
button.tag = 0
let vbutton = UIButton(type: .custom)
vbutton.setImage(#imageLiteral(resourceName: "Relative"),
for: .normal)
vbutton.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
vbutton.tag = 1

btns = [vbutton, button]


}
}

return btns

public func mesibo_(onMenuItemSelected parent: Any!, type: Int32,


profile: MesiboUserProfile!, item: Int32) -> Bool {

// userlist menu are active


if type == 0 {
// USERLIST
if item == 1 {
//item == 0 is reserved
}
} else {
// MESSAGEBOX
print("Menu btn from messagebox pressed")
if item == 0 {
checkMicPermission(false)
} else if item == 1 {
checkCameraAccess()
}
}
return true
}

You might also like