diff --git a/project/Plugins/DependencyPlugin/ProjectDescriptionHelpers/RootFeatureDependency.swift b/project/Plugins/DependencyPlugin/ProjectDescriptionHelpers/RootFeatureDependency.swift new file mode 100644 index 00000000..06d29213 --- /dev/null +++ b/project/Plugins/DependencyPlugin/ProjectDescriptionHelpers/RootFeatureDependency.swift @@ -0,0 +1,13 @@ +// +// RootFeatureDependency.swift +// DependencyPlugin +// +// Created by 최준영 on 6/21/24. +// + +import ProjectDescription + +public extension ModuleDependency.Presentation { + + static let RootFeature: TargetDependency = .project(target: "RootFeature", path: .relativeToRoot("Projects/Presentation/Feature/Root")) +} diff --git a/project/Projects/App/Project.swift b/project/Projects/App/Project.swift index 8e906011..2dcf867d 100644 --- a/project/Projects/App/Project.swift +++ b/project/Projects/App/Project.swift @@ -30,6 +30,7 @@ let project = Project( // Presentation D.Presentation.PresentationCore, + D.Presentation.RootFeature, D.Presentation.AuthFeature, // Domain diff --git a/project/Projects/App/Sources/RootCoordinator/Main/Worker/CenterMainCoordinator.swift b/project/Projects/App/Sources/RootCoordinator/Main/Worker/CenterMainCoordinator.swift new file mode 100644 index 00000000..b160eddb --- /dev/null +++ b/project/Projects/App/Sources/RootCoordinator/Main/Worker/CenterMainCoordinator.swift @@ -0,0 +1,93 @@ +// +// CenterMainCoordinator.swift +// Idle-iOS +// +// Created by choijunios on 7/25/24. +// + +import UIKit +import DSKit +import PresentationCore +import RootFeature + +class CenterMainCoordinator: ParentCoordinator { + var childCoordinators: [Coordinator] = [] + + var parent: ParentCoordinator? + + var navigationController: UINavigationController + let injector: Injector + + init(dependency: Dependency) { + self.navigationController = dependency.navigationController + self.injector = dependency.injector + } + + func start() { + + let tabInfo = CenterMainScreen.allCases.map { tab in + + TabBarInfo( + viewController: createNavForTab(tab: tab), + tabBarItem: .init( + name: tab.name + ) + ) + } + + let tabController = IdleTabBar() + tabController.setViewControllers(info: tabInfo) + tabController.selectedIndex = 0 + + navigationController.pushViewController(tabController, animated: false) + } + + // #1. Tab별 네비게이션 컨트롤러 생성 + func createNavForTab(tab: CenterMainScreen) -> UINavigationController { + + let tabNavController = UINavigationController() + tabNavController.setNavigationBarHidden(false, animated: false) + + startTabCoordinator( + tab: tab, + navigationController: tabNavController + ) + + return tabNavController + } + // #2. 생성한 컨트롤러를 각 탭별 Coordinator에 전달 + func startTabCoordinator(tab: CenterMainScreen, navigationController: UINavigationController) { + + var coordinator: ChildCoordinator! + + switch tab { + case .recruitmentManage: + coordinator = RecruitmentManagementCoordinator( + navigationController: navigationController + ) + case .setting: + coordinator = SettingCoordinator( + navigationController: navigationController + ) + } + addChildCoordinator(coordinator) + + // 코디네이터들을 실행 + coordinator.start() + } +} + +// MARK: Center 탭의 구성요소들 +enum CenterMainScreen: Int, CaseIterable { + case recruitmentManage = 0 + case setting = 1 + + var name: String { + switch self { + case .recruitmentManage: + "채용" + case .setting: + "설정" + } + } +} diff --git a/project/Projects/App/Sources/RootCoordinator/Main/Worker/WorkerMainCoordinator.swift b/project/Projects/App/Sources/RootCoordinator/Main/Worker/WorkerMainCoordinator.swift new file mode 100644 index 00000000..a6233de5 --- /dev/null +++ b/project/Projects/App/Sources/RootCoordinator/Main/Worker/WorkerMainCoordinator.swift @@ -0,0 +1,100 @@ +// +// WorkerMainCoordinator.swift +// Idle-iOS +// +// Created by choijunios on 7/25/24. +// + +import UIKit +import DSKit +import PresentationCore +import RootFeature + +class WorkerMainCoordinator: ParentCoordinator { + var childCoordinators: [Coordinator] = [] + + var parent: ParentCoordinator? + + var navigationController: UINavigationController + let injector: Injector + + init(dependency: Dependency) { + self.navigationController = dependency.navigationController + self.injector = dependency.injector + } + + func start() { + + let tabInfo = WorkerMainScreen.allCases.map { tab in + + TabBarInfo( + viewController: createNavForTab(tab: tab), + tabBarItem: .init( + name: tab.name + ) + ) + } + + let tabController = IdleTabBar() + tabController.setViewControllers(info: tabInfo) + tabController.selectedIndex = 0 + + navigationController.pushViewController(tabController, animated: false) + } + + // #1. Tab별 네비게이션 컨트롤러 생성 + func createNavForTab(tab: WorkerMainScreen) -> UINavigationController { + + let tabNavController = UINavigationController() + tabNavController.setNavigationBarHidden(false, animated: false) + + startTabCoordinator( + tab: tab, + navigationController: tabNavController + ) + + return tabNavController + } + // #2. 생성한 컨트롤러를 각 탭별 Coordinator에 전달 + func startTabCoordinator(tab: WorkerMainScreen, navigationController: UINavigationController) { + + var coordinator: ChildCoordinator! + + switch tab { + case .recruitmentBoard: + coordinator = RecruitmentBoardCoordinator( + navigationController: navigationController + ) + case .applyManagement: + coordinator = ApplyManagementCoordinator( + navigationController: navigationController + ) + case .setting: + coordinator = SettingCoordinator( + navigationController: navigationController + ) + } + addChildCoordinator(coordinator) + + // 코디네이터들을 실행 + coordinator.start() + } +} + +// MARK: Worker 탭의 구성요소들 +enum WorkerMainScreen: Int, CaseIterable { + case recruitmentBoard = 0 + case applyManagement = 1 + case setting = 2 + + var name: String { + switch self { + case .recruitmentBoard: + "채용" + case .applyManagement: + "공고관리" + case .setting: + "설정" + } + } +} diff --git a/project/Projects/App/Sources/RootCoordinator/RootCoordinator+Extension.swift b/project/Projects/App/Sources/RootCoordinator/RootCoordinator+Extension.swift index 4bc73ad3..5d6204bf 100644 --- a/project/Projects/App/Sources/RootCoordinator/RootCoordinator+Extension.swift +++ b/project/Projects/App/Sources/RootCoordinator/RootCoordinator+Extension.swift @@ -21,4 +21,36 @@ extension RootCoordinator { authCoordinator.start() } + + /// 요양보호사 메인화면을 실행합니다. + func workerMain() { + + let coordinator = WorkerMainCoordinator( + dependency: .init( + navigationController: navigationController, + injector: injector + ) + ) + coordinator.parent = self + + addChildCoordinator(coordinator) + + coordinator.start() + } + + /// 센터 메인화면을 시작합니다. + func centerMain() { + + let coordinator = CenterMainCoordinator( + dependency: .init( + navigationController: navigationController, + injector: injector + ) + ) + coordinator.parent = self + + addChildCoordinator(coordinator) + + coordinator.start() + } } diff --git a/project/Projects/App/Sources/RootCoordinator/RootCoordinator.swift b/project/Projects/App/Sources/RootCoordinator/RootCoordinator.swift index 47ada1ed..c4fe48ff 100644 --- a/project/Projects/App/Sources/RootCoordinator/RootCoordinator.swift +++ b/project/Projects/App/Sources/RootCoordinator/RootCoordinator.swift @@ -26,17 +26,9 @@ class RootCoordinator: ParentCoordinator { } func start() { + navigationController.setNavigationBarHidden(true, animated: false) - navigationController.navigationBar.isHidden = true - - let coordinator = TestMainTabBarCoodinator( - navigationController: navigationController - ) - - coordinator.parent = self - addChildCoordinator(coordinator) - - coordinator.start() + centerMain() } func popViewController() { diff --git a/project/Projects/App/Sources/RootCoordinator/TestMain/TestMainTabBarCoodinator.swift b/project/Projects/App/Sources/RootCoordinator/TestMain/TestMainTabBarCoodinator.swift deleted file mode 100644 index 9436e3e4..00000000 --- a/project/Projects/App/Sources/RootCoordinator/TestMain/TestMainTabBarCoodinator.swift +++ /dev/null @@ -1,94 +0,0 @@ -// -// TestVC.swift -// Idle-iOS -// -// Created by choijunios on 6/30/24. -// - -import UIKit -import DSKit -import PresentationCore - -// MARK: Test MainTabBar -class TestMainTabBarCoodinator: ChildCoordinator { - - var navigationController: UINavigationController - - var parent: RootCoordinator? - - weak var viewControllerRef: UIViewController? - - init(navigationController: UINavigationController) { - self.navigationController = navigationController - } - - func start() { - - let viewController = TestMainTabBarController() - viewController.coordinator = self - - self.viewControllerRef = viewController - - navigationController.pushViewController(viewController, animated: false) - } - - func popViewController() { - - navigationController.popViewController(animated: true) - } - - func coordinatorDidFinish() { - - parent?.removeChildCoordinator(self) - } - - func startAuth() { - - parent?.auth() - } -} - -public class TestMainTabBarController: DisposableViewController { - - var coordinator: TestMainTabBarCoodinator? - - lazy var startLoginButton = ButtonPrototype(text: "로그인 시작") { [weak self] in - self?.coordinator?.startAuth() - } - - public func cleanUp() { - - coordinator?.coordinatorDidFinish() - } - - public override func viewDidLoad() { - - let titleLabel = UILabel() - - titleLabel.text = "테스트용 메인 탭바 화면입니다." - - view.backgroundColor = .white - - [ - titleLabel, - startLoginButton - ].forEach { - $0.translatesAutoresizingMaskIntoConstraints = false - view.addSubview($0) - } - - view.layoutMargins = .init(top: 0, left: 20, bottom: 0, right: 20) - - view.addSubview(titleLabel) - titleLabel.translatesAutoresizingMaskIntoConstraints = false - - NSLayoutConstraint.activate([ - titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), - titleLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor), - - startLoginButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor), - startLoginButton.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor), - startLoginButton.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor) - ]) - } -} diff --git a/project/Projects/Presentation/DSKit/ExampleApp/Sources/SceneDelegate.swift b/project/Projects/Presentation/DSKit/ExampleApp/Sources/SceneDelegate.swift index f72103cb..9bdeb8f8 100644 --- a/project/Projects/Presentation/DSKit/ExampleApp/Sources/SceneDelegate.swift +++ b/project/Projects/Presentation/DSKit/ExampleApp/Sources/SceneDelegate.swift @@ -6,6 +6,7 @@ // import UIKit +import DSKit class SceneDelegate: UIResponder, UIWindowSceneDelegate { @@ -16,7 +17,38 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { guard let windowScene = scene as? UIWindowScene else { return } window = UIWindow(windowScene: windowScene) - let vc = AlertViewController() + let vc = IdleTabBar() + vc.setViewControllers(info: [ + TabBarInfo( + viewController: UINavigationController(rootViewController: { + let vc = UIViewController() + vc.view.backgroundColor = .blue + return vc + }()), + tabBarItem: .init(name: "홈") + ), + + TabBarInfo( + viewController: UINavigationController(rootViewController: { + let vc = UIViewController() + vc.view.backgroundColor = .yellow + return vc + }()), + tabBarItem: .init(name: "프로필") + ), + + TabBarInfo( + viewController: UINavigationController(rootViewController: { + let vc = UIViewController() + vc.view.backgroundColor = .red + return vc + }()), + tabBarItem: .init(name: "설정") + ), + ]) + + vc.selectedIndex = 0 + window?.rootViewController = vc window?.makeKeyAndVisible() } diff --git a/project/Projects/Presentation/DSKit/Sources/CommonUI/TabBar/IdleTabBar.swift b/project/Projects/Presentation/DSKit/Sources/CommonUI/TabBar/IdleTabBar.swift new file mode 100644 index 00000000..e5b756d3 --- /dev/null +++ b/project/Projects/Presentation/DSKit/Sources/CommonUI/TabBar/IdleTabBar.swift @@ -0,0 +1,161 @@ +// +// IdleTabBar.swift +// PresentationCore +// +// Created by choijunios on 7/25/24. +// + +import UIKit +import RxSwift +import RxCocoa + +public class IdleTabBar: UIViewController { + + // 탭바구성 + public private(set) var viewControllers: [UIViewController] = [] + private var tabBarItems: [IdleTabBarItem] = [] + + // 탭바 아이템 + private var tabBarItemViews: [IdleTabBarItemViewable] = [] + + private var currentIndex: Int = -1 + + public var selectedIndex: Int { + get { + currentIndex + } + set { + moveTo(index: newValue) + currentIndex = newValue + } + } + + private let disposeBag = DisposeBag() + + public init() { + + super.init(nibName: nil, bundle: nil) + + setAppearance() + } + + public required init?(coder: NSCoder) { fatalError() } + + /// 생성시 한번만 호출해야 합니다. + public func setViewControllers(info: [TabBarInfo]) { + + viewControllers = [] + tabBarItems = [] + + info.forEach { + viewControllers.append($0.viewController) + tabBarItems.append($0.tabBarItem) + } + + // 뷰컨트롤러들 추가 + viewControllers + .forEach { + self.addChild($0) + $0.didMove(toParent: self) + } + + setTabBarItems() + } + + private func setTabBarItems() { + + tabBarItemViews = tabBarItems.map { item in + TextButtonType1(labelText: item.name) + } + + let tabBarItemStack = HStack( + tabBarItemViews, + alignment: .fill, + distribution: .fillEqually + ) + + view.addSubview(tabBarItemStack) + tabBarItemStack.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + tabBarItemStack.topAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor), + tabBarItemStack.leadingAnchor.constraint(equalTo: view.leadingAnchor), + tabBarItemStack.trailingAnchor.constraint(equalTo: view.trailingAnchor), + tabBarItemStack.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) + ]) + + setTabBarItemObservable() + } + + private func setTabBarItemObservable() { + + let observers = tabBarItemViews.enumerated().map { (index, element) in + element.eventPublisher.map { _ in index } + } + + Observable + .merge(observers) + .asDriver(onErrorJustReturn: 0) + .drive(onNext: { [weak self] index in + self?.selectedIndex = index + }) + .disposed(by: disposeBag) + } + + private func moveTo(index: Int) { + + if currentIndex == index { return } + + if currentIndex != -1 { + let prevVC = viewControllers[currentIndex] + prevVC.view.removeFromSuperview() + } + + let currentVC = viewControllers[index] + view.addSubview(currentVC.view) + currentVC.view.translatesAutoresizingMaskIntoConstraints = false + + let currentView = currentVC.view! + + NSLayoutConstraint.activate([ + currentView.topAnchor.constraint(equalTo: view.topAnchor), + currentView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + currentView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + currentView.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor) + ]) + } + + // MARK: ViewController 세팅 + private func setAppearance() { + + view.backgroundColor = .white + view.layoutMargins = .init(top: 0, left: 0, bottom: 56, right: 0) + } +} + +// 임시적 세팅 +extension TextButtonType1: IdleTabBarItemViewable { } + +// 임시적 세팅 +public protocol IdleTabBarItemViewable: UIView { + var eventPublisher: Observable { get } +} + + +public struct IdleTabBarItem { + let name: String + + public init(name: String) { + self.name = name + } +} + +public struct TabBarInfo { + let viewController: UIViewController + let tabBarItem: IdleTabBarItem + + public init(viewController: UIViewController, tabBarItem: IdleTabBarItem) { + self.viewController = viewController + self.tabBarItem = tabBarItem + } +} diff --git a/project/Projects/Presentation/Feature/Root/ExampleApp/Resources/LaunchScreen.storyboard b/project/Projects/Presentation/Feature/Root/ExampleApp/Resources/LaunchScreen.storyboard new file mode 100644 index 00000000..a2157a3e --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/ExampleApp/Resources/LaunchScreen.storyboard @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/project/Projects/Presentation/Feature/Root/ExampleApp/Sources/AppDelegate.swift b/project/Projects/Presentation/Feature/Root/ExampleApp/Sources/AppDelegate.swift new file mode 100644 index 00000000..00267bb5 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/ExampleApp/Sources/AppDelegate.swift @@ -0,0 +1,36 @@ +// +// AppDelegate.swift +// +// +// Created by 최준영 on 6/19/24. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/project/Projects/Presentation/Feature/Root/ExampleApp/Sources/SceneDelegate.swift b/project/Projects/Presentation/Feature/Root/ExampleApp/Sources/SceneDelegate.swift new file mode 100644 index 00000000..015452b5 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/ExampleApp/Sources/SceneDelegate.swift @@ -0,0 +1,23 @@ +// +// SceneDelegate.swift +// +// +// Created by 최준영 on 6/19/24. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + + guard let windowScene = scene as? UIWindowScene else { return } + + + window = UIWindow(windowScene: windowScene) + window?.rootViewController = ViewController() + window?.makeKeyAndVisible() + } +} diff --git a/project/Projects/Presentation/Feature/Root/ExampleApp/Sources/ViewController.swift b/project/Projects/Presentation/Feature/Root/ExampleApp/Sources/ViewController.swift new file mode 100644 index 00000000..e439d432 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/ExampleApp/Sources/ViewController.swift @@ -0,0 +1,29 @@ +// +// ViewController.swift +// +// +// Created by 최준영 on 6/19/24. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + + let initialLabel = UILabel() + + initialLabel.text = "Example app" + + view.backgroundColor = .white + + view.addSubview(initialLabel) + initialLabel.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + initialLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), + initialLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + } +} + diff --git a/project/Projects/Presentation/Feature/Root/Project.swift b/project/Projects/Presentation/Feature/Root/Project.swift new file mode 100644 index 00000000..500aa0f0 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Project.swift @@ -0,0 +1,86 @@ +// +// Project.swift +// ProjectDescriptionHelpers +// +// Created by choijunios on 2024/07/25 +// + +import ProjectDescription +import ProjectDescriptionHelpers +import ConfigurationPlugin +import DependencyPlugin + +let project = Project( + name: "Root", + settings: .settings( + configurations: IdleConfiguration.emptyConfigurations + ), + targets: [ + + /// FeatureConcrete + .target( + name: "RootFeature", + destinations: DeploymentSettings.platform, + product: .staticFramework, + bundleId: "$(PRODUCT_BUNDLE_IDENTIFIER)", + deploymentTargets: DeploymentSettings.deployment_version, + sources: ["Sources/**"], + resources: ["Resources/**"], + dependencies: [ + // Presentation + D.Presentation.PresentationCore, + D.Presentation.DSKit, + + // Domain + D.Domain.UseCaseInterface, + D.Domain.RepositoryInterface, + + // ThirdParty + D.ThirdParty.RxSwift, + D.ThirdParty.RxCocoa, + + // Presentation + D.Presentation.AuthFeature, + D.Presentation.WorkerFeature, + D.Presentation.CenterFeature, + ], + settings: .settings( + configurations: IdleConfiguration.presentationConfigurations + ) + ), + + /// FeatureConcrete ExampleApp + .target( + name: "Root_ExampleApp", + destinations: DeploymentSettings.platform, + product: .app, + bundleId: "$(PRODUCT_BUNDLE_IDENTIFIER)", + deploymentTargets: DeploymentSettings.deployment_version, + infoPlist: IdleInfoPlist.exampleAppDefault, + sources: ["ExampleApp/Sources/**"], + resources: ["ExampleApp/Resources/**"], + dependencies: [ + .target(name: "RootFeature"), + ], + settings: .settings( + configurations: IdleConfiguration.presentationConfigurations + ) + ), + ], + schemes: [ + Scheme.makeSchemes( + .target("RootFeature"), + configNames: [ + IdleConfiguration.debugConfigName, + IdleConfiguration.releaseConfigName + ] + ), + Scheme.makeSchemes( + .target("Root_ExampleApp"), + configNames: [ + IdleConfiguration.debugConfigName, + IdleConfiguration.releaseConfigName + ] + ) + ].flatMap { $0 } +) diff --git a/project/Projects/Presentation/Feature/Root/Resources/Empty.md b/project/Projects/Presentation/Feature/Root/Resources/Empty.md new file mode 100644 index 00000000..64e53d46 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Resources/Empty.md @@ -0,0 +1,2 @@ +# <#Title#> + diff --git a/project/Projects/Presentation/Feature/Root/Sources/Screen/Center/Coordinator/RecruitmentManagementCoordinator.swift b/project/Projects/Presentation/Feature/Root/Sources/Screen/Center/Coordinator/RecruitmentManagementCoordinator.swift new file mode 100644 index 00000000..4d4db893 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Sources/Screen/Center/Coordinator/RecruitmentManagementCoordinator.swift @@ -0,0 +1,30 @@ +// +// RecruitmentManagementCoordinator.swift +// RootFeature +// +// Created by choijunios on 7/25/24. +// + +import UIKit +import PresentationCore + +public class RecruitmentManagementCoordinator: ChildCoordinator { + + public weak var viewControllerRef: UIViewController? + + public var navigationController: UINavigationController + + public init(navigationController: UINavigationController) { + self.navigationController = navigationController + } + + public func start() { + let vc = RecuitmentManagementVC() + + navigationController.pushViewController(vc, animated: false) + } + + public func coordinatorDidFinish() { + + } +} diff --git a/project/Projects/Presentation/Feature/Root/Sources/Screen/Center/View/RecuitmentManagementVC.swift b/project/Projects/Presentation/Feature/Root/Sources/Screen/Center/View/RecuitmentManagementVC.swift new file mode 100644 index 00000000..f9dcd214 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Sources/Screen/Center/View/RecuitmentManagementVC.swift @@ -0,0 +1,34 @@ +// +// RecuitmentManagementVC.swift +// RootFeature +// +// Created by choijunios on 7/25/24. +// + +import UIKit + +public class RecuitmentManagementVC: UIViewController { + + public init() { + super.init(nibName: nil, bundle: nil) + + setAppearacne() + } + + public required init?(coder: NSCoder) { fatalError() } + + private func setAppearacne() { + view.backgroundColor = .white + + let label = UILabel() + label.text = "공고 관리" + + label.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(label) + + NSLayoutConstraint.activate([ + label.centerXAnchor.constraint(equalTo: view.centerXAnchor), + label.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + } +} diff --git a/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/Coordinator/ApplyManagementCoordinator.swift b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/Coordinator/ApplyManagementCoordinator.swift new file mode 100644 index 00000000..de8d7645 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/Coordinator/ApplyManagementCoordinator.swift @@ -0,0 +1,30 @@ +// +// ApplyManagementCoordinator.swift +// RootFeature +// +// Created by choijunios on 7/25/24. +// + +import UIKit +import PresentationCore + +public class ApplyManagementCoordinator: ChildCoordinator { + + public weak var viewControllerRef: UIViewController? + + public var navigationController: UINavigationController + + public init(navigationController: UINavigationController) { + self.navigationController = navigationController + } + + public func start() { + let vc = ApplyManagementVC() + + navigationController.pushViewController(vc, animated: false) + } + + public func coordinatorDidFinish() { + + } +} diff --git a/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/Coordinator/RecruitmentBoardCoordinator.swift b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/Coordinator/RecruitmentBoardCoordinator.swift new file mode 100644 index 00000000..b16bee40 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/Coordinator/RecruitmentBoardCoordinator.swift @@ -0,0 +1,31 @@ +// +// RecruitmentBoardCoordinator.swift +// RootFeature +// +// Created by choijunios on 7/25/24. +// + +import UIKit +import PresentationCore + +public class RecruitmentBoardCoordinator: ChildCoordinator { + + public weak var viewControllerRef: UIViewController? + + public var navigationController: UINavigationController + + public init(navigationController: UINavigationController) { + self.navigationController = navigationController + } + + public func start() { + let vc = RecruitmentBoardVC() + + navigationController.pushViewController(vc, animated: false) + } + + public func coordinatorDidFinish() { + + } +} + diff --git a/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/Coordinator/SettingCoordinator.swift b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/Coordinator/SettingCoordinator.swift new file mode 100644 index 00000000..4a329db2 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/Coordinator/SettingCoordinator.swift @@ -0,0 +1,30 @@ +// +// SettingCoordinator.swift +// RootFeature +// +// Created by choijunios on 7/25/24. +// + +import UIKit +import PresentationCore + +public class SettingCoordinator: ChildCoordinator { + + public weak var viewControllerRef: UIViewController? + + public var navigationController: UINavigationController + + public init(navigationController: UINavigationController) { + self.navigationController = navigationController + } + + public func start() { + let vc = SettingVC() + + navigationController.pushViewController(vc, animated: false) + } + + public func coordinatorDidFinish() { + + } +} diff --git a/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/View/ RecruitmentBoardVC.swift b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/View/ RecruitmentBoardVC.swift new file mode 100644 index 00000000..7444898a --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/View/ RecruitmentBoardVC.swift @@ -0,0 +1,34 @@ +// +// RecruitmentBoardVC.swift +// RootFeature +// +// Created by choijunios on 7/25/24. +// + +import UIKit + +public class RecruitmentBoardVC: UIViewController { + + public init() { + super.init(nibName: nil, bundle: nil) + + setAppearacne() + } + + public required init?(coder: NSCoder) { fatalError() } + + private func setAppearacne() { + view.backgroundColor = .white + + let label = UILabel() + label.text = "채용공고 화면" + + label.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(label) + + NSLayoutConstraint.activate([ + label.centerXAnchor.constraint(equalTo: view.centerXAnchor), + label.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + } +} diff --git a/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/View/ApplyManagementVC.swift b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/View/ApplyManagementVC.swift new file mode 100644 index 00000000..240da75b --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/View/ApplyManagementVC.swift @@ -0,0 +1,34 @@ +// +// ApplyManagementVC.swift +// RootFeature +// +// Created by choijunios on 7/25/24. +// + +import UIKit + +public class ApplyManagementVC: UIViewController { + + public init() { + super.init(nibName: nil, bundle: nil) + + setAppearacne() + } + + public required init?(coder: NSCoder) { fatalError() } + + private func setAppearacne() { + view.backgroundColor = .white + + let label = UILabel() + label.text = "공고 관리 화면" + + label.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(label) + + NSLayoutConstraint.activate([ + label.centerXAnchor.constraint(equalTo: view.centerXAnchor), + label.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + } +} diff --git a/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/View/SettingVC.swift b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/View/SettingVC.swift new file mode 100644 index 00000000..46b88c49 --- /dev/null +++ b/project/Projects/Presentation/Feature/Root/Sources/Screen/Worker/View/SettingVC.swift @@ -0,0 +1,34 @@ +// +// SettingVC.swift +// RootFeature +// +// Created by choijunios on 7/25/24. +// + +import UIKit + +public class SettingVC: UIViewController { + + public init() { + super.init(nibName: nil, bundle: nil) + + setAppearacne() + } + + public required init?(coder: NSCoder) { fatalError() } + + private func setAppearacne() { + view.backgroundColor = .white + + let label = UILabel() + label.text = "세팅 화면" + + label.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(label) + + NSLayoutConstraint.activate([ + label.centerXAnchor.constraint(equalTo: view.centerXAnchor), + label.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + } +} diff --git a/project/graph.png b/project/graph.png index d45c8e88..acc71a64 100644 Binary files a/project/graph.png and b/project/graph.png differ