- modified the alert for session expired.

- finalised the cart icon with badge. MAde a singleton for this.
This commit is contained in:
Bilal
2024-07-31 00:18:49 +05:30
parent 0e3b43adba
commit 0456c5f30d
8 changed files with 138 additions and 204 deletions

View File

@@ -10,23 +10,33 @@ import Alamofire
class CartDataCache{
static var cartListData = [CartListingDM.ResultData]()
static var isFetched = false
static var cartCount = 0 {
static var cartListData = [CartListingDM.ResultData](){
didSet{
if cartCount == 0{
if cartListData.count == 0{
cartBadgeLabel.text = "0"
cartBadgeLabel.isHidden = true
}else{
cartBadgeLabel.text = cartCount.toString()
cartBadgeLabel.text = cartListData.count.toString()
cartBadgeLabel.isHidden = false
}
}
}
static var isFetched = false
// static var cartCount = 0 {
// didSet{
// if cartCount == 0{
// cartBadgeLabel.text = "0"
// cartBadgeLabel.isHidden = true
// }else{
// cartBadgeLabel.text = cartCount.toString()
// cartBadgeLabel.isHidden = false
// }
// }
// }
static var addressData = [AddressListDM]()
static let cartBadgeLabel = UILabel()
static let shareInstance = CartDataCache()
func getCartList(vc : UIViewController){
let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()]
@@ -44,7 +54,6 @@ class CartDataCache{
guard let data = data.data?.result else{return}
CartDataCache.cartListData = data
CartDataCache.cartCount = data.count
CartDataCache.isFetched = true
default:
Utilities.dismissProgressHUD()
@@ -57,3 +66,51 @@ class CartDataCache{
}
}
}
class BadgeBarBtn{
static let shared = BadgeBarBtn()
private init() {} // Prevents others from using the default '()' initializer
public var tapAction: (() -> Void)?
func setupBadge(for button: UIButton, with text: String) {
let badgeLabel = CartDataCache.cartBadgeLabel
badgeLabel.frame = CGRect(x: 30, y: 0, width: 18, height: 18)
badgeLabel.backgroundColor = UIColor.red
badgeLabel.isHidden = false // Ensure it is not hidden
badgeLabel.clipsToBounds = true
badgeLabel.layer.cornerRadius = 9
badgeLabel.textColor = UIColor.white
badgeLabel.font = FontCustom.shareInstance.customFont(fontName: .Exo2_Regular, size: 10)
badgeLabel.textAlignment = .center
badgeLabel.text = text
// Add the badge label to the button if not already added
if badgeLabel.superview != button {
button.addSubview(badgeLabel)
}
// Ensure the badge label is brought to the front
button.bringSubviewToFront(badgeLabel)
}
func setupCartButton() -> UIBarButtonItem {
let filterBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 45, height: 45))
filterBtn.setImage(UIImage(named: "CartIcon"), for: .normal)
filterBtn.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
// Configure the badge label
setupBadge(for: filterBtn, with: CartDataCache.cartListData.count.toString())
return UIBarButtonItem(customView: filterBtn)
}
@objc private func buttonPressed() {
if let action = tapAction {
action()
}
}
}

View File

@@ -40,6 +40,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// IQKeyboardManager.shared.enableAutoToolbar = false
// IQKeyboardManager.shared.layoutIfNeededOnUpdate = true
registerCustomFonts()
// Set the authentication ID Pass after app starts
AuthFunc.shareInstance.setAuthIDPass()
@@ -52,6 +53,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
//Configure and modify the side bar
configureSideBar()
//Configure JWPlayer Liscense
JWPlayerKitLicense.setLicenseKey("Lgok1t7H4PKY+M8FZqmCx54ibUF+NeCTn+xgd+/LVTaRdc+L")
return true
}

View File

