diff --git a/NADA-iOS-forRelease.xcodeproj/project.pbxproj b/NADA-iOS-forRelease.xcodeproj/project.pbxproj index fc8aa2e6..d5f70ab5 100644 --- a/NADA-iOS-forRelease.xcodeproj/project.pbxproj +++ b/NADA-iOS-forRelease.xcodeproj/project.pbxproj @@ -885,8 +885,8 @@ F8FC43A026C01F040033E151 /* ViewControllers */ = { isa = PBXGroup; children = ( - 397B75182763B5DA004AEB03 /* TeamNADA */, 397B750E2763A5DD004AEB03 /* OpenSource */, + 397B75182763B5DA004AEB03 /* TeamNADA */, 77812945275F6E6A004B34F4 /* CardDetail */, F8518059275D0468006BD5ED /* Onboarding */, 393E3343275F69DB00965BBF /* Splash */, diff --git a/NADA-iOS-forRelease/Resouces/Constants/Notification.swift b/NADA-iOS-forRelease/Resouces/Constants/Notification.swift index 5233bb6e..dfba9c83 100644 --- a/NADA-iOS-forRelease/Resouces/Constants/Notification.swift +++ b/NADA-iOS-forRelease/Resouces/Constants/Notification.swift @@ -20,6 +20,5 @@ extension Notification.Name { static let passDataToDetail = Notification.Name("passDataToDetail") static let reloadGroupViewController = Notification.Name("reloadGroupViewController") static let creationReloadMainCardSwiper = Notification.Name("creationReloadMainCardSwiper") - static let listReloadMainCardSwiper = Notification.Name("listReloadMainCardSwiper") static let dismissQRCodeCardResult = Notification.Name("dismissQRCodeCardResult") } diff --git a/NADA-iOS-forRelease/Resouces/Extensions/UIColor+Extension.swift b/NADA-iOS-forRelease/Resouces/Extensions/UIColor+Extension.swift index 583eaf11..68a79e02 100644 --- a/NADA-iOS-forRelease/Resouces/Extensions/UIColor+Extension.swift +++ b/NADA-iOS-forRelease/Resouces/Extensions/UIColor+Extension.swift @@ -134,6 +134,20 @@ extension UIColor { } } + @nonobjc class var loadingBackground: UIColor { + if #available(iOS 13, *) { + return UIColor { (traitCollection: UITraitCollection) -> UIColor in + if traitCollection.userInterfaceStyle == .light { + return UIColor(white: 0, alpha: 0.2) + } else { + return UIColor(white: 0, alpha: 0.8) + } + } + } else { + return UIColor(white: 0, alpha: 0.2) + } + } + @nonobjc class var harmonyRed: UIColor { return UIColor(red: 239.0 / 255.0, green: 115.0 / 255.0, blue: 115.0 / 255.0, alpha: 1.0) } diff --git a/NADA-iOS-forRelease/Resouces/Storyboards/CardCreation/CardCreation.storyboard b/NADA-iOS-forRelease/Resouces/Storyboards/CardCreation/CardCreation.storyboard index dcb2bffc..9264a9b3 100644 --- a/NADA-iOS-forRelease/Resouces/Storyboards/CardCreation/CardCreation.storyboard +++ b/NADA-iOS-forRelease/Resouces/Storyboards/CardCreation/CardCreation.storyboard @@ -1,9 +1,9 @@ - + - + diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/CardCreation/CardCreationPreviewViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/CardCreation/CardCreationPreviewViewController.swift index 4c144333..5fd7163d 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/CardCreation/CardCreationPreviewViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/CardCreation/CardCreationPreviewViewController.swift @@ -22,7 +22,7 @@ class CardCreationPreviewViewController: UIViewController { lazy var loadingBgView: UIView = { let bgView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)) - bgView.backgroundColor = .bottomDimmedBackground + bgView.backgroundColor = .loadingBackground return bgView }() @@ -246,6 +246,7 @@ extension CardCreationPreviewViewController { """) .setHeight(587) nextVC.modalPresentationStyle = .overFullScreen + presentingVC.present(nextVC, animated: true) { UserDefaults.standard.set(false, forKey: Const.UserDefaultsKey.isFirstCard) } diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/CardList/CardListViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/CardList/CardListViewController.swift index b1da9b41..697528df 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/CardList/CardListViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/CardList/CardListViewController.swift @@ -42,7 +42,6 @@ class CardListViewController: UIViewController { // MARK: - IBAction Properties @IBAction func dismissToPreviousView(_ sender: UIButton) { - NotificationCenter.default.post(name: .listReloadMainCardSwiper, object: nil) self.navigationController?.popViewController(animated: true) } diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Group/GroupViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Group/GroupViewController.swift index caf708c5..300f11a3 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Group/GroupViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Group/GroupViewController.swift @@ -62,7 +62,7 @@ class GroupViewController: UIViewController { lazy var loadingBgView: UIView = { let bgView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)) - bgView.backgroundColor = .bottomDimmedBackground + bgView.backgroundColor = .loadingBackground return bgView }() @@ -103,10 +103,16 @@ class GroupViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - offset = 0 - frontCards?.removeAll() - - groupListFetchWithAPI(userID: UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) ?? "") + DispatchQueue.main.async { + self.setActivityIndicator() + + self.offset = 0 + self.frontCards?.removeAll() + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.groupListFetchWithAPI(userID: UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) ?? "") + } } } @@ -146,7 +152,7 @@ extension GroupViewController { } // MARK: - @objc Methods - + @objc func didRecieveDataNotification(_ notification: Notification) { selectedRow = notification.object as? Int ?? 0 } @@ -155,7 +161,7 @@ extension GroupViewController { private func relaodCardCollection() { offset = 0 frontCards?.removeAll() - + groupListFetchWithAPI(userID: UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) ?? "") } } @@ -172,7 +178,10 @@ extension GroupViewController { self.groupCollectionView.reloadData() self.groupId = group.groups[self.selectedRow].groupID self.cardListInGroupWithAPI(cardListInGroupRequest: CardListInGroupRequest(userId: UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) ?? "", groupId: group.groups[self.selectedRow].groupID, offset: 0)) { - self.cardsCollectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .top, animated: false) + if self.frontCards?.count != 0 { + self.cardsCollectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .top, animated: false) + } + self.isInfiniteScroll = true } } case .requestErr(let message): @@ -188,40 +197,30 @@ extension GroupViewController { } func cardListInGroupWithAPI(cardListInGroupRequest: CardListInGroupRequest, completion: @escaping () -> Void = { }) { - DispatchQueue.main.async { - self.setActivityIndicator() - } - - DispatchQueue.main.async { - GroupAPI.shared.cardListFetchInGroup(cardListInGroupRequest: cardListInGroupRequest) { response in - switch response { - case .success(let data): - self.activityIndicator.stopAnimating() - self.loadingBgView.removeFromSuperview() - - self.isInfiniteScroll = true - - if let cards = data as? CardsInGroupResponse { - self.frontCards?.append(contentsOf: cards.cards) - if self.frontCards?.count == 0 { - self.emptyView.isHidden = false - } else { - self.emptyView.isHidden = true - } - self.cardsCollectionView.reloadData() + GroupAPI.shared.cardListFetchInGroup(cardListInGroupRequest: cardListInGroupRequest) { response in + switch response { + case .success(let data): + self.activityIndicator.stopAnimating() + self.loadingBgView.removeFromSuperview() + + if let cards = data as? CardsInGroupResponse { + self.frontCards?.append(contentsOf: cards.cards) + if self.frontCards?.count == 0 { + self.emptyView.isHidden = false + } else { + self.emptyView.isHidden = true } - case .requestErr(let message): - print("cardListInGroupWithAPI - requestErr: \(message)") - case .pathErr: - print("cardListInGroupWithAPI - pathErr") - case .serverErr: - print("cardListInGroupWithAPI - serverErr") - case .networkFail: - print("cardListInGroupWithAPI - networkFail") - } - if self.frontCards?.count != 0 { - completion() + self.cardsCollectionView.reloadData() } + completion() + case .requestErr(let message): + print("cardListInGroupWithAPI - requestErr: \(message)") + case .pathErr: + print("cardListInGroupWithAPI - pathErr") + case .serverErr: + print("cardListInGroupWithAPI - serverErr") + case .networkFail: + print("cardListInGroupWithAPI - networkFail") } } } @@ -254,12 +253,16 @@ extension GroupViewController { // MARK: - UICollectionViewDelegate extension GroupViewController: UICollectionViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { - if cardsCollectionView.contentOffset.y > cardsCollectionView.contentSize.height - cardsCollectionView.bounds.height { - if isInfiniteScroll { - isInfiniteScroll = false - offset += 1 - - cardListInGroupWithAPI(cardListInGroupRequest: CardListInGroupRequest(userId: UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) ?? "", groupId: serverGroups?.groups[self.selectedRow].groupID ?? -1, offset: offset)) + if scrollView == cardsCollectionView { + if cardsCollectionView.contentOffset.y > cardsCollectionView.contentSize.height - cardsCollectionView.bounds.height { + if isInfiniteScroll { + isInfiniteScroll = false + offset += 1 + + cardListInGroupWithAPI(cardListInGroupRequest: CardListInGroupRequest(userId: UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) ?? "", groupId: serverGroups?.groups[self.selectedRow].groupID ?? -1, offset: offset)) { + self.isInfiniteScroll = true + } + } } } } @@ -326,10 +329,19 @@ extension GroupViewController: UICollectionViewDataSource { groupId = serverGroups?.groups[indexPath.row].groupID offset = 0 frontCards?.removeAll() - cardListInGroupWithAPI(cardListInGroupRequest: - CardListInGroupRequest(userId: UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) ?? "", - groupId: serverGroups?.groups[indexPath.row].groupID ?? 0, - offset: 0)) + + DispatchQueue.main.async { + self.setActivityIndicator() + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.cardListInGroupWithAPI(cardListInGroupRequest: + CardListInGroupRequest(userId: UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) ?? "", + groupId: self.serverGroups?.groups[indexPath.row].groupID ?? 0, + offset: 0)) { + self.isInfiniteScroll = true + } + } case cardsCollectionView: cardDetailFetchWithAPI(cardID: frontCards?[indexPath.row].cardID ?? "") default: diff --git a/NADA-iOS-forRelease/Sources/ViewControllers/Main/FrontViewController.swift b/NADA-iOS-forRelease/Sources/ViewControllers/Main/FrontViewController.swift index 3aa65746..8b6c9409 100644 --- a/NADA-iOS-forRelease/Sources/ViewControllers/Main/FrontViewController.swift +++ b/NADA-iOS-forRelease/Sources/ViewControllers/Main/FrontViewController.swift @@ -6,8 +6,10 @@ // import UIKit -import VerticalCardSwiper + import KakaoSDKCommon +import NVActivityIndicatorView +import VerticalCardSwiper class FrontViewController: UIViewController { @@ -18,6 +20,27 @@ class FrontViewController: UIViewController { private var cardDataList: [Card]? = [] private var userID: String? + var isAfterCreation = false + + // MARK: - Components + + lazy var loadingBgView: UIView = { + let bgView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)) + bgView.backgroundColor = .loadingBackground + + return bgView + }() + + lazy var activityIndicator: NVActivityIndicatorView = { + let activityIndicator = NVActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 40, height: 40), + type: .ballBeat, + color: .mainColorNadaMain, + padding: .zero) + activityIndicator.translatesAutoresizingMaskIntoConstraints = false + + return activityIndicator + }() + // MARK: - @IBOutlet Properties @IBOutlet weak var cardSwiper: VerticalCardSwiper! @@ -28,7 +51,28 @@ class FrontViewController: UIViewController { setUserID() setDelegate() setNotification() - cardListFetchWithAPI(userID: userID, isList: false, offset: offset) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + if !self.isAfterCreation { + DispatchQueue.main.async { + + self.setActivityIndicator() + + self.offset = 0 + self.cardDataList?.removeAll() + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.cardListFetchWithAPI(userID: self.userID, isList: false, offset: self.offset) { + _ = self.cardSwiper.scrollToCard(at: 0, animated: false) + self.activityIndicator.stopAnimating() + self.loadingBgView.removeFromSuperview() + } + } + } } // MARK: - @IBAction Properties @@ -66,13 +110,24 @@ extension FrontViewController { private func setNotification() { NotificationCenter.default.addObserver(self, selector: #selector(didRecievePresentCardShare(_:)), name: .presentCardShare, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(setCreationReloadMainCardSwiper), name: .creationReloadMainCardSwiper, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(setListReloadMainCardSwiper), name: .listReloadMainCardSwiper, object: nil) } private func setUserID() { userID = UserDefaults.standard.string(forKey: Const.UserDefaultsKey.userID) } + private func setActivityIndicator() { + view.addSubview(loadingBgView) + loadingBgView.addSubview(activityIndicator) + + NSLayoutConstraint.activate([ + activityIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor), + activityIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor) + ]) + + activityIndicator.startAnimating() + } + // MARK: - @objc Methods @objc @@ -91,18 +146,15 @@ extension FrontViewController { @objc private func setCreationReloadMainCardSwiper() { + isAfterCreation = true + cardDataList?.removeAll() offset = 0 - _ = cardSwiper.scrollToCard(at: 1, animated: false) - cardListFetchWithAPI(userID: userID, isList: false, offset: offset) - } - - @objc - private func setListReloadMainCardSwiper() { - cardDataList?.removeAll() - offset = 0 - _ = cardSwiper.scrollToCard(at: 0, animated: false) - cardListFetchWithAPI(userID: userID, isList: false, offset: offset) + + cardListFetchWithAPI(userID: userID, isList: false, offset: offset) { + _ = self.cardSwiper.scrollToCard(at: 1, animated: false) + self.isAfterCreation = false + } } } @@ -118,7 +170,9 @@ extension FrontViewController: VerticalCardSwiperDelegate { isInfiniteScroll = false offset += 1 guard let userID = userID else { return } - cardListFetchWithAPI(userID: userID, isList: false, offset: offset) + cardListFetchWithAPI(userID: userID, isList: false, offset: offset) { + self.isInfiniteScroll = true + } } } } @@ -152,17 +206,16 @@ extension FrontViewController: VerticalCardSwiperDatasource { // MARK: - Network extension FrontViewController { - func cardListFetchWithAPI(userID: String?, isList: Bool, offset: Int) { + func cardListFetchWithAPI(userID: String?, isList: Bool, offset: Int, completion: @escaping () -> Void = { }) { guard let userID = userID else { return } CardAPI.shared.cardListFetch(userID: userID, isList: isList, offset: offset) { response in switch response { case .success(let data): - self.isInfiniteScroll = true - if let cardListLookUp = data as? CardListLookUp { self.cardDataList?.append(contentsOf: cardListLookUp.cards) self.cardSwiper.reloadData() } + completion() case .requestErr(let message): print("cardListFetchWithAPI - requestErr: \(message)") case .pathErr: