From 98a6bdbe08c8fcfe1cb4c6b61ab4366ca196ac66 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Sun, 23 Oct 2022 15:01:26 +0900 Subject: [PATCH 01/23] =?UTF-8?q?feat=20::=20RenewalPasswordFeature=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dependency+Project.swift | 1 + .../RenewalPasswordFeature-Info.plist | 22 +++++++++++++++++++ .../RenewalPasswordFeatureTests-Info.plist | 22 +++++++++++++++++++ .../RenewalPasswordFeature/Project.swift | 10 +++++++++ .../Sources/RenewalPasswordFeature.swift | 1 + .../Tests/TargetTests.swift | 17 ++++++++++++++ Projects/Features/RootFeature/Project.swift | 1 + 7 files changed, 74 insertions(+) create mode 100644 Projects/Features/RenewalPasswordFeature/Derived/InfoPlists/RenewalPasswordFeature-Info.plist create mode 100644 Projects/Features/RenewalPasswordFeature/Derived/InfoPlists/RenewalPasswordFeatureTests-Info.plist create mode 100644 Projects/Features/RenewalPasswordFeature/Project.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/RenewalPasswordFeature.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Tests/TargetTests.swift diff --git a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift index 1622772d..fa730c63 100644 --- a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift +++ b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift @@ -10,6 +10,7 @@ public extension TargetDependency { } public extension TargetDependency.Project.Features { + static let RenewalPasswordFeature = TargetDependency.feature(name: "RenewalPasswordFeature") static let FindIDFeature = TargetDependency.feature(name: "FindIDFeature") static let SigninFeature = TargetDependency.feature(name: "SigninFeature") static let BaseFeature = TargetDependency.feature(name: "BaseFeature") diff --git a/Projects/Features/RenewalPasswordFeature/Derived/InfoPlists/RenewalPasswordFeature-Info.plist b/Projects/Features/RenewalPasswordFeature/Derived/InfoPlists/RenewalPasswordFeature-Info.plist new file mode 100644 index 00000000..323e5ecf --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Derived/InfoPlists/RenewalPasswordFeature-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Features/RenewalPasswordFeature/Derived/InfoPlists/RenewalPasswordFeatureTests-Info.plist b/Projects/Features/RenewalPasswordFeature/Derived/InfoPlists/RenewalPasswordFeatureTests-Info.plist new file mode 100644 index 00000000..6c40a6cd --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Derived/InfoPlists/RenewalPasswordFeatureTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Features/RenewalPasswordFeature/Project.swift b/Projects/Features/RenewalPasswordFeature/Project.swift new file mode 100644 index 00000000..0ac5bc52 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Project.swift @@ -0,0 +1,10 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.makeModule( + name: "RenewalPasswordFeature", + product: .staticFramework, + dependencies: [ + .Project.Features.BaseFeature + ] +) \ No newline at end of file diff --git a/Projects/Features/RenewalPasswordFeature/Sources/RenewalPasswordFeature.swift b/Projects/Features/RenewalPasswordFeature/Sources/RenewalPasswordFeature.swift new file mode 100644 index 00000000..b50248b0 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/RenewalPasswordFeature.swift @@ -0,0 +1 @@ +// This is for tuist \ No newline at end of file diff --git a/Projects/Features/RenewalPasswordFeature/Tests/TargetTests.swift b/Projects/Features/RenewalPasswordFeature/Tests/TargetTests.swift new file mode 100644 index 00000000..b1cf7940 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Tests/TargetTests.swift @@ -0,0 +1,17 @@ +import XCTest + +class TargetTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + XCTAssertEqual("A", "A") + } + +} diff --git a/Projects/Features/RootFeature/Project.swift b/Projects/Features/RootFeature/Project.swift index 98817b25..fff97d03 100644 --- a/Projects/Features/RootFeature/Project.swift +++ b/Projects/Features/RootFeature/Project.swift @@ -7,6 +7,7 @@ let project = Project.makeModule( dependencies: [ .Project.Features.BaseFeature, .Project.Features.FindIDFeature, + .Project.Features.RenewalPasswordFeature, .Project.Features.SigninFeature ] ) From 47cf644abb7dac935b73889e75966382c59b9b9b Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Sun, 23 Oct 2022 15:35:08 +0900 Subject: [PATCH 02/23] =?UTF-8?q?feat=20::=20view=20file=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RenewalPasswordFeature/Sources/RenewalPasswordFeature.swift | 1 - .../Sources/View/AuthenticationEmailView.swift | 1 + .../RenewalPasswordFeature/Sources/View/ChangePasswordView.swift | 1 + .../Sources/View/EnterInformationView.swift | 1 + 4 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 Projects/Features/RenewalPasswordFeature/Sources/RenewalPasswordFeature.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/RenewalPasswordFeature.swift b/Projects/Features/RenewalPasswordFeature/Sources/RenewalPasswordFeature.swift deleted file mode 100644 index b50248b0..00000000 --- a/Projects/Features/RenewalPasswordFeature/Sources/RenewalPasswordFeature.swift +++ /dev/null @@ -1 +0,0 @@ -// This is for tuist \ No newline at end of file diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift @@ -0,0 +1 @@ + diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift b/Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift @@ -0,0 +1 @@ + diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift b/Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift @@ -0,0 +1 @@ + From 3ebda15ede353b39d8c3bb467d48f44a29729967 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Wed, 26 Oct 2022 01:10:52 +0900 Subject: [PATCH 03/23] =?UTF-8?q?merge=20::=20develop=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=92=80=20=EB=B0=9B=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dependency+Project.swift | 1 + .../Sources/Application/DI/AppComponent.swift | 19 ++++ .../DI/Auth/AppComponent+Auth.swift | 4 + Projects/App/Sources/Application/DMSApp.swift | 3 +- .../Sources/Application/NeedleGenerated.swift | 85 ++++++++++++++++ .../Sources/DmsFeaturesObject.swift | 11 ++ .../InfoPlists/MainTabFeature-Info.plist | 22 ++++ .../InfoPlists/MainTabFeatureTests-Info.plist | 22 ++++ .../Features/MainTabFeature/Project.swift | 10 ++ .../Sources/MainTabComponent.swift | 10 ++ .../MainTabFeature/Sources/MainTabView.swift | 78 +++++++++++++++ .../MainTabFeature/Tests/TargetTests.swift | 17 ++++ .../AuthenticationEmailComponent.swift | 19 ++++ .../Component/ChangePasswordComponent.swift | 17 ++++ .../Component/EnterInformationComponent.swift | 17 ++++ .../View/AuthenticationEmailView.swift | 12 +++ .../Sources/View/BlockEmailView.swift | 41 ++++++++ .../Sources/View/ChangePasswordView.swift | 13 +++ .../Sources/View/EnterInformationView.swift | 78 +++++++++++++++ .../AuthenticationEmailViewModel.swift | 22 ++++ .../ViewModel/ChangePasswordViewModel.swift | 21 ++++ .../ViewModel/EnterInformationViewModel.swift | 32 ++++++ Projects/Features/RootFeature/Project.swift | 3 +- .../RootFeature/Sources/Feature.swift | 1 - .../RootFeature/Sources/RootComponent.swift | 10 ++ .../RootFeature/Sources/RootView.swift | 20 ++++ .../Modules/Utility/Sources/SceneFlow.swift | 7 ++ .../Modules/Utility/Sources/StorageKeys.swift | 5 + .../Services/APIKit/Sources/AuthAPI.swift | 28 ++++++ .../Sources/Base/DmsFeaturesResponseDTO.swift | 17 ++++ .../Impl/AuthRepositoreImpl.swift | 6 +- .../Stub/AuthRepositoryStub.swift | 19 ++-- .../UseCases/Fake/SigninUseCaseFake.swift | 5 +- .../Impl/ReissueTokenUseCaseImpl.swift | 16 +++ .../UseCases/Impl/SigninUseCaseImpl.swift | 2 +- .../Repository/AuthRepositoryImplSpec.swift | 8 +- .../Auth/UseCase/SigninUseCaseImplSpec.swift | 8 +- .../Auth/Repository/AuthRepository.swift | 3 +- .../Auth/UseCases/ReissueTokenUseCase.swift | 7 ++ .../Sources/Auth/UseCases/SigninUseCase.swift | 2 +- .../Sources/Entities/DmsFeatures.swift | 17 ++++ Projects/Services/NetworkModule/Project.swift | 3 +- .../Impl/RemoteAuthDataSourceImpl.swift | 13 ++- .../Auth/Remote/RemoteAuthDataSource.swift | 4 +- .../Stub/RemoteAuthDataSourceStub.swift | 20 ++-- .../DmsFeaturesDataTransfer.swift | 12 +++ .../Remote/RemoteAuthDataSourceImplSpec.swift | 9 +- .../Sources/BottomSheet/DmsBottomSheet.swift | 94 ++++++++++++++++++ .../Extensions/View+cornerRadius.swift | 21 ++++ ...kButton.swift => View+dmsBackButton.swift} | 0 graph.png | Bin 77495 -> 88529 bytes 51 files changed, 883 insertions(+), 31 deletions(-) create mode 100644 Projects/Features/BaseFeature/Sources/DmsFeaturesObject.swift create mode 100644 Projects/Features/MainTabFeature/Derived/InfoPlists/MainTabFeature-Info.plist create mode 100644 Projects/Features/MainTabFeature/Derived/InfoPlists/MainTabFeatureTests-Info.plist create mode 100644 Projects/Features/MainTabFeature/Project.swift create mode 100644 Projects/Features/MainTabFeature/Sources/MainTabComponent.swift create mode 100644 Projects/Features/MainTabFeature/Sources/MainTabView.swift create mode 100644 Projects/Features/MainTabFeature/Tests/TargetTests.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/Component/ChangePasswordComponent.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/Component/EnterInformationComponent.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/ViewModel/ChangePasswordViewModel.swift create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/ViewModel/EnterInformationViewModel.swift delete mode 100644 Projects/Features/RootFeature/Sources/Feature.swift create mode 100644 Projects/Features/RootFeature/Sources/RootComponent.swift create mode 100644 Projects/Features/RootFeature/Sources/RootView.swift create mode 100644 Projects/Modules/Utility/Sources/SceneFlow.swift create mode 100644 Projects/Modules/Utility/Sources/StorageKeys.swift create mode 100644 Projects/Services/DataMappingModule/Sources/Base/DmsFeaturesResponseDTO.swift create mode 100644 Projects/Services/DataModule/Sources/Auth/UseCases/Impl/ReissueTokenUseCaseImpl.swift create mode 100644 Projects/Services/DomainModule/Sources/Auth/UseCases/ReissueTokenUseCase.swift create mode 100644 Projects/Services/DomainModule/Sources/Entities/DmsFeatures.swift create mode 100644 Projects/Services/NetworkModule/Sources/Base/DataTransfer/DmsFeaturesDataTransfer.swift create mode 100644 Projects/UsertInterfaces/DesignSystem/Sources/BottomSheet/DmsBottomSheet.swift create mode 100644 Projects/UsertInterfaces/DesignSystem/Sources/Extensions/View+cornerRadius.swift rename Projects/UsertInterfaces/DesignSystem/Sources/Extensions/{View+configBackButton.swift => View+dmsBackButton.swift} (100%) diff --git a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift index fa730c63..c64d4302 100644 --- a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift +++ b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift @@ -11,6 +11,7 @@ public extension TargetDependency { public extension TargetDependency.Project.Features { static let RenewalPasswordFeature = TargetDependency.feature(name: "RenewalPasswordFeature") + static let MainTabFeature = TargetDependency.feature(name: "MainTabFeature") static let FindIDFeature = TargetDependency.feature(name: "FindIDFeature") static let SigninFeature = TargetDependency.feature(name: "SigninFeature") static let BaseFeature = TargetDependency.feature(name: "BaseFeature") diff --git a/Projects/App/Sources/Application/DI/AppComponent.swift b/Projects/App/Sources/Application/DI/AppComponent.swift index bcd6a156..1fcbe644 100644 --- a/Projects/App/Sources/Application/DI/AppComponent.swift +++ b/Projects/App/Sources/Application/DI/AppComponent.swift @@ -3,6 +3,8 @@ import SwiftUI import KeychainModule import FindIDFeature import SigninFeature +import RenewalPasswordFeature +import MainTabFeature public final class AppComponent: BootstrapComponent { public func makeRootView() -> some View { @@ -14,6 +16,7 @@ public final class AppComponent: BootstrapComponent { } } +// MARK: - Auth public extension AppComponent { var findIDComponent: FindIDComponent { FindIDComponent(parent: self) @@ -21,4 +24,20 @@ public extension AppComponent { var signinComponent: SigninComponent { SigninComponent(parent: self) } + var enterInformationComponent: EnterInformationComponent { + EnterInformationComponent(parent: self) + } + var authenticationEmailComponent: AuthenticationEmailComponent { + AuthenticationEmailComponent(parent: self) + } + var changePasswordComponent: ChangePasswordComponent { + ChangePasswordComponent(parent: self) + } +} + +// MARK: - Main +public extension AppComponent { + var mainTabComponent: MainTabComponent { + MainTabComponent(parent: self) + } } diff --git a/Projects/App/Sources/Application/DI/Auth/AppComponent+Auth.swift b/Projects/App/Sources/Application/DI/Auth/AppComponent+Auth.swift index 85c88db0..7d89ef4c 100644 --- a/Projects/App/Sources/Application/DI/Auth/AppComponent+Auth.swift +++ b/Projects/App/Sources/Application/DI/Auth/AppComponent+Auth.swift @@ -25,6 +25,10 @@ public extension AppComponent { SendAuthCodeUseCaseImpl(authRepository: authRepository) } + var reissueTokenUseCase: any ReissueTokenUseCase { + ReissueTokenCaseImpl(authRepository: authRepository) + } + var checkEmailExistByAccountIDUseCase: any CheckEmailExistByAccountIDUseCase { CheckEmailExistByAccountIDUseCaseImpl(authRepository: authRepository) } diff --git a/Projects/App/Sources/Application/DMSApp.swift b/Projects/App/Sources/Application/DMSApp.swift index 577e9df5..3b1081ed 100644 --- a/Projects/App/Sources/Application/DMSApp.swift +++ b/Projects/App/Sources/Application/DMSApp.swift @@ -1,7 +1,6 @@ import SwiftUI import DesignSystem import FindIDFeature - import SigninFeature @main @@ -13,7 +12,7 @@ struct DMSApp: App { var body: some Scene { WindowGroup { NavigationView { - AppComponent().signinComponent.makeView() + AppComponent().enterInformationComponent.makeView() } } } diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift index b7d84746..4c0a9a7f 100644 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ b/Projects/App/Sources/Application/NeedleGenerated.swift @@ -4,8 +4,10 @@ import DataModule import DomainModule import FindIDFeature import KeychainModule +import MainTabFeature import NeedleFoundation import NetworkModule +import RenewalPasswordFeature import SigninFeature import SwiftUI @@ -22,6 +24,17 @@ private func parent1(_ component: NeedleFoundation.Scope) -> NeedleFoundation.Sc #if !NEEDLE_DYNAMIC +private class MainTabDependency2826cdb310ed0b17a725Provider: MainTabDependency { + + + init() { + + } +} +/// ^->AppComponent->MainTabComponent +private func factory1ab5a747ddf21e1393f9e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { + return MainTabDependency2826cdb310ed0b17a725Provider() +} private class SigninDependencyde06a9d0b22764487733Provider: SigninDependency { var signinUseCase: any SigninUseCase { return appComponent.signinUseCase @@ -35,6 +48,48 @@ private class SigninDependencyde06a9d0b22764487733Provider: SigninDependency { private func factory2882a056d84a613debccf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { return SigninDependencyde06a9d0b22764487733Provider(appComponent: parent1(component) as! AppComponent) } +private class EnterInformationDependency9204f24c784151f429ddProvider: EnterInformationDependency { + var checkAccountIDIsExistUseCase: any CheckAccountIDIsExistUseCase { + return appComponent.checkAccountIDIsExistUseCase + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->EnterInformationComponent +private func factory359a960501e79e833f64f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return EnterInformationDependency9204f24c784151f429ddProvider(appComponent: parent1(component) as! AppComponent) +} +private class AuthenticationEmailDependency73189eb572618b10e0fbProvider: AuthenticationEmailDependency { + var verifyAuthCodeUseCase: any VerifyAuthCodeUseCase { + return appComponent.verifyAuthCodeUseCase + } + var sendAuthCodeUseCase: any SendAuthCodeUseCase { + return appComponent.sendAuthCodeUseCase + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->AuthenticationEmailComponent +private func factory8798d0becd9d2870112af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return AuthenticationEmailDependency73189eb572618b10e0fbProvider(appComponent: parent1(component) as! AppComponent) +} +private class ChangePasswordDependency04ab7ced24136c4fb27eProvider: ChangePasswordDependency { + var renewalPasswordUseCase: any RenewalPasswordUseCase { + return appComponent.renewalPasswordUseCase + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->ChangePasswordComponent +private func factoryab7c4d87dab53e0a51b9f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return ChangePasswordDependency04ab7ced24136c4fb27eProvider(appComponent: parent1(component) as! AppComponent) +} private class FindIDDependencyb481fe947a844cc29913Provider: FindIDDependency { var findIDUseCase: any FindIDUseCase { return appComponent.findIDUseCase @@ -62,10 +117,15 @@ extension AppComponent: Registration { localTable["signinUseCase-any SigninUseCase"] = { self.signinUseCase as Any } localTable["verifyAuthCodeUseCase-any VerifyAuthCodeUseCase"] = { self.verifyAuthCodeUseCase as Any } localTable["sendAuthCodeUseCase-any SendAuthCodeUseCase"] = { self.sendAuthCodeUseCase as Any } + localTable["reissueTokenUseCase-any ReissueTokenUseCase"] = { self.reissueTokenUseCase as Any } localTable["checkEmailExistByAccountIDUseCase-any CheckEmailExistByAccountIDUseCase"] = { self.checkEmailExistByAccountIDUseCase as Any } localTable["checkAccountIDIsExistUseCase-any CheckAccountIDIsExistUseCase"] = { self.checkAccountIDIsExistUseCase as Any } localTable["findIDComponent-FindIDComponent"] = { self.findIDComponent as Any } localTable["signinComponent-SigninComponent"] = { self.signinComponent as Any } + localTable["enterInformationComponent-EnterInformationComponent"] = { self.enterInformationComponent as Any } + localTable["authenticationEmailComponent-AuthenticationEmailComponent"] = { self.authenticationEmailComponent as Any } + localTable["changePasswordComponent-ChangePasswordComponent"] = { self.changePasswordComponent as Any } + localTable["mainTabComponent-MainTabComponent"] = { self.mainTabComponent as Any } localTable["remoteStudentsDataSource-any RemoteStudentsDataSource"] = { self.remoteStudentsDataSource as Any } localTable["studentsRepository-any StudentsRepository"] = { self.studentsRepository as Any } localTable["signupUseCase-any SignupUseCase"] = { self.signupUseCase as Any } @@ -82,11 +142,32 @@ extension AppComponent: Registration { localTable["checkSchoolCodeUseCase-any CheckSchoolCodeUseCase"] = { self.checkSchoolCodeUseCase as Any } } } +extension MainTabComponent: Registration { + public func registerItems() { + + } +} extension SigninComponent: Registration { public func registerItems() { keyPathToName[\SigninDependency.signinUseCase] = "signinUseCase-any SigninUseCase" } } +extension EnterInformationComponent: Registration { + public func registerItems() { + keyPathToName[\EnterInformationDependency.checkAccountIDIsExistUseCase] = "checkAccountIDIsExistUseCase-any CheckAccountIDIsExistUseCase" + } +} +extension AuthenticationEmailComponent: Registration { + public func registerItems() { + keyPathToName[\AuthenticationEmailDependency.verifyAuthCodeUseCase] = "verifyAuthCodeUseCase-any VerifyAuthCodeUseCase" + keyPathToName[\AuthenticationEmailDependency.sendAuthCodeUseCase] = "sendAuthCodeUseCase-any SendAuthCodeUseCase" + } +} +extension ChangePasswordComponent: Registration { + public func registerItems() { + keyPathToName[\ChangePasswordDependency.renewalPasswordUseCase] = "renewalPasswordUseCase-any RenewalPasswordUseCase" + } +} extension FindIDComponent: Registration { public func registerItems() { keyPathToName[\FindIDDependency.findIDUseCase] = "findIDUseCase-any FindIDUseCase" @@ -110,7 +191,11 @@ private func registerProviderFactory(_ componentPath: String, _ factory: @escapi private func register1() { registerProviderFactory("^->AppComponent", factoryEmptyDependencyProvider) + registerProviderFactory("^->AppComponent->MainTabComponent", factory1ab5a747ddf21e1393f9e3b0c44298fc1c149afb) registerProviderFactory("^->AppComponent->SigninComponent", factory2882a056d84a613debccf47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->EnterInformationComponent", factory359a960501e79e833f64f47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->AuthenticationEmailComponent", factory8798d0becd9d2870112af47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->ChangePasswordComponent", factoryab7c4d87dab53e0a51b9f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->FindIDComponent", factory8dd2f9e0b545ead35ecaf47b58f8f304c97af4d5) } #endif diff --git a/Projects/Features/BaseFeature/Sources/DmsFeaturesObject.swift b/Projects/Features/BaseFeature/Sources/DmsFeaturesObject.swift new file mode 100644 index 00000000..ab4d2231 --- /dev/null +++ b/Projects/Features/BaseFeature/Sources/DmsFeaturesObject.swift @@ -0,0 +1,11 @@ +import Combine +import DomainModule +import Foundation + +public final class DmsFeaturesObject: ObservableObject { + public let features: DmsFeatures + + public init(features: DmsFeatures) { + self.features = features + } +} diff --git a/Projects/Features/MainTabFeature/Derived/InfoPlists/MainTabFeature-Info.plist b/Projects/Features/MainTabFeature/Derived/InfoPlists/MainTabFeature-Info.plist new file mode 100644 index 00000000..323e5ecf --- /dev/null +++ b/Projects/Features/MainTabFeature/Derived/InfoPlists/MainTabFeature-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Features/MainTabFeature/Derived/InfoPlists/MainTabFeatureTests-Info.plist b/Projects/Features/MainTabFeature/Derived/InfoPlists/MainTabFeatureTests-Info.plist new file mode 100644 index 00000000..6c40a6cd --- /dev/null +++ b/Projects/Features/MainTabFeature/Derived/InfoPlists/MainTabFeatureTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Features/MainTabFeature/Project.swift b/Projects/Features/MainTabFeature/Project.swift new file mode 100644 index 00000000..23ddfdc7 --- /dev/null +++ b/Projects/Features/MainTabFeature/Project.swift @@ -0,0 +1,10 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.makeModule( + name: "MainTabFeature", + product: .staticFramework, + dependencies: [ + .Project.Features.BaseFeature + ] +) \ No newline at end of file diff --git a/Projects/Features/MainTabFeature/Sources/MainTabComponent.swift b/Projects/Features/MainTabFeature/Sources/MainTabComponent.swift new file mode 100644 index 00000000..66e1b108 --- /dev/null +++ b/Projects/Features/MainTabFeature/Sources/MainTabComponent.swift @@ -0,0 +1,10 @@ +import NeedleFoundation +import SwiftUI + +public protocol MainTabDependency: Dependency {} + +public final class MainTabComponent: Component { + public func makeView() -> some View { + MainTabView() + } +} diff --git a/Projects/Features/MainTabFeature/Sources/MainTabView.swift b/Projects/Features/MainTabFeature/Sources/MainTabView.swift new file mode 100644 index 00000000..11553e31 --- /dev/null +++ b/Projects/Features/MainTabFeature/Sources/MainTabView.swift @@ -0,0 +1,78 @@ +import SwiftUI +import DesignSystem + +struct MainTabView: View { + @State var selection = 0 + @Namespace var animation + @Namespace var tabAnimation + + var body: some View { + VStack { + TabView(selection: $selection) { + Text("0") + .tag(0) + + Text("1") + .tag(1) + + Text("2") + .tag(2) + + Text("3") + .tag(3) + } + .ignoresSafeArea() + + tabbarView() + .background { + Color.GrayScale.gray1 + .ignoresSafeArea() + } + .shadow( + color: .GrayScale.gray5.opacity(0.24), + radius: 20, + y: 1 + ) + } + } + + @ViewBuilder + func tabbarView() -> some View { + let tabItem: [(String, Int)] = [ + ("house", 0), + ("plus.bubble", 1), + ("megaphone", 2), + ("person", 3) + ] + + HStack { + Spacer() + + ForEach(tabItem, id: \.1) { name, tag in + tabItemView(systemName: name, tag: tag) + + Spacer() + } + } + } + + @ViewBuilder + func tabItemView(systemName: String, tag: Int) -> some View { + Button { + withAnimation { + selection = tag + } + } label: { + Image(systemName: systemName) + .foregroundColor(tag == selection ? .GrayScale.gray8: .GrayScale.gray5) + .overlay(alignment: .top) { + Circle() + .fill(Color.PrimaryVariant.darken2) + .frame(width: tag == selection ? 4 : 0, height: tag == selection ? 4 : 0) + .offset(y: -8) + } + .padding(12) + } + + } +} diff --git a/Projects/Features/MainTabFeature/Tests/TargetTests.swift b/Projects/Features/MainTabFeature/Tests/TargetTests.swift new file mode 100644 index 00000000..b1cf7940 --- /dev/null +++ b/Projects/Features/MainTabFeature/Tests/TargetTests.swift @@ -0,0 +1,17 @@ +import XCTest + +class TargetTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + XCTAssertEqual("A", "A") + } + +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift new file mode 100644 index 00000000..941b13cc --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift @@ -0,0 +1,19 @@ +import DomainModule +import NeedleFoundation +import SwiftUI + +public protocol AuthenticationEmailDependency: Dependency { + var verifyAuthCodeUseCase: any VerifyAuthCodeUseCase { get } + var sendAuthCodeUseCase: any SendAuthCodeUseCase { get } +} + +public final class AuthenticationEmailComponent: Component { + public func makeView() -> some View { + AuthenticationEmailView( + viewModel: .init( + verifyAuthCodeUseCase: self.dependency.verifyAuthCodeUseCase, + sendAuthCodeUseCase: self.dependency.sendAuthCodeUseCase + ) + ) + } +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/Component/ChangePasswordComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/Component/ChangePasswordComponent.swift new file mode 100644 index 00000000..3795602d --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/Component/ChangePasswordComponent.swift @@ -0,0 +1,17 @@ +import DomainModule +import NeedleFoundation +import SwiftUI + +public protocol ChangePasswordDependency: Dependency { + var renewalPasswordUseCase: any RenewalPasswordUseCase { get } +} + +public final class ChangePasswordComponent: Component { + public func makeView() -> some View { + ChangePasswordView( + viewModel: .init( + renewalPasswordUseCase: self.dependency.renewalPasswordUseCase + ) + ) + } +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/Component/EnterInformationComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/Component/EnterInformationComponent.swift new file mode 100644 index 00000000..3bb2ad4c --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/Component/EnterInformationComponent.swift @@ -0,0 +1,17 @@ +import DomainModule +import NeedleFoundation +import SwiftUI + +public protocol EnterInformationDependency: Dependency { + var checkAccountIDIsExistUseCase: any CheckAccountIDIsExistUseCase { get } +} + +public final class EnterInformationComponent: Component { + public func makeView() -> some View { + EnterInformationView( + viewModel: .init( + checkAccountIDIsExistUseCase: self.dependency.checkAccountIDIsExistUseCase + ) + ) + } +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift index 8b137891..8e8a954d 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift @@ -1 +1,13 @@ +import SwiftUI +import DesignSystem +struct AuthenticationEmailView: View { + @StateObject var viewModel: AuthenticationEmailViewModel + + public init(viewModel: AuthenticationEmailViewModel) { + _viewModel = StateObject(wrappedValue: viewModel) + } + var body: some View { + Text("AuthenticationEmailView") + } +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift new file mode 100644 index 00000000..337c9694 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift @@ -0,0 +1,41 @@ +import SwiftUI +import DesignSystem + +struct BlockEmailView: View { + @Binding var email: String + @Binding var isShow: Bool + + init( + email: Binding, + isShow: Binding + ) { + _email = email + _isShow = isShow + } + + var body: some View { +// if isShow { + ZStack { + Color.GrayScale.gray2 + .ignoresSafeArea() + + HStack { + VStack(alignment: .leading) { + Text("아이디와 일치하는 이메일 입니다") + .dmsFont(.text(.small), color: .GrayScale.gray7) + .multilineTextAlignment(.leading) + + Text(email) + .dmsFont(.text(.small), color: .PrimaryVariant.primary) + .multilineTextAlignment(.leading) + } + Spacer() + + } + .padding(.horizontal, 16) + } + .frame(height: 68) + + } +// } +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift b/Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift index 8b137891..e53a3e6b 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift @@ -1 +1,14 @@ +import SwiftUI +import DesignSystem +struct ChangePasswordView: View { + @StateObject var viewModel: ChangePasswordViewModel + + public init(viewModel: ChangePasswordViewModel) { + _viewModel = StateObject(wrappedValue: viewModel) + } + + var body: some View { + Text("ChangePasswordView") + } +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift b/Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift index 8b137891..b6fe2be7 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift @@ -1 +1,79 @@ +import SwiftUI +import DesignSystem +struct EnterInformationView: View { + private enum FocusField { + case id + case name + case email + } + + @FocusState private var focusField: FocusField? + @StateObject var viewModel: EnterInformationViewModel + + public init(viewModel: EnterInformationViewModel) { + _viewModel = StateObject(wrappedValue: viewModel) + } + + var body: some View { + VStack { + HStack { + VStack(alignment: .leading, spacing: 8) { + Text("DMS") + .dmsFont(.title(.extraLarge), color: .PrimaryVariant.primary) + .padding(.top, 28) + + Text("계정 본인인증") + .dmsFont(.text(.medium), color: .GrayScale.gray6) + } + + Spacer() + } + VStack(spacing: 20) { + DMSFloatingTextField("아이디", text: $viewModel.id) { + focusField = .name + withAnimation(Animation.easeIn(duration: 0.2)) { + viewModel.returnEmailTextField() + } + } + .focused($focusField, equals: .id) + .textContentType(.nickname) + + if viewModel.isShow { + BlockEmailView(email: $viewModel.blockEmail, isShow: $viewModel.isShow) + } + + } + .padding(.top, 68) + .transition(.slide) + + VStack(spacing: 60) { + DMSFloatingTextField("이름", text: $viewModel.name) { + focusField = .email + } + .focused($focusField, equals: .name) + .textContentType(.name) + + DMSFloatingTextField("이메일", text: $viewModel.email) { + viewModel.nextButtonDidTap() + } + .focused($focusField, equals: .email) + .textContentType(.emailAddress) + } + .padding(.top, 40) + + Spacer() + + DMSWideButton(text: "다음", color: .PrimaryVariant.primary) { + viewModel.nextButtonDidTap() + } + .disabled(!viewModel.isNextButtonEnabled ) + .padding(.bottom, 40) + + } + .frame(maxWidth: .infinity) + .ignoresSafeArea(.keyboard, edges: .bottom) + .padding(.horizontal, 24) + + } +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift new file mode 100644 index 00000000..5a7de25b --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift @@ -0,0 +1,22 @@ +import BaseFeature +import Combine +import DomainModule + +final class AuthenticationEmailViewModel: BaseViewModel { + + @Published var email = "" + @Published var id = "" + @Published var name = "" + @Published var authenticationCode = "" + + private let verifyAuthCodeUseCase: any VerifyAuthCodeUseCase + private let sendAuthCodeUseCase: any SendAuthCodeUseCase + + public init( + verifyAuthCodeUseCase: any VerifyAuthCodeUseCase, + sendAuthCodeUseCase: any SendAuthCodeUseCase + ) { + self.verifyAuthCodeUseCase = verifyAuthCodeUseCase + self.sendAuthCodeUseCase = sendAuthCodeUseCase + } +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/ChangePasswordViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/ChangePasswordViewModel.swift new file mode 100644 index 00000000..dcbfdf55 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/ChangePasswordViewModel.swift @@ -0,0 +1,21 @@ +import BaseFeature +import Combine +import DomainModule + +final class ChangePasswordViewModel: BaseViewModel { + + @Published var email = "" + @Published var id = "" + @Published var name = "" + @Published var authenticationCode = "" + @Published var password = "" + @Published var verificationㅖassword = "" + + private let renewalPasswordUseCase: any RenewalPasswordUseCase + + public init( + renewalPasswordUseCase: any RenewalPasswordUseCase + ) { + self.renewalPasswordUseCase = renewalPasswordUseCase + } +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/EnterInformationViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/EnterInformationViewModel.swift new file mode 100644 index 00000000..5a96bfc3 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/EnterInformationViewModel.swift @@ -0,0 +1,32 @@ +import BaseFeature +import Combine +import DomainModule + +final class EnterInformationViewModel: BaseViewModel { + + @Published var email = "" + @Published var blockEmail = "082****@naver.com" + @Published var id = "" + @Published var name = "" + @Published var isShow = false + + var isNextButtonEnabled: Bool { + !email.isEmpty && !id.isEmpty && !name.isEmpty + } + + private let checkAccountIDIsExistUseCase: any CheckAccountIDIsExistUseCase + + public init( + checkAccountIDIsExistUseCase: any CheckAccountIDIsExistUseCase + ) { + self.checkAccountIDIsExistUseCase = checkAccountIDIsExistUseCase + } + + func nextButtonDidTap() { + + } + + func returnEmailTextField() { + isShow.toggle() // 임시 + } +} diff --git a/Projects/Features/RootFeature/Project.swift b/Projects/Features/RootFeature/Project.swift index fff97d03..59d34c15 100644 --- a/Projects/Features/RootFeature/Project.swift +++ b/Projects/Features/RootFeature/Project.swift @@ -8,6 +8,7 @@ let project = Project.makeModule( .Project.Features.BaseFeature, .Project.Features.FindIDFeature, .Project.Features.RenewalPasswordFeature, - .Project.Features.SigninFeature + .Project.Features.SigninFeature, + .Project.Features.MainTabFeature ] ) diff --git a/Projects/Features/RootFeature/Sources/Feature.swift b/Projects/Features/RootFeature/Sources/Feature.swift deleted file mode 100644 index 7d846fc7..00000000 --- a/Projects/Features/RootFeature/Sources/Feature.swift +++ /dev/null @@ -1 +0,0 @@ -// this is for tuist diff --git a/Projects/Features/RootFeature/Sources/RootComponent.swift b/Projects/Features/RootFeature/Sources/RootComponent.swift new file mode 100644 index 00000000..fb6418eb --- /dev/null +++ b/Projects/Features/RootFeature/Sources/RootComponent.swift @@ -0,0 +1,10 @@ +import NeedleFoundation +import SwiftUI + +public protocol RootDependency: Dependency {} + +public final class RootComponent: Component { + public func makeView() -> some View { + RootView() + } +} diff --git a/Projects/Features/RootFeature/Sources/RootView.swift b/Projects/Features/RootFeature/Sources/RootView.swift new file mode 100644 index 00000000..9b3af904 --- /dev/null +++ b/Projects/Features/RootFeature/Sources/RootView.swift @@ -0,0 +1,20 @@ +import BaseFeature +import SwiftUI +import Utility + +struct RootView: View { + @AppStorage(StorageKeys.sceneFlow.rawValue) var sceneFlow: SceneFlow = .splash + @StateObject var dmsFeaturesObject = DmsFeaturesObject( + features: .init(mealService: false, noticeService: false, pointService: false) + ) + + var body: some View { + Text("Hello, World!") + } +} + +struct RootView_Previews: PreviewProvider { + static var previews: some View { + RootView() + } +} diff --git a/Projects/Modules/Utility/Sources/SceneFlow.swift b/Projects/Modules/Utility/Sources/SceneFlow.swift new file mode 100644 index 00000000..8151f35f --- /dev/null +++ b/Projects/Modules/Utility/Sources/SceneFlow.swift @@ -0,0 +1,7 @@ +import Foundation + +public enum SceneFlow: String, RawRepresentable { + case splash + case auth + case main +} diff --git a/Projects/Modules/Utility/Sources/StorageKeys.swift b/Projects/Modules/Utility/Sources/StorageKeys.swift new file mode 100644 index 00000000..06a8f635 --- /dev/null +++ b/Projects/Modules/Utility/Sources/StorageKeys.swift @@ -0,0 +1,5 @@ +import Foundation + +public enum StorageKeys: String { + case sceneFlow = "SCENE_FLOW" +} diff --git a/Projects/Services/APIKit/Sources/AuthAPI.swift b/Projects/Services/APIKit/Sources/AuthAPI.swift index abc11b20..8953e28b 100644 --- a/Projects/Services/APIKit/Sources/AuthAPI.swift +++ b/Projects/Services/APIKit/Sources/AuthAPI.swift @@ -140,6 +140,34 @@ extension AuthAPI: DmsAPI { public var sampleData: Data { switch self { + case .signin: + return """ +{ + "access_token" : "access.access.access", + "expired_at" : "2022-02-27'T'12:12:12", + "refresh_token" : "refresh.refresh.refresh", + "features" : { + "meal_service" : false, + "notice_service" : false, + "point_service" : false, + } +} +""".data(using: .utf8) ?? .init() + + case .reissueToken: + return """ +{ + "access_token" : "access.access.access", + "expired_at" : "2022-02-27'T'12:12:12", + "refresh_token" : "refresh.refresh.refresh", + "features" : { + "meal_service" : false, + "notice_service" : false, + "point_service" : false, + } +} +""".data(using: .utf8) ?? .init() + case .checkAccountIDIsExist: return """ { diff --git a/Projects/Services/DataMappingModule/Sources/Base/DmsFeaturesResponseDTO.swift b/Projects/Services/DataMappingModule/Sources/Base/DmsFeaturesResponseDTO.swift new file mode 100644 index 00000000..f02870c9 --- /dev/null +++ b/Projects/Services/DataMappingModule/Sources/Base/DmsFeaturesResponseDTO.swift @@ -0,0 +1,17 @@ +import Foundation + +public struct DmsFeaturesResponseDTO: Decodable { + public let features: DmsFeaturesDTO +} + +public struct DmsFeaturesDTO: Decodable { + public let mealService: Bool + public let noticeService: Bool + public let pointService: Bool + + enum CodingKeys: String, CodingKey { + case mealService = "meal_service" + case noticeService = "notice_service" + case pointService = "point_service" + } +} diff --git a/Projects/Services/DataModule/Sources/Auth/Repositories/Impl/AuthRepositoreImpl.swift b/Projects/Services/DataModule/Sources/Auth/Repositories/Impl/AuthRepositoreImpl.swift index 52013c44..a0656eef 100644 --- a/Projects/Services/DataModule/Sources/Auth/Repositories/Impl/AuthRepositoreImpl.swift +++ b/Projects/Services/DataModule/Sources/Auth/Repositories/Impl/AuthRepositoreImpl.swift @@ -11,7 +11,7 @@ public struct AuthRepositoryImpl: AuthRepository { self.remoteAuthDataSource = remoteAuthDataSource } - public func signin(req: SigninRequestDTO) -> AnyPublisher { + public func signin(req: SigninRequestDTO) -> AnyPublisher { remoteAuthDataSource.signin(req: req) } @@ -23,6 +23,10 @@ public struct AuthRepositoryImpl: AuthRepository { remoteAuthDataSource.sendAuthCode(req: req) } + public func reissueToken() -> AnyPublisher { + remoteAuthDataSource.reissueToken() + } + public func checkEmailExistByAccountID(req: EmailExistByAccountIDRequestDTO) -> AnyPublisher { remoteAuthDataSource.checkEmailExistByAccountID(req: req) } diff --git a/Projects/Services/DataModule/Sources/Auth/Repositories/Stub/AuthRepositoryStub.swift b/Projects/Services/DataModule/Sources/Auth/Repositories/Stub/AuthRepositoryStub.swift index 948ecda1..4745fe03 100644 --- a/Projects/Services/DataModule/Sources/Auth/Repositories/Stub/AuthRepositoryStub.swift +++ b/Projects/Services/DataModule/Sources/Auth/Repositories/Stub/AuthRepositoryStub.swift @@ -6,28 +6,35 @@ import ErrorModule public struct AuthRepositoryStub: AuthRepository { public init() {} - public func signin(req: SigninRequestDTO) -> AnyPublisher { - Just(()).mapError { $0.asDMSError } + public func signin(req: SigninRequestDTO) -> AnyPublisher { + Just(DmsFeatures(mealService: false, noticeService: false, pointService: false)) + .setFailureType(to: DmsError.self) .eraseToAnyPublisher() } public func verifyAuthCode(req: VerifyAuthCodeRequestDTO) -> AnyPublisher { - Just(()).mapError { $0.asDMSError } + Just(()).setFailureType(to: DmsError.self) .eraseToAnyPublisher() } public func sendAuthCode(req: SendAuthCodeRequestDTO) -> AnyPublisher { - Just(()).mapError { $0.asDMSError } + Just(()).setFailureType(to: DmsError.self) + .eraseToAnyPublisher() + } + + public func reissueToken() -> AnyPublisher { + Just(DmsFeatures(mealService: false, noticeService: false, pointService: false)) + .setFailureType(to: DmsError.self) .eraseToAnyPublisher() } public func checkEmailExistByAccountID(req: EmailExistByAccountIDRequestDTO) -> AnyPublisher { - Just(()).mapError { $0.asDMSError } + Just(()).setFailureType(to: DmsError.self) .eraseToAnyPublisher() } public func checkAccountIDIsExist(id: String) -> AnyPublisher { - Just("abc******@gmail.com").mapError { $0.asDMSError } + Just("abc******@gmail.com").setFailureType(to: DmsError.self) .eraseToAnyPublisher() } } diff --git a/Projects/Services/DataModule/Sources/Auth/UseCases/Fake/SigninUseCaseFake.swift b/Projects/Services/DataModule/Sources/Auth/UseCases/Fake/SigninUseCaseFake.swift index da4db55a..1fdd1bd9 100644 --- a/Projects/Services/DataModule/Sources/Auth/UseCases/Fake/SigninUseCaseFake.swift +++ b/Projects/Services/DataModule/Sources/Auth/UseCases/Fake/SigninUseCaseFake.swift @@ -7,9 +7,10 @@ import Foundation public struct SigninUseCaseFake: SigninUseCase { public init () {} - public func execute(req: SigninRequestDTO) -> AnyPublisher { + public func execute(req: SigninRequestDTO) -> AnyPublisher { if req.accountID == "baekteun" && req.password == "baekteun" { - return Just(()).setFailureType(to: DmsError.self) + return Just(DmsFeatures(mealService: false, noticeService: false, pointService: false)) + .setFailureType(to: DmsError.self) .delay(for: 1, scheduler: DispatchQueue.main) .eraseToAnyPublisher() } else { diff --git a/Projects/Services/DataModule/Sources/Auth/UseCases/Impl/ReissueTokenUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Auth/UseCases/Impl/ReissueTokenUseCaseImpl.swift new file mode 100644 index 00000000..3a49d237 --- /dev/null +++ b/Projects/Services/DataModule/Sources/Auth/UseCases/Impl/ReissueTokenUseCaseImpl.swift @@ -0,0 +1,16 @@ +import Combine +import DataMappingModule +import DomainModule +import ErrorModule + +public struct ReissueTokenCaseImpl: ReissueTokenUseCase { + private let authRepository: any AuthRepository + + public init(authRepository: any AuthRepository) { + self.authRepository = authRepository + } + + public func execute() -> AnyPublisher { + authRepository.reissueToken() + } +} diff --git a/Projects/Services/DataModule/Sources/Auth/UseCases/Impl/SigninUseCaseImpl.swift b/Projects/Services/DataModule/Sources/Auth/UseCases/Impl/SigninUseCaseImpl.swift index 1905b66c..76e87e10 100644 --- a/Projects/Services/DataModule/Sources/Auth/UseCases/Impl/SigninUseCaseImpl.swift +++ b/Projects/Services/DataModule/Sources/Auth/UseCases/Impl/SigninUseCaseImpl.swift @@ -10,7 +10,7 @@ public struct SigninUseCaseImpl: SigninUseCase { self.authRepository = authRepository } - public func execute(req: SigninRequestDTO) -> AnyPublisher { + public func execute(req: SigninRequestDTO) -> AnyPublisher { authRepository.signin(req: req) } } diff --git a/Projects/Services/DataModule/Tests/Auth/Repository/AuthRepositoryImplSpec.swift b/Projects/Services/DataModule/Tests/Auth/Repository/AuthRepositoryImplSpec.swift index 6817ca5c..cf6ea5a2 100644 --- a/Projects/Services/DataModule/Tests/Auth/Repository/AuthRepositoryImplSpec.swift +++ b/Projects/Services/DataModule/Tests/Auth/Repository/AuthRepositoryImplSpec.swift @@ -20,13 +20,19 @@ final class AuthRepositoryImplSpec: QuickSpec { context("signin()를 실행하면") { it("request를 성공적으로 실행한다.") { var success: Void? + var res: DmsFeatures? sut.signin(req: .init(accountID: "", password: "")) .sink { _ in } receiveValue: { item in - success = item + success = () + res = item } .store(in: &bag) expect { success }.toNotEventually(beNil()) expect { success }.toEventually(beVoid()) + expect { res }.toNot(beNil()) + expect { res?.mealService }.to(beFalse()) + expect { res?.noticeService }.to(beFalse()) + expect { res?.pointService }.to(beFalse()) } } context("verifyAuthCode()를 실행하면") { diff --git a/Projects/Services/DataModule/Tests/Auth/UseCase/SigninUseCaseImplSpec.swift b/Projects/Services/DataModule/Tests/Auth/UseCase/SigninUseCaseImplSpec.swift index 3a611a23..62e816ac 100644 --- a/Projects/Services/DataModule/Tests/Auth/UseCase/SigninUseCaseImplSpec.swift +++ b/Projects/Services/DataModule/Tests/Auth/UseCase/SigninUseCaseImplSpec.swift @@ -18,13 +18,19 @@ final class SigninUseCaseImplSpec: QuickSpec { context("execute()를 실행하면") { it("request를 성공적으로 실행한다.") { var success: Void? + var res: DmsFeatures? sut.execute(req: .init(accountID: "", password: "")) .sink { _ in } receiveValue: { item in - success = item + success = () + res = item } .store(in: &bag) expect { success }.toNotEventually(beNil()) expect { success }.toEventually(beVoid()) + expect { res }.toNot(beNil()) + expect { res?.mealService }.to(beFalse()) + expect { res?.noticeService }.to(beFalse()) + expect { res?.pointService }.to(beFalse()) } } } diff --git a/Projects/Services/DomainModule/Sources/Auth/Repository/AuthRepository.swift b/Projects/Services/DomainModule/Sources/Auth/Repository/AuthRepository.swift index 90083275..bb0bde81 100644 --- a/Projects/Services/DomainModule/Sources/Auth/Repository/AuthRepository.swift +++ b/Projects/Services/DomainModule/Sources/Auth/Repository/AuthRepository.swift @@ -3,9 +3,10 @@ import DataMappingModule import ErrorModule public protocol AuthRepository { - func signin(req: SigninRequestDTO) -> AnyPublisher + func signin(req: SigninRequestDTO) -> AnyPublisher func verifyAuthCode(req: VerifyAuthCodeRequestDTO) -> AnyPublisher func sendAuthCode(req: SendAuthCodeRequestDTO) -> AnyPublisher + func reissueToken() -> AnyPublisher func checkEmailExistByAccountID(req: EmailExistByAccountIDRequestDTO) -> AnyPublisher func checkAccountIDIsExist(id: String) -> AnyPublisher } diff --git a/Projects/Services/DomainModule/Sources/Auth/UseCases/ReissueTokenUseCase.swift b/Projects/Services/DomainModule/Sources/Auth/UseCases/ReissueTokenUseCase.swift new file mode 100644 index 00000000..dd3d5134 --- /dev/null +++ b/Projects/Services/DomainModule/Sources/Auth/UseCases/ReissueTokenUseCase.swift @@ -0,0 +1,7 @@ +import Combine +import DataMappingModule +import ErrorModule + +public protocol ReissueTokenUseCase { + func execute() -> AnyPublisher +} diff --git a/Projects/Services/DomainModule/Sources/Auth/UseCases/SigninUseCase.swift b/Projects/Services/DomainModule/Sources/Auth/UseCases/SigninUseCase.swift index f9a607c3..94e49568 100644 --- a/Projects/Services/DomainModule/Sources/Auth/UseCases/SigninUseCase.swift +++ b/Projects/Services/DomainModule/Sources/Auth/UseCases/SigninUseCase.swift @@ -3,5 +3,5 @@ import DataMappingModule import ErrorModule public protocol SigninUseCase { - func execute(req: SigninRequestDTO) -> AnyPublisher + func execute(req: SigninRequestDTO) -> AnyPublisher } diff --git a/Projects/Services/DomainModule/Sources/Entities/DmsFeatures.swift b/Projects/Services/DomainModule/Sources/Entities/DmsFeatures.swift new file mode 100644 index 00000000..5cb7bc53 --- /dev/null +++ b/Projects/Services/DomainModule/Sources/Entities/DmsFeatures.swift @@ -0,0 +1,17 @@ +import Foundation + +public struct DmsFeatures: Equatable { + public init( + mealService: Bool, + noticeService: Bool, + pointService: Bool + ) { + self.mealService = mealService + self.noticeService = noticeService + self.pointService = pointService + } + + public let mealService: Bool + public let noticeService: Bool + public let pointService: Bool +} diff --git a/Projects/Services/NetworkModule/Project.swift b/Projects/Services/NetworkModule/Project.swift index 83d98a44..ffa71531 100644 --- a/Projects/Services/NetworkModule/Project.swift +++ b/Projects/Services/NetworkModule/Project.swift @@ -6,6 +6,7 @@ let project = Project.makeModule( product: .staticFramework, dependencies: [ .Project.Module.Utility, - .Project.Service.APIKit + .Project.Service.APIKit, + .Project.Service.Domain ] ) diff --git a/Projects/Services/NetworkModule/Sources/Auth/Remote/Impl/RemoteAuthDataSourceImpl.swift b/Projects/Services/NetworkModule/Sources/Auth/Remote/Impl/RemoteAuthDataSourceImpl.swift index 6677c289..0817a9ac 100644 --- a/Projects/Services/NetworkModule/Sources/Auth/Remote/Impl/RemoteAuthDataSourceImpl.swift +++ b/Projects/Services/NetworkModule/Sources/Auth/Remote/Impl/RemoteAuthDataSourceImpl.swift @@ -1,11 +1,14 @@ import APIKit import Combine import DataMappingModule +import DomainModule import ErrorModule public final class RemoteAuthDataSourceImpl: BaseRemoteDataSource, RemoteAuthDataSource { - public func signin(req: SigninRequestDTO) -> AnyPublisher { - request(.signin(req)) + public func signin(req: SigninRequestDTO) -> AnyPublisher { + request(.signin(req), dto: DmsFeaturesResponseDTO.self) + .map { $0.toDomain() } + .eraseToAnyPublisher() } public func verifyAuthCode(req: VerifyAuthCodeRequestDTO) -> AnyPublisher { @@ -16,8 +19,10 @@ public final class RemoteAuthDataSourceImpl: BaseRemoteDataSource, Remo request(.sendAuthCode(req)) } - public func reissueToken() -> AnyPublisher { - request(.reissueToken) + public func reissueToken() -> AnyPublisher { + request(.reissueToken, dto: DmsFeaturesResponseDTO.self) + .map { $0.toDomain() } + .eraseToAnyPublisher() } public func checkEmailExistByAccountID(req: EmailExistByAccountIDRequestDTO) -> AnyPublisher { diff --git a/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSource.swift b/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSource.swift index 08e1bbd0..529c0ad2 100644 --- a/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSource.swift +++ b/Projects/Services/NetworkModule/Sources/Auth/Remote/RemoteAuthDataSource.swift @@ -1,13 +1,15 @@ import APIKit import Combine import DataMappingModule +import DomainModule import ErrorModule import Foundation public protocol RemoteAuthDataSource { - func signin(req: SigninRequestDTO) -> AnyPublisher + func signin(req: SigninRequestDTO) -> AnyPublisher func verifyAuthCode(req: VerifyAuthCodeRequestDTO) -> AnyPublisher func sendAuthCode(req: SendAuthCodeRequestDTO) -> AnyPublisher + func reissueToken() -> AnyPublisher func checkEmailExistByAccountID(req: EmailExistByAccountIDRequestDTO) -> AnyPublisher func checkAccountIDIsExist(id: String) -> AnyPublisher } diff --git a/Projects/Services/NetworkModule/Sources/Auth/Remote/Stub/RemoteAuthDataSourceStub.swift b/Projects/Services/NetworkModule/Sources/Auth/Remote/Stub/RemoteAuthDataSourceStub.swift index b6ccc59e..bdca3f12 100644 --- a/Projects/Services/NetworkModule/Sources/Auth/Remote/Stub/RemoteAuthDataSourceStub.swift +++ b/Projects/Services/NetworkModule/Sources/Auth/Remote/Stub/RemoteAuthDataSourceStub.swift @@ -1,32 +1,40 @@ import Combine import DataMappingModule +import DomainModule import ErrorModule public struct RemoteAuthDataSourceStub: RemoteAuthDataSource { public init() {} - public func signin(req: SigninRequestDTO) -> AnyPublisher { - Just(()).mapError { $0.asDMSError } + public func signin(req: SigninRequestDTO) -> AnyPublisher { + Just(DmsFeatures(mealService: false, noticeService: false, pointService: false)) + .setFailureType(to: DmsError.self) .eraseToAnyPublisher() } public func verifyAuthCode(req: VerifyAuthCodeRequestDTO) -> AnyPublisher { - Just(()).mapError { $0.asDMSError } + Just(()).setFailureType(to: DmsError.self) .eraseToAnyPublisher() } public func sendAuthCode(req: SendAuthCodeRequestDTO) -> AnyPublisher { - Just(()).mapError { $0.asDMSError } + Just(()).setFailureType(to: DmsError.self) + .eraseToAnyPublisher() + } + + public func reissueToken() -> AnyPublisher { + Just(DmsFeatures(mealService: false, noticeService: false, pointService: false)) + .setFailureType(to: DmsError.self) .eraseToAnyPublisher() } public func checkEmailExistByAccountID(req: EmailExistByAccountIDRequestDTO) -> AnyPublisher { - Just(()).mapError { $0.asDMSError } + Just(()).setFailureType(to: DmsError.self) .eraseToAnyPublisher() } public func checkAccountIDIsExist(id: String) -> AnyPublisher { - Just("abc******@gmail.com").mapError { $0.asDMSError } + Just("abc******@gmail.com").setFailureType(to: DmsError.self) .eraseToAnyPublisher() } } diff --git a/Projects/Services/NetworkModule/Sources/Base/DataTransfer/DmsFeaturesDataTransfer.swift b/Projects/Services/NetworkModule/Sources/Base/DataTransfer/DmsFeaturesDataTransfer.swift new file mode 100644 index 00000000..49a76481 --- /dev/null +++ b/Projects/Services/NetworkModule/Sources/Base/DataTransfer/DmsFeaturesDataTransfer.swift @@ -0,0 +1,12 @@ +import DataMappingModule +import DomainModule + +public extension DmsFeaturesResponseDTO { + func toDomain() -> DmsFeatures { + DmsFeatures( + mealService: features.mealService, + noticeService: features.noticeService, + pointService: features.pointService + ) + } +} diff --git a/Projects/Services/NetworkModule/Tests/Auth/Remote/RemoteAuthDataSourceImplSpec.swift b/Projects/Services/NetworkModule/Tests/Auth/Remote/RemoteAuthDataSourceImplSpec.swift index 9adb4ebd..b726cf95 100644 --- a/Projects/Services/NetworkModule/Tests/Auth/Remote/RemoteAuthDataSourceImplSpec.swift +++ b/Projects/Services/NetworkModule/Tests/Auth/Remote/RemoteAuthDataSourceImplSpec.swift @@ -1,6 +1,7 @@ import APIKit import Nimble import DataMappingModule +import DomainModule import Combine import Foundation import Quick @@ -34,13 +35,19 @@ final class RemoteAuthDataSourceImplSpec: QuickSpec { context("signin()을 실행하면") { it("request를 성공적으로 실행한다.") { var success: Void? + var res: DmsFeatures? sut.signin(req: .init(accountID: "", password: "")) .sink { _ in } receiveValue: { item in - success = item + success = () + res = item } .store(in: &bag) expect { success }.toNotEventually(beNil()) expect { success }.toEventually(beVoid()) + expect { res }.toNot(beNil()) + expect { res?.mealService }.to(beFalse()) + expect { res?.noticeService }.to(beFalse()) + expect { res?.pointService }.to(beFalse()) } } context("verifyAuthCode()를 실행하면") { diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/BottomSheet/DmsBottomSheet.swift b/Projects/UsertInterfaces/DesignSystem/Sources/BottomSheet/DmsBottomSheet.swift new file mode 100644 index 00000000..64929ae7 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/BottomSheet/DmsBottomSheet.swift @@ -0,0 +1,94 @@ +import SwiftUI + +struct DmsBottomSheet: ViewModifier { + @Binding var isShowing: Bool + @State var dragHeight: CGFloat = 0 + var content: () -> T + var height: CGFloat + var sheetDragging: some Gesture { + DragGesture(minimumDistance: 0, coordinateSpace: .global) + .onChanged { value in + withAnimation(.spring()) { + dragHeight = min(30, -value.translation.height) + } + } + .onEnded { value in + withAnimation { + dragHeight = 0 + } + let verticalAmount = value.translation.height + if verticalAmount > -100 { + withAnimation { + isShowing = false + } + } + } + } + + init( + isShowing: Binding, + height: CGFloat = .infinity, + content: @escaping () -> T + ) { + _isShowing = isShowing + self.height = height + self.content = content + } + + func body(content: Content) -> some View { + ZStack { + content + + ZStack(alignment: .bottom) { + if isShowing { + Color.GrayScale.gray9 + .opacity(0.10) + .ignoresSafeArea() + .onTapGesture { + withAnimation(.spring()) { + isShowing = false + } + } + .gesture(sheetDragging) + .transition(.opacity) + + ZStack { + Color.GrayScale.gray1 + .cornerRadius(25, corners: [.topLeft, .topRight]) + .padding(.top, -dragHeight) + .gesture(sheetDragging) + + VStack { + RoundedRectangle(cornerRadius: 5) + .fill(Color.GrayScale.gray4) + .frame(width: 100, height: 4) + .padding(.top, 12) + + self.content() + .frame(maxWidth: .infinity) + } + .padding(.bottom, 42) + .offset(y: -dragHeight) + } + .fixedSize(horizontal: false, vertical: true) + .transition(.move(edge: .bottom)) + .frame(maxHeight: height) + .if(!(height == .infinity)) { + $0.frame(height: height) + } + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom) + .ignoresSafeArea() + } + } +} + +public extension View { + func dmsBottomSheet( + isShowing: Binding, + content: @escaping () -> Content + ) -> some View { + modifier(DmsBottomSheet(isShowing: isShowing, content: content)) + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/Extensions/View+cornerRadius.swift b/Projects/UsertInterfaces/DesignSystem/Sources/Extensions/View+cornerRadius.swift new file mode 100644 index 00000000..37f97d93 --- /dev/null +++ b/Projects/UsertInterfaces/DesignSystem/Sources/Extensions/View+cornerRadius.swift @@ -0,0 +1,21 @@ +import SwiftUI + +public extension View { + func cornerRadius(_ radius: CGFloat, corners: UIRectCorner) -> some View { + clipShape(RoundedCorner(radius: radius, corners: corners)) + } +} + +struct RoundedCorner: Shape { + var radius: CGFloat = 4 + var corners: UIRectCorner = .allCorners + + func path(in rect: CGRect) -> Path { + let path = UIBezierPath( + roundedRect: rect, + byRoundingCorners: corners, + cornerRadii: CGSize(width: radius, height: radius) + ) + return Path(path.cgPath) + } +} diff --git a/Projects/UsertInterfaces/DesignSystem/Sources/Extensions/View+configBackButton.swift b/Projects/UsertInterfaces/DesignSystem/Sources/Extensions/View+dmsBackButton.swift similarity index 100% rename from Projects/UsertInterfaces/DesignSystem/Sources/Extensions/View+configBackButton.swift rename to Projects/UsertInterfaces/DesignSystem/Sources/Extensions/View+dmsBackButton.swift diff --git a/graph.png b/graph.png index a9edf932b0f1e41de6c589ba3dbc81f42ca60358..55e1f23d696e1904989ed25052eb1f546b27209f 100644 GIT binary patch literal 88529 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

?jA~ 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 z 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

V}r@5ib8#NGBD1JC8#MP!*S%JpS#_Cc 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