@@ -58,14 +58,27 @@ class NetworkManager{
switch response.result {
case .success(let value):
/*
if Sucess == 4 menas user has logined in other device, logout that user by saying session timeout
if Sucess == 4 menas user has logined in some other device, logout that user by saying session timeout
*/
if value.success == 4{
if let topController = UIApplication.topViewController() {
Utilities.alertWithBtnCompletion(title: "Session Expired", msgBody: "Please Login Again", okBtnStr: "OK", vc: topController) { isDone in
let sb = UIStoryboard(name: K.StoryBoard.customAlerts, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.CustomAlerts.alertCustomVC) as! AlertCustomVC
vcPush.contentLabel = "Please Login Again"
vcPush.mainTitleText = "Session Expired."
vcPush.yesBtnText = "Login"
vcPush.onDoneBlock = { isDone in
AuthFunc.shareInstance.logout()
UIApplication.setRootView(LoginNavVC.instantiate(from: .AuthenticationSB))
}
vcPush.modalPresentationStyle = .overCurrentContext
vcPush.modalTransitionStyle = .crossDissolve
topController.present(vcPush, animated: true)
// Utilities.alertWithBtnCompletion(title: "Session Expired", msgBody: "Please Login Again", okBtnStr: "OK", vc: topController) { isDone in
// AuthFunc.shareInstance.logout()
// UIApplication.setRootView(LoginNavVC.instantiate(from: .AuthenticationSB))
// }
}
return
}

View File

@@ -20,41 +20,41 @@ class ShopCategoryVC: UIViewController {
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
// Create the button
let backbutton = UIButton(type: .custom)
backbutton.setImage(UIImage(named: "CartIcon"), for: .normal) // Image can be downloaded from the provided link
backbutton.setTitleColor(.black, for: .normal) // You can change the TitleColor
backbutton.addTarget(self, action: #selector(cartBtnTapped), for: .touchUpInside)
// Set button height and width
let buttonHeight: CGFloat = 50
let buttonWidth: CGFloat = 50
backbutton.translatesAutoresizingMaskIntoConstraints = false
backbutton.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
backbutton.heightAnchor.constraint(equalToConstant: buttonHeight).isActive = true
// Create a container view for the button
let containerView = UIView(frame: CGRect(x: 0, y: 0, width: buttonWidth, height: buttonHeight))
containerView.addSubview(backbutton)
// Set constraints for the button inside the container view
NSLayoutConstraint.activate([
backbutton.centerYAnchor.constraint(equalTo: containerView.centerYAnchor),
backbutton.centerXAnchor.constraint(equalTo: containerView.centerXAnchor)
])
// Create a UIBarButtonItem with the custom view
let customBarButton = UIBarButtonItem(customView: containerView)
// Create a flexible space item to push the custom view to the left
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
flexibleSpace.width = 10
// Create a negative spacer to fine-tune the position
let negativeSpacer = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
negativeSpacer.width = 10 // Adjust this value to move the button to the left
// Add the custom bar button and the spacer to the navigation bar
self.navigationItem.rightBarButtonItems = [flexibleSpace,negativeSpacer, customBarButton]
// // Create the button
// let backbutton = UIButton(type: .custom)
// backbutton.setImage(UIImage(named: "CartIcon"), for: .normal) // Image can be downloaded from the provided link
// backbutton.setTitleColor(.black, for: .normal) // You can change the TitleColor
// backbutton.addTarget(self, action: #selector(cartBtnTapped), for: .touchUpInside)
//
// // Set button height and width
// let buttonHeight: CGFloat = 50
// let buttonWidth: CGFloat = 50
// backbutton.translatesAutoresizingMaskIntoConstraints = false
// backbutton.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
// backbutton.heightAnchor.constraint(equalToConstant: buttonHeight).isActive = true
//
// // Create a container view for the button
// let containerView = UIView(frame: CGRect(x: 0, y: 0, width: buttonWidth, height: buttonHeight))
// containerView.addSubview(backbutton)
//
// // Set constraints for the button inside the container view
// NSLayoutConstraint.activate([
// backbutton.centerYAnchor.constraint(equalTo: containerView.centerYAnchor),
// backbutton.centerXAnchor.constraint(equalTo: containerView.centerXAnchor)
// ])
//
// // Create a UIBarButtonItem with the custom view
// let customBarButton = UIBarButtonItem(customView: containerView)
//
// // Create a flexible space item to push the custom view to the left
// let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
// flexibleSpace.width = 10
// // Create a negative spacer to fine-tune the position
// let negativeSpacer = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
// negativeSpacer.width = 10 // Adjust this value to move the button to the left
//
// // Add the custom bar button and the spacer to the navigation bar
// self.navigationItem.rightBarButtonItems = [flexibleSpace,negativeSpacer, customBarButton]
}
@objc func cartBtnTapped(){

View File

@@ -19,6 +19,12 @@ class ShopCategoryVM{
setupCell()
addGradient()
getCategory()
let btn = BadgeBarBtn.shared.setupCartButton()
self.vc.navigationItem.rightBarButtonItems = [btn]
BadgeBarBtn.shared.tapAction = {
print("tapped")
}
}
func setupCell(){

View File

@@ -18,56 +18,20 @@ class ShopListingVM{
addGradient()
getSuperCategory()
let filterBtn = UIButton.init(frame: CGRect.init(x: 0, y: 0, width: 45, height: 45))
filterBtn.setImage(UIImage(named: "CartIcon"), for: .normal)
filterBtn.addTarget(self, action: #selector(cartBtnTapped), for: .touchUpInside)
// let lblBadge = type(of: CartDataCache.cartBadgeLabel).init(frame: CGRect.init(x: 30, y: 0, width: 18, height: 18))
CartDataCache.cartBadgeLabel.backgroundColor = UIColor.red
CartDataCache.cartBadgeLabel.isHidden = true
CartDataCache.cartBadgeLabel.clipsToBounds = true
CartDataCache.cartBadgeLabel.layer.cornerRadius = 9
CartDataCache.cartBadgeLabel.textColor = UIColor.white
CartDataCache.cartBadgeLabel.font = FontCustom.shareInstance.customFont(fontName: .Exo2_Regular, size: 10)
CartDataCache.cartBadgeLabel.textAlignment = .center
filterBtn.addSubview(CartDataCache.cartBadgeLabel)
self.vc.navigationItem.rightBarButtonItems = [UIBarButtonItem.init(customView: filterBtn)]
let btn = BadgeBarBtn.shared.setupCartButton()
self.vc.navigationItem.rightBarButtonItems = [btn]
BadgeBarBtn.shared.tapAction = {
let sb = UIStoryboard(name: K.StoryBoard.cart, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Cart.cartListVC) as! CartListVC
self.vc.navigationController?.pushViewController(vcPush, animated: true)
}
//check if cart is not fetched
if !CartDataCache.isFetched{
CartDataCache.shareInstance.getCartList(vc: self.vc)
}
CartDataCache.cartBadgeLabel.text = "2"
// let btn = BadgedButtonItem(with: UIImage(named: "CartIcon")!)
// btn.setBadge(with: 2)
// self.vc.navigationItem.rightBarButtonItem = btn
//
// btn.tapAction = {
// print("tapped")
// }
// let cartButton = vc.createCartButton(imageName: "CartIcon",
// badgeNumber: CartDataCache.cartCount,
// target: self,
// action: #selector(cartBtnTapped))
//
// // Create a flexible space item to push the custom view to the left
// let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
// flexibleSpace.width = 10
//
// // Create a negative spacer to fine-tune the position
// let negativeSpacer = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
// negativeSpacer.width = 10 // Adjust this value to move the button to the left
//
// self.vc.navigationItem.rightBarButtonItems = [flexibleSpace, negativeSpacer, cartButton]
}
func setupCell(){
vc.tableView.register(UINib(nibName: K.CellIdentifier.Shop.shopListingCell, bundle: nil), forCellReuseIdentifier: K.CellIdentifier.Shop.shopListingCell)
vc.tableView.delegate = vc.self
@@ -124,95 +88,3 @@ class ShopListingVM{
}
}
}
extension UIBarButtonItem {
convenience init(icon: UIImage, badge: String, _ badgeBackgroundColor: UIColor = #colorLiteral(red: 0.9156965613, green: 0.380413115, blue: 0.2803866267, alpha: 1), target: Any? = UIBarButtonItem.self, action: Selector? = nil) {
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
imageView.image = icon
let label = UILabel(frame: CGRect(x: 8, y: -5, width: 20, height: 20))
label.text = badge
label.backgroundColor = badgeBackgroundColor
label.adjustsFontSizeToFitWidth = true
label.textAlignment = .center
label.font = FontCustom.shareInstance.customFont(fontName: .Exo2_Regular, size: 10)
label.clipsToBounds = true
label.layer.cornerRadius = 20 / 2
label.textColor = .white
let buttonView = UIView(frame: CGRect(x: 0, y: 0, width: 24, height: 24))
buttonView.addSubview(imageView)
buttonView.addSubview(label)
buttonView.addGestureRecognizer(UITapGestureRecognizer.init(target: target, action: action))
self.init(customView: buttonView)
}
}
class BadgedButtonItem1: UIBarButtonItem {
public func setBadge(with value: Int) {
self.badgeValue = value
}
private var badgeValue: Int? {
didSet {
if let value = badgeValue,
value > 0 {
lblBadge.isHidden = false
lblBadge.text = "\(value)"
} else {
lblBadge.isHidden = true
}
}
}
var tapAction: (() -> Void)?
private let filterBtn = UIButton()
private let lblBadge = UILabel()
override init() {
super.init()
setup()
}
init(with image: UIImage?) {
super.init()
setup(image: image)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
private func setup(image: UIImage? = nil) {
self.filterBtn.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
self.filterBtn.adjustsImageWhenHighlighted = false
self.filterBtn.setImage(image, for: .normal)
self.filterBtn.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
self.lblBadge.frame = CGRect(x: -5, y: 0, width: 15, height: 15)
self.lblBadge.backgroundColor = .red
self.lblBadge.clipsToBounds = true
self.lblBadge.layer.cornerRadius = 7
self.lblBadge.textColor = UIColor.white
self.lblBadge.font = UIFont.systemFont(ofSize: 10)
self.lblBadge.textAlignment = .center
self.lblBadge.isHidden = true
self.lblBadge.minimumScaleFactor = 0.1
self.lblBadge.adjustsFontSizeToFitWidth = true
self.filterBtn.addSubview(lblBadge)
self.customView = filterBtn
}
@objc func buttonPressed() {
if let action = tapAction {
action()
}
}
}

View File

@@ -15,7 +15,6 @@ class MyOrdersVC: UIViewController {
super.viewDidLoad()
vm.vc = self
vm.initView()
}

View File

@@ -15,32 +15,17 @@ class MyOrdersVM{
vc.title = "MY ORDERS".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
let btn = BadgeBarBtn.shared.setupCartButton()
self.vc.navigationItem.rightBarButtonItems = [btn]
BadgeBarBtn.shared.tapAction = {
let sb = UIStoryboard(name: K.StoryBoard.cart, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Cart.cartListVC) as! CartListVC
self.vc.navigationController?.pushViewController(vcPush, animated: true)
}
//check if cart is not fetched
if !CartDataCache.isFetched{
CartDataCache.shareInstance.getCartList(vc: self.vc)
}
let cartButton = vc.createCartButton(imageName: "CartIcon",
badgeNumber: CartDataCache.cartCount,
target: self,
action: #selector(cartBtnTapped))
// Create a flexible space item to push the custom view to the left
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
flexibleSpace.width = 10
// Create a negative spacer to fine-tune the position
let negativeSpacer = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
negativeSpacer.width = 10 // Adjust this value to move the button to the left
self.vc.navigationItem.rightBarButtonItems = [flexibleSpace, negativeSpacer, cartButton]
// Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { _ in
// lblBadge.text = "3"
// }
}
@objc func cartBtnTapped(){
print("cart tapped")
}
}