From 8aa6a68cea6fdf1126a87e4830e0c6baae1455b5 Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Sun, 6 Oct 2024 16:29:35 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[Chore]=20#202=20-=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=9D=B4=EB=A6=84=20=EC=84=A4=EC=A0=95=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EC=A0=95=EA=B7=9C=ED=91=9C=ED=98=84=EC=8B=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resource/Protocols/ProfileViewModelType.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Terning-iOS/Terning-iOS/Resource/Protocols/ProfileViewModelType.swift b/Terning-iOS/Terning-iOS/Resource/Protocols/ProfileViewModelType.swift index 59b9eb32..cf63fe97 100644 --- a/Terning-iOS/Terning-iOS/Resource/Protocols/ProfileViewModelType.swift +++ b/Terning-iOS/Terning-iOS/Resource/Protocols/ProfileViewModelType.swift @@ -23,14 +23,14 @@ extension ProfileViewModelType { func characterCount(of string: String) -> Int { return string.count } - + func containsSpecialCharacters(_ string: String) -> Bool { let regex = "[\\p{S}\\p{C}]" return string.range(of: regex, options: .regularExpression) != nil } - + func containsSymbols(_ string: String) -> Bool { - let regex = "[!@#$%^&*(),.?\":;'/{}\\[\\]|<>+=\\-_\\\\\\ \\—…’‘’]" + let regex = "[!@#$%^&*(),.?\":;'/{}\\[\\]|<>+=\\-_\\\\—…’‘’]" return string.range(of: regex, options: .regularExpression) != nil } } From 85a0966c40b8be9c567edd8267cfcadc25135ea8 Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Sun, 6 Oct 2024 16:34:31 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[Chore]=20#202=20-=20LoginViewController=20?= =?UTF-8?q?=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewController/AccountOptionViewController.swift | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Terning-iOS/Terning-iOS/Source/Presentation/AccountOption/ViewController/AccountOptionViewController.swift b/Terning-iOS/Terning-iOS/Source/Presentation/AccountOption/ViewController/AccountOptionViewController.swift index c009b00b..d4fbdedd 100644 --- a/Terning-iOS/Terning-iOS/Source/Presentation/AccountOption/ViewController/AccountOptionViewController.swift +++ b/Terning-iOS/Terning-iOS/Source/Presentation/AccountOption/ViewController/AccountOptionViewController.swift @@ -99,12 +99,10 @@ extension AccountOptionViewController { extension AccountOptionViewController { private func navigateToLoginVC() { - let LoginVC = UINavigationController( - rootViewController: LoginViewController( - viewModel: LoginViewModel( - loginRepository: LoginRepository( - loginService: LoginService() - ) + let LoginVC = LoginViewController( + viewModel: LoginViewModel( + loginRepository: LoginRepository( + loginService: LoginService() ) ) ) From a089804ed63b2d21a865e34596e220139607df2a Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Sun, 6 Oct 2024 16:35:50 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[Chore]=20#202=20-=20rootView=20=EB=A1=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Profile/ViewModel/ProfileViewModel.swift | 2 +- .../AdvertisementCollectionViewCell.swift | 2 +- .../ViewController/SearchViewController.swift | 61 ++++++++++--------- 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Terning-iOS/Terning-iOS/Source/Presentation/Profile/ViewModel/ProfileViewModel.swift b/Terning-iOS/Terning-iOS/Source/Presentation/Profile/ViewModel/ProfileViewModel.swift index d5e290c3..21cec95d 100644 --- a/Terning-iOS/Terning-iOS/Source/Presentation/Profile/ViewModel/ProfileViewModel.swift +++ b/Terning-iOS/Terning-iOS/Source/Presentation/Profile/ViewModel/ProfileViewModel.swift @@ -11,7 +11,7 @@ import RxCocoa import RxSwift final class ProfileViewModel: ProfileViewModelType { - + // MARK: - Properties private let authProvider = Providers.authProvider diff --git a/Terning-iOS/Terning-iOS/Source/Presentation/Search/Cell/AdvertisementCollectionViewCell.swift b/Terning-iOS/Terning-iOS/Source/Presentation/Search/Cell/AdvertisementCollectionViewCell.swift index 40d65f0f..53428f94 100644 --- a/Terning-iOS/Terning-iOS/Source/Presentation/Search/Cell/AdvertisementCollectionViewCell.swift +++ b/Terning-iOS/Terning-iOS/Source/Presentation/Search/Cell/AdvertisementCollectionViewCell.swift @@ -57,6 +57,6 @@ extension AdvertisementCollectionViewCell { extension AdvertisementCollectionViewCell { func bind(with advertisement: UIImage) { - advertisementImageView.image = advertisement + advertisementImageView.image = advertisement } } diff --git a/Terning-iOS/Terning-iOS/Source/Presentation/Search/ViewController/SearchViewController.swift b/Terning-iOS/Terning-iOS/Source/Presentation/Search/ViewController/SearchViewController.swift index bd698566..2bd914f5 100644 --- a/Terning-iOS/Terning-iOS/Source/Presentation/Search/ViewController/SearchViewController.swift +++ b/Terning-iOS/Terning-iOS/Source/Presentation/Search/ViewController/SearchViewController.swift @@ -30,12 +30,13 @@ final class SearchViewController: UIViewController { // MARK: - UI Components - let searchView = SearchView() + let rootView = SearchView() // MARK: - Init init(viewModel: SearchViewModel) { self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) } @@ -63,10 +64,10 @@ final class SearchViewController: UIViewController { extension SearchViewController { private func setUI() { view.backgroundColor = .white - view.addSubview(searchView) + view.addSubview(rootView) } private func setLayout() { - searchView.snp.makeConstraints { + rootView.snp.makeConstraints { $0.edges.equalTo(view.safeAreaLayoutGuide) } } @@ -76,15 +77,15 @@ extension SearchViewController { extension SearchViewController { private func setDelegate() { - searchView.collectionView.dataSource = self - searchView.collectionView.delegate = self + rootView.collectionView.dataSource = self + rootView.collectionView.delegate = self } private func setAddTarget() { - searchView.searchView.textField.isUserInteractionEnabled = false + rootView.searchView.textField.isUserInteractionEnabled = false let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleSearchViewTap)) - searchView.searchView.addGestureRecognizer(tapGestureRecognizer) - searchView.pageControl.isUserInteractionEnabled = false + rootView.searchView.addGestureRecognizer(tapGestureRecognizer) + rootView.pageControl.isUserInteractionEnabled = false } private func startTimer() { @@ -122,11 +123,11 @@ extension SearchViewController { @objc private func autoScroll() { - let currentPage = searchView.pageControl.currentPage - let nextPage = (currentPage + 1) % (searchView.advertisement?.advertisements?.count ?? 1) + let currentPage = rootView.pageControl.currentPage + let nextPage = (currentPage + 1) % (rootView.advertisement?.advertisements?.count ?? 1) let indexPath = IndexPath(item: nextPage, section: RecomandType.advertisement.rawValue) - searchView.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) - searchView.pageControl.currentPage = nextPage + rootView.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) + rootView.pageControl.currentPage = nextPage } } @@ -144,23 +145,23 @@ extension SearchViewController { output.announcements .drive(onNext: { [weak self] advertisements in - self?.searchView.advertisement = advertisements - self?.searchView.collectionView.reloadData() - self?.searchView.pageControl.numberOfPages = advertisements.advertisements?.count ?? 0 + self?.rootView.advertisement = advertisements + self?.rootView.collectionView.reloadData() + self?.rootView.pageControl.numberOfPages = advertisements.advertisements?.count ?? 0 }) .disposed(by: disposeBag) output.recommendedByViews .drive(onNext: { [weak self] viewsNum in - self?.searchView.viewsNum = viewsNum - self?.searchView.collectionView.reloadData() + self?.rootView.viewsNum = viewsNum + self?.rootView.collectionView.reloadData() }) .disposed(by: disposeBag) output.recommendedByScraps .drive(onNext: { [weak self] scrapsNum in - self?.searchView.scrapsNum = scrapsNum - self?.searchView.collectionView.reloadData() + self?.rootView.scrapsNum = scrapsNum + self?.rootView.collectionView.reloadData() }) .disposed(by: disposeBag) @@ -174,8 +175,8 @@ extension SearchViewController { .drive(onNext: { [weak self] page in guard let self = self else { return } let indexPath = IndexPath(item: page, section: RecomandType.advertisement.rawValue) - self.searchView.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) - self.searchView.pageControl.currentPage = page + self.rootView.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) + self.rootView.pageControl.currentPage = page }) .disposed(by: disposeBag) } @@ -191,11 +192,11 @@ extension SearchViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { switch RecomandType(rawValue: section) { case .advertisement: - return searchView.advertisement?.advertisements?.count ?? 0 + return rootView.advertisement?.advertisements?.count ?? 0 case .viewsNum: - return searchView.viewsNum?.count ?? 0 + return rootView.viewsNum?.count ?? 0 case .scrapsNum: - return searchView.scrapsNum?.count ?? 0 + return rootView.scrapsNum?.count ?? 0 default: return 0 } @@ -205,21 +206,21 @@ extension SearchViewController: UICollectionViewDataSource { switch RecomandType(rawValue: indexPath.section) { case .advertisement: guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: AdvertisementCollectionViewCell.className, for: indexPath) as? AdvertisementCollectionViewCell, - let advertisements = searchView.advertisement?.advertisements else { + let advertisements = rootView.advertisement?.advertisements else { return UICollectionViewCell() } cell.bind(with: advertisements[indexPath.row]) return cell case .viewsNum: guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: RecommendCollectionViewCell.className, for: indexPath) as? RecommendCollectionViewCell, - let viewsNum = searchView.viewsNum else { + let viewsNum = rootView.viewsNum else { return UICollectionViewCell() } cell.bind(with: viewsNum[indexPath.row]) return cell case .scrapsNum: guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: RecommendCollectionViewCell.className, for: indexPath) as? RecommendCollectionViewCell, - let scrapsNum = searchView.scrapsNum else { + let scrapsNum = rootView.scrapsNum else { return UICollectionViewCell() } cell.bind(with: scrapsNum[indexPath.row]) @@ -266,7 +267,7 @@ extension SearchViewController: UICollectionViewDelegate { guard let url = URL(string: urlString) else { return } UIApplication.shared.open(url, options: [:], completionHandler: nil) case .viewsNum: - guard let viewsNum = searchView.viewsNum else { return } + guard let viewsNum = rootView.viewsNum else { return } let selectedItem = viewsNum[indexPath.item].internshipAnnouncementId @@ -283,7 +284,7 @@ extension SearchViewController: UICollectionViewDelegate { jobDetailVC.internshipAnnouncementId.accept(selectedItem) self.navigationController?.pushViewController(jobDetailVC, animated: true) case .scrapsNum: - guard let scrapsNum = searchView.scrapsNum else { return } + guard let scrapsNum = rootView.scrapsNum else { return } let selectedItem = scrapsNum[indexPath.item].internshipAnnouncementId @@ -309,7 +310,7 @@ extension SearchViewController: UICollectionViewDelegate { guard let sectionType = RecomandType(rawValue: indexPath.section) else { return } if sectionType == .advertisement { - searchView.pageControl.currentPage = indexPath.item + rootView.pageControl.currentPage = indexPath.item } } From 1a87b959d3ed16a83c42be577b1b3af9f6003744 Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Mon, 7 Oct 2024 17:13:49 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[Setting]=20#202=20-=20v1.0.1=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Terning-iOS/Terning-iOS.xcodeproj/project.pbxproj | 8 ++++---- Terning-iOS/Terning-iOS/Info.plist | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Terning-iOS/Terning-iOS.xcodeproj/project.pbxproj b/Terning-iOS/Terning-iOS.xcodeproj/project.pbxproj index 9c0f99f0..5f166ee8 100644 --- a/Terning-iOS/Terning-iOS.xcodeproj/project.pbxproj +++ b/Terning-iOS/Terning-iOS.xcodeproj/project.pbxproj @@ -1724,7 +1724,7 @@ CODE_SIGN_ENTITLEMENTS = "Terning-iOS/Terning-iOS.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2024.1002.0940; + CURRENT_PROJECT_VERSION = 2024.1006.1653; DEVELOPMENT_TEAM = 8Q4H7X3Q58; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1739,7 +1739,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.0; + MARKETING_VERSION = 1.0.1; OTHER_LDFLAGS = ( "-Xlinker", "-interposable", @@ -1764,7 +1764,7 @@ CODE_SIGN_ENTITLEMENTS = "Terning-iOS/Terning-iOS.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2024.1002.0940; + CURRENT_PROJECT_VERSION = 2024.1006.1653; DEVELOPMENT_TEAM = 8Q4H7X3Q58; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1779,7 +1779,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.0; + MARKETING_VERSION = 1.0.1; PRODUCT_BUNDLE_IDENTIFIER = "com.terning.Terning-iOS"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/Terning-iOS/Terning-iOS/Info.plist b/Terning-iOS/Terning-iOS/Info.plist index 7202658b..f69ddc4a 100644 --- a/Terning-iOS/Terning-iOS/Info.plist +++ b/Terning-iOS/Terning-iOS/Info.plist @@ -2,6 +2,12 @@ + CFBundleDisplayName + terning + CFBundleShortVersionString + 1.0.1 + CFBundleVersion + 2024.1006.1653 ITSAppUsesNonExemptEncryption CFBundleURLTypes