From d1ae6cf6e96a0f744fad955c587e4397deb105b9 Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 09:52:46 +0900 Subject: [PATCH 01/16] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20::=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=EA=B0=80=EC=9E=85=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EB=B7=B0=20=ED=8C=8C=EC=9D=BC=EB=AA=85=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 | 8 +-- .../Sources/Application/NeedleGenerated.swift | 62 +++++++++---------- .../Sources/SigninComponent.swift | 4 +- .../SigninFeature/Sources/SigninView.swift | 8 +-- ...wift => SignupAuthCodeVerifyFactory.swift} | 2 +- ...Factory.swift => SignupEmailFactory.swift} | 2 +- .../Sources/Email/SignupEmailComponent.swift | 16 +++++ .../SignupEmailView.swift} | 16 ++--- .../Sources/Email/SignupEmailViewModel.swift | 12 ++++ .../SignupEmailVerifyComponent.swift | 16 ----- .../SignupEmailVerifyViewModel.swift | 12 ---- .../SignupVerifyAuthCodeComponent.swift} | 8 +-- .../SignupVerifyAuthCodeView.swift} | 6 +- .../SignupVerifyAuthCodeViewModel.swift} | 2 +- 14 files changed, 87 insertions(+), 87 deletions(-) rename Projects/Feature/SignupFeature/Interface/{SignupEmailAuthCodeVerifyFactory.swift => SignupAuthCodeVerifyFactory.swift} (62%) rename Projects/Feature/SignupFeature/Interface/{SignupEmailVerifyFactory.swift => SignupEmailFactory.swift} (66%) create mode 100644 Projects/Feature/SignupFeature/Sources/Email/SignupEmailComponent.swift rename Projects/Feature/SignupFeature/Sources/{EmailVerify/SignupEmailVerifyView.swift => Email/SignupEmailView.swift} (71%) create mode 100644 Projects/Feature/SignupFeature/Sources/Email/SignupEmailViewModel.swift delete mode 100644 Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyComponent.swift delete mode 100644 Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyViewModel.swift rename Projects/Feature/SignupFeature/Sources/{EmailAuthCodeVerify/SignupEmailAuthCodeVerifyComponent.swift => VerifyAuthCode/SignupVerifyAuthCodeComponent.swift} (50%) rename Projects/Feature/SignupFeature/Sources/{EmailAuthCodeVerify/SignupEmailAuthCodeVerifyView.swift => VerifyAuthCode/SignupVerifyAuthCodeView.swift} (92%) rename Projects/Feature/SignupFeature/Sources/{EmailAuthCodeVerify/SignupEmailAuthCodeVerifyViewModel.swift => VerifyAuthCode/SignupVerifyAuthCodeViewModel.swift} (78%) diff --git a/Projects/App/Sources/Application/DI/AppComponent.swift b/Projects/App/Sources/Application/DI/AppComponent.swift index 9ffdf3a..3818353 100644 --- a/Projects/App/Sources/Application/DI/AppComponent.swift +++ b/Projects/App/Sources/Application/DI/AppComponent.swift @@ -39,11 +39,11 @@ public extension AppComponent { SigninComponent(parent: self) } // Signup - var signupEmailVerifyFactory: any SignupEmailVerifyFactory { - SignupEmailVerifyComponent(parent: self) + var signupEmailFactory: any SignupEmailFactory { + SignupEmailComponent(parent: self) } - var signupEmailAuthCodeVerifyFactory: any SignupEmailAuthCodeVerifyFactory { - SignupEmailAuthCodeVerifyComponent(parent: self) + var signupVerifyAuthCode: any SignupVerifyAuthCodeFactory { + SignupVerifyAuthCodeComponent(parent: self) } var signupPasswordFactory: any SignupPasswordFactory { SignupPasswordComponent(parent: self) diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift index 9dfcff5..b2436e9 100644 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ b/Projects/App/Sources/Application/NeedleGenerated.swift @@ -35,31 +35,31 @@ private class SplashDependencye0cb7136f2ec3edfd60aProvider: SplashDependency { private func factoryace9f05f51d68f4c0677e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { return SplashDependencye0cb7136f2ec3edfd60aProvider() } -private class SignupPasswordDependency778bf5389a70d7df6152Provider: SignupPasswordDependency { - var signupNameFactory: any SignupNameFactory { - return appComponent.signupNameFactory +private class SignupVerifyAuthCodeDependencyc5bfc91282e270b5f35aProvider: SignupVerifyAuthCodeDependency { + var signupPasswordFactory: any SignupPasswordFactory { + return appComponent.signupPasswordFactory } private let appComponent: AppComponent init(appComponent: AppComponent) { self.appComponent = appComponent } } -/// ^->AppComponent->SignupPasswordComponent -private func factorye93d1d56840ff97c674af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return SignupPasswordDependency778bf5389a70d7df6152Provider(appComponent: parent1(component) as! AppComponent) +/// ^->AppComponent->SignupVerifyAuthCodeComponent +private func factoryff5803dec4bd48820d95f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return SignupVerifyAuthCodeDependencyc5bfc91282e270b5f35aProvider(appComponent: parent1(component) as! AppComponent) } -private class SignupEmailAuthCodeVerifyDependencyaf9da1ebf0e9e5f1b708Provider: SignupEmailAuthCodeVerifyDependency { - var signupPasswordFactory: any SignupPasswordFactory { - return appComponent.signupPasswordFactory +private class SignupPasswordDependency778bf5389a70d7df6152Provider: SignupPasswordDependency { + var signupNameFactory: any SignupNameFactory { + return appComponent.signupNameFactory } private let appComponent: AppComponent init(appComponent: AppComponent) { self.appComponent = appComponent } } -/// ^->AppComponent->SignupEmailAuthCodeVerifyComponent -private func factoryb06be35aa893adde971bf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return SignupEmailAuthCodeVerifyDependencyaf9da1ebf0e9e5f1b708Provider(appComponent: parent1(component) as! AppComponent) +/// ^->AppComponent->SignupPasswordComponent +private func factorye93d1d56840ff97c674af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return SignupPasswordDependency778bf5389a70d7df6152Provider(appComponent: parent1(component) as! AppComponent) } private class SignupStudentIDDependencyc62f548e51245f5bf42dProvider: SignupStudentIDDependency { var signupGenderFactory: any SignupGenderFactory { @@ -111,18 +111,18 @@ private class SignupNameDependency860534ba64c054146b7bProvider: SignupNameDepend private func factory71e8fa7f4327b1e25ed0f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { return SignupNameDependency860534ba64c054146b7bProvider(appComponent: parent1(component) as! AppComponent) } -private class SignupEmailVerifyDependencyf9d372ac752ee19b78caProvider: SignupEmailVerifyDependency { - var signupEmailAuthCodeVerifyFactory: any SignupEmailAuthCodeVerifyFactory { - return appComponent.signupEmailAuthCodeVerifyFactory +private class SignupEmailDependency844c9e928af75b6aaa7aProvider: SignupEmailDependency { + var signupVerifyAuthCode: any SignupVerifyAuthCodeFactory { + return appComponent.signupVerifyAuthCode } private let appComponent: AppComponent init(appComponent: AppComponent) { self.appComponent = appComponent } } -/// ^->AppComponent->SignupEmailVerifyComponent -private func factory3b1904c76335d70151ebf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return SignupEmailVerifyDependencyf9d372ac752ee19b78caProvider(appComponent: parent1(component) as! AppComponent) +/// ^->AppComponent->SignupEmailComponent +private func factory4d1ddf658c5970ef6b47f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return SignupEmailDependency844c9e928af75b6aaa7aProvider(appComponent: parent1(component) as! AppComponent) } private class RootDependency3944cc797a4a88956fb5Provider: RootDependency { var splashFactory: any SplashFactory { @@ -141,8 +141,8 @@ private func factory264bfc4d4cb6b0629b40f47b58f8f304c97af4d5(_ component: Needle return RootDependency3944cc797a4a88956fb5Provider(appComponent: parent1(component) as! AppComponent) } private class SigninDependencyde06a9d0b22764487733Provider: SigninDependency { - var signupEmailVerifyFactory: any SignupEmailVerifyFactory { - return appComponent.signupEmailVerifyFactory + var signupEmailFactory: any SignupEmailFactory { + return appComponent.signupEmailFactory } private let appComponent: AppComponent init(appComponent: AppComponent) { @@ -160,8 +160,8 @@ extension AppComponent: Registration { localTable["splashFactory-any SplashFactory"] = { [unowned self] in self.splashFactory as Any } localTable["signinFactory-any SigninFactory"] = { [unowned self] in self.signinFactory as Any } - localTable["signupEmailVerifyFactory-any SignupEmailVerifyFactory"] = { [unowned self] in self.signupEmailVerifyFactory as Any } - localTable["signupEmailAuthCodeVerifyFactory-any SignupEmailAuthCodeVerifyFactory"] = { [unowned self] in self.signupEmailAuthCodeVerifyFactory as Any } + localTable["signupEmailFactory-any SignupEmailFactory"] = { [unowned self] in self.signupEmailFactory as Any } + localTable["signupVerifyAuthCode-any SignupVerifyAuthCodeFactory"] = { [unowned self] in self.signupVerifyAuthCode as Any } localTable["signupPasswordFactory-any SignupPasswordFactory"] = { [unowned self] in self.signupPasswordFactory as Any } localTable["signupNameFactory-any SignupNameFactory"] = { [unowned self] in self.signupNameFactory as Any } localTable["signupStudentIDFactory-any SignupStudentIDFactory"] = { [unowned self] in self.signupStudentIDFactory as Any } @@ -174,14 +174,14 @@ extension SplashComponent: Registration { } } -extension SignupPasswordComponent: Registration { +extension SignupVerifyAuthCodeComponent: Registration { public func registerItems() { - keyPathToName[\SignupPasswordDependency.signupNameFactory] = "signupNameFactory-any SignupNameFactory" + keyPathToName[\SignupVerifyAuthCodeDependency.signupPasswordFactory] = "signupPasswordFactory-any SignupPasswordFactory" } } -extension SignupEmailAuthCodeVerifyComponent: Registration { +extension SignupPasswordComponent: Registration { public func registerItems() { - keyPathToName[\SignupEmailAuthCodeVerifyDependency.signupPasswordFactory] = "signupPasswordFactory-any SignupPasswordFactory" + keyPathToName[\SignupPasswordDependency.signupNameFactory] = "signupNameFactory-any SignupNameFactory" } } extension SignupStudentIDComponent: Registration { @@ -204,9 +204,9 @@ extension SignupNameComponent: Registration { keyPathToName[\SignupNameDependency.signupStudentIDFactory] = "signupStudentIDFactory-any SignupStudentIDFactory" } } -extension SignupEmailVerifyComponent: Registration { +extension SignupEmailComponent: Registration { public func registerItems() { - keyPathToName[\SignupEmailVerifyDependency.signupEmailAuthCodeVerifyFactory] = "signupEmailAuthCodeVerifyFactory-any SignupEmailAuthCodeVerifyFactory" + keyPathToName[\SignupEmailDependency.signupVerifyAuthCode] = "signupVerifyAuthCode-any SignupVerifyAuthCodeFactory" } } extension RootComponent: Registration { @@ -217,7 +217,7 @@ extension RootComponent: Registration { } extension SigninComponent: Registration { public func registerItems() { - keyPathToName[\SigninDependency.signupEmailVerifyFactory] = "signupEmailVerifyFactory-any SignupEmailVerifyFactory" + keyPathToName[\SigninDependency.signupEmailFactory] = "signupEmailFactory-any SignupEmailFactory" } } @@ -238,13 +238,13 @@ private func registerProviderFactory(_ componentPath: String, _ factory: @escapi @inline(never) private func register1() { registerProviderFactory("^->AppComponent", factoryEmptyDependencyProvider) registerProviderFactory("^->AppComponent->SplashComponent", factoryace9f05f51d68f4c0677e3b0c44298fc1c149afb) + registerProviderFactory("^->AppComponent->SignupVerifyAuthCodeComponent", factoryff5803dec4bd48820d95f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupPasswordComponent", factorye93d1d56840ff97c674af47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->SignupEmailAuthCodeVerifyComponent", factoryb06be35aa893adde971bf47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupStudentIDComponent", factorycca12bec445b4f4f6de7f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupGenderComponent", factory997eaa831d16af15eee5f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupCheckLevelComponent", factory5b23127e837152346fdae3b0c44298fc1c149afb) registerProviderFactory("^->AppComponent->SignupNameComponent", factory71e8fa7f4327b1e25ed0f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->SignupEmailVerifyComponent", factory3b1904c76335d70151ebf47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->SignupEmailComponent", factory4d1ddf658c5970ef6b47f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->RootComponent", factory264bfc4d4cb6b0629b40f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SigninComponent", factory2882a056d84a613debccf47b58f8f304c97af4d5) } diff --git a/Projects/Feature/SigninFeature/Sources/SigninComponent.swift b/Projects/Feature/SigninFeature/Sources/SigninComponent.swift index 93828b4..d5d2bc9 100644 --- a/Projects/Feature/SigninFeature/Sources/SigninComponent.swift +++ b/Projects/Feature/SigninFeature/Sources/SigninComponent.swift @@ -4,14 +4,14 @@ import SigninFeatureInterface import SignupFeatureInterface public protocol SigninDependency: Dependency { - var signupEmailVerifyFactory: any SignupEmailVerifyFactory { get } + var signupEmailFactory: any SignupEmailFactory { get } } public final class SigninComponent: Component, SigninFactory { public func makeView() -> some View { SigninView( viewModel: .init(), - signupEmailVerifyFactory: dependency.signupEmailVerifyFactory + signupEmailFactory: dependency.signupEmailFactory ) } } diff --git a/Projects/Feature/SigninFeature/Sources/SigninView.swift b/Projects/Feature/SigninFeature/Sources/SigninView.swift index 61caa70..ad9b48f 100644 --- a/Projects/Feature/SigninFeature/Sources/SigninView.swift +++ b/Projects/Feature/SigninFeature/Sources/SigninView.swift @@ -12,14 +12,14 @@ struct SigninView: View { @FocusState private var focusField: FocusField? @StateObject var viewModel: SigninViewModel - private let signupEmailVerifyFactory: any SignupEmailVerifyFactory + private let signupEmailFactory: any SignupEmailFactory init( viewModel: SigninViewModel, - signupEmailVerifyFactory: any SignupEmailVerifyFactory + signupEmailFactory: any SignupEmailFactory ) { _viewModel = StateObject(wrappedValue: viewModel) - self.signupEmailVerifyFactory = signupEmailVerifyFactory + self.signupEmailFactory = signupEmailFactory } var body: some View { @@ -70,6 +70,6 @@ struct SigninView: View { Spacer() } - .navigate(to: signupEmailVerifyFactory.makeView().eraseToAnyView(), when: $viewModel.isNavigatedToSignup) + .navigate(to: signupEmailFactory.makeView().eraseToAnyView(), when: $viewModel.isNavigatedToSignup) } } diff --git a/Projects/Feature/SignupFeature/Interface/SignupEmailAuthCodeVerifyFactory.swift b/Projects/Feature/SignupFeature/Interface/SignupAuthCodeVerifyFactory.swift similarity index 62% rename from Projects/Feature/SignupFeature/Interface/SignupEmailAuthCodeVerifyFactory.swift rename to Projects/Feature/SignupFeature/Interface/SignupAuthCodeVerifyFactory.swift index 12eb80d..4689581 100644 --- a/Projects/Feature/SignupFeature/Interface/SignupEmailAuthCodeVerifyFactory.swift +++ b/Projects/Feature/SignupFeature/Interface/SignupAuthCodeVerifyFactory.swift @@ -1,6 +1,6 @@ import SwiftUI -public protocol SignupEmailAuthCodeVerifyFactory { +public protocol SignupVerifyAuthCodeFactory { associatedtype SomeView: View func makeView() -> SomeView } diff --git a/Projects/Feature/SignupFeature/Interface/SignupEmailVerifyFactory.swift b/Projects/Feature/SignupFeature/Interface/SignupEmailFactory.swift similarity index 66% rename from Projects/Feature/SignupFeature/Interface/SignupEmailVerifyFactory.swift rename to Projects/Feature/SignupFeature/Interface/SignupEmailFactory.swift index e2f140f..556aafa 100644 --- a/Projects/Feature/SignupFeature/Interface/SignupEmailVerifyFactory.swift +++ b/Projects/Feature/SignupFeature/Interface/SignupEmailFactory.swift @@ -1,6 +1,6 @@ import SwiftUI -public protocol SignupEmailVerifyFactory { +public protocol SignupEmailFactory { associatedtype SomeView: View func makeView() -> SomeView } diff --git a/Projects/Feature/SignupFeature/Sources/Email/SignupEmailComponent.swift b/Projects/Feature/SignupFeature/Sources/Email/SignupEmailComponent.swift new file mode 100644 index 0000000..8db734b --- /dev/null +++ b/Projects/Feature/SignupFeature/Sources/Email/SignupEmailComponent.swift @@ -0,0 +1,16 @@ +import SwiftUI +import NeedleFoundation +import SignupFeatureInterface + +public protocol SignupEmailDependency: Dependency { + var signupVerifyAuthCode: any SignupVerifyAuthCodeFactory { get } +} + +public final class SignupEmailComponent: Component, SignupEmailFactory { + public func makeView() -> some View { + SignupEmailView( + viewModel: .init(), + signupVerifyAuthCode: dependency.signupVerifyAuthCode + ) + } +} diff --git a/Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyView.swift b/Projects/Feature/SignupFeature/Sources/Email/SignupEmailView.swift similarity index 71% rename from Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyView.swift rename to Projects/Feature/SignupFeature/Sources/Email/SignupEmailView.swift index d246056..abe8b3d 100644 --- a/Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyView.swift +++ b/Projects/Feature/SignupFeature/Sources/Email/SignupEmailView.swift @@ -4,21 +4,21 @@ import BaseFeature import ViewUtil import SignupFeatureInterface -struct SignupEmailVerifyView: View { +struct SignupEmailView: View { private enum FocusField { case email } @FocusState private var focusField: FocusField? - @StateObject var viewModel: SignupEmailVerifyViewModel + @StateObject var viewModel: SignupEmailViewModel - private let signupEmailAuthCodeVerifyFactory: any SignupEmailAuthCodeVerifyFactory + private let signupVerifyAuthCode: any SignupVerifyAuthCodeFactory init( - viewModel: SignupEmailVerifyViewModel, - signupEmailAuthCodeVerifyFactory: any SignupEmailAuthCodeVerifyFactory + viewModel: SignupEmailViewModel, + signupVerifyAuthCode: any SignupVerifyAuthCodeFactory ) { _viewModel = StateObject(wrappedValue: viewModel) - self.signupEmailAuthCodeVerifyFactory = signupEmailAuthCodeVerifyFactory + self.signupVerifyAuthCode = signupVerifyAuthCode } var body: some View { @@ -52,8 +52,8 @@ struct SignupEmailVerifyView: View { .kgBackground() .hideKeyboardWhenTap() .navigate( - to: signupEmailAuthCodeVerifyFactory.makeView().eraseToAnyView(), - when: $viewModel.isNavigatedToEmailAuthCodeVerify + to: signupVerifyAuthCode.makeView().eraseToAnyView(), + when: $viewModel.isNavigatedToVerifyAuthCode ) } } diff --git a/Projects/Feature/SignupFeature/Sources/Email/SignupEmailViewModel.swift b/Projects/Feature/SignupFeature/Sources/Email/SignupEmailViewModel.swift new file mode 100644 index 0000000..bcd69c1 --- /dev/null +++ b/Projects/Feature/SignupFeature/Sources/Email/SignupEmailViewModel.swift @@ -0,0 +1,12 @@ +import BaseFeature +import Combine + +final class SignupEmailViewModel: BaseViewModel { + @Published var email: String = "" + + @Published var isNavigatedToVerifyAuthCode: Bool = false + + func nextButtonDidTap() { + self.isNavigatedToVerifyAuthCode = true + } +} diff --git a/Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyComponent.swift b/Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyComponent.swift deleted file mode 100644 index 2144fce..0000000 --- a/Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyComponent.swift +++ /dev/null @@ -1,16 +0,0 @@ -import SwiftUI -import NeedleFoundation -import SignupFeatureInterface - -public protocol SignupEmailVerifyDependency: Dependency { - var signupEmailAuthCodeVerifyFactory: any SignupEmailAuthCodeVerifyFactory { get } -} - -public final class SignupEmailVerifyComponent: Component, SignupEmailVerifyFactory { - public func makeView() -> some View { - SignupEmailVerifyView( - viewModel: .init(), - signupEmailAuthCodeVerifyFactory: dependency.signupEmailAuthCodeVerifyFactory - ) - } -} diff --git a/Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyViewModel.swift b/Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyViewModel.swift deleted file mode 100644 index eda6279..0000000 --- a/Projects/Feature/SignupFeature/Sources/EmailVerify/SignupEmailVerifyViewModel.swift +++ /dev/null @@ -1,12 +0,0 @@ -import BaseFeature -import Combine - -final class SignupEmailVerifyViewModel: BaseViewModel { - @Published var email: String = "" - - @Published var isNavigatedToEmailAuthCodeVerify: Bool = false - - func nextButtonDidTap() { - self.isNavigatedToEmailAuthCodeVerify = true - } -} diff --git a/Projects/Feature/SignupFeature/Sources/EmailAuthCodeVerify/SignupEmailAuthCodeVerifyComponent.swift b/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeComponent.swift similarity index 50% rename from Projects/Feature/SignupFeature/Sources/EmailAuthCodeVerify/SignupEmailAuthCodeVerifyComponent.swift rename to Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeComponent.swift index 4ac5e83..9b5a6c2 100644 --- a/Projects/Feature/SignupFeature/Sources/EmailAuthCodeVerify/SignupEmailAuthCodeVerifyComponent.swift +++ b/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeComponent.swift @@ -2,14 +2,14 @@ import SwiftUI import NeedleFoundation import SignupFeatureInterface -public protocol SignupEmailAuthCodeVerifyDependency: Dependency { +public protocol SignupVerifyAuthCodeDependency: Dependency { var signupPasswordFactory: any SignupPasswordFactory { get } } -public final class SignupEmailAuthCodeVerifyComponent: Component, - SignupEmailAuthCodeVerifyFactory { +public final class SignupVerifyAuthCodeComponent: Component, + SignupVerifyAuthCodeFactory { public func makeView() -> some View { - SignupEmailAuthCodeVerifyView( + SignupVerifyAuthCodeView( viewModel: .init(), signupPasswordFactory: dependency.signupPasswordFactory ) diff --git a/Projects/Feature/SignupFeature/Sources/EmailAuthCodeVerify/SignupEmailAuthCodeVerifyView.swift b/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeView.swift similarity index 92% rename from Projects/Feature/SignupFeature/Sources/EmailAuthCodeVerify/SignupEmailAuthCodeVerifyView.swift rename to Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeView.swift index 33ee125..8538157 100644 --- a/Projects/Feature/SignupFeature/Sources/EmailAuthCodeVerify/SignupEmailAuthCodeVerifyView.swift +++ b/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeView.swift @@ -4,17 +4,17 @@ import BaseFeature import ViewUtil import SignupFeatureInterface -struct SignupEmailAuthCodeVerifyView: View { +struct SignupVerifyAuthCodeView: View { private enum FocusField { case authCode } @FocusState private var focusField: FocusField? - @StateObject var viewModel: SignupEmailAuthCodeVerifyViewModel + @StateObject var viewModel: SignupVerifyAuthCodeViewModel private let signupPasswordFactory: any SignupPasswordFactory init( - viewModel: SignupEmailAuthCodeVerifyViewModel, + viewModel: SignupVerifyAuthCodeViewModel, signupPasswordFactory: any SignupPasswordFactory ) { _viewModel = StateObject(wrappedValue: viewModel) diff --git a/Projects/Feature/SignupFeature/Sources/EmailAuthCodeVerify/SignupEmailAuthCodeVerifyViewModel.swift b/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeViewModel.swift similarity index 78% rename from Projects/Feature/SignupFeature/Sources/EmailAuthCodeVerify/SignupEmailAuthCodeVerifyViewModel.swift rename to Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeViewModel.swift index 355656a..afc0e0c 100644 --- a/Projects/Feature/SignupFeature/Sources/EmailAuthCodeVerify/SignupEmailAuthCodeVerifyViewModel.swift +++ b/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeViewModel.swift @@ -2,7 +2,7 @@ import BaseFeature import Foundation import Combine -final class SignupEmailAuthCodeVerifyViewModel: BaseViewModel { +final class SignupVerifyAuthCodeViewModel: BaseViewModel { @Published var authCode: String = "" @Published var isNavigatedToPassword: Bool = false From 37ce7cce98696ec57f84306031a43a191a45a414 Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 09:57:25 +0900 Subject: [PATCH 02/16] =?UTF-8?q?=E2=9C=A8=20::=20VerifyAuthCodeView=20Nex?= =?UTF-8?q?tButton=20=EB=AC=B8=EA=B5=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 다음 -> 인증 --- .../Sources/VerifyAuthCode/SignupVerifyAuthCodeView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeView.swift b/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeView.swift index 8538157..1f8c31b 100644 --- a/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeView.swift +++ b/Projects/Feature/SignupFeature/Sources/VerifyAuthCode/SignupVerifyAuthCodeView.swift @@ -52,7 +52,7 @@ struct SignupVerifyAuthCodeView: View { Spacer() } .bottomButton( - text: "다음", + text: "인증", isEditing: focusField != nil, isDisabled: viewModel.authCode.count < 4, action: viewModel.nextButtonDidTap From ef6114964719ea5f15124f16a1ea57d92b04fa10 Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 10:01:18 +0900 Subject: [PATCH 03/16] =?UTF-8?q?=E2=9C=A8=20::=20CheckLevelView=20NextBut?= =?UTF-8?q?ton=20=EB=AC=B8=EA=B5=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 다음 -> 완료 --- .../Sources/UserInfo/CheckLevel/SignupCheckLevelView.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelView.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelView.swift index 36308c6..e73410a 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelView.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelView.swift @@ -36,8 +36,7 @@ struct SignupCheckLevelView: View { Spacer() } .bottomButton( - text: "다음", -// isDisabled: viewModel.studentID.isEmpty, + text: "완료", action: viewModel.nextButtonDidTap ) .navigationBackButton(navigationTitle: "정보 입력") From a55f75f24ba37c1851e1a67d53e511432245be87 Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 10:30:42 +0900 Subject: [PATCH 04/16] =?UTF-8?q?=E2=9C=A8=20::=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=EC=84=B1=EB=B3=84=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Gender/Components/SelectGenderView.swift | 57 ++++++++++++++++++ .../UserInfo/Gender/SignupGenderView.swift | 7 +++ .../Gender/SignupGenderViewModel.swift | 2 +- .../Man.imageset/Contents.json | 24 ++++++++ .../Man.imageset/Frame 9576.png | Bin 0 -> 91073 bytes .../Woman.imageset/Contents.json | 24 ++++++++ .../Woman.imageset/Frame 9593.png | Bin 0 -> 87999 bytes .../GenerateEnvironment.swift | 2 +- 8 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 Projects/Feature/SignupFeature/Sources/UserInfo/Gender/Components/SelectGenderView.swift create mode 100644 Projects/UserInterface/DesignSystem/Resources/Images/Images.xcassets/Man.imageset/Contents.json create mode 100644 Projects/UserInterface/DesignSystem/Resources/Images/Images.xcassets/Man.imageset/Frame 9576.png create mode 100644 Projects/UserInterface/DesignSystem/Resources/Images/Images.xcassets/Woman.imageset/Contents.json create mode 100644 Projects/UserInterface/DesignSystem/Resources/Images/Images.xcassets/Woman.imageset/Frame 9593.png diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/Components/SelectGenderView.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/Components/SelectGenderView.swift new file mode 100644 index 0000000..f383473 --- /dev/null +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/Components/SelectGenderView.swift @@ -0,0 +1,57 @@ +import SwiftUI +import DesignSystem + +enum Gender { + case man + case woman +} + +struct SelectGenderView: View { + let gender: Gender + @Binding var selectedGender: Gender + + init(_ gender: Gender, selectedGender: Binding) { + self.gender = gender + _selectedGender = selectedGender + } + + var body: some View { + Button { + self.selectedGender = gender + } label: { + VStack(spacing: 12) { + gender.image() + .frame(maxWidth: .infinity) + .background(Color.Grays.gray1100) + .clipCornerRadius(8) + .overlay { + RoundedRectangle(cornerRadius: 8) + .strokeBorder( + self.selectedGender == gender ? Color.Greens.main : .clear, + lineWidth: 1 + ) + } + } + } + } +} + +extension Gender { + @ViewBuilder + func image() -> some View { + switch self { + case .man: + DesignSystemAsset.Images.man.swiftUIImage + .resizable() + .frame(width: 130, height: 128) + .padding(.vertical, 16) + + case .woman: + DesignSystemAsset.Images.woman.swiftUIImage + .resizable() + .frame(width: 113, height: 144) + .padding(.top, 11) + .padding(.bottom, 5) + } + } +} diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderView.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderView.swift index 22e1a31..aa96b4f 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderView.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderView.swift @@ -26,6 +26,13 @@ struct SignupGenderView: View { description: "원활한 서비스를 위해 성별을 알려주세요" ) + HStack(spacing: 22) { + SelectGenderView(.woman, selectedGender: $viewModel.selectedGender) + + SelectGenderView(.man, selectedGender: $viewModel.selectedGender) + } + .padding(.horizontal, 24) + Spacer() } .bottomButton( diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderViewModel.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderViewModel.swift index 3203975..a837ad1 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderViewModel.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderViewModel.swift @@ -2,7 +2,7 @@ import BaseFeature import Combine final class SignupGenderViewModel: BaseViewModel { -// @Published var studentID: String = "" + @Published var selectedGender: Gender = .woman @Published var isNavigatedToLevelCheck: Bool = false diff --git a/Projects/UserInterface/DesignSystem/Resources/Images/Images.xcassets/Man.imageset/Contents.json b/Projects/UserInterface/DesignSystem/Resources/Images/Images.xcassets/Man.imageset/Contents.json new file mode 100644 index 0000000..5cfbadd --- /dev/null +++ b/Projects/UserInterface/DesignSystem/Resources/Images/Images.xcassets/Man.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "Frame 9576.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Projects/UserInterface/DesignSystem/Resources/Images/Images.xcassets/Man.imageset/Frame 9576.png b/Projects/UserInterface/DesignSystem/Resources/Images/Images.xcassets/Man.imageset/Frame 9576.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7fb4123725cecf88e44de357de9dd4f3e7dd13 GIT binary patch literal 91073 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℞D(gc9%R08 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 literal 0 HcmV?d00001 diff --git a/Tuist/ProjectDescriptionHelpers/GenerateEnvironment.swift b/Tuist/ProjectDescriptionHelpers/GenerateEnvironment.swift index e282684..8de9e77 100644 --- a/Tuist/ProjectDescriptionHelpers/GenerateEnvironment.swift +++ b/Tuist/ProjectDescriptionHelpers/GenerateEnvironment.swift @@ -18,7 +18,7 @@ public extension GenerateEnvironment { return [.needle] case .dev: - return [.swiftLint, .needle] + return [.needle] } } var scripts: [TargetScript] { From 0e6e772b305ea824d1aa660da039be5e01e88740 Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 15:37:59 +0900 Subject: [PATCH 05/16] =?UTF-8?q?=E2=9C=A8=20::=20Signup=20Flow=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A6=20=E3=85=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/App/Project.swift | 6 +- .../Sources/Application/DI/AppComponent.swift | 3 + .../Sources/Application/NeedleGenerated.swift | 64 +++++++++++---- Projects/App/Support/Info.plist | 4 +- .../UserInfo/SignupCheckLevelFactory.swift | 2 +- .../UserInfo/SignupGenderFactory.swift | 2 +- .../UserInfo/SignupNameFactory.swift | 2 +- .../UserInfo/SignupStudentIDFactory.swift | 2 +- .../UserInfo/SignupUserInfoFlowFactory.swift | 6 ++ .../Password/SignupPasswordComponent.swift | 4 +- .../Sources/Password/SignupPasswordView.swift | 8 +- .../SignupCheckLevelComponent.swift | 4 +- .../CheckLevel/SignupCheckLevelView.swift | 3 - .../SignupCheckLevelViewModel.swift | 8 ++ .../Components/SignupProgressView.swift | 3 + .../Flow/SignupUserInfoFlowComponent.swift | 22 +++++ .../Flow/SignupUserInfoFlowView.swift | 82 +++++++++++++++++++ .../Flow/SignupUserInfoFlowViewModel.swift | 38 +++++++++ .../Gender/SignupGenderComponent.swift | 9 +- .../UserInfo/Gender/SignupGenderView.swift | 14 +--- .../Gender/SignupGenderViewModel.swift | 8 +- .../UserInfo/Name/SignupNameComponent.swift | 9 +- .../UserInfo/Name/SignupNameView.swift | 12 +-- .../UserInfo/Name/SignupNameViewModel.swift | 8 +- .../StudentID/SignupStudentIDComponent.swift | 5 +- .../StudentID/SignupStudentIDView.swift | 13 +-- .../StudentID/SignupStudentIDViewModel.swift | 8 +- .../Extension/View+navigationBar.swift | 17 +++- .../Sources/View/CheckLevelCellView.swift | 2 +- 29 files changed, 271 insertions(+), 97 deletions(-) create mode 100644 Projects/Feature/SignupFeature/Interface/UserInfo/SignupUserInfoFlowFactory.swift create mode 100644 Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowComponent.swift create mode 100644 Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowView.swift create mode 100644 Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowViewModel.swift diff --git a/Projects/App/Project.swift b/Projects/App/Project.swift index b87ffe8..6b237ba 100644 --- a/Projects/App/Project.swift +++ b/Projects/App/Project.swift @@ -5,7 +5,11 @@ import Foundation import ProjectDescription import ProjectDescriptionHelpers -let configurations: [Configuration] = .default +let configurations: [Configuration] = [ + .debug(name: .dev, xcconfig: .relativeToXCConfig(type: .dev, name: env.name)), + .debug(name: .stage, xcconfig: .relativeToXCConfig(type: .stage, name: env.name)), + .release(name: .prod, xcconfig: .relativeToXCConfig(type: .prod, name: env.name)) +] let settings: Settings = .settings( base: env.baseSetting, diff --git a/Projects/App/Sources/Application/DI/AppComponent.swift b/Projects/App/Sources/Application/DI/AppComponent.swift index 3818353..90717f0 100644 --- a/Projects/App/Sources/Application/DI/AppComponent.swift +++ b/Projects/App/Sources/Application/DI/AppComponent.swift @@ -48,6 +48,9 @@ public extension AppComponent { var signupPasswordFactory: any SignupPasswordFactory { SignupPasswordComponent(parent: self) } + var signupUserInfoFlowFactory: any SignupUserInfoFlowFactory { + SignupUserInfoFlowComponent(parent: self) + } var signupNameFactory: any SignupNameFactory { SignupNameComponent(parent: self) } diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift index b2436e9..13eed84 100644 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ b/Projects/App/Sources/Application/NeedleGenerated.swift @@ -49,8 +49,8 @@ private func factoryff5803dec4bd48820d95f47b58f8f304c97af4d5(_ component: Needle return SignupVerifyAuthCodeDependencyc5bfc91282e270b5f35aProvider(appComponent: parent1(component) as! AppComponent) } private class SignupPasswordDependency778bf5389a70d7df6152Provider: SignupPasswordDependency { - var signupNameFactory: any SignupNameFactory { - return appComponent.signupNameFactory + var signupUserInfoFlowFactory: any SignupUserInfoFlowFactory { + return appComponent.signupUserInfoFlowFactory } private let appComponent: AppComponent init(appComponent: AppComponent) { @@ -75,17 +75,15 @@ private func factorycca12bec445b4f4f6de7f47b58f8f304c97af4d5(_ component: Needle return SignupStudentIDDependencyc62f548e51245f5bf42dProvider(appComponent: parent1(component) as! AppComponent) } private class SignupGenderDependency65e2a6565372eb41f4acProvider: SignupGenderDependency { - var signupCheckLevelFactory: any SignupCheckLevelFactory { - return appComponent.signupCheckLevelFactory - } - private let appComponent: AppComponent - init(appComponent: AppComponent) { - self.appComponent = appComponent + + + init() { + } } /// ^->AppComponent->SignupGenderComponent -private func factory997eaa831d16af15eee5f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return SignupGenderDependency65e2a6565372eb41f4acProvider(appComponent: parent1(component) as! AppComponent) +private func factory997eaa831d16af15eee5e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { + return SignupGenderDependency65e2a6565372eb41f4acProvider() } private class SignupCheckLevelDependencye4ec84c7d38354a454aeProvider: SignupCheckLevelDependency { @@ -99,17 +97,37 @@ private func factory5b23127e837152346fdae3b0c44298fc1c149afb(_ component: Needle return SignupCheckLevelDependencye4ec84c7d38354a454aeProvider() } private class SignupNameDependency860534ba64c054146b7bProvider: SignupNameDependency { + + + init() { + + } +} +/// ^->AppComponent->SignupNameComponent +private func factory71e8fa7f4327b1e25ed0e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { + return SignupNameDependency860534ba64c054146b7bProvider() +} +private class SignupUserInfoFlowDependencyc2b570f167242d15d8e8Provider: SignupUserInfoFlowDependency { + var signupNameFactory: any SignupNameFactory { + return appComponent.signupNameFactory + } var signupStudentIDFactory: any SignupStudentIDFactory { return appComponent.signupStudentIDFactory } + var signupGenderFactory: any SignupGenderFactory { + return appComponent.signupGenderFactory + } + var signupCheckLevelFactory: any SignupCheckLevelFactory { + return appComponent.signupCheckLevelFactory + } private let appComponent: AppComponent init(appComponent: AppComponent) { self.appComponent = appComponent } } -/// ^->AppComponent->SignupNameComponent -private func factory71e8fa7f4327b1e25ed0f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { - return SignupNameDependency860534ba64c054146b7bProvider(appComponent: parent1(component) as! AppComponent) +/// ^->AppComponent->SignupUserInfoFlowComponent +private func factoryce6f8b9af5f65c8e334ef47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return SignupUserInfoFlowDependencyc2b570f167242d15d8e8Provider(appComponent: parent1(component) as! AppComponent) } private class SignupEmailDependency844c9e928af75b6aaa7aProvider: SignupEmailDependency { var signupVerifyAuthCode: any SignupVerifyAuthCodeFactory { @@ -163,6 +181,7 @@ extension AppComponent: Registration { localTable["signupEmailFactory-any SignupEmailFactory"] = { [unowned self] in self.signupEmailFactory as Any } localTable["signupVerifyAuthCode-any SignupVerifyAuthCodeFactory"] = { [unowned self] in self.signupVerifyAuthCode as Any } localTable["signupPasswordFactory-any SignupPasswordFactory"] = { [unowned self] in self.signupPasswordFactory as Any } + localTable["signupUserInfoFlowFactory-any SignupUserInfoFlowFactory"] = { [unowned self] in self.signupUserInfoFlowFactory as Any } localTable["signupNameFactory-any SignupNameFactory"] = { [unowned self] in self.signupNameFactory as Any } localTable["signupStudentIDFactory-any SignupStudentIDFactory"] = { [unowned self] in self.signupStudentIDFactory as Any } localTable["signupGenderFactory-any SignupGenderFactory"] = { [unowned self] in self.signupGenderFactory as Any } @@ -181,7 +200,7 @@ extension SignupVerifyAuthCodeComponent: Registration { } extension SignupPasswordComponent: Registration { public func registerItems() { - keyPathToName[\SignupPasswordDependency.signupNameFactory] = "signupNameFactory-any SignupNameFactory" + keyPathToName[\SignupPasswordDependency.signupUserInfoFlowFactory] = "signupUserInfoFlowFactory-any SignupUserInfoFlowFactory" } } extension SignupStudentIDComponent: Registration { @@ -191,7 +210,7 @@ extension SignupStudentIDComponent: Registration { } extension SignupGenderComponent: Registration { public func registerItems() { - keyPathToName[\SignupGenderDependency.signupCheckLevelFactory] = "signupCheckLevelFactory-any SignupCheckLevelFactory" + } } extension SignupCheckLevelComponent: Registration { @@ -201,7 +220,15 @@ extension SignupCheckLevelComponent: Registration { } extension SignupNameComponent: Registration { public func registerItems() { - keyPathToName[\SignupNameDependency.signupStudentIDFactory] = "signupStudentIDFactory-any SignupStudentIDFactory" + + } +} +extension SignupUserInfoFlowComponent: Registration { + public func registerItems() { + keyPathToName[\SignupUserInfoFlowDependency.signupNameFactory] = "signupNameFactory-any SignupNameFactory" + keyPathToName[\SignupUserInfoFlowDependency.signupStudentIDFactory] = "signupStudentIDFactory-any SignupStudentIDFactory" + keyPathToName[\SignupUserInfoFlowDependency.signupGenderFactory] = "signupGenderFactory-any SignupGenderFactory" + keyPathToName[\SignupUserInfoFlowDependency.signupCheckLevelFactory] = "signupCheckLevelFactory-any SignupCheckLevelFactory" } } extension SignupEmailComponent: Registration { @@ -241,9 +268,10 @@ private func registerProviderFactory(_ componentPath: String, _ factory: @escapi registerProviderFactory("^->AppComponent->SignupVerifyAuthCodeComponent", factoryff5803dec4bd48820d95f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupPasswordComponent", factorye93d1d56840ff97c674af47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupStudentIDComponent", factorycca12bec445b4f4f6de7f47b58f8f304c97af4d5) - registerProviderFactory("^->AppComponent->SignupGenderComponent", factory997eaa831d16af15eee5f47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->SignupGenderComponent", factory997eaa831d16af15eee5e3b0c44298fc1c149afb) registerProviderFactory("^->AppComponent->SignupCheckLevelComponent", factory5b23127e837152346fdae3b0c44298fc1c149afb) - registerProviderFactory("^->AppComponent->SignupNameComponent", factory71e8fa7f4327b1e25ed0f47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->SignupNameComponent", factory71e8fa7f4327b1e25ed0e3b0c44298fc1c149afb) + registerProviderFactory("^->AppComponent->SignupUserInfoFlowComponent", factoryce6f8b9af5f65c8e334ef47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SignupEmailComponent", factory4d1ddf658c5970ef6b47f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->RootComponent", factory264bfc4d4cb6b0629b40f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SigninComponent", factory2882a056d84a613debccf47b58f8f304c97af4d5) diff --git a/Projects/App/Support/Info.plist b/Projects/App/Support/Info.plist index a8624ed..4172bf3 100644 --- a/Projects/App/Support/Info.plist +++ b/Projects/App/Support/Info.plist @@ -16,8 +16,8 @@ $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString 1.0 - CFBundleVersion - 1 + CFBundleDisplayName + $(BUNDLE_DISPLAY_NAME) LSRequiresIPhoneOS UIApplicationSupportsIndirectInputEvents diff --git a/Projects/Feature/SignupFeature/Interface/UserInfo/SignupCheckLevelFactory.swift b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupCheckLevelFactory.swift index d05004f..8a401fd 100644 --- a/Projects/Feature/SignupFeature/Interface/UserInfo/SignupCheckLevelFactory.swift +++ b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupCheckLevelFactory.swift @@ -2,5 +2,5 @@ import SwiftUI public protocol SignupCheckLevelFactory { associatedtype SomeView: View - func makeView() -> SomeView + func makeView(nextViewNavigateAction: @escaping () -> Void) -> SomeView } diff --git a/Projects/Feature/SignupFeature/Interface/UserInfo/SignupGenderFactory.swift b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupGenderFactory.swift index a169b8f..e5dce8e 100644 --- a/Projects/Feature/SignupFeature/Interface/UserInfo/SignupGenderFactory.swift +++ b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupGenderFactory.swift @@ -2,5 +2,5 @@ import SwiftUI public protocol SignupGenderFactory { associatedtype SomeView: View - func makeView() -> SomeView + func makeView(nextViewNavigateAction: @escaping () -> Void) -> SomeView } diff --git a/Projects/Feature/SignupFeature/Interface/UserInfo/SignupNameFactory.swift b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupNameFactory.swift index cffaf15..7823758 100644 --- a/Projects/Feature/SignupFeature/Interface/UserInfo/SignupNameFactory.swift +++ b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupNameFactory.swift @@ -2,5 +2,5 @@ import SwiftUI public protocol SignupNameFactory { associatedtype SomeView: View - func makeView() -> SomeView + func makeView(nextViewNavigateAction: @escaping () -> Void) -> SomeView } diff --git a/Projects/Feature/SignupFeature/Interface/UserInfo/SignupStudentIDFactory.swift b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupStudentIDFactory.swift index e9b1832..a7d11ed 100644 --- a/Projects/Feature/SignupFeature/Interface/UserInfo/SignupStudentIDFactory.swift +++ b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupStudentIDFactory.swift @@ -2,5 +2,5 @@ import SwiftUI public protocol SignupStudentIDFactory { associatedtype SomeView: View - func makeView() -> SomeView + func makeView(nextViewNavigateAction: @escaping () -> Void) -> SomeView } diff --git a/Projects/Feature/SignupFeature/Interface/UserInfo/SignupUserInfoFlowFactory.swift b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupUserInfoFlowFactory.swift new file mode 100644 index 0000000..1791c5f --- /dev/null +++ b/Projects/Feature/SignupFeature/Interface/UserInfo/SignupUserInfoFlowFactory.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol SignupUserInfoFlowFactory { + associatedtype SomeView: View + func makeView() -> SomeView +} diff --git a/Projects/Feature/SignupFeature/Sources/Password/SignupPasswordComponent.swift b/Projects/Feature/SignupFeature/Sources/Password/SignupPasswordComponent.swift index f60ec80..eb59e0d 100644 --- a/Projects/Feature/SignupFeature/Sources/Password/SignupPasswordComponent.swift +++ b/Projects/Feature/SignupFeature/Sources/Password/SignupPasswordComponent.swift @@ -3,14 +3,14 @@ import NeedleFoundation import SignupFeatureInterface public protocol SignupPasswordDependency: Dependency { - var signupNameFactory: any SignupNameFactory { get } + var signupUserInfoFlowFactory: any SignupUserInfoFlowFactory { get } } public final class SignupPasswordComponent: Component, SignupPasswordFactory { public func makeView() -> some View { SignupPasswordView( viewModel: .init(), - signupNameFactory: dependency.signupNameFactory + signupUserInfoFlowFactory: dependency.signupUserInfoFlowFactory ) } } diff --git a/Projects/Feature/SignupFeature/Sources/Password/SignupPasswordView.swift b/Projects/Feature/SignupFeature/Sources/Password/SignupPasswordView.swift index a7f14b6..4663b23 100644 --- a/Projects/Feature/SignupFeature/Sources/Password/SignupPasswordView.swift +++ b/Projects/Feature/SignupFeature/Sources/Password/SignupPasswordView.swift @@ -12,14 +12,14 @@ struct SignupPasswordView: View { @FocusState private var focusField: FocusField? @StateObject var viewModel: SignupPasswordViewModel - private let signupNameFactory: any SignupNameFactory + private let signupUserInfoFlowFactory: any SignupUserInfoFlowFactory init( viewModel: SignupPasswordViewModel, - signupNameFactory: any SignupNameFactory + signupUserInfoFlowFactory: any SignupUserInfoFlowFactory ) { _viewModel = StateObject(wrappedValue: viewModel) - self.signupNameFactory = signupNameFactory + self.signupUserInfoFlowFactory = signupUserInfoFlowFactory } var body: some View { @@ -66,7 +66,7 @@ struct SignupPasswordView: View { .kgBackground() .hideKeyboardWhenTap() .navigate( - to: signupNameFactory.makeView().eraseToAnyView(), + to: signupUserInfoFlowFactory.makeView().eraseToAnyView(), when: $viewModel.isNavigatedToName ) } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelComponent.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelComponent.swift index f677aec..38ee5a8 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelComponent.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelComponent.swift @@ -6,9 +6,9 @@ public protocol SignupCheckLevelDependency: Dependency { } public final class SignupCheckLevelComponent: Component, SignupCheckLevelFactory { - public func makeView() -> some View { + public func makeView(nextViewNavigateAction: @escaping () -> Void) -> some View { SignupCheckLevelView( - viewModel: .init() + viewModel: .init(nextViewNavigateAction: nextViewNavigateAction) ) } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelView.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelView.swift index e73410a..bea9ec1 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelView.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelView.swift @@ -16,8 +16,6 @@ struct SignupCheckLevelView: View { var body: some View { VStack(spacing: 0) { - SignupProgressView(step: .checkLevel) - NavigationTitleView( title: "운동 실력을 알려주세요", description: "평소 운동을 좋아하고 잘하시는지 알려주세요" @@ -39,7 +37,6 @@ struct SignupCheckLevelView: View { text: "완료", action: viewModel.nextButtonDidTap ) - .navigationBackButton(navigationTitle: "정보 입력") .kgBackground() .hideKeyboardWhenTap() .onChange(of: viewModel.isSuccessToSignup) { _ in diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelViewModel.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelViewModel.swift index 440ff20..b3913a6 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelViewModel.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/CheckLevel/SignupCheckLevelViewModel.swift @@ -6,7 +6,15 @@ final class SignupCheckLevelViewModel: BaseViewModel { @Published var selectedLevel: PhysicalLevel = .high @Published var isSuccessToSignup: Bool = false + private let nextViewNavigateAction: () -> Void + + init(nextViewNavigateAction: @escaping () -> Void) { + self.nextViewNavigateAction = nextViewNavigateAction + } + func nextButtonDidTap() { self.isSuccessToSignup = true + + nextViewNavigateAction() } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Components/SignupProgressView.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Components/SignupProgressView.swift index a1a93dc..08d3e84 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/Components/SignupProgressView.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Components/SignupProgressView.swift @@ -32,6 +32,7 @@ struct SignupProgressView: View { HStack(spacing: 0) { Color.Greens.secondary .frame(width: 31, height: 12) + ForEach(1...3, id: \.self) { index in (index < self.step.rawValue ? Color.Greens.secondary : Color.Grays.gray1000) .frame(height: 12) @@ -41,7 +42,9 @@ struct SignupProgressView: View { Color.Grays.gray1000 .frame(width: 31, height: 12) } + .background(Color.Grays.gray1000) } .padding(.vertical, 16) + .animation(.default, value: step) } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowComponent.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowComponent.swift new file mode 100644 index 0000000..c983fb5 --- /dev/null +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowComponent.swift @@ -0,0 +1,22 @@ +import SwiftUI +import NeedleFoundation +import SignupFeatureInterface + +public protocol SignupUserInfoFlowDependency: Dependency { + var signupNameFactory: any SignupNameFactory { get } + var signupStudentIDFactory: any SignupStudentIDFactory { get } + var signupGenderFactory: any SignupGenderFactory { get } + var signupCheckLevelFactory: any SignupCheckLevelFactory { get } +} + +public final class SignupUserInfoFlowComponent: Component, SignupUserInfoFlowFactory { + public func makeView() -> some View { + SignupUserInfoFlowView( + viewModel: .init(), + nameFactory: dependency.signupNameFactory, + studentIDFactory: dependency.signupStudentIDFactory, + genderFactory: dependency.signupGenderFactory, + checkLevelFactory: dependency.signupCheckLevelFactory + ) + } +} diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowView.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowView.swift new file mode 100644 index 0000000..864e95e --- /dev/null +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowView.swift @@ -0,0 +1,82 @@ +import SwiftUI +import DesignSystem +import ViewUtil +import SignupFeatureInterface + +struct SignupUserInfoFlowView: View { + @Environment(\.dismiss) var dismiss + @StateObject var viewModel: SignupUserInfoFlowViewModel + + private let nameFactory: any SignupNameFactory + private let studentIDFactory: any SignupStudentIDFactory + private let genderFactory: any SignupGenderFactory + private let checkLevelFactory: any SignupCheckLevelFactory + + init( + viewModel: SignupUserInfoFlowViewModel, + nameFactory: any SignupNameFactory, + studentIDFactory: any SignupStudentIDFactory, + genderFactory: any SignupGenderFactory, + checkLevelFactory: any SignupCheckLevelFactory + ) { + _viewModel = StateObject(wrappedValue: viewModel) + self.nameFactory = nameFactory + self.studentIDFactory = studentIDFactory + self.genderFactory = genderFactory + self.checkLevelFactory = checkLevelFactory + } + + var body: some View { + VStack(spacing: 0) { + SignupProgressView(step: viewModel.signupStep) + + Group { + switch viewModel.signupStep { + case .name: + nameFactory.makeView( + nextViewNavigateAction: viewModel.nextButtonDidTap + ) + .eraseToAnyView() + + case .studentID: + studentIDFactory.makeView( + nextViewNavigateAction: viewModel.nextButtonDidTap + ) + .eraseToAnyView() + + case .gender: + genderFactory.makeView( + nextViewNavigateAction: viewModel.nextButtonDidTap + ) + .eraseToAnyView() + + case .checkLevel: + checkLevelFactory.makeView( + nextViewNavigateAction: viewModel.nextButtonDidTap + ) + .eraseToAnyView() + } + } + .transition(viewModel.transition) + } + .animation(.default, value: viewModel.signupStep) + .navigationBackButton( + navigationTitle: "정보 입력", + backAction: { viewModel.backButtonDidTap(dismiss: dismiss) } + ) + .kgBackground() + .hideKeyboardWhenTap() + } +} + +extension AnyTransition { + static let backSlideTransition = AnyTransition.asymmetric( + insertion: .move(edge: .leading), + removal: .move(edge: .trailing) + ) + + static let nextSlideTransition = AnyTransition.asymmetric( + insertion: .move(edge: .trailing), + removal: .move(edge: .leading) + ) +} diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowViewModel.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowViewModel.swift new file mode 100644 index 0000000..d99c071 --- /dev/null +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Flow/SignupUserInfoFlowViewModel.swift @@ -0,0 +1,38 @@ +import BaseFeature +import Combine +import SwiftUI + +final class SignupUserInfoFlowViewModel: BaseViewModel { + @Published var signupStep: SignupStep = .name + var transition: AnyTransition = .nextSlideTransition + + func nextButtonDidTap() { + self.transition = .nextSlideTransition + + switch signupStep { + case .name: + self.signupStep = .studentID + case .studentID: + self.signupStep = .gender + case .gender: + self.signupStep = .checkLevel + case .checkLevel: + break + } + } + + func backButtonDidTap(dismiss: DismissAction) { + self.transition = .backSlideTransition + + switch signupStep { + case .name: + dismiss() + case .studentID: + self.signupStep = .name + case .gender: + self.signupStep = .studentID + case .checkLevel: + self.signupStep = .gender + } + } +} diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderComponent.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderComponent.swift index 7be04c9..97ab0d2 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderComponent.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderComponent.swift @@ -2,15 +2,12 @@ import SwiftUI import NeedleFoundation import SignupFeatureInterface -public protocol SignupGenderDependency: Dependency { - var signupCheckLevelFactory: any SignupCheckLevelFactory { get } -} +public protocol SignupGenderDependency: Dependency {} public final class SignupGenderComponent: Component, SignupGenderFactory { - public func makeView() -> some View { + public func makeView(nextViewNavigateAction: @escaping () -> Void) -> some View { SignupGenderView( - viewModel: .init(), - signupCheckLevelFactory: dependency.signupCheckLevelFactory + viewModel: .init(nextViewNavigateAction: nextViewNavigateAction) ) } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderView.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderView.swift index aa96b4f..4c2f89f 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderView.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderView.swift @@ -7,20 +7,14 @@ import ViewUtil struct SignupGenderView: View { @StateObject var viewModel: SignupGenderViewModel - private let signupCheckLevelFactory: any SignupCheckLevelFactory - init( - viewModel: SignupGenderViewModel, - signupCheckLevelFactory: any SignupCheckLevelFactory + viewModel: SignupGenderViewModel ) { _viewModel = StateObject(wrappedValue: viewModel) - self.signupCheckLevelFactory = signupCheckLevelFactory } var body: some View { VStack(spacing: 0) { - SignupProgressView(step: .gender) - NavigationTitleView( title: "성별을 알려주세요", description: "원활한 서비스를 위해 성별을 알려주세요" @@ -37,15 +31,9 @@ struct SignupGenderView: View { } .bottomButton( text: "다음", -// isDisabled: viewModel.studentID.isEmpty, action: viewModel.nextButtonDidTap ) - .navigationBackButton(navigationTitle: "정보 입력") .kgBackground() .hideKeyboardWhenTap() - .navigate( - to: signupCheckLevelFactory.makeView().eraseToAnyView(), - when: $viewModel.isNavigatedToLevelCheck - ) } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderViewModel.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderViewModel.swift index a837ad1..ae9d075 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderViewModel.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Gender/SignupGenderViewModel.swift @@ -4,9 +4,13 @@ import Combine final class SignupGenderViewModel: BaseViewModel { @Published var selectedGender: Gender = .woman - @Published var isNavigatedToLevelCheck: Bool = false + private let nextViewNavigateAction: () -> Void + + init(nextViewNavigateAction: @escaping () -> Void) { + self.nextViewNavigateAction = nextViewNavigateAction + } func nextButtonDidTap() { - self.isNavigatedToLevelCheck = true + self.nextViewNavigateAction() } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameComponent.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameComponent.swift index bb1f68e..19748b3 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameComponent.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameComponent.swift @@ -2,15 +2,12 @@ import SwiftUI import NeedleFoundation import SignupFeatureInterface -public protocol SignupNameDependency: Dependency { - var signupStudentIDFactory: any SignupStudentIDFactory { get } -} +public protocol SignupNameDependency: Dependency {} public final class SignupNameComponent: Component, SignupNameFactory { - public func makeView() -> some View { + public func makeView(nextViewNavigateAction: @escaping () -> Void) -> some View { SignupNameView( - viewModel: .init(), - signupStudentIDFactory: dependency.signupStudentIDFactory + viewModel: .init(nextViewNavigateAction: nextViewNavigateAction) ) } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameView.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameView.swift index 4884ab0..e469159 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameView.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameView.swift @@ -11,19 +11,14 @@ struct SignupNameView: View { @FocusState private var focusField: FocusField? @StateObject var viewModel: SignupNameViewModel - private let signupStudentIDFactory: any SignupStudentIDFactory init( - viewModel: SignupNameViewModel, - signupStudentIDFactory: any SignupStudentIDFactory + viewModel: SignupNameViewModel ) { _viewModel = StateObject(wrappedValue: viewModel) - self.signupStudentIDFactory = signupStudentIDFactory } var body: some View { VStack(spacing: 0) { - SignupProgressView(step: .name) - NavigationTitleView( title: "이름을 입력해 주세요", description: "원활한 서비스를 위해 이름을 입력해주세요" @@ -48,12 +43,7 @@ struct SignupNameView: View { isDisabled: viewModel.name.isEmpty, action: viewModel.nextButtonDidTap ) - .navigationBackButton(navigationTitle: "정보 입력") .kgBackground() .hideKeyboardWhenTap() - .navigate( - to: signupStudentIDFactory.makeView().eraseToAnyView(), - when: $viewModel.isNavigatedToStudentID - ) } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameViewModel.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameViewModel.swift index 978ddef..5921ff9 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameViewModel.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/Name/SignupNameViewModel.swift @@ -4,9 +4,13 @@ import Combine final class SignupNameViewModel: BaseViewModel { @Published var name: String = "" - @Published var isNavigatedToStudentID: Bool = false + private let nextViewNavigateAction: () -> Void + + init(nextViewNavigateAction: @escaping () -> Void) { + self.nextViewNavigateAction = nextViewNavigateAction + } func nextButtonDidTap() { - self.isNavigatedToStudentID = true + self.nextViewNavigateAction() } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDComponent.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDComponent.swift index 004b8f0..615ee67 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDComponent.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDComponent.swift @@ -7,10 +7,9 @@ public protocol SignupStudentIDDependency: Dependency { } public final class SignupStudentIDComponent: Component, SignupStudentIDFactory { - public func makeView() -> some View { + public func makeView(nextViewNavigateAction: @escaping () -> Void) -> some View { SignupStudentIDView( - viewModel: .init(), - signupGenderFactory: dependency.signupGenderFactory + viewModel: .init(nextViewNavigateAction: nextViewNavigateAction) ) } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDView.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDView.swift index 98cb253..a5a2dd7 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDView.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDView.swift @@ -11,20 +11,14 @@ struct SignupStudentIDView: View { @FocusState private var focusField: FocusField? @StateObject var viewModel: SignupStudentIDViewModel - private let signupGenderFactory: any SignupGenderFactory - init( - viewModel: SignupStudentIDViewModel, - signupGenderFactory: any SignupGenderFactory + viewModel: SignupStudentIDViewModel ) { _viewModel = StateObject(wrappedValue: viewModel) - self.signupGenderFactory = signupGenderFactory } var body: some View { VStack(spacing: 0) { - SignupProgressView(step: .studentID) - NavigationTitleView( title: "학번을 입력해주세요", description: "원활한 서비스를 위해 학번을 입력해주세요" @@ -51,12 +45,7 @@ struct SignupStudentIDView: View { isDisabled: viewModel.studentID.isEmpty, action: viewModel.nextButtonDidTap ) - .navigationBackButton(navigationTitle: "정보 입력") .kgBackground() .hideKeyboardWhenTap() - .navigate( - to: signupGenderFactory.makeView().eraseToAnyView(), - when: $viewModel.isNavigatedToGender - ) } } diff --git a/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDViewModel.swift b/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDViewModel.swift index b69ba66..be95a89 100644 --- a/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDViewModel.swift +++ b/Projects/Feature/SignupFeature/Sources/UserInfo/StudentID/SignupStudentIDViewModel.swift @@ -4,9 +4,13 @@ import Combine final class SignupStudentIDViewModel: BaseViewModel { @Published var studentID: String = "" - @Published var isNavigatedToGender: Bool = false + private let nextViewNavigateAction: () -> Void + + init(nextViewNavigateAction: @escaping () -> Void) { + self.nextViewNavigateAction = nextViewNavigateAction + } func nextButtonDidTap() { - self.isNavigatedToGender = true + self.nextViewNavigateAction() } } diff --git a/Projects/UserInterface/DesignSystem/Sources/Extension/View+navigationBar.swift b/Projects/UserInterface/DesignSystem/Sources/Extension/View+navigationBar.swift index 79e5075..a0ff6c5 100644 --- a/Projects/UserInterface/DesignSystem/Sources/Extension/View+navigationBar.swift +++ b/Projects/UserInterface/DesignSystem/Sources/Extension/View+navigationBar.swift @@ -7,15 +7,18 @@ public struct NavigationBarModifier: ViewModifier { private let navigationTitle: String private let hasBackButton: Bool + private let backAction: (() -> Void)? private let rightIcon: (icon: Icons, action: () -> Void)? init( navigationTitle: String, hasBackButton: Bool = false, + backAction: (() -> Void)?, rightIcon: (Icons, () -> Void)? = nil ) { self.navigationTitle = navigationTitle self.hasBackButton = hasBackButton + self.backAction = backAction self.rightIcon = rightIcon } @@ -25,7 +28,11 @@ public struct NavigationBarModifier: ViewModifier { HStack { if hasBackButton { Button { - dismiss() + if let backAction { + backAction() + } else { + dismiss() + } } label: { KGIcon(.chevronLeft) .frame(28) @@ -63,24 +70,28 @@ public extension View { func navigationBar( navigationTitle: String = "", hasBackButton: Bool = false, + backAction: (() -> Void)? = nil, rightIcon: (Icons, () -> Void)? = nil ) -> some View { modifier( NavigationBarModifier( navigationTitle: navigationTitle, hasBackButton: hasBackButton, + backAction: backAction, rightIcon: rightIcon ) ) } func navigationBackButton( - navigationTitle: String = "" + navigationTitle: String = "", + backAction: (() -> Void)? = nil ) -> some View { modifier( NavigationBarModifier( navigationTitle: navigationTitle, - hasBackButton: true + hasBackButton: true, + backAction: backAction ) ) } diff --git a/Projects/UserInterface/DesignSystem/Sources/View/CheckLevelCellView.swift b/Projects/UserInterface/DesignSystem/Sources/View/CheckLevelCellView.swift index a1c5029..bf6d255 100644 --- a/Projects/UserInterface/DesignSystem/Sources/View/CheckLevelCellView.swift +++ b/Projects/UserInterface/DesignSystem/Sources/View/CheckLevelCellView.swift @@ -24,7 +24,7 @@ public struct LevelCheckCellView: View { .kgFont(.m1, weight: .semiBold, color: .Grays.white) Text(level.description) - .kgFont(.m3, weight: .regular, color: .Grays.gray500) + .kgFont(.label, weight: .regular, color: .Grays.gray500) .lineLimit(1) Spacer() From 4bbf90d87e11f1ee75f8e728a58b85aae7020ebd Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 09:55:54 +0900 Subject: [PATCH 06/16] =?UTF-8?q?=E2=9C=A8=20::=20find=20Password=20Featur?= =?UTF-8?q?e=20init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectDescriptionHelpers/ModulePaths.swift | 1 + .../Interface/Interface.swift | 1 + .../Feature/FindPasswordFeature/Project.swift | 17 +++++++++++++++++ .../FindPasswordFeature/Sources/Sources.swift | 1 + .../Tests/FindPasswordFeatureTest.swift | 11 +++++++++++ 5 files changed, 31 insertions(+) create mode 100644 Projects/Feature/FindPasswordFeature/Interface/Interface.swift create mode 100644 Projects/Feature/FindPasswordFeature/Project.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/Sources.swift create mode 100644 Projects/Feature/FindPasswordFeature/Tests/FindPasswordFeatureTest.swift diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift index e179a2d..7d3ed7c 100644 --- a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift @@ -24,6 +24,7 @@ extension ModulePaths: MicroTargetPathConvertable { public extension ModulePaths { enum Feature: String, MicroTargetPathConvertable { + case FindPasswordFeature case SignupFeature case SigninFeature case SplashFeature diff --git a/Projects/Feature/FindPasswordFeature/Interface/Interface.swift b/Projects/Feature/FindPasswordFeature/Interface/Interface.swift new file mode 100644 index 0000000..b1853ce --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Interface/Interface.swift @@ -0,0 +1 @@ +// This is for Tuist diff --git a/Projects/Feature/FindPasswordFeature/Project.swift b/Projects/Feature/FindPasswordFeature/Project.swift new file mode 100644 index 0000000..f654b37 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Project.swift @@ -0,0 +1,17 @@ +import DependencyPlugin +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project.module( + name: ModulePaths.Feature.FindPasswordFeature.rawValue, + targets: [ + .interface(module: .feature(.FindPasswordFeature)), + .implements(module: .feature(.FindPasswordFeature), dependencies: [ + .feature(target: .FindPasswordFeature, type: .interface), + .feature(target: .BaseFeature) + ]), + .tests(module: .feature(.FindPasswordFeature), dependencies: [ + .feature(target: .FindPasswordFeature) + ]) + ] +) diff --git a/Projects/Feature/FindPasswordFeature/Sources/Sources.swift b/Projects/Feature/FindPasswordFeature/Sources/Sources.swift new file mode 100644 index 0000000..b1853ce --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/Sources.swift @@ -0,0 +1 @@ +// This is for Tuist diff --git a/Projects/Feature/FindPasswordFeature/Tests/FindPasswordFeatureTest.swift b/Projects/Feature/FindPasswordFeature/Tests/FindPasswordFeatureTest.swift new file mode 100644 index 0000000..ee17017 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Tests/FindPasswordFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class FindPasswordFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} From 4427fe1ace4b3c0eb2a9cd776d5343b200916683 Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:42:16 +0900 Subject: [PATCH 07/16] =?UTF-8?q?=E2=9C=A8=20::=20onSuccess=20Extension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Shared/ViewUtil/Sources/View+onSuccess.swift | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Projects/Shared/ViewUtil/Sources/View+onSuccess.swift diff --git a/Projects/Shared/ViewUtil/Sources/View+onSuccess.swift b/Projects/Shared/ViewUtil/Sources/View+onSuccess.swift new file mode 100644 index 0000000..b882839 --- /dev/null +++ b/Projects/Shared/ViewUtil/Sources/View+onSuccess.swift @@ -0,0 +1,8 @@ +import SwiftUI + +public extension View { + func onSuccess(of value: Bool, _ action: () -> Void) -> some View { + if value { action() } + return self + } +} From 4e6ee769692b713869be009a7fcbd6d8d5ff95f9 Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:42:47 +0900 Subject: [PATCH 08/16] =?UTF-8?q?=E2=9C=A8=20::=20Signup=20Component=20?= =?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8=EC=8B=9C=EC=8A=A4=ED=85=9C=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Extension/View+bottomButton.swift} | 3 +-- .../Sources/View}/NavigationTitleView.swift | 14 +++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) rename Projects/{Feature/SignupFeature/Sources/Components/BottomButton.swift => UserInterface/DesignSystem/Sources/Extension/View+bottomButton.swift} (95%) rename Projects/{Feature/SignupFeature/Sources/Components => UserInterface/DesignSystem/Sources/View}/NavigationTitleView.swift (59%) diff --git a/Projects/Feature/SignupFeature/Sources/Components/BottomButton.swift b/Projects/UserInterface/DesignSystem/Sources/Extension/View+bottomButton.swift similarity index 95% rename from Projects/Feature/SignupFeature/Sources/Components/BottomButton.swift rename to Projects/UserInterface/DesignSystem/Sources/Extension/View+bottomButton.swift index 6551884..80eb562 100644 --- a/Projects/Feature/SignupFeature/Sources/Components/BottomButton.swift +++ b/Projects/UserInterface/DesignSystem/Sources/Extension/View+bottomButton.swift @@ -1,10 +1,9 @@ import SwiftUI -import DesignSystem /// Vstack으로 할 경우 버튼이 잘리는 문제가 발생 /// ZStack을 사용해 SuperView의 상단으로 띄움 -struct BottomButton: ViewModifier { +private struct BottomButton: ViewModifier { let text: String let isEditing: Bool let isDisabled: Bool diff --git a/Projects/Feature/SignupFeature/Sources/Components/NavigationTitleView.swift b/Projects/UserInterface/DesignSystem/Sources/View/NavigationTitleView.swift similarity index 59% rename from Projects/Feature/SignupFeature/Sources/Components/NavigationTitleView.swift rename to Projects/UserInterface/DesignSystem/Sources/View/NavigationTitleView.swift index 6d6d621..1690ccc 100644 --- a/Projects/Feature/SignupFeature/Sources/Components/NavigationTitleView.swift +++ b/Projects/UserInterface/DesignSystem/Sources/View/NavigationTitleView.swift @@ -1,11 +1,15 @@ import SwiftUI -import DesignSystem -struct NavigationTitleView: View { - let title: String - let description: String +public struct NavigationTitleView: View { + private let title: String + private let description: String - var body: some View { + public init(title: String, description: String) { + self.title = title + self.description = description + } + + public var body: some View { VStack(alignment: .leading, spacing: 8) { Text(title) .kgFont(.h3, weight: .semiBold, color: .white) From f0d7c63bf21bc897ed215d08dafce6150e07295b Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:43:05 +0900 Subject: [PATCH 09/16] =?UTF-8?q?=E2=9C=A8=20::=20FindPassword=20DI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Application/DI/AppComponent.swift | 13 ++++ .../Sources/Application/NeedleGenerated.swift | 64 +++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/Projects/App/Sources/Application/DI/AppComponent.swift b/Projects/App/Sources/Application/DI/AppComponent.swift index 90717f0..ad5a8d2 100644 --- a/Projects/App/Sources/Application/DI/AppComponent.swift +++ b/Projects/App/Sources/Application/DI/AppComponent.swift @@ -8,6 +8,8 @@ import SigninFeature import SigninFeatureInterface import SignupFeature import SignupFeatureInterface +import FindPasswordFeature +import FindPasswordFeatureInterface public final class AppComponent: BootstrapComponent { // private let _keychain: any Keychain @@ -63,4 +65,15 @@ public extension AppComponent { var signupCheckLevelFactory: any SignupCheckLevelFactory { SignupCheckLevelComponent(parent: self) } + + // Find Password + var inputEmailFactory: any InputEmailFactory { + InputEmailComponent(parent: self) + } + var verifyAuthCodeFactory: any VerifyAuthCodeFactory { + VerifyAuthCodeComponent(parent: self) + } + var inputNewPasswordFactory: any InputNewPasswordFactory { + InputNewPasswordComponent(parent: self) + } } diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift index 13eed84..2fa268d 100644 --- a/Projects/App/Sources/Application/NeedleGenerated.swift +++ b/Projects/App/Sources/Application/NeedleGenerated.swift @@ -1,5 +1,7 @@ +import FindPasswordFeature +import FindPasswordFeatureInterface import NeedleFoundation import RootFeature import RootFeatureInterface @@ -162,6 +164,9 @@ private class SigninDependencyde06a9d0b22764487733Provider: SigninDependency { var signupEmailFactory: any SignupEmailFactory { return appComponent.signupEmailFactory } + var inputEmailFactory: any InputEmailFactory { + return appComponent.inputEmailFactory + } private let appComponent: AppComponent init(appComponent: AppComponent) { self.appComponent = appComponent @@ -171,6 +176,43 @@ private class SigninDependencyde06a9d0b22764487733Provider: SigninDependency { private func factory2882a056d84a613debccf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { return SigninDependencyde06a9d0b22764487733Provider(appComponent: parent1(component) as! AppComponent) } +private class VerifyAuthCodeDependencya16ab19f97e0892b555bProvider: VerifyAuthCodeDependency { + var inputNewPasswordFactory: any InputNewPasswordFactory { + return appComponent.inputNewPasswordFactory + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->VerifyAuthCodeComponent +private func factoryed5ce75de1bf576b84adf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return VerifyAuthCodeDependencya16ab19f97e0892b555bProvider(appComponent: parent1(component) as! AppComponent) +} +private class InputNewPasswordDependency1149e32e41e1cfce6f6dProvider: InputNewPasswordDependency { + + + init() { + + } +} +/// ^->AppComponent->InputNewPasswordComponent +private func factory27615059458a0576f404e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject { + return InputNewPasswordDependency1149e32e41e1cfce6f6dProvider() +} +private class InputEmailDependency4102766a436592066e97Provider: InputEmailDependency { + var verifyAuthCodeFactory: any VerifyAuthCodeFactory { + return appComponent.verifyAuthCodeFactory + } + private let appComponent: AppComponent + init(appComponent: AppComponent) { + self.appComponent = appComponent + } +} +/// ^->AppComponent->InputEmailComponent +private func factoryf939e41ba3a1151e88f8f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject { + return InputEmailDependency4102766a436592066e97Provider(appComponent: parent1(component) as! AppComponent) +} #else extension AppComponent: Registration { @@ -186,6 +228,9 @@ extension AppComponent: Registration { localTable["signupStudentIDFactory-any SignupStudentIDFactory"] = { [unowned self] in self.signupStudentIDFactory as Any } localTable["signupGenderFactory-any SignupGenderFactory"] = { [unowned self] in self.signupGenderFactory as Any } localTable["signupCheckLevelFactory-any SignupCheckLevelFactory"] = { [unowned self] in self.signupCheckLevelFactory as Any } + localTable["inputEmailFactory-any InputEmailFactory"] = { [unowned self] in self.inputEmailFactory as Any } + localTable["verifyAuthCodeFactory-any VerifyAuthCodeFactory"] = { [unowned self] in self.verifyAuthCodeFactory as Any } + localTable["inputNewPasswordFactory-any InputNewPasswordFactory"] = { [unowned self] in self.inputNewPasswordFactory as Any } } } extension SplashComponent: Registration { @@ -245,6 +290,22 @@ extension RootComponent: Registration { extension SigninComponent: Registration { public func registerItems() { keyPathToName[\SigninDependency.signupEmailFactory] = "signupEmailFactory-any SignupEmailFactory" + keyPathToName[\SigninDependency.inputEmailFactory] = "inputEmailFactory-any InputEmailFactory" + } +} +extension VerifyAuthCodeComponent: Registration { + public func registerItems() { + keyPathToName[\VerifyAuthCodeDependency.inputNewPasswordFactory] = "inputNewPasswordFactory-any InputNewPasswordFactory" + } +} +extension InputNewPasswordComponent: Registration { + public func registerItems() { + + } +} +extension InputEmailComponent: Registration { + public func registerItems() { + keyPathToName[\InputEmailDependency.verifyAuthCodeFactory] = "verifyAuthCodeFactory-any VerifyAuthCodeFactory" } } @@ -275,6 +336,9 @@ private func registerProviderFactory(_ componentPath: String, _ factory: @escapi registerProviderFactory("^->AppComponent->SignupEmailComponent", factory4d1ddf658c5970ef6b47f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->RootComponent", factory264bfc4d4cb6b0629b40f47b58f8f304c97af4d5) registerProviderFactory("^->AppComponent->SigninComponent", factory2882a056d84a613debccf47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->VerifyAuthCodeComponent", factoryed5ce75de1bf576b84adf47b58f8f304c97af4d5) + registerProviderFactory("^->AppComponent->InputNewPasswordComponent", factory27615059458a0576f404e3b0c44298fc1c149afb) + registerProviderFactory("^->AppComponent->InputEmailComponent", factoryf939e41ba3a1151e88f8f47b58f8f304c97af4d5) } #endif From 7b1ea9550f580b269124780426f796d490ff8dce Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:43:20 +0900 Subject: [PATCH 10/16] =?UTF-8?q?=E2=9C=A8=20::=20RootPresentaionMode=20En?= =?UTF-8?q?v=20Value?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RootPresentationMode.swift | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Projects/Feature/BaseFeature/Sources/EnvironmentValues/RootPresentationMode.swift diff --git a/Projects/Feature/BaseFeature/Sources/EnvironmentValues/RootPresentationMode.swift b/Projects/Feature/BaseFeature/Sources/EnvironmentValues/RootPresentationMode.swift new file mode 100644 index 0000000..619b788 --- /dev/null +++ b/Projects/Feature/BaseFeature/Sources/EnvironmentValues/RootPresentationMode.swift @@ -0,0 +1,20 @@ +import SwiftUI + +public struct RootPresentationModeKey: EnvironmentKey { + public static let defaultValue: Binding = .constant(RootPresentationMode()) +} + +public extension EnvironmentValues { + var rootPresentationMode: Binding { + get { return self[RootPresentationModeKey.self] } + set { self[RootPresentationModeKey.self] = newValue } + } +} + +public typealias RootPresentationMode = Bool + +public extension Binding { + func popToRootView() { + self.wrappedValue.toggle() + } +} From df950f85a774192e2d798fae3e98eb31480c728b Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:43:41 +0900 Subject: [PATCH 11/16] =?UTF-8?q?=F0=9F=94=A5=20::=20Default=20File=20Remo?= =?UTF-8?q?ve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Feature/FindPasswordFeature/Interface/Interface.swift | 1 - Projects/Feature/FindPasswordFeature/Sources/Sources.swift | 1 - 2 files changed, 2 deletions(-) delete mode 100644 Projects/Feature/FindPasswordFeature/Interface/Interface.swift delete mode 100644 Projects/Feature/FindPasswordFeature/Sources/Sources.swift diff --git a/Projects/Feature/FindPasswordFeature/Interface/Interface.swift b/Projects/Feature/FindPasswordFeature/Interface/Interface.swift deleted file mode 100644 index b1853ce..0000000 --- a/Projects/Feature/FindPasswordFeature/Interface/Interface.swift +++ /dev/null @@ -1 +0,0 @@ -// This is for Tuist diff --git a/Projects/Feature/FindPasswordFeature/Sources/Sources.swift b/Projects/Feature/FindPasswordFeature/Sources/Sources.swift deleted file mode 100644 index b1853ce..0000000 --- a/Projects/Feature/FindPasswordFeature/Sources/Sources.swift +++ /dev/null @@ -1 +0,0 @@ -// This is for Tuist From f86e4e94c03e0ab5141b785f062032cbdce98489 Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:43:53 +0900 Subject: [PATCH 12/16] =?UTF-8?q?=E2=9C=A8=20::=20Input=20Email=20Publishi?= =?UTF-8?q?ng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interface/InputEmailFactory.swift | 6 ++ .../Sources/Email/InputEmailComponent.swift | 16 +++++ .../Sources/Email/InputEmailViewModel.swift | 12 ++++ .../Sources/Email/InputSignupEmailView.swift | 61 +++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 Projects/Feature/FindPasswordFeature/Interface/InputEmailFactory.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/Email/InputEmailComponent.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/Email/InputEmailViewModel.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/Email/InputSignupEmailView.swift diff --git a/Projects/Feature/FindPasswordFeature/Interface/InputEmailFactory.swift b/Projects/Feature/FindPasswordFeature/Interface/InputEmailFactory.swift new file mode 100644 index 0000000..ce19a83 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Interface/InputEmailFactory.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol InputEmailFactory { + associatedtype SomeView: View + func makeView() -> SomeView +} diff --git a/Projects/Feature/FindPasswordFeature/Sources/Email/InputEmailComponent.swift b/Projects/Feature/FindPasswordFeature/Sources/Email/InputEmailComponent.swift new file mode 100644 index 0000000..b35cc94 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/Email/InputEmailComponent.swift @@ -0,0 +1,16 @@ +import SwiftUI +import NeedleFoundation +import FindPasswordFeatureInterface + +public protocol InputEmailDependency: Dependency { + var verifyAuthCodeFactory: any VerifyAuthCodeFactory { get } +} + +public final class InputEmailComponent: Component, InputEmailFactory { + public func makeView() -> some View { + InputEmailView( + viewModel: .init(), + verifyAuthCodeFactory: dependency.verifyAuthCodeFactory + ) + } +} diff --git a/Projects/Feature/FindPasswordFeature/Sources/Email/InputEmailViewModel.swift b/Projects/Feature/FindPasswordFeature/Sources/Email/InputEmailViewModel.swift new file mode 100644 index 0000000..5831b0f --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/Email/InputEmailViewModel.swift @@ -0,0 +1,12 @@ +import BaseFeature +import Combine + +final class InputEmailViewModel: BaseViewModel { + @Published var email: String = "" + + @Published var isNavigatedToVerifyAuthCode: Bool = false + + func nextButtonDidTap() { + self.isNavigatedToVerifyAuthCode = true + } +} diff --git a/Projects/Feature/FindPasswordFeature/Sources/Email/InputSignupEmailView.swift b/Projects/Feature/FindPasswordFeature/Sources/Email/InputSignupEmailView.swift new file mode 100644 index 0000000..0b44eac --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/Email/InputSignupEmailView.swift @@ -0,0 +1,61 @@ +import DesignSystem +import SwiftUI +import BaseFeature +import ViewUtil +import FindPasswordFeatureInterface + +struct InputEmailView: View { + private enum FocusField { + case email + } + @FocusState private var focusField: FocusField? + @StateObject var viewModel: InputEmailViewModel + @Environment(\.rootPresentationMode) var rootPresentationMode + + private let verifyAuthCodeFactory: any VerifyAuthCodeFactory + + init( + viewModel: InputEmailViewModel, + verifyAuthCodeFactory: any VerifyAuthCodeFactory + ) { + _viewModel = StateObject(wrappedValue: viewModel) + self.verifyAuthCodeFactory = verifyAuthCodeFactory + } + + var body: some View { + VStack(spacing: 0) { + NavigationTitleView( + title: "이메일을 입력해 주세요", + description: "이메일로 인증번호를 전송해 드릴게요" + ) + + KGTextField( + "이메일을 입력해주세요", + text: $viewModel.email, + title: "이메일", + isError: viewModel.isErrorOccurred, + errorMessage: viewModel.errorMessage, + onCommit: viewModel.nextButtonDidTap + ) + .textContentType(.emailAddress) + .keyboardType(.emailAddress) + .focused($focusField, equals: .email) + + Spacer() + } + .bottomButton( + text: "다음", + isEditing: focusField != nil, + isDisabled: viewModel.email.isEmpty, + action: viewModel.nextButtonDidTap + ) + .navigationBackButton() + .kgBackground() + .hideKeyboardWhenTap() + .navigate( + to: verifyAuthCodeFactory.makeView().eraseToAnyView() + .environment(\.rootPresentationMode, rootPresentationMode), + when: $viewModel.isNavigatedToVerifyAuthCode + ) + } +} From 715fb7c6d1c446bbf50fd3931c20c694d433d66f Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:44:07 +0900 Subject: [PATCH 13/16] =?UTF-8?q?=E2=9C=A8=20::=20VerifyAuthCode=20Publish?= =?UTF-8?q?ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interface/VerifyAuthCodeFactory.swift | 6 ++ .../VerifyAuthCodeComponent.swift | 17 +++++ .../VerifyAuthCode/VerifyAuthCodeView.swift | 70 +++++++++++++++++++ .../VerifyAuthCodeViewModel.swift | 13 ++++ 4 files changed, 106 insertions(+) create mode 100644 Projects/Feature/FindPasswordFeature/Interface/VerifyAuthCodeFactory.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeComponent.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeView.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeViewModel.swift diff --git a/Projects/Feature/FindPasswordFeature/Interface/VerifyAuthCodeFactory.swift b/Projects/Feature/FindPasswordFeature/Interface/VerifyAuthCodeFactory.swift new file mode 100644 index 0000000..b977a25 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Interface/VerifyAuthCodeFactory.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol VerifyAuthCodeFactory { + associatedtype SomeView: View + func makeView() -> SomeView +} diff --git a/Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeComponent.swift b/Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeComponent.swift new file mode 100644 index 0000000..d713b57 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeComponent.swift @@ -0,0 +1,17 @@ +import SwiftUI +import NeedleFoundation +import FindPasswordFeatureInterface + +public protocol VerifyAuthCodeDependency: Dependency { + var inputNewPasswordFactory: any InputNewPasswordFactory { get } +} + +public final class VerifyAuthCodeComponent: Component, + VerifyAuthCodeFactory { + public func makeView() -> some View { + VerifyAuthCodeView( + viewModel: .init(), + inputNewPasswordFactory: dependency.inputNewPasswordFactory + ) + } +} diff --git a/Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeView.swift b/Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeView.swift new file mode 100644 index 0000000..9d0777d --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeView.swift @@ -0,0 +1,70 @@ +import DesignSystem +import SwiftUI +import BaseFeature +import ViewUtil +import FindPasswordFeatureInterface + +struct VerifyAuthCodeView: View { + private enum FocusField { + case authCode + } + @FocusState private var focusField: FocusField? + @StateObject var viewModel: VerifyAuthCodeViewModel + @Environment(\.rootPresentationMode) var rootPresentationMode + + private let inputNewPasswordFactory: any InputNewPasswordFactory + + init( + viewModel: VerifyAuthCodeViewModel, + inputNewPasswordFactory: any InputNewPasswordFactory + ) { + _viewModel = StateObject(wrappedValue: viewModel) + self.inputNewPasswordFactory = inputNewPasswordFactory + } + + var body: some View { + VStack(spacing: 0) { + NavigationTitleView( + title: "인증번호를 입력해 주세요", + description: "입력해주신 이메일로 인증번호를 전송해 드렸어요" + ) + + VerifyCodeTextField( + $viewModel.authCode, + isError: viewModel.isErrorOccurred, + errorMessage: viewModel.errorMessage, + onCommit: viewModel.nextButtonDidTap + ) + .focused($focusField, equals: .authCode) + + HStack { + Text("5:00") + .kgFont(.label, weight: .regular, color: .Greens.main) + + Spacer() + + Text("인증번호 재전송") + .kgFont(.label, weight: .regular, color: .Grays.gray400) + .underlineText(color: .Grays.gray400) + } + .padding(.vertical, 16) + .padding(.horizontal, 24) + + Spacer() + } + .bottomButton( + text: "인증", + isEditing: focusField != nil, + isDisabled: viewModel.authCode.count < 4, + action: viewModel.nextButtonDidTap + ) + .navigationBackButton() + .kgBackground() + .hideKeyboardWhenTap() + .navigate( + to: inputNewPasswordFactory.makeView().eraseToAnyView() + .environment(\.rootPresentationMode, rootPresentationMode), + when: $viewModel.isNavigatedToNewPassword + ) + } +} diff --git a/Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeViewModel.swift b/Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeViewModel.swift new file mode 100644 index 0000000..9828a4e --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/VerifyAuthCode/VerifyAuthCodeViewModel.swift @@ -0,0 +1,13 @@ +import BaseFeature +import Foundation +import Combine + +final class VerifyAuthCodeViewModel: BaseViewModel { + @Published var authCode: String = "" + + @Published var isNavigatedToNewPassword: Bool = false + + func nextButtonDidTap() { + self.isNavigatedToNewPassword = true + } +} From 8366ea51b42ddf8bee89a48acf169120c2392fca Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:44:23 +0900 Subject: [PATCH 14/16] =?UTF-8?q?=E2=9C=A8=20::=20InputNewPassword=20Publi?= =?UTF-8?q?shing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interface/InputNewPasswordFactory.swift | 6 ++ .../InputNewPasswordComponent.swift | 13 ++++ .../NewPassword/InputNewPasswordView.swift | 71 +++++++++++++++++++ .../InputNewPasswordViewModel.swift | 13 ++++ 4 files changed, 103 insertions(+) create mode 100644 Projects/Feature/FindPasswordFeature/Interface/InputNewPasswordFactory.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordComponent.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordView.swift create mode 100644 Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordViewModel.swift diff --git a/Projects/Feature/FindPasswordFeature/Interface/InputNewPasswordFactory.swift b/Projects/Feature/FindPasswordFeature/Interface/InputNewPasswordFactory.swift new file mode 100644 index 0000000..f12aab8 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Interface/InputNewPasswordFactory.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol InputNewPasswordFactory { + associatedtype SomeView: View + func makeView() -> SomeView +} diff --git a/Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordComponent.swift b/Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordComponent.swift new file mode 100644 index 0000000..742f013 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordComponent.swift @@ -0,0 +1,13 @@ +import SwiftUI +import NeedleFoundation +import FindPasswordFeatureInterface + +public protocol InputNewPasswordDependency: Dependency {} + +public final class InputNewPasswordComponent: Component, InputNewPasswordFactory { + public func makeView() -> some View { + InputNewPasswordView( + viewModel: .init() + ) + } +} diff --git a/Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordView.swift b/Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordView.swift new file mode 100644 index 0000000..194f8b9 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordView.swift @@ -0,0 +1,71 @@ +import DesignSystem +import SwiftUI +import BaseFeature +import SignupFeatureInterface +import ViewUtil + +struct InputNewPasswordView: View { + private enum FocusField { + case password + case checkPassword + } + @FocusState private var focusField: FocusField? + @StateObject var viewModel: InputNewPasswordViewModel + @Environment(\.rootPresentationMode) var rootPresentationMode + + init( + viewModel: InputNewPasswordViewModel + ) { + _viewModel = StateObject(wrappedValue: viewModel) + } + + var body: some View { + VStack(spacing: 0) { + NavigationTitleView( + title: "새 비밀번호를 입력해주세요", + description: "비밀번호는 영어와 숫자를 조합해 만들어 주세요" + ) + + KGTextField( + "비밀번호(8~12자)를 입력해 주세요", + text: $viewModel.password, + title: "비밀번호", + isError: viewModel.isErrorOccurred, + errorMessage: viewModel.errorMessage, + isSecure: true + ) { + self.focusField = .checkPassword + } + .textContentType(.password) + .focused($focusField, equals: .password) + + KGTextField( + "비밀번호 다시 입력해 주세요", + text: $viewModel.checkPassword, + title: "비밀번호 확인", + isError: viewModel.isErrorOccurred, + errorMessage: viewModel.errorMessage, + isSecure: true, + onCommit: viewModel.nextButtonDidTap + ) + .textContentType(.password) + .focused($focusField, equals: .checkPassword) + + Spacer() + } + .bottomButton( + text: "다음", + isEditing: focusField != nil, + isDisabled: viewModel.password.isEmpty || viewModel.checkPassword.isEmpty, + action: viewModel.nextButtonDidTap + ) + .navigationBar() + .kgBackground() + .hideKeyboardWhenTap() + .onSuccess(of: viewModel.isSuccessToChangePassword) { + DispatchQueue.main.async { + self.rootPresentationMode.popToRootView() + } + } + } +} diff --git a/Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordViewModel.swift b/Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordViewModel.swift new file mode 100644 index 0000000..c0aa1a4 --- /dev/null +++ b/Projects/Feature/FindPasswordFeature/Sources/NewPassword/InputNewPasswordViewModel.swift @@ -0,0 +1,13 @@ +import BaseFeature +import Combine + +final class InputNewPasswordViewModel: BaseViewModel { + @Published var password: String = "" + @Published var checkPassword: String = "" + + @Published var isSuccessToChangePassword: Bool = false + + func nextButtonDidTap() { + self.isSuccessToChangePassword = true + } +} From 3823cb75104bbc188b8168b6f398806cc80af40e Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:44:42 +0900 Subject: [PATCH 15/16] =?UTF-8?q?=E2=9C=A8=20::=20Signin=20to=20FindPasswo?= =?UTF-8?q?rd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Feature/SigninFeature/Project.swift | 3 ++- .../Sources/SigninComponent.swift | 5 +++- .../SigninFeature/Sources/SigninView.swift | 23 +++++++++++++++---- .../Sources/SigninViewModel.swift | 5 ++++ ...wift => SignupVerifyAuthCodeFactory.swift} | 0 5 files changed, 30 insertions(+), 6 deletions(-) rename Projects/Feature/SignupFeature/Interface/{SignupAuthCodeVerifyFactory.swift => SignupVerifyAuthCodeFactory.swift} (100%) diff --git a/Projects/Feature/SigninFeature/Project.swift b/Projects/Feature/SigninFeature/Project.swift index 7bde5f1..048b497 100644 --- a/Projects/Feature/SigninFeature/Project.swift +++ b/Projects/Feature/SigninFeature/Project.swift @@ -9,7 +9,8 @@ let project = Project.module( .implements(module: .feature(.SigninFeature), dependencies: [ .feature(target: .SigninFeature, type: .interface), .feature(target: .BaseFeature), - .feature(target: .SignupFeature, type: .interface) + .feature(target: .SignupFeature, type: .interface), + .feature(target: .FindPasswordFeature, type: .interface) ]), .tests(module: .feature(.SigninFeature), dependencies: [ .feature(target: .SigninFeature) diff --git a/Projects/Feature/SigninFeature/Sources/SigninComponent.swift b/Projects/Feature/SigninFeature/Sources/SigninComponent.swift index d5d2bc9..1c3e783 100644 --- a/Projects/Feature/SigninFeature/Sources/SigninComponent.swift +++ b/Projects/Feature/SigninFeature/Sources/SigninComponent.swift @@ -2,16 +2,19 @@ import SwiftUI import NeedleFoundation import SigninFeatureInterface import SignupFeatureInterface +import FindPasswordFeatureInterface public protocol SigninDependency: Dependency { var signupEmailFactory: any SignupEmailFactory { get } + var inputEmailFactory: any InputEmailFactory { get } } public final class SigninComponent: Component, SigninFactory { public func makeView() -> some View { SigninView( viewModel: .init(), - signupEmailFactory: dependency.signupEmailFactory + signupEmailFactory: dependency.signupEmailFactory, + inputEmailFactory: dependency.inputEmailFactory ) } } diff --git a/Projects/Feature/SigninFeature/Sources/SigninView.swift b/Projects/Feature/SigninFeature/Sources/SigninView.swift index ad9b48f..0bee470 100644 --- a/Projects/Feature/SigninFeature/Sources/SigninView.swift +++ b/Projects/Feature/SigninFeature/Sources/SigninView.swift @@ -3,6 +3,7 @@ import SwiftUI import BaseFeature import ViewUtil import SignupFeatureInterface +import FindPasswordFeatureInterface struct SigninView: View { private enum FocusField { @@ -13,13 +14,16 @@ struct SigninView: View { @StateObject var viewModel: SigninViewModel private let signupEmailFactory: any SignupEmailFactory + private let inputEmailFactory: any InputEmailFactory init( viewModel: SigninViewModel, - signupEmailFactory: any SignupEmailFactory + signupEmailFactory: any SignupEmailFactory, + inputEmailFactory: any InputEmailFactory ) { _viewModel = StateObject(wrappedValue: viewModel) self.signupEmailFactory = signupEmailFactory + self.inputEmailFactory = inputEmailFactory } var body: some View { @@ -63,13 +67,24 @@ struct SigninView: View { Color.Grays.gray700 .frame(width: 1, height: 16) - Text("비밀번호 찾기") - .kgFont(.label, weight: .regular, color: .Grays.gray700) + Button(action: viewModel.findPasswordButtonDidTap) { + Text("비밀번호 찾기") + .kgFont(.label, weight: .regular, color: .Grays.gray700) + } } } Spacer() } - .navigate(to: signupEmailFactory.makeView().eraseToAnyView(), when: $viewModel.isNavigatedToSignup) + .hideKeyboardWhenTap() + .navigate( + to: signupEmailFactory.makeView().eraseToAnyView(), + when: $viewModel.isNavigatedToSignup + ) + .navigate( + to: inputEmailFactory.makeView().eraseToAnyView() + .environment(\.rootPresentationMode, $viewModel.isNavigatedToFindPassword), + when: $viewModel.isNavigatedToFindPassword + ) } } diff --git a/Projects/Feature/SigninFeature/Sources/SigninViewModel.swift b/Projects/Feature/SigninFeature/Sources/SigninViewModel.swift index ca3ec76..4e89503 100644 --- a/Projects/Feature/SigninFeature/Sources/SigninViewModel.swift +++ b/Projects/Feature/SigninFeature/Sources/SigninViewModel.swift @@ -6,6 +6,7 @@ final class SigninViewModel: BaseViewModel { @Published var password: String = "" @Published var isNavigatedToSignup: Bool = false + @Published var isNavigatedToFindPassword: Bool = false func signinButtonDidTap() { print("Signin") @@ -14,4 +15,8 @@ final class SigninViewModel: BaseViewModel { func signupButtonDidTap() { self.isNavigatedToSignup = true } + + func findPasswordButtonDidTap() { + self.isNavigatedToFindPassword = true + } } diff --git a/Projects/Feature/SignupFeature/Interface/SignupAuthCodeVerifyFactory.swift b/Projects/Feature/SignupFeature/Interface/SignupVerifyAuthCodeFactory.swift similarity index 100% rename from Projects/Feature/SignupFeature/Interface/SignupAuthCodeVerifyFactory.swift rename to Projects/Feature/SignupFeature/Interface/SignupVerifyAuthCodeFactory.swift From 42f064c3c4fb2f8bdf792e4dde29cd2871c54d9c Mon Sep 17 00:00:00 2001 From: HongSJae Date: Fri, 26 Apr 2024 19:57:59 +0900 Subject: [PATCH 16/16] =?UTF-8?q?=E2=9C=A8=20::=20onSuccess=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Shared/ViewUtil/Sources/View+onSuccess.swift | 9 ++++++--- .../DesignSystem/Sources/TextField/KGTextField.swift | 3 +++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Projects/Shared/ViewUtil/Sources/View+onSuccess.swift b/Projects/Shared/ViewUtil/Sources/View+onSuccess.swift index b882839..75f369f 100644 --- a/Projects/Shared/ViewUtil/Sources/View+onSuccess.swift +++ b/Projects/Shared/ViewUtil/Sources/View+onSuccess.swift @@ -1,8 +1,11 @@ import SwiftUI public extension View { - func onSuccess(of value: Bool, _ action: () -> Void) -> some View { - if value { action() } - return self + func onSuccess(of value: Bool, _ action: @escaping () -> Void) -> some View { + self.onChange(of: value) { changedValue in + if changedValue { + action() + } + } } } diff --git a/Projects/UserInterface/DesignSystem/Sources/TextField/KGTextField.swift b/Projects/UserInterface/DesignSystem/Sources/TextField/KGTextField.swift index cea365c..9e19534 100644 --- a/Projects/UserInterface/DesignSystem/Sources/TextField/KGTextField.swift +++ b/Projects/UserInterface/DesignSystem/Sources/TextField/KGTextField.swift @@ -69,6 +69,9 @@ public struct KGTextField: View { lineWidth: 1 ) } + .onTapGesture { + self.isFocused = true + } if !description.isEmpty || isErrorAndNotEmpty { Text(isErrorAndNotEmpty ? errorMessage : description)