Vassa007

Home

Mar 5th, 2025
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 9.74 KB | None | 0 0
  1. //
  2. //  HomeViewController.swift
  3. //  SFL-NextGen-Unej
  4. //
  5. //  Created by Rendy K.R on 12/04/20.
  6. //  Copyright © 2020 Universitas Jember. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10.  
  11. class HomeViewController: UIViewController {
  12.  
  13.     @IBOutlet weak var profileView: UIView!
  14.     @IBOutlet weak var namaLabel: UILabel!
  15.     @IBOutlet weak var nipNrpLabel: UILabel!
  16.     @IBOutlet weak var fakultasLabel: PaddingLabel!
  17.     @IBOutlet weak var profilePicture: UIImageView!
  18.    
  19.     @IBOutlet weak var menuCollectionView: UICollectionView!
  20.     @IBOutlet weak var menuHeightConstraint: NSLayoutConstraint!
  21.    
  22.     let listMenu = ["Jadwal", "Kehadiran", "Entri Nilai", "Ganti Jadwal", "Perwalian", "Bimbingan", "UC3", "Monitoring", "More"]
  23.     let menuIcons = [
  24.         UIImage(named: "icon_jadwal"),
  25.         UIImage(named: "icon_kehadiran"),
  26.         UIImage(named: "icon_entryNilai"),
  27.         UIImage(named: "icon_gantiJadwal"),
  28.         UIImage(named: "icon_perwalian"),
  29.         UIImage(named: "icon_bimbingan"),
  30.         UIImage(named: "icon_uc3"),
  31.         UIImage(named: "icon_monitoring"),
  32.         UIImage(named: "icon_more")
  33.     ]
  34.    
  35.     let customView = Bundle.main.loadNibNamed("MoreMenu", owner: nil, options: nil)?.first as! MoreMenuView
  36.    
  37.     var menuCollectionViewHeight: CGFloat {
  38.         menuCollectionView.layoutIfNeeded()
  39.  
  40.         return menuCollectionView.contentSize.height
  41.     }
  42.    
  43.     let locManager = deviceLocationManager.shared
  44.    
  45.     override func viewDidLoad() {
  46.         super.viewDidLoad()
  47.  
  48.         // Do any additional setup after loading the view.
  49.         homeStyleConfigurations()
  50.         menuCollectionView.delegate = self
  51.         menuCollectionView.dataSource = self
  52.        
  53.         if #available(iOS 13.0, *) {
  54.             let barAppearance = UINavigationBarAppearance()
  55.             barAppearance.backgroundColor = globalConstants.mainGreen
  56.             barAppearance.shadowImage = UIImage()
  57.             barAppearance.shadowColor = globalConstants.mainGreen
  58.             self.navigationController?.navigationBar.standardAppearance = barAppearance
  59.             self.navigationController?.navigationBar.scrollEdgeAppearance = barAppearance
  60.             self.navigationController?.navigationBar.shadowImage = UIImage()
  61.             self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
  62.             self.navigationController?.navigationBar.shadowImage = UIImage()
  63.            
  64.         } else {
  65.             // Fallback on earlier versions
  66.         }
  67.                
  68.         if #available(iOS 15.0, *) {
  69.             let appearance = UITabBarAppearance()
  70.             appearance.configureWithOpaqueBackground()
  71.             appearance.backgroundColor = .white
  72.  
  73.             appearance.stackedLayoutAppearance.normal.iconColor = globalConstants.lightGrey
  74.             appearance.stackedLayoutAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: globalConstants.lightGrey]
  75.             appearance.stackedLayoutAppearance.normal.badgeBackgroundColor = globalConstants.lightGrey
  76.  
  77.             appearance.stackedLayoutAppearance.selected.iconColor = globalConstants.mainGreen
  78.             appearance.stackedLayoutAppearance.selected.titleTextAttributes = [NSAttributedString.Key.foregroundColor: globalConstants.mainGreen]
  79.  
  80.             self.tabBarController?.tabBar.standardAppearance = appearance
  81.             self.tabBarController?.tabBar.scrollEdgeAppearance = appearance
  82.         }
  83.        
  84.         locManager.retrieveCurrentLocation()
  85.         getLocationData()
  86.     }
  87.    
  88.     override func viewWillAppear(_ animated: Bool) {
  89.         super.viewWillAppear(true)
  90.        
  91.         self.view.setNeedsLayout()
  92.         self.view.layoutIfNeeded()
  93.         collectionViewStyle()
  94.         let profPicString = UserDefaults.standard.string(forKey: "profilePicture") ?? ""
  95.        
  96.         if profPicString.isEmpty == true || profPicString == "" {
  97.             profilePicture.image = UIImage(named: "sampleProfilePicture")
  98.         } else {
  99.             let resize = CGSize(width: profilePicture.frame.size.width, height: profilePicture.frame.size.height)
  100.             let photoData = Data(base64Encoded: profPicString)
  101.             let photoImage = UIImage(data: photoData!)?.crop(to: resize)
  102.             profilePicture.image = photoImage!
  103.         }
  104.         appVersionChecker.compareVersion(currentVersion: globalConstants.versiApp)
  105.         checkIDFcm.updateFCM(idfcm: UserDefaults.standard.string(forKey: "idfcm") ?? "", perangkat: UIDevice.modelName, os: UIDevice.current.systemVersion, appVersion: globalConstants.versiApp)
  106.        
  107.         if socketManager.shared.socket != nil && socketManager.shared.manager != nil && socketManager.shared.socket.status == .connected {
  108. //            print("SOCKET STATUS: ", socketManager.shared.socket.status)
  109.             socketManager.shared.terminateConnection()
  110.         }
  111.        
  112.     }
  113.    
  114.     override func viewDidLayoutSubviews() {
  115.         super.viewDidLayoutSubviews()
  116.         self.profilePicture.layer.cornerRadius = self.profilePicture.frame.size.height/2
  117.         self.fakultasLabel.cornerRadius = self.fakultasLabel.frame.size.height/2
  118.     }
  119.    
  120.     @IBAction func notifikasiButton(_ sender: Any) {
  121.         self.pushViewController(sbName: "Notifikasi", sbID: "notifikasiSB")
  122.     }
  123.    
  124.     @IBAction func settingButton(_ sender: Any) {
  125.         self.pushViewController(sbName: "Setting", sbID: "settingSB")
  126.     }
  127.    
  128.     /*
  129.     // MARK: - Navigation
  130.  
  131.     // In a storyboard-based application, you will often want to do a little preparation before navigation
  132.     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  133.         // Get the new view controller using segue.destination.
  134.         // Pass the selected object to the new view controller.
  135.     }
  136.     */
  137.    
  138. }
  139.  
  140. extension HomeViewController {
  141.    
  142.     private func getLocationData() {
  143.         DispatchQueue.global().async(qos: .background) {
  144.             let timer = Timer(timeInterval: 300, repeats: true) { _ in
  145.                 self.postLocations()
  146.             }
  147.             let runLoop = RunLoop.current
  148.             runLoop.add(timer, forMode: .default)
  149.             runLoop.run()
  150.         }
  151.     }
  152.    
  153.     func postLocations() {
  154.         let locManager = deviceLocationManager.shared
  155.         locManager.retrieveCurrentLocation()
  156.         guard let location = locManager.locationArr.last else { return }
  157.         let jsonLocation = location.toJSON()
  158.         let encLocation = crypter.shared.encrypt(jsonLocation)
  159.         // MARK:  Post method ke server & local
  160.         do {
  161.             switch AppDelegate.canConnectInternet() {
  162.             case false:
  163.                 UserLocationProcess.insertLocalLocationData(locations: encLocation, timelog: location["timelog"]!)
  164.                 break
  165.             case true:
  166. //                self.insertLocalLocationData(locations: encLocation, timelog: location["timelog"]!)
  167. //                let now = Date()
  168. //                let jamMasuk = now.timeAt(jam: 7, menit: 30)
  169. //                let jamPulang = now.timeAt(jam: 14, menit: 00)
  170. //                if now >= jamMasuk && now <= jamPulang {
  171. //                    print("MASUK DALAM TIME INTERVAL")
  172.                     let localDataNotSynced = self.getLocalLocationData()
  173.                    
  174.                     if localDataNotSynced.count > 0 {
  175.                         sendLocationsToServer(fromLocal: true, data: localDataNotSynced)
  176.                         sendLocationsToServer(fromLocal: false, data: [location])
  177.                     } else {
  178.                         sendLocationsToServer(fromLocal: false, data: [location])
  179.                     }
  180.                
  181.                 break
  182.             }
  183.         }
  184.     }
  185.    
  186.     func getLocalLocationData() -> [[String: String]] {
  187.         do {
  188.             let localData = try UserLocationProcess.readLocalLocationData()
  189.             var notSynchronizedData = [[String: String]]()
  190.             for i in 0..<localData.count {
  191.                 if localData[i].synchronized == false {
  192.                     let decryptedData = crypter.shared.decrypt(localData[i].data)
  193.                     let dictData = try JSONSerialization.jsonObject(with: decryptedData.data(using: .utf8)!, options: .allowFragments)
  194.                    
  195.                     notSynchronizedData.append(dictData as! [String : String])
  196.                 }
  197.             }
  198.            
  199.             return notSynchronizedData
  200.         } catch let error {
  201.             print(error)
  202.         }
  203.        
  204.         return []
  205.     }
  206.    
  207.     func sendLocationsToServer(fromLocal: Bool, data: [[String: String]]) {
  208.         let params = [
  209.            "lokasi": data
  210.         ]
  211.        
  212.         let encParams = crypter.shared.encrypt(params.toJSON())
  213. //            print(crypter.shared.decrypt(encParams))
  214.         let streams = [
  215.             "streams": encParams
  216.         ]
  217.        
  218.         let log = LogLocationHandler.init()
  219.         log.fetchData(streams as Dictionary<String, AnyObject>, method: .post, headers: nHeaders.headerAfterLogin(), closure: {
  220.             (res: globalResModel!, errorMsg) -> Void in
  221.             if errorMsg != nil {
  222.                 print(errorMsg!)
  223.             } else {
  224.                 if res.success == false {
  225.                 } else {
  226.                     if fromLocal == true {
  227.                         self.updateLocalLocationDataToSync(notSynchronizedData: data)
  228.                     }
  229.                 }
  230.             }
  231.         })
  232.     }
  233.    
  234.     func updateLocalLocationDataToSync(notSynchronizedData: [[String: String]]) {
  235. //        print("NOT SYNC DATA: ", Array(Set(notSynchronizedData)))
  236.         for i in 0..<notSynchronizedData.count {
  237.             UserLocationProcess.updateStatusIsSync(timelog: notSynchronizedData[i]["timelog"]!, synchronized: true)
  238.         }
  239.     }
  240. }
  241.  
Add Comment
Please, Sign In to add comment