diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Target.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Target.swift index 6296e351..9fa63cae 100644 --- a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Target.swift +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Target.swift @@ -9,6 +9,62 @@ public extension TargetDependency { } public extension TargetDependency.Feature { + static let InputLanguageInfoFeatureInterface = TargetDependency.project( + target: ModulePaths.Feature.InputLanguageInfoFeature.targetName(type: .interface), + path: .relativeToFeature(ModulePaths.Feature.InputLanguageInfoFeature.rawValue) + ) + static let InputLanguageInfoFeature = TargetDependency.project( + target: ModulePaths.Feature.InputLanguageInfoFeature.targetName(type: .sources), + path: .relativeToFeature(ModulePaths.Feature.InputLanguageInfoFeature.rawValue) + ) + static let InputCertificateInfoFeatureInterface = TargetDependency.project( + target: ModulePaths.Feature.InputCertificateInfoFeature.targetName(type: .interface), + path: .relativeToFeature(ModulePaths.Feature.InputCertificateInfoFeature.rawValue) + ) + static let InputCertificateInfoFeature = TargetDependency.project( + target: ModulePaths.Feature.InputCertificateInfoFeature.targetName(type: .sources), + path: .relativeToFeature(ModulePaths.Feature.InputCertificateInfoFeature.rawValue) + ) + static let InputMilitaryInfoFeatureInterface = TargetDependency.project( + target: ModulePaths.Feature.InputMilitaryInfoFeature.targetName(type: .interface), + path: .relativeToFeature(ModulePaths.Feature.InputMilitaryInfoFeature.rawValue) + ) + static let InputMilitaryInfoFeature = TargetDependency.project( + target: ModulePaths.Feature.InputMilitaryInfoFeature.targetName(type: .sources), + path: .relativeToFeature(ModulePaths.Feature.InputMilitaryInfoFeature.rawValue) + ) + static let InputWorkInfoFeatureInterface = TargetDependency.project( + target: ModulePaths.Feature.InputWorkInfoFeature.targetName(type: .interface), + path: .relativeToFeature(ModulePaths.Feature.InputWorkInfoFeature.rawValue) + ) + static let InputWorkInfoFeature = TargetDependency.project( + target: ModulePaths.Feature.InputWorkInfoFeature.targetName(type: .sources), + path: .relativeToFeature(ModulePaths.Feature.InputWorkInfoFeature.rawValue) + ) + static let InputSchoolLifeInfoFeatureInterface = TargetDependency.project( + target: ModulePaths.Feature.InputSchoolLifeInfoFeature.targetName(type: .interface), + path: .relativeToFeature(ModulePaths.Feature.InputSchoolLifeInfoFeature.rawValue) + ) + static let InputSchoolLifeInfoFeature = TargetDependency.project( + target: ModulePaths.Feature.InputSchoolLifeInfoFeature.targetName(type: .sources), + path: .relativeToFeature(ModulePaths.Feature.InputSchoolLifeInfoFeature.rawValue) + ) + static let InputProfileInfoFeatureInterface = TargetDependency.project( + target: ModulePaths.Feature.InputProfileInfoFeature.targetName(type: .interface), + path: .relativeToFeature(ModulePaths.Feature.InputProfileInfoFeature.rawValue) + ) + static let InputProfileInfoFeature = TargetDependency.project( + target: ModulePaths.Feature.InputProfileInfoFeature.targetName(type: .sources), + path: .relativeToFeature(ModulePaths.Feature.InputProfileInfoFeature.rawValue) + ) + static let InputInformationFeatureInterface = TargetDependency.project( + target: ModulePaths.Feature.InputInformationFeature.targetName(type: .interface), + path: .relativeToFeature(ModulePaths.Feature.InputInformationFeature.rawValue) + ) + static let InputInformationFeature = TargetDependency.project( + target: ModulePaths.Feature.InputInformationFeature.targetName(type: .sources), + path: .relativeToFeature(ModulePaths.Feature.InputInformationFeature.rawValue) + ) static let SigninFeatureInterface = TargetDependency.project( target: ModulePaths.Feature.SigninFeature.targetName(type: .interface), path: .relativeToFeature(ModulePaths.Feature.SigninFeature.rawValue) diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift index e434cd48..645929f9 100644 --- a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift +++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift @@ -10,6 +10,13 @@ public enum ModulePaths { public extension ModulePaths { enum Feature: String { + case InputLanguageInfoFeature + case InputCertificateInfoFeature + case InputMilitaryInfoFeature + case InputWorkInfoFeature + case InputSchoolLifeInfoFeature + case InputProfileInfoFeature + case InputInformationFeature case SigninFeature case BaseFeature diff --git a/Projects/Core/DesignSystem/Sources/Extension/View+smsBackButton.swift b/Projects/Core/DesignSystem/Sources/Extension/View+smsBackButton.swift index 70bd57e7..7e7c0dcd 100644 --- a/Projects/Core/DesignSystem/Sources/Extension/View+smsBackButton.swift +++ b/Projects/Core/DesignSystem/Sources/Extension/View+smsBackButton.swift @@ -1,4 +1,6 @@ +import Combine import SwiftUI +import UIKit struct SMSBackButtonModifier: ViewModifier { let dismiss: DismissAction diff --git a/Projects/Feature/InputCertificateInfoFeature/Interface/InputCertificateInfoBuildable.swift b/Projects/Feature/InputCertificateInfoFeature/Interface/InputCertificateInfoBuildable.swift new file mode 100644 index 00000000..21c00684 --- /dev/null +++ b/Projects/Feature/InputCertificateInfoFeature/Interface/InputCertificateInfoBuildable.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol InputCertificateInfoBuildable { + associatedtype ViewType: View + func makeView() -> ViewType +} diff --git a/Projects/Feature/InputCertificateInfoFeature/Project.swift b/Projects/Feature/InputCertificateInfoFeature/Project.swift new file mode 100644 index 00000000..50306a56 --- /dev/null +++ b/Projects/Feature/InputCertificateInfoFeature/Project.swift @@ -0,0 +1,12 @@ +import ProjectDescription +import ProjectDescriptionHelpers +import DependencyPlugin + +let project = Project.makeModule( + name: ModulePaths.Feature.InputCertificateInfoFeature.rawValue, + product: .staticLibrary, + targets: [.interface, .unitTest], + internalDependencies: [ + .Feature.BaseFeature + ] +) diff --git a/Projects/Feature/InputCertificateInfoFeature/Sources/DI/InputCertificateInfoComponent.swift b/Projects/Feature/InputCertificateInfoFeature/Sources/DI/InputCertificateInfoComponent.swift new file mode 100644 index 00000000..10e79c4e --- /dev/null +++ b/Projects/Feature/InputCertificateInfoFeature/Sources/DI/InputCertificateInfoComponent.swift @@ -0,0 +1,15 @@ +import BaseFeature +import InputCertificateInfoFeatureInterface +import NeedleFoundation +import SwiftUI + +public protocol InputCertificateInfoDependency: Dependency {} + +public final class InputCertificateInfoComponent: + Component, + InputCertificateInfoBuildable { + + public func makeView() -> some View { + EmptyView() + } +} diff --git a/Projects/Feature/InputCertificateInfoFeature/Sources/Intent/InputCertificateInfoIntent.swift b/Projects/Feature/InputCertificateInfoFeature/Sources/Intent/InputCertificateInfoIntent.swift new file mode 100644 index 00000000..d44f671d --- /dev/null +++ b/Projects/Feature/InputCertificateInfoFeature/Sources/Intent/InputCertificateInfoIntent.swift @@ -0,0 +1,3 @@ +import Foundation + +final class InputCertificateInfoIntent: InputCetrificateInfoIntentProtocol {} diff --git a/Projects/Feature/InputCertificateInfoFeature/Sources/Intent/InputCertificateInfoIntentProtocol.swift b/Projects/Feature/InputCertificateInfoFeature/Sources/Intent/InputCertificateInfoIntentProtocol.swift new file mode 100644 index 00000000..b87ae3e9 --- /dev/null +++ b/Projects/Feature/InputCertificateInfoFeature/Sources/Intent/InputCertificateInfoIntentProtocol.swift @@ -0,0 +1,3 @@ +import Foundation + +protocol InputCertificateInfoIntentProtocol {} diff --git a/Projects/Feature/InputCertificateInfoFeature/Sources/Model/InputCertificateInfoModel.swift b/Projects/Feature/InputCertificateInfoFeature/Sources/Model/InputCertificateInfoModel.swift new file mode 100644 index 00000000..54056764 --- /dev/null +++ b/Projects/Feature/InputCertificateInfoFeature/Sources/Model/InputCertificateInfoModel.swift @@ -0,0 +1,5 @@ +import Foundation + +final class InputCertificateInfoModel: ObservableObject, InputCertificateInfoStateProtocol {} + +extension InputCertificateInfoModel: InputCertificateInfoActionProtocol {} diff --git a/Projects/Feature/InputCertificateInfoFeature/Sources/Model/InputCertificateInfoModelProtocol.swift b/Projects/Feature/InputCertificateInfoFeature/Sources/Model/InputCertificateInfoModelProtocol.swift new file mode 100644 index 00000000..b793c58c --- /dev/null +++ b/Projects/Feature/InputCertificateInfoFeature/Sources/Model/InputCertificateInfoModelProtocol.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol InputCertificateInfoStateProtocol {} + +protocol InputCertificateInfoActionProtocol: AnyObject {} diff --git a/Projects/Feature/InputCertificateInfoFeature/Sources/Scene/InputCertificateInfoView.swift b/Projects/Feature/InputCertificateInfoFeature/Sources/Scene/InputCertificateInfoView.swift new file mode 100644 index 00000000..c9b5fa1f --- /dev/null +++ b/Projects/Feature/InputCertificateInfoFeature/Sources/Scene/InputCertificateInfoView.swift @@ -0,0 +1,12 @@ +import BaseFeature +import SwiftUI + +struct InputCertificateInfoView: View { + @StateObject var container: MVIContainer + var intent: any InputCertificateInfoIntentProtocol { container.intent } + var state: any InputCertificateInfoStateProtocol { container.model } + + var body: some View { + Text("Hello, World!") + } +} diff --git a/Projects/Feature/InputCertificateInfoFeature/Tests/InputCertificateInfoFeatureTest.swift b/Projects/Feature/InputCertificateInfoFeature/Tests/InputCertificateInfoFeatureTest.swift new file mode 100644 index 00000000..2db15bf7 --- /dev/null +++ b/Projects/Feature/InputCertificateInfoFeature/Tests/InputCertificateInfoFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class InputCertificateInfoFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Feature/InputInformationFeature/Interface/InputInformationBuildable.swift b/Projects/Feature/InputInformationFeature/Interface/InputInformationBuildable.swift new file mode 100644 index 00000000..e1a5d75a --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Interface/InputInformationBuildable.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol InputInformationBuildable { + associatedtype ViewType: View + func makeView() -> ViewType +} diff --git a/Projects/Feature/InputInformationFeature/Project.swift b/Projects/Feature/InputInformationFeature/Project.swift new file mode 100644 index 00000000..66a0b446 --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Project.swift @@ -0,0 +1,18 @@ +import ProjectDescription +import ProjectDescriptionHelpers +import DependencyPlugin + +let project = Project.makeModule( + name: ModulePaths.Feature.InputInformationFeature.rawValue, + product: .staticLibrary, + targets: [.interface, .unitTest], + internalDependencies: [ + .Feature.BaseFeature, + .Feature.InputProfileInfoFeatureInterface, + .Feature.InputSchoolLifeInfoFeatureInterface, + .Feature.InputWorkInfoFeatureInterface, + .Feature.InputMilitaryInfoFeatureInterface, + .Feature.InputCertificateInfoFeatureInterface, + .Feature.InputLanguageInfoFeatureInterface + ] +) diff --git a/Projects/Feature/InputInformationFeature/Sources/DI/InputInformationComponent.swift b/Projects/Feature/InputInformationFeature/Sources/DI/InputInformationComponent.swift new file mode 100644 index 00000000..1bfeae34 --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Sources/DI/InputInformationComponent.swift @@ -0,0 +1,22 @@ +import BaseFeature +import InputInformationFeatureInterface +import NeedleFoundation +import SwiftUI + +public protocol InputInformationDependency: Dependency {} + +public final class InputInformationComponent: + Component, + InputInformationBuildable { + + public func makeView() -> some View { + let model = InputInformationModel() + let intent = InputInformationIntent(model: model) + let container = MVIContainer( + intent: intent as InputInformationIntentProtocol, + model: model as InputInformationStateProtocol, + modelChangePublisher: model.objectWillChange + ) + return InputInformationView(container: container) + } +} diff --git a/Projects/Feature/InputInformationFeature/Sources/Intent/InputInformationIntent.swift b/Projects/Feature/InputInformationFeature/Sources/Intent/InputInformationIntent.swift new file mode 100644 index 00000000..484a5f6e --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Sources/Intent/InputInformationIntent.swift @@ -0,0 +1,9 @@ +import Foundation + +final class InputInformationIntent: InputInformationIntentProtocol { + private weak var model: (any InputInformationActionProtocol)? + + init(model: any InputInformationActionProtocol) { + self.model = model + } +} diff --git a/Projects/Feature/InputInformationFeature/Sources/Intent/InputInformationIntentProtocol.swift b/Projects/Feature/InputInformationFeature/Sources/Intent/InputInformationIntentProtocol.swift new file mode 100644 index 00000000..4440742f --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Sources/Intent/InputInformationIntentProtocol.swift @@ -0,0 +1,3 @@ +import Foundation + +protocol InputInformationIntentProtocol {} diff --git a/Projects/Feature/InputInformationFeature/Sources/Model/InputInformationModel.swift b/Projects/Feature/InputInformationFeature/Sources/Model/InputInformationModel.swift new file mode 100644 index 00000000..80c890c2 --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Sources/Model/InputInformationModel.swift @@ -0,0 +1,21 @@ +import Foundation + +final class InputInformationModel: ObservableObject, InputInformationStateProtocol { + @Published var phase: InformationPhase = .profile +} + +extension InputInformationModel: InputInformationActionProtocol { + func prevButtonDidTap() { + guard let currentIndex = InformationPhase.allCases.firstIndex(of: phase), + currentIndex > 1 + else { return } + phase = InformationPhase.allCases[currentIndex - 1] + } + + func nextButtonDidTap() { + guard let currentIndex = InformationPhase.allCases.firstIndex(of: phase), + currentIndex < InformationPhase.allCases.count - 1 + else { return } + phase = InformationPhase.allCases[currentIndex + 1] + } +} diff --git a/Projects/Feature/InputInformationFeature/Sources/Model/InputInformationModelProtocol.swift b/Projects/Feature/InputInformationFeature/Sources/Model/InputInformationModelProtocol.swift new file mode 100644 index 00000000..9d3e94b4 --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Sources/Model/InputInformationModelProtocol.swift @@ -0,0 +1,19 @@ +import Foundation + +enum InformationPhase: CaseIterable { + case profile + case school + case workCondition + case military + case certification + case language +} + +protocol InputInformationStateProtocol { + var phase: InformationPhase { get } +} + +protocol InputInformationActionProtocol: AnyObject { + func prevButtonDidTap() + func nextButtonDidTap() +} diff --git a/Projects/Feature/InputInformationFeature/Sources/Scene/InputInformationView.swift b/Projects/Feature/InputInformationFeature/Sources/Scene/InputInformationView.swift new file mode 100644 index 00000000..aaaebb03 --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Sources/Scene/InputInformationView.swift @@ -0,0 +1,20 @@ +import BaseFeature +import SwiftUI + +struct InputInformationView: View { + @StateObject var container: MVIContainer + var intent: any InputInformationIntentProtocol { container.intent } + var state: any InputInformationStateProtocol { container.model } + + var body: some View { + InputInformationPageWrapView( + selection: Binding( + get: { state.phase }, + set: { _ in } + ) + ) { + Text("a") + .tag(InformationPhase.profile) + } + } +} diff --git a/Projects/Feature/InputInformationFeature/Sources/Scene/View/InputInformationPageWrapView.swift b/Projects/Feature/InputInformationFeature/Sources/Scene/View/InputInformationPageWrapView.swift new file mode 100644 index 00000000..c7851c83 --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Sources/Scene/View/InputInformationPageWrapView.swift @@ -0,0 +1,23 @@ +import SwiftUI + +struct InputInformationPageWrapView: View { + @Binding var selection: Selection + var content: Content + + init( + selection: Binding, + @ViewBuilder content: () -> Content + ) { + _selection = selection + self.content = content() + } + + var body: some View { + ZStack(alignment: .topTrailing) { + TabView(selection: $selection) { + content + } + .tabViewStyle(.page(indexDisplayMode: .never)) + } + } +} diff --git a/Projects/Feature/InputInformationFeature/Tests/InputInformationFeatureTest.swift b/Projects/Feature/InputInformationFeature/Tests/InputInformationFeatureTest.swift new file mode 100644 index 00000000..14104674 --- /dev/null +++ b/Projects/Feature/InputInformationFeature/Tests/InputInformationFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class InputInformationFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Feature/InputLanguageInfoFeature/Interface/InputLanguageInfoBuildable.swift b/Projects/Feature/InputLanguageInfoFeature/Interface/InputLanguageInfoBuildable.swift new file mode 100644 index 00000000..3984fcc3 --- /dev/null +++ b/Projects/Feature/InputLanguageInfoFeature/Interface/InputLanguageInfoBuildable.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol InputLanguageInfoBuildable { + associatedtype ViewType: View + func makeView() -> ViewType +} diff --git a/Projects/Feature/InputLanguageInfoFeature/Project.swift b/Projects/Feature/InputLanguageInfoFeature/Project.swift new file mode 100644 index 00000000..7f1f977f --- /dev/null +++ b/Projects/Feature/InputLanguageInfoFeature/Project.swift @@ -0,0 +1,12 @@ +import ProjectDescription +import ProjectDescriptionHelpers +import DependencyPlugin + +let project = Project.makeModule( + name: ModulePaths.Feature.InputLanguageInfoFeature.rawValue, + product: .staticLibrary, + targets: [.interface, .unitTest], + internalDependencies: [ + .Feature.BaseFeature + ] +) diff --git a/Projects/Feature/InputLanguageInfoFeature/Sources/DI/InputLanguageInfoComponent.swift b/Projects/Feature/InputLanguageInfoFeature/Sources/DI/InputLanguageInfoComponent.swift new file mode 100644 index 00000000..34edb2d7 --- /dev/null +++ b/Projects/Feature/InputLanguageInfoFeature/Sources/DI/InputLanguageInfoComponent.swift @@ -0,0 +1,15 @@ +import BaseFeature +import InputLanguageInfoFeatureInterface +import NeedleFoundation +import SwiftUI + +public protocol InputLanguageInfoDependency: Dependency {} + +public final class InputLanguageInfoComponent: + Component, + InputLanguageInfoBuildable { + + public func makeView() -> some View { + EmptyView() + } +} diff --git a/Projects/Feature/InputLanguageInfoFeature/Sources/Intent/InputLanguageInfoIntent.swift b/Projects/Feature/InputLanguageInfoFeature/Sources/Intent/InputLanguageInfoIntent.swift new file mode 100644 index 00000000..b2e14c88 --- /dev/null +++ b/Projects/Feature/InputLanguageInfoFeature/Sources/Intent/InputLanguageInfoIntent.swift @@ -0,0 +1,3 @@ +import Foundation + +final class InputLanguageInfoIntent: InputLanguageInfoIntentProtocol {} diff --git a/Projects/Feature/InputLanguageInfoFeature/Sources/Intent/InputLanguageInfoIntentProtocol.swift b/Projects/Feature/InputLanguageInfoFeature/Sources/Intent/InputLanguageInfoIntentProtocol.swift new file mode 100644 index 00000000..4104fe25 --- /dev/null +++ b/Projects/Feature/InputLanguageInfoFeature/Sources/Intent/InputLanguageInfoIntentProtocol.swift @@ -0,0 +1,3 @@ +import Foundation + +protocol InputLanguageInfoIntentProtocol {} diff --git a/Projects/Feature/InputLanguageInfoFeature/Sources/Model/InputLanguageInfoModel.swift b/Projects/Feature/InputLanguageInfoFeature/Sources/Model/InputLanguageInfoModel.swift new file mode 100644 index 00000000..ee965e86 --- /dev/null +++ b/Projects/Feature/InputLanguageInfoFeature/Sources/Model/InputLanguageInfoModel.swift @@ -0,0 +1,5 @@ +import Foundation + +final class InputLanguageInfoModel: ObservableObject, InputLanguageInfoStateProtocol {} + +extension InputLanguageInfoModel: InputLanguageInfoActionProtocol {} diff --git a/Projects/Feature/InputLanguageInfoFeature/Sources/Model/InputLanguageInfoModelProtocol.swift b/Projects/Feature/InputLanguageInfoFeature/Sources/Model/InputLanguageInfoModelProtocol.swift new file mode 100644 index 00000000..87591af3 --- /dev/null +++ b/Projects/Feature/InputLanguageInfoFeature/Sources/Model/InputLanguageInfoModelProtocol.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol InputLanguageInfoStateProtocol {} + +protocol InputLanguageInfoActionProtocol: AnyObject {} diff --git a/Projects/Feature/InputLanguageInfoFeature/Sources/Scene/InputLanguageInfoView.swift b/Projects/Feature/InputLanguageInfoFeature/Sources/Scene/InputLanguageInfoView.swift new file mode 100644 index 00000000..fd4492ec --- /dev/null +++ b/Projects/Feature/InputLanguageInfoFeature/Sources/Scene/InputLanguageInfoView.swift @@ -0,0 +1,12 @@ +import BaseFeature +import SwiftUI + +struct InputLanguageInfoView: View { + @StateObject var container: MVIContainer + var intent: any InputLanguageInfoIntentProtocol { container.intent } + var state: any InputLanguageInfoStateProtocol { container.model } + + var body: some View { + Text("Hello, World!") + } +} diff --git a/Projects/Feature/InputLanguageInfoFeature/Tests/InputLanguageInfoFeatureTest.swift b/Projects/Feature/InputLanguageInfoFeature/Tests/InputLanguageInfoFeatureTest.swift new file mode 100644 index 00000000..c3d73661 --- /dev/null +++ b/Projects/Feature/InputLanguageInfoFeature/Tests/InputLanguageInfoFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class InputLanguageInfoFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Feature/InputMilitaryInfoFeature/Interface/InputMilitaryInfoBuildable.swift b/Projects/Feature/InputMilitaryInfoFeature/Interface/InputMilitaryInfoBuildable.swift new file mode 100644 index 00000000..3bbddc73 --- /dev/null +++ b/Projects/Feature/InputMilitaryInfoFeature/Interface/InputMilitaryInfoBuildable.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol InputMilitaryInfoBuildable { + associatedtype ViewType: View + func makeView() -> ViewType +} diff --git a/Projects/Feature/InputMilitaryInfoFeature/Project.swift b/Projects/Feature/InputMilitaryInfoFeature/Project.swift new file mode 100644 index 00000000..6de85add --- /dev/null +++ b/Projects/Feature/InputMilitaryInfoFeature/Project.swift @@ -0,0 +1,10 @@ +import ProjectDescription +import ProjectDescriptionHelpers +import DependencyPlugin + +let project = Project.makeModule( + name: ModulePaths.Feature.InputMilitaryInfoFeature.rawValue, + product: .staticLibrary, + targets: [.interface, .unitTest], + internalDependencies: [] +) diff --git a/Projects/Feature/InputMilitaryInfoFeature/Sources/DI/InputMilitaryInfoComponent.swift b/Projects/Feature/InputMilitaryInfoFeature/Sources/DI/InputMilitaryInfoComponent.swift new file mode 100644 index 00000000..f37d9c91 --- /dev/null +++ b/Projects/Feature/InputMilitaryInfoFeature/Sources/DI/InputMilitaryInfoComponent.swift @@ -0,0 +1,15 @@ +import BaseFeature +import InputMilitaryInfoFeatureInterface +import NeedleFoundation +import SwiftUI + +public protocol InputMilitaryInfoDependency: Dependency {} + +public final class InputProfileInfoComponent: + Component, + InputMilitaryInfoBuildable { + + public func makeView() -> some View { + EmptyView() + } +} diff --git a/Projects/Feature/InputMilitaryInfoFeature/Sources/Intent/InputMilitaryInfoIntent.swift b/Projects/Feature/InputMilitaryInfoFeature/Sources/Intent/InputMilitaryInfoIntent.swift new file mode 100644 index 00000000..dfb17e70 --- /dev/null +++ b/Projects/Feature/InputMilitaryInfoFeature/Sources/Intent/InputMilitaryInfoIntent.swift @@ -0,0 +1,3 @@ +import Foundation + +final class InputMilitaryInfoIntent: InputMilitaryInfoIntentProtocol {} diff --git a/Projects/Feature/InputMilitaryInfoFeature/Sources/Intent/InputMilitaryInfoIntentProtocol.swift b/Projects/Feature/InputMilitaryInfoFeature/Sources/Intent/InputMilitaryInfoIntentProtocol.swift new file mode 100644 index 00000000..d82e15a1 --- /dev/null +++ b/Projects/Feature/InputMilitaryInfoFeature/Sources/Intent/InputMilitaryInfoIntentProtocol.swift @@ -0,0 +1,3 @@ +import Foundation + +protocol InputMilitaryInfoIntentProtocol {} diff --git a/Projects/Feature/InputMilitaryInfoFeature/Sources/Model/InputMilitaryInfoModel.swift b/Projects/Feature/InputMilitaryInfoFeature/Sources/Model/InputMilitaryInfoModel.swift new file mode 100644 index 00000000..d7b59009 --- /dev/null +++ b/Projects/Feature/InputMilitaryInfoFeature/Sources/Model/InputMilitaryInfoModel.swift @@ -0,0 +1,5 @@ +import Foundation + +final class InputMilitaryInfoModel: ObservableObject, InputMilitaryInfoStateProtocol {} + +extension InputMilitaryInfoModel: InputMilitaryInfoActionProtocol {} diff --git a/Projects/Feature/InputMilitaryInfoFeature/Sources/Model/InputMilitaryInfoModelProtocol.swift b/Projects/Feature/InputMilitaryInfoFeature/Sources/Model/InputMilitaryInfoModelProtocol.swift new file mode 100644 index 00000000..b9b69ab0 --- /dev/null +++ b/Projects/Feature/InputMilitaryInfoFeature/Sources/Model/InputMilitaryInfoModelProtocol.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol InputMilitaryInfoStateProtocol {} + +protocol InputMilitaryInfoActionProtocol: AnyObject {} diff --git a/Projects/Feature/InputMilitaryInfoFeature/Sources/Scene/InputMilitaryInfoView.swift b/Projects/Feature/InputMilitaryInfoFeature/Sources/Scene/InputMilitaryInfoView.swift new file mode 100644 index 00000000..87caff52 --- /dev/null +++ b/Projects/Feature/InputMilitaryInfoFeature/Sources/Scene/InputMilitaryInfoView.swift @@ -0,0 +1,12 @@ +import BaseFeature +import SwiftUI + +struct InputMilitaryInfoView: View { + @StateObject var container: MVIContainer + var intent: any InputMilitaryInfoIntentProtocol { container.intent } + var state: any InputMilitaryInfoStateProtocol { container.model } + + var body: some View { + Text("Hello, World!") + } +} diff --git a/Projects/Feature/InputMilitaryInfoFeature/Tests/InputMilitaryInfoFeatureTest.swift b/Projects/Feature/InputMilitaryInfoFeature/Tests/InputMilitaryInfoFeatureTest.swift new file mode 100644 index 00000000..8a0d56c2 --- /dev/null +++ b/Projects/Feature/InputMilitaryInfoFeature/Tests/InputMilitaryInfoFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class InputMilitaryInfoFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Feature/InputProfileInfoFeature/Interface/InputProfileInfoBuildable.swift b/Projects/Feature/InputProfileInfoFeature/Interface/InputProfileInfoBuildable.swift new file mode 100644 index 00000000..bf3c0fbe --- /dev/null +++ b/Projects/Feature/InputProfileInfoFeature/Interface/InputProfileInfoBuildable.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol InputProfileInfoBuildable { + associatedtype ViewType: View + func makeView() -> ViewType +} diff --git a/Projects/Feature/InputProfileInfoFeature/Project.swift b/Projects/Feature/InputProfileInfoFeature/Project.swift new file mode 100644 index 00000000..cdecafd1 --- /dev/null +++ b/Projects/Feature/InputProfileInfoFeature/Project.swift @@ -0,0 +1,12 @@ +import ProjectDescription +import ProjectDescriptionHelpers +import DependencyPlugin + +let project = Project.makeModule( + name: ModulePaths.Feature.InputProfileInfoFeature.rawValue, + product: .staticLibrary, + targets: [.interface, .unitTest], + internalDependencies: [ + .Feature.BaseFeature + ] +) diff --git a/Projects/Feature/InputProfileInfoFeature/Sources/DI/InputProfileInfoComponent.swift b/Projects/Feature/InputProfileInfoFeature/Sources/DI/InputProfileInfoComponent.swift new file mode 100644 index 00000000..debbdfbc --- /dev/null +++ b/Projects/Feature/InputProfileInfoFeature/Sources/DI/InputProfileInfoComponent.swift @@ -0,0 +1,22 @@ +import BaseFeature +import InputProfileInfoFeatureInterface +import NeedleFoundation +import SwiftUI + +public protocol InputProfileInfoDependency: Dependency {} + +public final class InputProfileInfoComponent: + Component, + InputProfileInfoBuildable { + + public func makeView() -> some View { + let model = InputProfileInfoModel() + let intent = InputProfileInfoIntent() + let container = MVIContainer( + intent: intent as InputProfileInfoIntentProtocol, + model: model as InputProfileInfoStateProtocol, + modelChangePublisher: model.objectWillChange + ) + return InputProfileInfoView(container: container) + } +} diff --git a/Projects/Feature/InputProfileInfoFeature/Sources/Intent/InputProfileInfoIntent.swift b/Projects/Feature/InputProfileInfoFeature/Sources/Intent/InputProfileInfoIntent.swift new file mode 100644 index 00000000..82493092 --- /dev/null +++ b/Projects/Feature/InputProfileInfoFeature/Sources/Intent/InputProfileInfoIntent.swift @@ -0,0 +1,3 @@ +import Foundation + +final class InputProfileInfoIntent: InputProfileInfoIntentProtocol {} diff --git a/Projects/Feature/InputProfileInfoFeature/Sources/Intent/InputProfileInfoIntentProtocol.swift b/Projects/Feature/InputProfileInfoFeature/Sources/Intent/InputProfileInfoIntentProtocol.swift new file mode 100644 index 00000000..caa25b2e --- /dev/null +++ b/Projects/Feature/InputProfileInfoFeature/Sources/Intent/InputProfileInfoIntentProtocol.swift @@ -0,0 +1,3 @@ +import Foundation + +protocol InputProfileInfoIntentProtocol {} diff --git a/Projects/Feature/InputProfileInfoFeature/Sources/Model/InputProfileInfoModel.swift b/Projects/Feature/InputProfileInfoFeature/Sources/Model/InputProfileInfoModel.swift new file mode 100644 index 00000000..233e5278 --- /dev/null +++ b/Projects/Feature/InputProfileInfoFeature/Sources/Model/InputProfileInfoModel.swift @@ -0,0 +1,5 @@ +import Foundation + +final class InputProfileInfoModel: ObservableObject, InputProfileInfoStateProtocol {} + +extension InputProfileInfoModel: InputProfileInfoActionProtocol {} diff --git a/Projects/Feature/InputProfileInfoFeature/Sources/Model/InputProfileInfoModelProtocol.swift b/Projects/Feature/InputProfileInfoFeature/Sources/Model/InputProfileInfoModelProtocol.swift new file mode 100644 index 00000000..2cc7a2f4 --- /dev/null +++ b/Projects/Feature/InputProfileInfoFeature/Sources/Model/InputProfileInfoModelProtocol.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol InputProfileInfoStateProtocol {} + +protocol InputProfileInfoActionProtocol: AnyObject {} diff --git a/Projects/Feature/InputProfileInfoFeature/Sources/Scene/InputProfileInfoView.swift b/Projects/Feature/InputProfileInfoFeature/Sources/Scene/InputProfileInfoView.swift new file mode 100644 index 00000000..557347fe --- /dev/null +++ b/Projects/Feature/InputProfileInfoFeature/Sources/Scene/InputProfileInfoView.swift @@ -0,0 +1,12 @@ +import BaseFeature +import SwiftUI + +struct InputProfileInfoView: View { + @StateObject var container: MVIContainer + var intent: any InputProfileInfoIntentProtocol { container.intent } + var state: any InputProfileInfoStateProtocol { container.model } + + var body: some View { + Text("Hello, World!") + } +} diff --git a/Projects/Feature/InputProfileInfoFeature/Tests/InputProfileInfoFeatureTest.swift b/Projects/Feature/InputProfileInfoFeature/Tests/InputProfileInfoFeatureTest.swift new file mode 100644 index 00000000..6fc0140e --- /dev/null +++ b/Projects/Feature/InputProfileInfoFeature/Tests/InputProfileInfoFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class InputProfileInfoFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Feature/InputSchoolLifeInfoFeature/Interface/InputSchoolLifeInfoBuildable.swift b/Projects/Feature/InputSchoolLifeInfoFeature/Interface/InputSchoolLifeInfoBuildable.swift new file mode 100644 index 00000000..490c8351 --- /dev/null +++ b/Projects/Feature/InputSchoolLifeInfoFeature/Interface/InputSchoolLifeInfoBuildable.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol InputSchoolListInfoBuildable { + associatedtype ViewType: View + func makeView() -> ViewType +} diff --git a/Projects/Feature/InputSchoolLifeInfoFeature/Project.swift b/Projects/Feature/InputSchoolLifeInfoFeature/Project.swift new file mode 100644 index 00000000..5519b3f8 --- /dev/null +++ b/Projects/Feature/InputSchoolLifeInfoFeature/Project.swift @@ -0,0 +1,12 @@ +import ProjectDescription +import ProjectDescriptionHelpers +import DependencyPlugin + +let project = Project.makeModule( + name: ModulePaths.Feature.InputSchoolLifeInfoFeature.rawValue, + product: .staticLibrary, + targets: [.interface, .unitTest], + internalDependencies: [ + .Feature.BaseFeature + ] +) diff --git a/Projects/Feature/InputSchoolLifeInfoFeature/Sources/DI/InputSchoolLifeInfoComponent.swift b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/DI/InputSchoolLifeInfoComponent.swift new file mode 100644 index 00000000..f5e2db5b --- /dev/null +++ b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/DI/InputSchoolLifeInfoComponent.swift @@ -0,0 +1,22 @@ +import BaseFeature +import InputSchoolLifeInfoFeatureInterface +import NeedleFoundation +import SwiftUI + +public protocol InputSchoolLifeInfoDependency: Dependency {} + +public final class InputSchoolLifeInfoComponent: + Component, + InputSchoolListInfoBuildable { + + public func makeView() -> some View { + let model = InputSchoolLifeInfoModel() + let intent = InputSchoolLifeInfoIntent() + let container = MVIContainer( + intent: intent as InputSchoolLifeInfoIntentProtocol, + model: model as InputSchoolLifeInfoStateProtocol, + modelChangePublisher: model.objectWillChange + ) + return InputSchoolLifeInfoView(container: container) + } +} diff --git a/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Intent/InputSchoolLifeInfoIntent.swift b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Intent/InputSchoolLifeInfoIntent.swift new file mode 100644 index 00000000..03d2e626 --- /dev/null +++ b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Intent/InputSchoolLifeInfoIntent.swift @@ -0,0 +1,3 @@ +import Foundation + +final class InputSchoolLifeInfoIntent: InputSchoolLifeInfoIntentProtocol {} diff --git a/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Intent/InputSchoolLifeInfoIntentProtocol.swift b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Intent/InputSchoolLifeInfoIntentProtocol.swift new file mode 100644 index 00000000..69de33fa --- /dev/null +++ b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Intent/InputSchoolLifeInfoIntentProtocol.swift @@ -0,0 +1,3 @@ +import Foundation + +protocol InputSchoolLifeInfoIntentProtocol {} diff --git a/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Model/InputSchoolLifeInfoModel.swift b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Model/InputSchoolLifeInfoModel.swift new file mode 100644 index 00000000..fd9b77e4 --- /dev/null +++ b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Model/InputSchoolLifeInfoModel.swift @@ -0,0 +1,5 @@ +import Foundation + +final class InputSchoolLifeInfoModel: ObservableObject, InputSchoolLifeInfoStateProtocol {} + +extension InputSchoolLifeInfoModel: InputSchoolLifeInfoActionProtocol {} diff --git a/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Model/InputSchoolLifeInfoModelProtocol.swift b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Model/InputSchoolLifeInfoModelProtocol.swift new file mode 100644 index 00000000..c2c6760a --- /dev/null +++ b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Model/InputSchoolLifeInfoModelProtocol.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol InputSchoolLifeInfoStateProtocol {} + +protocol InputSchoolLifeInfoActionProtocol {} diff --git a/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Scene/InputSchoolLifeInfoView.swift b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Scene/InputSchoolLifeInfoView.swift new file mode 100644 index 00000000..ae4eadb0 --- /dev/null +++ b/Projects/Feature/InputSchoolLifeInfoFeature/Sources/Scene/InputSchoolLifeInfoView.swift @@ -0,0 +1,12 @@ +import BaseFeature +import SwiftUI + +struct InputSchoolLifeInfoView: View { + @StateObject var container: MVIContainer + var intent: any InputSchoolLifeInfoIntentProtocol { container.intent } + var state: any InputSchoolLifeInfoStateProtocol { container.model } + + var body: some View { + Text("Hello, World!") + } +} diff --git a/Projects/Feature/InputSchoolLifeInfoFeature/Tests/InputSchoolLifeInfoFeatureTest.swift b/Projects/Feature/InputSchoolLifeInfoFeature/Tests/InputSchoolLifeInfoFeatureTest.swift new file mode 100644 index 00000000..8c0095a7 --- /dev/null +++ b/Projects/Feature/InputSchoolLifeInfoFeature/Tests/InputSchoolLifeInfoFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class InputSchoolLifeInfoFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +} diff --git a/Projects/Feature/InputWorkInfoFeature/Interface/InputWorkInfoBuildable.swift b/Projects/Feature/InputWorkInfoFeature/Interface/InputWorkInfoBuildable.swift new file mode 100644 index 00000000..3522f16c --- /dev/null +++ b/Projects/Feature/InputWorkInfoFeature/Interface/InputWorkInfoBuildable.swift @@ -0,0 +1,6 @@ +import SwiftUI + +public protocol InputWorkInfoBuildable { + associatedtype ViewType: View + func makeView() -> ViewType +} diff --git a/Projects/Feature/InputWorkInfoFeature/Project.swift b/Projects/Feature/InputWorkInfoFeature/Project.swift new file mode 100644 index 00000000..cb752c15 --- /dev/null +++ b/Projects/Feature/InputWorkInfoFeature/Project.swift @@ -0,0 +1,12 @@ +import ProjectDescription +import ProjectDescriptionHelpers +import DependencyPlugin + +let project = Project.makeModule( + name: ModulePaths.Feature.InputWorkInfoFeature.rawValue, + product: .staticLibrary, + targets: [.interface, .unitTest], + internalDependencies: [ + .Feature.BaseFeature + ] +) diff --git a/Projects/Feature/InputWorkInfoFeature/Sources/DI/InputWorkInfoComponent.swift b/Projects/Feature/InputWorkInfoFeature/Sources/DI/InputWorkInfoComponent.swift new file mode 100644 index 00000000..b3f6741e --- /dev/null +++ b/Projects/Feature/InputWorkInfoFeature/Sources/DI/InputWorkInfoComponent.swift @@ -0,0 +1,15 @@ +import BaseFeature +import InputWorkInfoFeatureInterface +import NeedleFoundation +import SwiftUI + +public protocol InputWorkInfoDependency: Dependency {} + +public final class InputWorkInfoComponent: + Component, + InputWorkInfoBuildable { + + public func makeView() -> some View { + EmptyView() + } +} diff --git a/Projects/Feature/InputWorkInfoFeature/Sources/Intent/InputWorkInfoIntent.swift b/Projects/Feature/InputWorkInfoFeature/Sources/Intent/InputWorkInfoIntent.swift new file mode 100644 index 00000000..b95e266d --- /dev/null +++ b/Projects/Feature/InputWorkInfoFeature/Sources/Intent/InputWorkInfoIntent.swift @@ -0,0 +1,3 @@ +import Foundation + +final class InputWorkInfoIntent: InputWorkInfoIntentProtocol {} diff --git a/Projects/Feature/InputWorkInfoFeature/Sources/Intent/InputWorkInfoIntentProtocol.swift b/Projects/Feature/InputWorkInfoFeature/Sources/Intent/InputWorkInfoIntentProtocol.swift new file mode 100644 index 00000000..dd90ebcd --- /dev/null +++ b/Projects/Feature/InputWorkInfoFeature/Sources/Intent/InputWorkInfoIntentProtocol.swift @@ -0,0 +1,3 @@ +import Foundation + +protocol InputWorkInfoIntentProtocol {} diff --git a/Projects/Feature/InputWorkInfoFeature/Sources/Model/InputWorkInfoModel.swift b/Projects/Feature/InputWorkInfoFeature/Sources/Model/InputWorkInfoModel.swift new file mode 100644 index 00000000..25c78aaa --- /dev/null +++ b/Projects/Feature/InputWorkInfoFeature/Sources/Model/InputWorkInfoModel.swift @@ -0,0 +1,5 @@ +import Foundation + +final class InputWorkInfoModel: ObservableObject, InputWorkInfoStateProtocol {} + +extension InputWorkInfoModel: InputWorkInfoActionProtocol {} diff --git a/Projects/Feature/InputWorkInfoFeature/Sources/Model/InputWorkInfoModelProtocol.swift b/Projects/Feature/InputWorkInfoFeature/Sources/Model/InputWorkInfoModelProtocol.swift new file mode 100644 index 00000000..faac0933 --- /dev/null +++ b/Projects/Feature/InputWorkInfoFeature/Sources/Model/InputWorkInfoModelProtocol.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol InputWorkInfoStateProtocol {} + +protocol InputWorkInfoActionProtocol {} diff --git a/Projects/Feature/InputWorkInfoFeature/Sources/Scene/InputWorkInfoView.swift b/Projects/Feature/InputWorkInfoFeature/Sources/Scene/InputWorkInfoView.swift new file mode 100644 index 00000000..91338f4a --- /dev/null +++ b/Projects/Feature/InputWorkInfoFeature/Sources/Scene/InputWorkInfoView.swift @@ -0,0 +1,12 @@ +import BaseFeature +import SwiftUI + +struct InputWorkInfoView: View { + @StateObject var container: MVIContainer + var intent: any InputWorkInfoIntentProtocol { container.intent } + var state: any InputWorkInfoStateProtocol { container.model } + + var body: some View { + Text("Hello, World!") + } +} diff --git a/Projects/Feature/InputWorkInfoFeature/Tests/InputWorkInfoFeatureTest.swift b/Projects/Feature/InputWorkInfoFeature/Tests/InputWorkInfoFeatureTest.swift new file mode 100644 index 00000000..a370f70e --- /dev/null +++ b/Projects/Feature/InputWorkInfoFeature/Tests/InputWorkInfoFeatureTest.swift @@ -0,0 +1,11 @@ +import XCTest + +final class InputWorkInfoFeatureTests: XCTestCase { + override func setUpWithError() throws {} + + override func tearDownWithError() throws {} + + func testExample() { + XCTAssertEqual(1, 1) + } +}