diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index d4f24ae..e50fb76 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -21,7 +21,7 @@ 340FDFD5292B5DB700C4E3DC /* DefaultQuestUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3416FC89292B560800B504C5 /* DefaultQuestUseCase.swift */; }; 340FDFDB292B7A1500C4E3DC /* QuestViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 340FDFDA292B7A1500C4E3DC /* QuestViewModelTests.swift */; }; 340FDFDE292B7A2C00C4E3DC /* QuestUseCaseMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 340FDFDD292B7A2C00C4E3DC /* QuestUseCaseMock.swift */; }; - 34113BE82934917500AB4919 /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34113BE72934917500AB4919 /* AuthViewModel.swift */; }; + 34113BE82934917500AB4919 /* LoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34113BE72934917500AB4919 /* LoginViewModel.swift */; }; 34113BEB2934A3B200AB4919 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34113BEA2934A3B200AB4919 /* LoginViewController.swift */; }; 34113BED2934BD3D00AB4919 /* TextFieldForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34113BEC2934BD3D00AB4919 /* TextFieldForm.swift */; }; 3413139C291E480500E607E1 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 3413139B291E480500E607E1 /* SnapKit */; }; @@ -155,7 +155,7 @@ 340A724A29348C2200B26AA6 /* DefaultAuthUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultAuthUseCase.swift; sourceTree = ""; }; 340FDFDA292B7A1500C4E3DC /* QuestViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewModelTests.swift; sourceTree = ""; }; 340FDFDD292B7A2C00C4E3DC /* QuestUseCaseMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestUseCaseMock.swift; sourceTree = ""; }; - 34113BE72934917500AB4919 /* AuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthViewModel.swift; sourceTree = ""; }; + 34113BE72934917500AB4919 /* LoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewModel.swift; sourceTree = ""; }; 34113BEA2934A3B200AB4919 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; 34113BEC2934BD3D00AB4919 /* TextFieldForm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldForm.swift; sourceTree = ""; }; 3416FC87292B54DB00B504C5 /* QuestUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestUseCase.swift; sourceTree = ""; }; @@ -311,7 +311,7 @@ 34113BE62934916B00AB4919 /* ViewModel */ = { isa = PBXGroup; children = ( - 34113BE72934917500AB4919 /* AuthViewModel.swift */, + 34113BE72934917500AB4919 /* LoginViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -1081,7 +1081,7 @@ 34874AA629252088000570DF /* AddQuestsViewController.swift in Sources */, 34642AB62925D9E40052FA0E /* UserInfoView.swift in Sources */, 349955292923600A007AB99E /* BrowseViewController.swift in Sources */, - 34113BE82934917500AB4919 /* AuthViewModel.swift in Sources */, + 34113BE82934917500AB4919 /* LoginViewModel.swift in Sources */, 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */, B58DFC0A29227DA800C68A4B /* CalendarCell.swift in Sources */, 3499551529232533007AB99E /* UIColor+.swift in Sources */, diff --git a/DailyQuest/DailyQuest/Application/DIContainer/SettingsSceneDIContainer.swift b/DailyQuest/DailyQuest/Application/DIContainer/SettingsSceneDIContainer.swift index 7309a88..a61a0e6 100644 --- a/DailyQuest/DailyQuest/Application/DIContainer/SettingsSceneDIContainer.swift +++ b/DailyQuest/DailyQuest/Application/DIContainer/SettingsSceneDIContainer.swift @@ -10,12 +10,24 @@ import UIKit final class SettingsSceneDIContainer { // MARK: - Repositories + func makeAuthRepository() -> AuthRepository { + return DefaultAuthRepository() + } // MARK: - Use Cases + func makeAuthUseCase() -> AuthUseCase { + return DefaultAuthUseCase(authRepository: makeAuthRepository()) + } // MARK: - View Models + func makeLoginViewModel() -> LoginViewModel { + return LoginViewModel(authUseCase: makeAuthUseCase()) + } // MARK: - View Controller + func makeLoginViewController() -> LoginViewController { + return LoginViewController.create(with: makeLoginViewModel()) + } // MARK: - Flow func makeSettingsCoordinator(navigationController: UINavigationController, diff --git a/DailyQuest/DailyQuest/Presentation/Settings/Flow/SettingsCoordinator.swift b/DailyQuest/DailyQuest/Presentation/Settings/Flow/SettingsCoordinator.swift index 22f47e0..6775f3d 100644 --- a/DailyQuest/DailyQuest/Presentation/Settings/Flow/SettingsCoordinator.swift +++ b/DailyQuest/DailyQuest/Presentation/Settings/Flow/SettingsCoordinator.swift @@ -43,7 +43,7 @@ final class DefaultSettingsCoordinator: SettingsCoordinator { } func showLoginFlow() { - let loginViewController = LoginViewController() + let loginViewController = settingsSceneDIContainer.makeLoginViewController() navigationController.pushViewController(loginViewController, animated: true) } } diff --git a/DailyQuest/DailyQuest/Presentation/Settings/ViewController/LoginViewController.swift b/DailyQuest/DailyQuest/Presentation/Settings/ViewController/LoginViewController.swift index cd3d4a0..0924658 100644 --- a/DailyQuest/DailyQuest/Presentation/Settings/ViewController/LoginViewController.swift +++ b/DailyQuest/DailyQuest/Presentation/Settings/ViewController/LoginViewController.swift @@ -12,6 +12,8 @@ import RxCocoa import SnapKit final class LoginViewController: UIViewController { + private var viewModel: LoginViewModel! + private var disposableBag = DisposeBag() private lazy var container: UIStackView = { let container = UIStackView() @@ -44,10 +46,19 @@ final class LoginViewController: UIViewController { }() // MARK: Life Cycle + static func create(with viewModel: LoginViewModel) -> LoginViewController { + let vc = LoginViewController() + vc.setup(with: viewModel) + + return vc + } + override func viewDidLoad() { super.viewDidLoad() configureUI() + + bind() } private func configureUI() { @@ -64,14 +75,32 @@ final class LoginViewController: UIViewController { make.width.equalToSuperview().multipliedBy(0.8) } } + + private func setup(with authViewModel: LoginViewModel) { + viewModel = authViewModel + } } -#if canImport(SwiftUI) && DEBUG -import SwiftUI - -struct ViewController_Preview: PreviewProvider { - static var previews: some View { - LoginViewController().showPreview(.iPhone14) +extension LoginViewController { + private func bind() { + let input = LoginViewModel.Input( + emailFieldDidEditEvent: emailField.rx.text.orEmpty.asObservable(), + passwordFieldDidEditEvent: passwordField.rx.text.orEmpty.asObservable(), + submitButtonDidTapEvent: submitButton.rx.tap.asObservable() + ) + + let output = viewModel.transform(input: input, disposeBag: disposableBag) + + output + .buttonEnabled + .drive(submitButton.rx.isEnabled) + .disposed(by: disposableBag) + + output + .loginResult + .subscribe(onNext: { result in + print("login result is :::: ", result) + }) + .disposed(by: disposableBag) } } -#endif diff --git a/DailyQuest/DailyQuest/Presentation/Settings/ViewModel/AuthViewModel.swift b/DailyQuest/DailyQuest/Presentation/Settings/ViewModel/LoginViewModel.swift similarity index 95% rename from DailyQuest/DailyQuest/Presentation/Settings/ViewModel/AuthViewModel.swift rename to DailyQuest/DailyQuest/Presentation/Settings/ViewModel/LoginViewModel.swift index 9b38c55..ba4ecef 100644 --- a/DailyQuest/DailyQuest/Presentation/Settings/ViewModel/AuthViewModel.swift +++ b/DailyQuest/DailyQuest/Presentation/Settings/ViewModel/LoginViewModel.swift @@ -1,5 +1,5 @@ // -// AuthViewModel.swift +// LoginViewModel.swift // DailyQuest // // Created by jinwoong Kim on 2022/11/28. @@ -10,7 +10,7 @@ import Foundation import RxSwift import RxCocoa -final class AuthViewModel { +final class LoginViewModel { private let authUseCase: AuthUseCase init(authUseCase: AuthUseCase) {