8^NpznG41Z18_rfYD=EhY!+0RE_DO(^mXH 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 From 2283d1feafba8027947bb5444d8aef45bfd10e23 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Wed, 26 Oct 2022 17:05:48 +0900 Subject: [PATCH 04/23] =?UTF-8?q?style=20::=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=ED=9B=84=20=EB=A6=B0=ED=8A=B8=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/View/BlockEmailView.swift | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift index 337c9694..03ad6660 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift @@ -14,28 +14,26 @@ struct BlockEmailView: View { } var body: some View { -// if isShow { - ZStack { - Color.GrayScale.gray2 - .ignoresSafeArea() + ZStack { + Color.GrayScale.gray2 + .ignoresSafeArea() - HStack { - VStack(alignment: .leading) { - Text("아이디와 일치하는 이메일 입니다") - .dmsFont(.text(.small), color: .GrayScale.gray7) - .multilineTextAlignment(.leading) - - Text(email) - .dmsFont(.text(.small), color: .PrimaryVariant.primary) - .multilineTextAlignment(.leading) - } - Spacer() + HStack { + VStack(alignment: .leading) { + Text("아이디와 일치하는 이메일 입니다") + .dmsFont(.text(.small), color: .GrayScale.gray7) + .multilineTextAlignment(.leading) + Text(email) + .dmsFont(.text(.small), color: .PrimaryVariant.primary) + .multilineTextAlignment(.leading) } - .padding(.horizontal, 16) - } - .frame(height: 68) + Spacer() + } + .padding(.horizontal, 16) } -// } + .frame(height: 68) + + } } From fca112a092621dd5664ee4f3c14cc3db39f88b5e Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Thu, 27 Oct 2022 12:23:55 +0900 Subject: [PATCH 05/23] feat :: needle --- .../Sources/Application/NeedleGenerated.swift | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift index 0ed07c0d..cd68154d 100644 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ b/Projects/App/Sources/Application/NeedleGenerated.swift @@ -78,6 +78,48 @@ private class HomeDependency443c4e1871277bd8432aProvider: HomeDependency { private func factory67229cdf0f755562b2b1f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { return HomeDependency443c4e1871277bd8432aProvider(appComponent: parent1(component) as! AppComponent) } +private class EnterInformationDependency9204f24c784151f429ddProvider: EnterInformationDependency { + var checkAccountIDIsExistUseCase: any CheckAccountIDIsExistUseCase { + return appComponent.checkAccountIDIsExistUseCase + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->EnterInformationComponent +private func factory359a960501e79e833f64f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return EnterInformationDependency9204f24c784151f429ddProvider(appComponent: parent1(component) as! AppComponent) +} +private class AuthenticationEmailDependency73189eb572618b10e0fbProvider: AuthenticationEmailDependency { + var verifyAuthCodeUseCase: any VerifyAuthCodeUseCase { + return appComponent.verifyAuthCodeUseCase + } + var sendAuthCodeUseCase: any SendAuthCodeUseCase { + return appComponent.sendAuthCodeUseCase + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->AuthenticationEmailComponent +private func factory8798d0becd9d2870112af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return AuthenticationEmailDependency73189eb572618b10e0fbProvider(appComponent: parent1(component) as! AppComponent) +} +private class ChangePasswordDependency04ab7ced24136c4fb27eProvider: ChangePasswordDependency { + var renewalPasswordUseCase: any RenewalPasswordUseCase { + return appComponent.renewalPasswordUseCase + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->ChangePasswordComponent +private func factoryab7c4d87dab53e0a51b9f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return ChangePasswordDependency04ab7ced24136c4fb27eProvider(appComponent: parent1(component) as! AppComponent) +} private class FindIDDependencyb481fe947a844cc29913Provider: FindIDDependency { var findIDUseCase: any FindIDUseCase { return appComponent.findIDUseCase @@ -111,6 +153,9 @@ extension AppComponent: Registration { localTable["schoolCodeComponent-SchoolCodeComponent"] = { self.schoolCodeComponent as Any } localTable["findIDComponent-FindIDComponent"] = { self.findIDComponent as Any } localTable["signinComponent-SigninComponent"] = { self.signinComponent as Any } + localTable["enterInformationComponent-EnterInformationComponent"] = { self.enterInformationComponent as Any } + localTable["authenticationEmailComponent-AuthenticationEmailComponent"] = { self.authenticationEmailComponent as Any } + localTable["changePasswordComponent-ChangePasswordComponent"] = { self.changePasswordComponent as Any } localTable["mainTabComponent-MainTabComponent"] = { self.mainTabComponent as Any } localTable["homeComponent-HomeComponent"] = { self.homeComponent as Any } localTable["remoteStudentsDataSource-any RemoteStudentsDataSource"] = { self.remoteStudentsDataSource as Any } @@ -152,6 +197,22 @@ extension HomeComponent: Registration { keyPathToName[\HomeDependency.fetchMealListUseCase] = "fetchMealListUseCase-any FetchMealListUseCase" } } +extension EnterInformationComponent: Registration { + public func registerItems() { + keyPathToName[\EnterInformationDependency.checkAccountIDIsExistUseCase] = "checkAccountIDIsExistUseCase-any CheckAccountIDIsExistUseCase" + } +} +extension AuthenticationEmailComponent: Registration { + public func registerItems() { + keyPathToName[\AuthenticationEmailDependency.verifyAuthCodeUseCase] = "verifyAuthCodeUseCase-any VerifyAuthCodeUseCase" + keyPathToName[\AuthenticationEmailDependency.sendAuthCodeUseCase] = "sendAuthCodeUseCase-any SendAuthCodeUseCase" + } +} +extension ChangePasswordComponent: Registration { + public func registerItems() { + keyPathToName[\ChangePasswordDependency.renewalPasswordUseCase] = "renewalPasswordUseCase-any RenewalPasswordUseCase" + } +} extension FindIDComponent: Registration { public func registerItems() { keyPathToName[\FindIDDependency.findIDUseCase] = "findIDUseCase-any FindIDUseCase" @@ -179,6 +240,9 @@ private func register1() { registerProviderFactory("^->AppComponent->MainTabComponent", factory1ab5a747ddf21e1393f9f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SigninComponent", factory2882a056d84a613debccf47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->HomeComponent", factory67229cdf0f755562b2b1f47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->EnterInformationComponent", factory359a960501e79e833f64f47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->AuthenticationEmailComponent", factory8798d0becd9d2870112af47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->ChangePasswordComponent", factoryab7c4d87dab53e0a51b9f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->FindIDComponent", factory8dd2f9e0b545ead35ecaf47b58f8f304c97af4d5) } #endif From 1a5cc003a9ed2f3136cab5088e3e44c266e37a89 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Thu, 27 Oct 2022 19:13:16 +0900 Subject: [PATCH 06/23] =?UTF-8?q?feat=20::=20AuthenticationEmail=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthenticationEmailComponent.swift | 5 +- .../View/AuthenticationEmailView.swift | 52 ++++++++++++++- .../ViewModel/AuthenticationEmailParam.swift | 13 ++++ .../AuthenticationEmailViewModel.swift | 64 ++++++++++++++++--- 4 files changed, 121 insertions(+), 13 deletions(-) create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailParam.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift index 941b13cc..811ec25b 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift @@ -8,11 +8,12 @@ public protocol AuthenticationEmailDependency: Dependency { } public final class AuthenticationEmailComponent: Component { - public func makeView() -> some View { + public func makeView(authenticationEmailParam: AuthenticationEmailParam) -> some View { AuthenticationEmailView( viewModel: .init( + sendAuthCodeUseCase: self.dependency.sendAuthCodeUseCase, verifyAuthCodeUseCase: self.dependency.verifyAuthCodeUseCase, - sendAuthCodeUseCase: self.dependency.sendAuthCodeUseCase + authenticationEmailParam: authenticationEmailParam ) ) } diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift index 8e8a954d..8c97a842 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift @@ -3,11 +3,59 @@ import DesignSystem struct AuthenticationEmailView: View { @StateObject var viewModel: AuthenticationEmailViewModel + @Environment(\.dismiss) var dismiss - public init(viewModel: AuthenticationEmailViewModel) { + init( + viewModel: AuthenticationEmailViewModel + ) { _viewModel = StateObject(wrappedValue: viewModel) } + var body: some View { - Text("AuthenticationEmailView") + VStack { + HStack { + VStack(alignment: .leading, spacing: 8) { + Text("DMS") + .dmsFont(.title(.extraLarge), color: .PrimaryVariant.primary) + + Text("이메일 주소 입력") + .dmsFont(.text(.medium), color: .GrayScale.gray6) + } + + Spacer() + } + .padding(.top, 24) + + VStack(spacing: 40) { + DMSPassCodeView(codeCount: 6, text: $viewModel.authCode) + + Text(viewModel.isErrorOcuured ? viewModel.errorMessage : "이메일로 전송된 인증코드 6자리를 입력해주세요.") + .dmsFont(.text(.small), color: viewModel.isErrorOcuured ? .System.error : .GrayScale.gray5) + } + .padding(.top, 60) + + Text(viewModel.timeText) + .dmsFont(.text(.small), color: .PrimaryVariant.primary) + .padding(.top, 10) + + Spacer() + + DMSButton(text: "인증코드 재발송", style: .underline, color: .GrayScale.gray6) { + viewModel.sendEmailAuthCode() + } + + DMSWideButton(text: "인증", color: .PrimaryVariant.primary) { + viewModel.verifyEmailAuthCode() + } + .padding(.top, 32) + .padding(.bottom, 40) + } + .dmsBackButton(dismiss: dismiss) + .padding(.horizontal, 24) + .onAppear { + UIApplication.shared.hideKeyboard() + viewModel.sendEmailAuthCode() + } + .dmsToast(isShowing: $viewModel.isShowingToast, message: viewModel.toastMessage, style: .success) } } diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailParam.swift b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailParam.swift new file mode 100644 index 00000000..47434cb7 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailParam.swift @@ -0,0 +1,13 @@ +import Foundation + +public struct AuthenticationEmailParam: Equatable { + public init(name: String, email: String, id: String) { + self.name = name + self.email = email + self.id = id + } + + public let name: String + public let email: String + public let id: String +} diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift index 5a7de25b..a7ce56d4 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift @@ -1,22 +1,68 @@ import BaseFeature import Combine import DomainModule +import ErrorModule +import Foundation final class AuthenticationEmailViewModel: BaseViewModel { + @Published var authCode = "" { + didSet { isErrorOcuured = false } + } + @Published var timeRemaining = 180 + @Published var isShowingToast = false + @Published var toastMessage = "" + @Published var isNavigateSignupID = false + private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() + var timeText: String { + timeRemaining % 60 < 10 ? + "\(timeRemaining/60):0\(timeRemaining%60)" : + "\(timeRemaining/60):\(timeRemaining%60)" + } - @Published var email = "" - @Published var id = "" - @Published var name = "" - @Published var authenticationCode = "" - - private let verifyAuthCodeUseCase: any VerifyAuthCodeUseCase private let sendAuthCodeUseCase: any SendAuthCodeUseCase + private let verifyAuthCodeUseCase: any VerifyAuthCodeUseCase + let authenticationEmailParam: AuthenticationEmailParam - public init( + init( + sendAuthCodeUseCase: any SendAuthCodeUseCase, verifyAuthCodeUseCase: any VerifyAuthCodeUseCase, - sendAuthCodeUseCase: any SendAuthCodeUseCase + authenticationEmailParam: AuthenticationEmailParam ) { - self.verifyAuthCodeUseCase = verifyAuthCodeUseCase self.sendAuthCodeUseCase = sendAuthCodeUseCase + self.verifyAuthCodeUseCase = verifyAuthCodeUseCase + self.authenticationEmailParam = authenticationEmailParam + super.init() + + addCancellable( + timer.setFailureType(to: DmsError.self).eraseToAnyPublisher() + ) { [weak self] _ in + guard let self, self.timeRemaining > 0 else { return } + self.timeRemaining -= 1 + } + } + + func sendEmailAuthCode() { + addCancellable( + sendAuthCodeUseCase.execute( + req: .init(email: authenticationEmailParam.email, type: .signup) + ) + ) { [weak self] _ in + self?.authCode = "" + self?.timeRemaining = 180 + self?.toastMessage = "입력하신 이메일로 인증번호가 전송되었습니다." + self?.isShowingToast = true + } + } + + func verifyEmailAuthCode() { + addCancellable( + verifyAuthCodeUseCase.execute( + req: .init(email: authenticationEmailParam.email, authCode: authCode, type: .signup) + ) + ) { [weak self] _ in + self?.isNavigateSignupID = true + } onReceiveError: { [weak self] _ in + self?.authCode = "" + } } } From ed442e5d8f19cbe62eaedac8565a9de9703b36f9 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Thu, 27 Oct 2022 19:27:41 +0900 Subject: [PATCH 07/23] =?UTF-8?q?feat=20::=20=ED=8F=B4=EB=8D=94=EB=A7=81?= =?UTF-8?q?=20=EB=8B=A4=EC=8B=9C=20=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthenticationEmailComponent.swift | 0 .../AuthenticationEmailParam.swift | 0 .../{View => AuthenticationEmail}/AuthenticationEmailView.swift | 0 .../AuthenticationEmailViewModel.swift | 0 .../{Component => ChangePassword}/ChangePasswordComponent.swift | 0 .../Sources/{View => ChangePassword}/ChangePasswordView.swift | 0 .../{ViewModel => ChangePassword}/ChangePasswordViewModel.swift | 0 .../Sources/{View => EnterInformation}/BlockEmailView.swift | 0 .../EnterInformationComponent.swift | 0 .../Sources/{View => EnterInformation}/EnterInformationView.swift | 0 .../EnterInformationViewModel.swift | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename Projects/Features/RenewalPasswordFeature/Sources/{Component => AuthenticationEmail}/AuthenticationEmailComponent.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{ViewModel => AuthenticationEmail}/AuthenticationEmailParam.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{View => AuthenticationEmail}/AuthenticationEmailView.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{ViewModel => AuthenticationEmail}/AuthenticationEmailViewModel.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{Component => ChangePassword}/ChangePasswordComponent.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{View => ChangePassword}/ChangePasswordView.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{ViewModel => ChangePassword}/ChangePasswordViewModel.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{View => EnterInformation}/BlockEmailView.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{Component => EnterInformation}/EnterInformationComponent.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{View => EnterInformation}/EnterInformationView.swift (100%) rename Projects/Features/RenewalPasswordFeature/Sources/{ViewModel => EnterInformation}/EnterInformationViewModel.swift (100%) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailComponent.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/Component/AuthenticationEmailComponent.swift rename to Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailComponent.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailParam.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailParam.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailParam.swift rename to Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailParam.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/View/AuthenticationEmailView.swift rename to Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/ViewModel/AuthenticationEmailViewModel.swift rename to Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/Component/ChangePasswordComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordComponent.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/Component/ChangePasswordComponent.swift rename to Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordComponent.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/View/ChangePasswordView.swift rename to Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/ChangePasswordViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordViewModel.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/ViewModel/ChangePasswordViewModel.swift rename to Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordViewModel.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/BlockEmailView.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/View/BlockEmailView.swift rename to Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/BlockEmailView.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/Component/EnterInformationComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationComponent.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/Component/EnterInformationComponent.swift rename to Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationComponent.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/View/EnterInformationView.swift rename to Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ViewModel/EnterInformationViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationViewModel.swift similarity index 100% rename from Projects/Features/RenewalPasswordFeature/Sources/ViewModel/EnterInformationViewModel.swift rename to Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationViewModel.swift From 528a18214ee91615f27b0460e393fa4d014c7872 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Thu, 27 Oct 2022 21:47:56 +0900 Subject: [PATCH 08/23] feat :: ChangePasswordParm --- .../ChangePassword/ChangePasswordParm.swift | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordParm.swift diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordParm.swift b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordParm.swift new file mode 100644 index 00000000..b5d8a1e9 --- /dev/null +++ b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordParm.swift @@ -0,0 +1,21 @@ +import Foundation + +public struct ChangePasswordParm: Equatable { + public init( + name: String, + email: String, + id: String, + authCode: String + ) { + self.name = name + self.email = email + self.id = id + self.authCode = authCode + + } + + public let name: String + public let email: String + public let id: String + public let authCode: String +} From 1a24c7034e7e35cfd01965a964f4d2c754a6a440 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Thu, 27 Oct 2022 21:48:13 +0900 Subject: [PATCH 09/23] =?UTF-8?q?feat=20::=20AuthenticationEmailParam=20li?= =?UTF-8?q?nt=20=EC=A7=80=ED=82=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthenticationEmail/AuthenticationEmailParam.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailParam.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailParam.swift index 47434cb7..fb0307ce 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailParam.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailParam.swift @@ -1,12 +1,16 @@ import Foundation public struct AuthenticationEmailParam: Equatable { - public init(name: String, email: String, id: String) { + public init( + name: String, + email: String, + id: String + ) { self.name = name self.email = email self.id = id } - + public let name: String public let email: String public let id: String From 3a43de45a301fdbc718fff45cd1ae5b4ad7d2630 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Thu, 27 Oct 2022 23:50:10 +0900 Subject: [PATCH 10/23] feat :: ChangePasswordViewModel --- .../ChangePasswordViewModel.swift | 59 ++++++++++++++++--- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordViewModel.swift index dcbfdf55..85e083ef 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordViewModel.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordViewModel.swift @@ -3,19 +3,64 @@ import Combine import DomainModule final class ChangePasswordViewModel: BaseViewModel { + @Published var password = "" { + didSet { resettingError() } + } + @Published var passwordCheck = "" { + didSet { resettingError() } + } + @Published var isPasswordRegexError = false + @Published var isPasswordMismatchedError = false + @Published var isDoneAlertShow = false - @Published var email = "" - @Published var id = "" - @Published var name = "" - @Published var authenticationCode = "" - @Published var password = "" - @Published var verificationㅖassword = "" + var isRenewalPasswordButtonEnabled: Bool { + !password.isEmpty && !passwordCheck.isEmpty + } private let renewalPasswordUseCase: any RenewalPasswordUseCase + let changePasswordParm: ChangePasswordParm public init( - renewalPasswordUseCase: any RenewalPasswordUseCase + renewalPasswordUseCase: any RenewalPasswordUseCase, + changePasswordParm: ChangePasswordParm ) { self.renewalPasswordUseCase = renewalPasswordUseCase + self.changePasswordParm = changePasswordParm + } + + func renewalPasswordButtonDidTap() { + guard isRenewalPasswordButtonEnabled else { + return + } + + let passwordExpression = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+=-]).{8,20}" + guard password ~= passwordExpression else { + isPasswordRegexError = true + return + } + + guard password == passwordCheck else { + isPasswordMismatchedError = true + return + } + addCancellable( + renewalPasswordUseCase.execute( + req: .init( + accountID: changePasswordParm.id, + name: changePasswordParm.name, + email: changePasswordParm.email, + authCode: changePasswordParm.authCode, + newPassword: password + ) + ) + ) { [weak self] _ in + self?.isDoneAlertShow = true + } + + } + + func resettingError() { + isPasswordRegexError = false + isPasswordMismatchedError = false } } From 0179bdb8e72dff0688a8b21540d3f63c051e07c3 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Thu, 27 Oct 2022 23:51:08 +0900 Subject: [PATCH 11/23] feat :: ChangePasswordView --- .../ChangePassword/ChangePasswordView.swift | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift index e53a3e6b..b87f2c99 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift @@ -2,6 +2,12 @@ import SwiftUI import DesignSystem struct ChangePasswordView: View { + private enum FocusField { + case beforePassword + case newPassword + } + + @FocusState private var focusField: FocusField? @StateObject var viewModel: ChangePasswordViewModel public init(viewModel: ChangePasswordViewModel) { @@ -9,6 +15,44 @@ struct ChangePasswordView: View { } var body: some View { - Text("ChangePasswordView") + VStack { + HStack { + VStack(alignment: .leading, spacing: 8) { + Text("DMS") + .dmsFont(.title(.extraLarge), color: .PrimaryVariant.primary) + .padding(.top, 28) + + Text("아이디 찾기") + .dmsFont(.text(.medium), color: .GrayScale.gray6) + } + + Spacer() + } + + VStack(spacing: 60) { + SecureDMSFloatingTextField("새 비밀번호 입력", text: $viewModel.password) { + } + .focused($focusField, equals: .beforePassword) + + SecureDMSFloatingTextField("새 비밀번호 확인 ", text: $viewModel.passwordCheck) { + } + .focused($focusField, equals: .newPassword) + + } + .padding(.top, 68) + + Spacer() + + DMSWideButton(text: "확인", color: .PrimaryVariant.primary) { + viewModel.renewalPasswordButtonDidTap() + } + .disabled(viewModel.isRenewalPasswordButtonEnabled) + .padding(.bottom, 40) + } + .dmsToast(isShowing: $viewModel.isErrorOcuured, message: viewModel.errorMessage, style: .error) + .dmsBackground() + .frame(maxWidth: .infinity) + .ignoresSafeArea(.keyboard, edges: .bottom) + .padding(.horizontal, 24) } } From b73c182be08e9bb0c11ece9323242f9aa126ba0a Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Thu, 27 Oct 2022 23:51:19 +0900 Subject: [PATCH 12/23] feat :: ChangePasswordComponent --- .../Sources/ChangePassword/ChangePasswordComponent.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordComponent.swift index 3795602d..78280950 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordComponent.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordComponent.swift @@ -7,10 +7,11 @@ public protocol ChangePasswordDependency: Dependency { } public final class ChangePasswordComponent: Component { - public func makeView() -> some View { + public func makeView(changePasswordParm: ChangePasswordParm) -> some View { ChangePasswordView( viewModel: .init( - renewalPasswordUseCase: self.dependency.renewalPasswordUseCase + renewalPasswordUseCase: self.dependency.renewalPasswordUseCase, + changePasswordParm: changePasswordParm ) ) } From 929622d784a8c95b0ba83cbaeecc7e23b00852a0 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Thu, 27 Oct 2022 23:51:27 +0900 Subject: [PATCH 13/23] feat :: Needle --- .../Sources/Application/NeedleGenerated.swift | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift index 35e5fef0..f9a364d7 100644 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ b/Projects/App/Sources/Application/NeedleGenerated.swift @@ -110,19 +110,6 @@ private class HomeDependency443c4e1871277bd8432aProvider: HomeDependency { private func factory67229cdf0f755562b2b1f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { return HomeDependency443c4e1871277bd8432aProvider(appComponent: parent1(component) as! AppComponent) } -private class EnterInformationDependency9204f24c784151f429ddProvider: EnterInformationDependency { - var checkAccountIDIsExistUseCase: any CheckAccountIDIsExistUseCase { - return appComponent.checkAccountIDIsExistUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->EnterInformationComponent -private func factory359a960501e79e833f64f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return EnterInformationDependency9204f24c784151f429ddProvider(appComponent: parent1(component) as! AppComponent) -} private class AuthenticationEmailDependency73189eb572618b10e0fbProvider: AuthenticationEmailDependency { var verifyAuthCodeUseCase: any VerifyAuthCodeUseCase { return appComponent.verifyAuthCodeUseCase @@ -152,6 +139,19 @@ private class ChangePasswordDependency04ab7ced24136c4fb27eProvider: ChangePasswo private func factoryab7c4d87dab53e0a51b9f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { return ChangePasswordDependency04ab7ced24136c4fb27eProvider(appComponent: parent1(component) as! AppComponent) } +private class EnterInformationDependency9204f24c784151f429ddProvider: EnterInformationDependency { + var checkAccountIDIsExistUseCase: any CheckAccountIDIsExistUseCase { + return appComponent.checkAccountIDIsExistUseCase + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->EnterInformationComponent +private func factory359a960501e79e833f64f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return EnterInformationDependency9204f24c784151f429ddProvider(appComponent: parent1(component) as! AppComponent) +} private class FindIDDependencyb481fe947a844cc29913Provider: FindIDDependency { var findIDUseCase: any FindIDUseCase { return appComponent.findIDUseCase @@ -246,11 +246,6 @@ extension HomeComponent: Registration { keyPathToName[\HomeDependency.fetchMealListUseCase] = "fetchMealListUseCase-any FetchMealListUseCase" } } -extension EnterInformationComponent: Registration { - public func registerItems() { - keyPathToName[\EnterInformationDependency.checkAccountIDIsExistUseCase] = "checkAccountIDIsExistUseCase-any CheckAccountIDIsExistUseCase" - } -} extension AuthenticationEmailComponent: Registration { public func registerItems() { keyPathToName[\AuthenticationEmailDependency.verifyAuthCodeUseCase] = "verifyAuthCodeUseCase-any VerifyAuthCodeUseCase" @@ -262,6 +257,11 @@ extension ChangePasswordComponent: Registration { keyPathToName[\ChangePasswordDependency.renewalPasswordUseCase] = "renewalPasswordUseCase-any RenewalPasswordUseCase" } } +extension EnterInformationComponent: Registration { + public func registerItems() { + keyPathToName[\EnterInformationDependency.checkAccountIDIsExistUseCase] = "checkAccountIDIsExistUseCase-any CheckAccountIDIsExistUseCase" + } +} extension FindIDComponent: Registration { public func registerItems() { keyPathToName[\FindIDDependency.findIDUseCase] = "findIDUseCase-any FindIDUseCase" @@ -291,9 +291,9 @@ private func register1() { registerProviderFactory("^->AppComponent->MainTabComponent", factory1ab5a747ddf21e1393f9f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SigninComponent", factory2882a056d84a613debccf47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->HomeComponent", factory67229cdf0f755562b2b1f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->EnterInformationComponent", factory359a960501e79e833f64f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->AuthenticationEmailComponent", factory8798d0becd9d2870112af47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->ChangePasswordComponent", factoryab7c4d87dab53e0a51b9f47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->EnterInformationComponent", factory359a960501e79e833f64f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->FindIDComponent", factory8dd2f9e0b545ead35ecaf47b58f8f304c97af4d5) } #endif From a1af66d57c39c01dd05ca1b7c425b5f9f06ad468 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Fri, 28 Oct 2022 00:27:20 +0900 Subject: [PATCH 14/23] feat ::EnterInformationView navigate --- .../EnterInformationComponent.swift | 4 +++- .../EnterInformationView.swift | 19 ++++++++++++++++++- .../EnterInformationViewModel.swift | 10 ++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationComponent.swift index 3bb2ad4c..6e6ecc5a 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationComponent.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationComponent.swift @@ -4,6 +4,7 @@ import SwiftUI public protocol EnterInformationDependency: Dependency { var checkAccountIDIsExistUseCase: any CheckAccountIDIsExistUseCase { get } + var authenticationEmailComponent: AuthenticationEmailComponent { get } } public final class EnterInformationComponent: Component { @@ -11,7 +12,8 @@ public final class EnterInformationComponent: Component Date: Fri, 28 Oct 2022 00:36:27 +0900 Subject: [PATCH 15/23] feat :: AuthenticationEmail navigate --- .../AuthenticationEmailView.swift | 18 +++++++++++++++++- .../AuthenticationEmailViewModel.swift | 4 ++-- .../ChangePassword/ChangePasswordView.swift | 1 - 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift index 8c97a842..8fc403f7 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift @@ -3,12 +3,15 @@ import DesignSystem struct AuthenticationEmailView: View { @StateObject var viewModel: AuthenticationEmailViewModel + let changePasswordComponent: ChangePasswordComponent @Environment(\.dismiss) var dismiss init( - viewModel: AuthenticationEmailViewModel + viewModel: AuthenticationEmailViewModel, + changePasswordComponent: ChangePasswordComponent ) { _viewModel = StateObject(wrappedValue: viewModel) + self.changePasswordComponent = changePasswordComponent } var body: some View { @@ -57,5 +60,18 @@ struct AuthenticationEmailView: View { viewModel.sendEmailAuthCode() } .dmsToast(isShowing: $viewModel.isShowingToast, message: viewModel.toastMessage, style: .success) + .navigate( + to: changePasswordComponent.makeView( + changePasswordParm: .init( + name: viewModel.authenticationEmailParam.name, + email: viewModel.authenticationEmailParam.email, + id: viewModel.authenticationEmailParam.id, + authCode: viewModel.authCode + ) + ), + when: $viewModel.isNavigateChangePassword + ) + .dmsBackButton(dismiss: dismiss) + } } diff --git a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift index a7ce56d4..b14f64a4 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift @@ -11,7 +11,7 @@ final class AuthenticationEmailViewModel: BaseViewModel { @Published var timeRemaining = 180 @Published var isShowingToast = false @Published var toastMessage = "" - @Published var isNavigateSignupID = false + @Published var isNavigateChangePassword = false private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() var timeText: String { timeRemaining % 60 < 10 ? @@ -60,7 +60,7 @@ final class AuthenticationEmailViewModel: BaseViewModel { req: .init(email: authenticationEmailParam.email, authCode: authCode, type: .signup) ) ) { [weak self] _ in - self?.isNavigateSignupID = true + self?.isNavigateChangePassword = true } onReceiveError: { [weak self] _ in self?.authCode = "" } diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift index b87f2c99..0c8c3f0c 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift @@ -51,7 +51,6 @@ struct ChangePasswordView: View { } .dmsToast(isShowing: $viewModel.isErrorOcuured, message: viewModel.errorMessage, style: .error) .dmsBackground() - .frame(maxWidth: .infinity) .ignoresSafeArea(.keyboard, edges: .bottom) .padding(.horizontal, 24) } From cf68c78562fd6bed5c0b070d921d903ca2199a9e Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Fri, 28 Oct 2022 00:36:43 +0900 Subject: [PATCH 16/23] feat :: needle --- .../Sources/Application/NeedleGenerated.swift | 42 ++----------------- 1 file changed, 4 insertions(+), 38 deletions(-) diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift index 2353efc8..c5149c86 100644 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ b/Projects/App/Sources/Application/NeedleGenerated.swift @@ -26,19 +26,6 @@ private func parent1(_ component: NeedleFoundation.Scope) -> NeedleFoundation.Sc #if !NEEDLE_DYNAMIC -private class SchoolConfirmationQuestionsDependency3fa2ccd12da7c7f5cfc1Provider: SchoolConfirmationQuestionsDependency { - var checkSchoolQuestionUseCase: any CheckSchoolQuestionUseCase { - return appComponent.checkSchoolQuestionUseCase - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent - } -} -/// ^->AppComponent->SchoolConfirmationQuestionsComponent -private func factoryd462667f0418a53210fcf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return SchoolConfirmationQuestionsDependency3fa2ccd12da7c7f5cfc1Provider(appComponent: parent1(component) as! AppComponent) -} private class SchoolCodeDependencyc0114744c1c8c7843672Provider: SchoolCodeDependency { var checkSchoolCodeUseCase: any CheckSchoolCodeUseCase { return appComponent.checkSchoolCodeUseCase @@ -84,17 +71,6 @@ private class SignupEmailVerifyDependencyf9d372ac752ee19b78caProvider: SignupEma private func factory3b1904c76335d70151ebf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { return SignupEmailVerifyDependencyf9d372ac752ee19b78caProvider(appComponent: parent1(component) as! AppComponent) } -private class SignupProfileImageDependency4203088ab57581d9f871Provider: SignupProfileImageDependency { - - - init() { - - } -} -/// ^->AppComponent->SignupProfileImageComponent -private func factory6792674212c15df7e9cfe3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { - return SignupProfileImageDependency4203088ab57581d9f871Provider() -} private class MainTabDependency2826cdb310ed0b17a725Provider: MainTabDependency { var homeComponent: HomeComponent { return appComponent.homeComponent @@ -167,6 +143,9 @@ private class EnterInformationDependency9204f24c784151f429ddProvider: EnterInfor var checkAccountIDIsExistUseCase: any CheckAccountIDIsExistUseCase { return appComponent.checkAccountIDIsExistUseCase } + var authenticationEmailComponent: AuthenticationEmailComponent { + return appComponent.authenticationEmailComponent + } private let appComponent: AppComponent init(appComponent: AppComponent) { self.appComponent = appComponent @@ -209,13 +188,11 @@ extension AppComponent: Registration { localTable["schoolCodeComponent-SchoolCodeComponent"] = { self.schoolCodeComponent as Any } localTable["findIDComponent-FindIDComponent"] = { self.findIDComponent as Any } localTable["signinComponent-SigninComponent"] = { self.signinComponent as Any } - localTable["schoolConfirmationQuestionsComponent-SchoolConfirmationQuestionsComponent"] = { self.schoolConfirmationQuestionsComponent as Any } localTable["signupEmailVerifyComponent-SignupEmailVerifyComponent"] = { self.signupEmailVerifyComponent as Any } localTable["signupEmailAuthCodeVerifyComponent-SignupEmailAuthCodeVerifyComponent"] = { self.signupEmailAuthCodeVerifyComponent as Any } localTable["enterInformationComponent-EnterInformationComponent"] = { self.enterInformationComponent as Any } localTable["authenticationEmailComponent-AuthenticationEmailComponent"] = { self.authenticationEmailComponent as Any } localTable["changePasswordComponent-ChangePasswordComponent"] = { self.changePasswordComponent as Any } - localTable["signupProfileImageComponent-SignupProfileImageComponent"] = { self.signupProfileImageComponent as Any } localTable["mainTabComponent-MainTabComponent"] = { self.mainTabComponent as Any } localTable["homeComponent-HomeComponent"] = { self.homeComponent as Any } localTable["remoteStudentsDataSource-any RemoteStudentsDataSource"] = { self.remoteStudentsDataSource as Any } @@ -240,11 +217,6 @@ extension AppComponent: Registration { localTable["checkSchoolCodeUseCase-any CheckSchoolCodeUseCase"] = { self.checkSchoolCodeUseCase as Any } } } -extension SchoolConfirmationQuestionsComponent: Registration { - public func registerItems() { - keyPathToName[\SchoolConfirmationQuestionsDependency.checkSchoolQuestionUseCase] = "checkSchoolQuestionUseCase-any CheckSchoolQuestionUseCase" - } -} extension SchoolCodeComponent: Registration { public func registerItems() { keyPathToName[\SchoolCodeDependency.checkSchoolCodeUseCase] = "checkSchoolCodeUseCase-any CheckSchoolCodeUseCase" @@ -262,11 +234,6 @@ extension SignupEmailVerifyComponent: Registration { keyPathToName[\SignupEmailVerifyDependency.signupEmailAuthCodeVerifyComponent] = "signupEmailAuthCodeVerifyComponent-SignupEmailAuthCodeVerifyComponent" } } -extension SignupProfileImageComponent: Registration { - public func registerItems() { - - } -} extension MainTabComponent: Registration { public func registerItems() { keyPathToName[\MainTabDependency.homeComponent] = "homeComponent-HomeComponent" @@ -296,6 +263,7 @@ extension ChangePasswordComponent: Registration { extension EnterInformationComponent: Registration { public func registerItems() { keyPathToName[\EnterInformationDependency.checkAccountIDIsExistUseCase] = "checkAccountIDIsExistUseCase-any CheckAccountIDIsExistUseCase" + keyPathToName[\EnterInformationDependency.authenticationEmailComponent] = "authenticationEmailComponent-AuthenticationEmailComponent" } } extension FindIDComponent: Registration { @@ -321,11 +289,9 @@ private func registerProviderFactory(_ componentPath: String, _ factory: @escapi private func register1() { registerProviderFactory("^->AppComponent", factoryEmptyDependencyProvider) - registerProviderFactory("^->AppComponent->SchoolConfirmationQuestionsComponent", factoryd462667f0418a53210fcf47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SchoolCodeComponent", factoryb65c1efbf06b87162473f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupEmailAuthCodeVerifyComponent", factoryb06be35aa893adde971bf47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupEmailVerifyComponent", factory3b1904c76335d70151ebf47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->SignupProfileImageComponent", factory6792674212c15df7e9cfe3b0c44298fc1c149afb) registerProviderFactory("^->AppComponent->MainTabComponent", factory1ab5a747ddf21e1393f9f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SigninComponent", factory2882a056d84a613debccf47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->HomeComponent", factory67229cdf0f755562b2b1f47b58f8f304c97af4d5) From 52edc93274c38db4fd52617b071dc70bd8b52f86 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Fri, 28 Oct 2022 00:48:26 +0900 Subject: [PATCH 17/23] =?UTF-8?q?feat=20::=20=EB=AD=94=EA=B0=80=20?= =?UTF-8?q?=EB=A8=B8=EC=A7=80=20=EC=9E=98=EB=AA=BB=EB=90=98=EC=84=9C=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 --- .../Sources/Application/DI/AppComponent.swift | 1 + .../Sources/Application/NeedleGenerated.swift | 47 +++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/Projects/App/Sources/Application/DI/AppComponent.swift b/Projects/App/Sources/Application/DI/AppComponent.swift index 6022e17c..2fc996c0 100644 --- a/Projects/App/Sources/Application/DI/AppComponent.swift +++ b/Projects/App/Sources/Application/DI/AppComponent.swift @@ -54,6 +54,7 @@ public extension AppComponent { } var signupPasswordComponent: SignupPasswordComponent { SignupPasswordComponent(parent: self) + } var signupTermsComponent: SignupTermsComponent { SignupTermsComponent(parent: self) } diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift index 7c9f7255..b1f2e592 100644 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ b/Projects/App/Sources/Application/NeedleGenerated.swift @@ -26,6 +26,19 @@ private func parent1(_ component: NeedleFoundation.Scope) -> NeedleFoundation.Sc #if !NEEDLE_DYNAMIC +private class SchoolConfirmationQuestionsDependency3fa2ccd12da7c7f5cfc1Provider: SchoolConfirmationQuestionsDependency { + var checkSchoolQuestionUseCase: any CheckSchoolQuestionUseCase { + return appComponent.checkSchoolQuestionUseCase + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->SchoolConfirmationQuestionsComponent +private func factoryd462667f0418a53210fcf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return SchoolConfirmationQuestionsDependency3fa2ccd12da7c7f5cfc1Provider(appComponent: parent1(component) as! AppComponent) +} private class SchoolCodeDependencyc0114744c1c8c7843672Provider: SchoolCodeDependency { var checkSchoolCodeUseCase: any CheckSchoolCodeUseCase { return appComponent.checkSchoolCodeUseCase @@ -93,6 +106,17 @@ private class SignupEmailVerifyDependencyf9d372ac752ee19b78caProvider: SignupEma private func factory3b1904c76335d70151ebf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { return SignupEmailVerifyDependencyf9d372ac752ee19b78caProvider(appComponent: parent1(component) as! AppComponent) } +private class SignupProfileImageDependency4203088ab57581d9f871Provider: SignupProfileImageDependency { + + + init() { + + } +} +/// ^->AppComponent->SignupProfileImageComponent +private func factory6792674212c15df7e9cfe3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { + return SignupProfileImageDependency4203088ab57581d9f871Provider() +} private class MainTabDependency2826cdb310ed0b17a725Provider: MainTabDependency { var homeComponent: HomeComponent { return appComponent.homeComponent @@ -139,6 +163,9 @@ private class AuthenticationEmailDependency73189eb572618b10e0fbProvider: Authent var sendAuthCodeUseCase: any SendAuthCodeUseCase { return appComponent.sendAuthCodeUseCase } + var changePasswordComponent: ChangePasswordComponent { + return appComponent.changePasswordComponent + } private let appComponent: AppComponent init(appComponent: AppComponent) { self.appComponent = appComponent @@ -210,14 +237,15 @@ extension AppComponent: Registration { localTable["schoolCodeComponent-SchoolCodeComponent"] = { self.schoolCodeComponent as Any } localTable["findIDComponent-FindIDComponent"] = { self.findIDComponent as Any } localTable["signinComponent-SigninComponent"] = { self.signinComponent as Any } + localTable["schoolConfirmationQuestionsComponent-SchoolConfirmationQuestionsComponent"] = { self.schoolConfirmationQuestionsComponent as Any } localTable["signupEmailVerifyComponent-SignupEmailVerifyComponent"] = { self.signupEmailVerifyComponent as Any } localTable["signupEmailAuthCodeVerifyComponent-SignupEmailAuthCodeVerifyComponent"] = { self.signupEmailAuthCodeVerifyComponent as Any } - localTable["signupTermsComponent-SignupTermsComponent"] = { self.signupTermsComponent as Any } - localTable["signupProfileImageComponent-SignupProfileImageComponent"] = { self.signupProfileImageComponent as Any } - localTable["signupPasswordComponent-SignupPasswordComponent"] = { self.signupPasswordComponent as Any } localTable["enterInformationComponent-EnterInformationComponent"] = { self.enterInformationComponent as Any } localTable["authenticationEmailComponent-AuthenticationEmailComponent"] = { self.authenticationEmailComponent as Any } localTable["changePasswordComponent-ChangePasswordComponent"] = { self.changePasswordComponent as Any } + localTable["signupProfileImageComponent-SignupProfileImageComponent"] = { self.signupProfileImageComponent as Any } + localTable["signupPasswordComponent-SignupPasswordComponent"] = { self.signupPasswordComponent as Any } + localTable["signupTermsComponent-SignupTermsComponent"] = { self.signupTermsComponent as Any } localTable["mainTabComponent-MainTabComponent"] = { self.mainTabComponent as Any } localTable["homeComponent-HomeComponent"] = { self.homeComponent as Any } localTable["remoteStudentsDataSource-any RemoteStudentsDataSource"] = { self.remoteStudentsDataSource as Any } @@ -242,6 +270,11 @@ extension AppComponent: Registration { localTable["checkSchoolCodeUseCase-any CheckSchoolCodeUseCase"] = { self.checkSchoolCodeUseCase as Any } } } +extension SchoolConfirmationQuestionsComponent: Registration { + public func registerItems() { + keyPathToName[\SchoolConfirmationQuestionsDependency.checkSchoolQuestionUseCase] = "checkSchoolQuestionUseCase-any CheckSchoolQuestionUseCase" + } +} extension SchoolCodeComponent: Registration { public func registerItems() { keyPathToName[\SchoolCodeDependency.checkSchoolCodeUseCase] = "checkSchoolCodeUseCase-any CheckSchoolCodeUseCase" @@ -269,6 +302,11 @@ extension SignupEmailVerifyComponent: Registration { keyPathToName[\SignupEmailVerifyDependency.signupEmailAuthCodeVerifyComponent] = "signupEmailAuthCodeVerifyComponent-SignupEmailAuthCodeVerifyComponent" } } +extension SignupProfileImageComponent: Registration { + public func registerItems() { + + } +} extension MainTabComponent: Registration { public func registerItems() { keyPathToName[\MainTabDependency.homeComponent] = "homeComponent-HomeComponent" @@ -288,6 +326,7 @@ extension AuthenticationEmailComponent: Registration { public func registerItems() { keyPathToName[\AuthenticationEmailDependency.verifyAuthCodeUseCase] = "verifyAuthCodeUseCase-any VerifyAuthCodeUseCase" keyPathToName[\AuthenticationEmailDependency.sendAuthCodeUseCase] = "sendAuthCodeUseCase-any SendAuthCodeUseCase" + keyPathToName[\AuthenticationEmailDependency.changePasswordComponent] = "changePasswordComponent-ChangePasswordComponent" } } extension ChangePasswordComponent: Registration { @@ -324,11 +363,13 @@ private func registerProviderFactory(_ componentPath: String, _ factory: @escapi private func register1() { registerProviderFactory("^->AppComponent", factoryEmptyDependencyProvider) + registerProviderFactory("^->AppComponent->SchoolConfirmationQuestionsComponent", factoryd462667f0418a53210fcf47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SchoolCodeComponent", factoryb65c1efbf06b87162473f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupPasswordComponent", factorye93d1d56840ff97c674ae3b0c44298fc1c149afb) registerProviderFactory("^->AppComponent->SignupEmailAuthCodeVerifyComponent", factoryb06be35aa893adde971bf47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupTermsComponent", factoryf84223c07d964abc9b0ee3b0c44298fc1c149afb) registerProviderFactory("^->AppComponent->SignupEmailVerifyComponent", factory3b1904c76335d70151ebf47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->SignupProfileImageComponent", factory6792674212c15df7e9cfe3b0c44298fc1c149afb) registerProviderFactory("^->AppComponent->MainTabComponent", factory1ab5a747ddf21e1393f9f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SigninComponent", factory2882a056d84a613debccf47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->HomeComponent", factory67229cdf0f755562b2b1f47b58f8f304c97af4d5) From 0335b7d91c1caa155eda8a4b4dc3016dad5aa67d Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Fri, 28 Oct 2022 00:48:57 +0900 Subject: [PATCH 18/23] =?UTF-8?q?feat=20::=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=84=A4=EC=A0=95=20=EA=B8=80=EC=9E=90=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=8D=BC=EB=B8=94=EB=A6=AC=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthenticationEmail/AuthenticationEmailComponent.swift | 5 ++++- .../Sources/ChangePassword/ChangePasswordView.swift | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailComponent.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailComponent.swift index 811ec25b..12baf2dd 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailComponent.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailComponent.swift @@ -5,6 +5,8 @@ import SwiftUI public protocol AuthenticationEmailDependency: Dependency { var verifyAuthCodeUseCase: any VerifyAuthCodeUseCase { get } var sendAuthCodeUseCase: any SendAuthCodeUseCase { get } + var changePasswordComponent: ChangePasswordComponent { get } + } public final class AuthenticationEmailComponent: Component { @@ -14,7 +16,8 @@ public final class AuthenticationEmailComponent: Component Date: Fri, 28 Oct 2022 00:52:32 +0900 Subject: [PATCH 19/23] =?UTF-8?q?feat=20::=20=EA=B0=99=EC=9D=80=EA=B1=B0?= =?UTF-8?q?=20=EC=84=A0=EC=96=B8=ED=95=9C=EA=B1=B0=20=ED=95=98=EB=82=98=20?= =?UTF-8?q?=EC=A7=80=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/AuthenticationEmail/AuthenticationEmailView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift index 8fc403f7..4f4e44cd 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailView.swift @@ -53,7 +53,6 @@ struct AuthenticationEmailView: View { .padding(.top, 32) .padding(.bottom, 40) } - .dmsBackButton(dismiss: dismiss) .padding(.horizontal, 24) .onAppear { UIApplication.shared.hideKeyboard() From 9809093456f655440cce0c6a2b7e3f9732657d7e Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Fri, 28 Oct 2022 11:34:00 +0900 Subject: [PATCH 20/23] =?UTF-8?q?fix=20::=20type=20password=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthenticationEmail/AuthenticationEmailViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift index b14f64a4..548d4490 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/AuthenticationEmail/AuthenticationEmailViewModel.swift @@ -44,7 +44,7 @@ final class AuthenticationEmailViewModel: BaseViewModel { func sendEmailAuthCode() { addCancellable( sendAuthCodeUseCase.execute( - req: .init(email: authenticationEmailParam.email, type: .signup) + req: .init(email: authenticationEmailParam.email, type: .password) ) ) { [weak self] _ in self?.authCode = "" From ee85c4d9e87e88998257bda8e806195b1477ca12 Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Fri, 28 Oct 2022 11:38:10 +0900 Subject: [PATCH 21/23] =?UTF-8?q?fix=20::=20blockEmailView=20=EC=A3=BD?= =?UTF-8?q?=EC=9D=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/EnterInformation/BlockEmailView.swift | 5 +---- .../Sources/EnterInformation/EnterInformationView.swift | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/BlockEmailView.swift b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/BlockEmailView.swift index 03ad6660..f6efa804 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/BlockEmailView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/BlockEmailView.swift @@ -3,14 +3,11 @@ import DesignSystem struct BlockEmailView: View { @Binding var email: String - @Binding var isShow: Bool init( - email: Binding, - isShow: Binding + email: Binding ) { _email = email - _isShow = isShow } var body: some View { diff --git a/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift index a036d1ef..9858b66d 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift @@ -46,7 +46,7 @@ struct EnterInformationView: View { .textContentType(.nickname) if viewModel.isShow { - BlockEmailView(email: $viewModel.blockEmail, isShow: $viewModel.isShow) + BlockEmailView(email: $viewModel.blockEmail) } } From c86695f18dc0f2da9250df31eff970c837d700ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8C=80=ED=9D=AC?= <0824dh@naver.com> Date: Fri, 28 Oct 2022 11:38:43 +0900 Subject: [PATCH 22/23] Update Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift Co-authored-by: baegteun <74440939+baekteun@users.noreply.github.com> --- .../Sources/EnterInformation/EnterInformationView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift index a036d1ef..01c82209 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/EnterInformation/EnterInformationView.swift @@ -35,6 +35,7 @@ struct EnterInformationView: View { Spacer() } + VStack(spacing: 20) { DMSFloatingTextField("아이디", text: $viewModel.id) { focusField = .name From ecf288c9f5754bbdf2a73a19619fced31f087acd Mon Sep 17 00:00:00 2001 From: Daehee Kim <0824dh@naver.com> Date: Fri, 28 Oct 2022 19:13:25 +0900 Subject: [PATCH 23/23] =?UTF-8?q?feat=20::=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ChangePassword/ChangePasswordView.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift index 95653198..641d077d 100644 --- a/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift +++ b/Projects/Features/RenewalPasswordFeature/Sources/ChangePassword/ChangePasswordView.swift @@ -3,8 +3,8 @@ import DesignSystem struct ChangePasswordView: View { private enum FocusField { - case beforePassword - case newPassword + case password + case passwordCheck } @FocusState private var focusField: FocusField? @@ -34,11 +34,11 @@ struct ChangePasswordView: View { VStack(spacing: 60) { SecureDMSFloatingTextField("새 비밀번호 입력", text: $viewModel.password) { } - .focused($focusField, equals: .beforePassword) + .focused($focusField, equals: .password) SecureDMSFloatingTextField("새 비밀번호 확인 ", text: $viewModel.passwordCheck) { } - .focused($focusField, equals: .newPassword) + .focused($focusField, equals: .passwordCheck) } .padding(.top, 68)