diff --git a/project/Projects/App/Sources/RootCoordinator/Main/Center /SubCoordinator/CenterProfileRegisterCoordinator.swift b/project/Projects/App/Sources/RootCoordinator/Main/Center /SubCoordinator/CenterProfileRegisterCoordinator.swift index d499aeab..1c499335 100644 --- a/project/Projects/App/Sources/RootCoordinator/Main/Center /SubCoordinator/CenterProfileRegisterCoordinator.swift +++ b/project/Projects/App/Sources/RootCoordinator/Main/Center /SubCoordinator/CenterProfileRegisterCoordinator.swift @@ -51,10 +51,25 @@ class CenterProfileRegisterCoordinator: CenterProfileRegisterCoordinatable { extension CenterProfileRegisterCoordinator { - func showCompleteScreen(cardVO: Entity.CenterProfileCardVO) { - let coordinator = ProfileRegisterCompleteCoordinator( - cardVO: cardVO, - navigationController: navigationController + func showCompleteScreen() { + let vc = CenterProfileRegisterCompleteVC(coordinator: self) + let coordinator = CoordinatorWrapper( + parent: self, + nav: navigationController, + vc: vc + ) + addChildCoordinator(coordinator) + coordinator.parent = self + coordinator.start() + } + + func showPreviewScreen(stateObject: CenterProfileRegisterState) { + let coordinator = CenterProfileRegisterOverviewCO( + dependency: .init( + navigationController: navigationController, + stateObject: stateObject, + profileUseCase: injector.resolve(CenterProfileUseCase.self) + ) ) addChildCoordinator(coordinator) coordinator.parent = self diff --git a/project/Projects/App/Sources/RootCoordinator/RootCoordinator+Extension.swift b/project/Projects/App/Sources/RootCoordinator/RootCoordinator+Extension.swift index e86a8b5a..0c1772a9 100644 --- a/project/Projects/App/Sources/RootCoordinator/RootCoordinator+Extension.swift +++ b/project/Projects/App/Sources/RootCoordinator/RootCoordinator+Extension.swift @@ -57,6 +57,7 @@ extension RootCoordinator: RootCoorinatable { addChildCoordinator(coordinator) coordinator.start() + } /// 요양보호사 메인화면을 실행합니다. func workerMain() { diff --git a/project/Projects/Domain/RepositoryInterface/Auth/AuthRepository.swift b/project/Projects/Domain/RepositoryInterface/Auth/AuthRepository.swift index 5191ee75..f3297653 100644 --- a/project/Projects/Domain/RepositoryInterface/Auth/AuthRepository.swift +++ b/project/Projects/Domain/RepositoryInterface/Auth/AuthRepository.swift @@ -24,5 +24,4 @@ public protocol AuthRepository: RepositoryBase { func requestWorkerLogin(phoneNumber: String, authNumber: String) -> Single func signoutWorkerAccount() -> Single func deregisterWorkerAccount(reasons: [DeregisterReasonVO]) -> Single - func getCenterJoinStatus() -> RxSwift.Single } diff --git a/project/Projects/Presentation/Feature/Center/ExampleApp/Sources/SceneDelegate.swift b/project/Projects/Presentation/Feature/Center/ExampleApp/Sources/SceneDelegate.swift index 6a8b298f..b9734af1 100644 --- a/project/Projects/Presentation/Feature/Center/ExampleApp/Sources/SceneDelegate.swift +++ b/project/Projects/Presentation/Feature/Center/ExampleApp/Sources/SceneDelegate.swift @@ -12,6 +12,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? + var coordinator: RegisterCenterInfoCoordinator! + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = scene as? UIWindowScene else { return } @@ -23,9 +25,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(windowScene: windowScene) - window?.rootViewController = AuthStateDisplayVC(state: .requestCenterInfo) + window?.rootViewController = navigationController window?.makeKeyAndVisible() - + coordinator.start() } } diff --git a/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/CenterProfileRegisterOverviewCO.swift b/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/CenterProfileRegisterOverviewCO.swift new file mode 100644 index 00000000..853f5241 --- /dev/null +++ b/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/CenterProfileRegisterOverviewCO.swift @@ -0,0 +1,65 @@ +// +// CenterProfileRegisterOverviewCO.swift +// CenterFeature +// +// Created by choijunios on 9/12/24. +// + +import UIKit +import Entity +import PresentationCore +import UseCaseInterface + +public class CenterProfileRegisterOverviewCO: ChildCoordinator { + + public struct Dependency { + let navigationController: UINavigationController + let stateObject: CenterProfileRegisterState + let profileUseCase: CenterProfileUseCase + + public init(navigationController: UINavigationController, stateObject: CenterProfileRegisterState, profileUseCase: CenterProfileUseCase) { + self.navigationController = navigationController + self.stateObject = stateObject + self.profileUseCase = profileUseCase + } + } + + public weak var viewControllerRef: UIViewController? + public weak var parent: CenterProfileRegisterCoordinatable? + + public let navigationController: UINavigationController + let stateObject: CenterProfileRegisterState + let profileUseCase: CenterProfileUseCase + + public init(dependency: Dependency) { + self.navigationController = dependency.navigationController + self.stateObject = dependency.stateObject + self.profileUseCase = dependency.profileUseCase + } + + deinit { + printIfDebug("\(String(describing: RegisterRecruitmentCoordinator.self))") + } + + public func start() { + let vc = CenterProfileRegisterOverviewVC() + let vm = RegisterProfileOverviewVM( + coordinator: self, + stateObject: stateObject, + profileUseCase: profileUseCase + ) + vc.bind(viewModel: vm) + + viewControllerRef = vc + navigationController.pushViewController(vc, animated: true) + } + + public func coordinatorDidFinish() { + parent?.removeChildCoordinator(self) + popViewController() + } + + func showCompleteScreen() { + parent?.showCompleteScreen() + } +} diff --git a/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/ProfileRegisterCompleteCoordinator.swift b/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/ProfileRegisterCompleteCoordinator.swift deleted file mode 100644 index 6fa76389..00000000 --- a/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/ProfileRegisterCompleteCoordinator.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// ProfileRegisterCompleteCoordinator.swift -// CenterFeature -// -// Created by choijunios on 7/27/24. -// - -import UIKit -import Entity -import PresentationCore -import UseCaseInterface - -public class ProfileRegisterCompleteCoordinator: ChildCoordinator { - - public weak var viewControllerRef: UIViewController? - public weak var parent: CenterProfileRegisterCoordinatable? - - public let navigationController: UINavigationController - private let viewModel: ProfileRegisterCompleteViewModelable - - public init( - cardVO: CenterProfileCardVO, - navigationController: UINavigationController - ) { - self.viewModel = ProfileRegisterCompleteVM(centerCardVO: cardVO) - self.navigationController = navigationController - } - - deinit { - printIfDebug("\(String(describing: RegisterCenterInfoCoordinator.self))") - } - - public func start() { - let vc = ProfileRegisterCompleteVC(coordinator: self) - vc.bind(viewModel: viewModel) - viewControllerRef = vc - navigationController.pushViewController(vc, animated: true) - } - - public func coordinatorDidFinish() { - parent?.removeChildCoordinator(self) - } -} - -extension ProfileRegisterCompleteCoordinator { - - func showCenterProfile() { - parent?.showMyCenterProfile() - } - - func registerFinished() { - parent?.registerFinished() - } -} diff --git a/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/RegisterCenterInfoCoordinator.swift b/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/RegisterCenterInfoCoordinator.swift index cbbd3a24..d39ccf37 100644 --- a/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/RegisterCenterInfoCoordinator.swift +++ b/project/Projects/Presentation/Feature/Center/Sources/Coordinator/RegisterCenterInfo/RegisterCenterInfoCoordinator.swift @@ -16,14 +16,13 @@ public class RegisterCenterInfoCoordinator: ChildCoordinator { public weak var parent: CenterProfileRegisterCoordinatable? public let navigationController: UINavigationController - - public let viewModel: RegisterCenterInfoViewModelable + let profileUseCase: CenterProfileUseCase public init( profileUseCase: CenterProfileUseCase, navigationController: UINavigationController ) { - self.viewModel = RegisterCenterInfoVM(profileUseCase: profileUseCase) + self.profileUseCase = profileUseCase self.navigationController = navigationController } @@ -33,7 +32,8 @@ public class RegisterCenterInfoCoordinator: ChildCoordinator { public func start() { let vc = RegisterCenterInfoVC(coordinator: self) - vc.bind(viewModel: viewModel) + let vm = RegisterCenterInfoVM(coordinator: self) + vc.bind(viewModel: vm) viewControllerRef = vc @@ -47,8 +47,8 @@ public class RegisterCenterInfoCoordinator: ChildCoordinator { extension RegisterCenterInfoCoordinator { - func showCompleteScreen(cardVO: CenterProfileCardVO) { - parent?.showCompleteScreen(cardVO: cardVO) + func showPreviewScreen(stateObject: CenterProfileRegisterState) { + parent?.showPreviewScreen(stateObject: stateObject) } func registerFinished() { diff --git a/project/Projects/Presentation/Feature/Center/Sources/View/CenterAuth/CenterAuthVC.swift b/project/Projects/Presentation/Feature/Center/Sources/View/CenterAuth/CenterAuthVC.swift index 8c8f58f1..91214eca 100644 --- a/project/Projects/Presentation/Feature/Center/Sources/View/CenterAuth/CenterAuthVC.swift +++ b/project/Projects/Presentation/Feature/Center/Sources/View/CenterAuth/CenterAuthVC.swift @@ -200,3 +200,4 @@ class PageControllerDotView: HStack { } } } + diff --git a/project/Projects/Presentation/Feature/Center/Sources/View/CenterCertificate/CenterCertificateIntroductionVC.swift b/project/Projects/Presentation/Feature/Center/Sources/View/CenterCertificate/CenterCertificateIntroductionVC.swift index 12c56129..f69794db 100644 --- a/project/Projects/Presentation/Feature/Center/Sources/View/CenterCertificate/CenterCertificateIntroductionVC.swift +++ b/project/Projects/Presentation/Feature/Center/Sources/View/CenterCertificate/CenterCertificateIntroductionVC.swift @@ -220,47 +220,3 @@ extension CenterCertificateIntroductionVC: UIPageViewControllerDelegate, UIPageV dotView.activateView(index) } } - -class PageControllerDotView: HStack { - - let accentColor = DSColor.orange500.color - let normalColor = DSColor.gray100.color - - // Init - let pageCnt: Int - - // View - private var dotViews: [Int: UIView] = [:] - - init(pageCnt: Int) { - self.pageCnt = pageCnt - super.init([], spacing: 12) - setLayout() - } - required init(coder: NSCoder) { fatalError() } - - func setLayout() { - - let viewList = (0.. { get } -} - -public class ProfileRegisterCompleteVM: ProfileRegisterCompleteViewModelable { - - public var centerCardVO: Driver - - public init(centerCardVO: CenterProfileCardVO) { - - self.centerCardVO = Single - .just(centerCardVO) - .asDriver(onErrorJustReturn: .default) - } - -} - -public class ProfileRegisterCompleteVC: UIViewController { - - // Init - weak var coordinator: ProfileRegisterCompleteCoordinator? - - // View - let registerSuccessTitle: IdleLabel = { - let label = IdleLabel(typography: .Heading1) - label.textString = "센터 회원으로 가입했어요." - return label - }() - // 추후 이미지 추가 예정 - let registerSuccessImage: UIView = { - let view = UIView() - view.backgroundColor = .cyan - return view - }() - - let centerProfileButton: CenterProfileButton = { - let profileBtn = CenterProfileButton( - nameString: "센터명", - locatonString: "위치" - ) - return profileBtn - }() - - // 하단 버튼 - let ctaButton: CTAButtonType1 = { - let button = CTAButtonType1(labelText: "시작하기") - return button - }() - - private let disposeBag = DisposeBag() - - public init(coordinator: ProfileRegisterCompleteCoordinator?) { - self.coordinator = coordinator - super.init(nibName: nil, bundle: nil) - } - required init?(coder: NSCoder) { fatalError() } - - public override func viewDidLoad() { - setAppearance() - setAutoLayout() - setObservable() - } - - private func setAppearance() { - view.backgroundColor = .white - view.layoutMargins = .init(top: 0, left: 20, bottom: 16, right: 20) - } - - private func setAutoLayout() { - - let titleImageSK = VStack( - [ - registerSuccessTitle, - registerSuccessImage, - ], - spacing: 20, - alignment: .center - ) - NSLayoutConstraint.activate([ - registerSuccessImage.widthAnchor.constraint(equalToConstant: 120), - registerSuccessImage.heightAnchor.constraint(equalTo: registerSuccessImage.widthAnchor), - ]) - - let profileButtonSK = VStack( - [ - { - let label = IdleLabel(typography: .Body3) - label.textString = "아래의 센터가 맞나요?" - label.textAlignment = .center - label.attrTextColor = DSKitAsset.Colors.gray300.color - return label - }(), - centerProfileButton - ], - spacing: 8, - alignment: .fill - ) - - let mainSK = VStack( - [ - titleImageSK, - profileButtonSK - ], - spacing: 44, - alignment: .fill - ) - - let mainBackground = UIView() - mainBackground.addSubview(mainSK) - mainSK.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - mainSK.centerYAnchor.constraint(equalTo: mainBackground.centerYAnchor), - mainSK.leadingAnchor.constraint(equalTo: mainBackground.leadingAnchor), - mainSK.trailingAnchor.constraint(equalTo: mainBackground.trailingAnchor), - ]) - - [ - mainBackground, - ctaButton, - ].forEach { - $0.translatesAutoresizingMaskIntoConstraints = false - view.addSubview($0) - } - - NSLayoutConstraint.activate([ - - mainBackground.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), - mainBackground.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor), - mainBackground.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor), - mainBackground.bottomAnchor.constraint(equalTo: ctaButton.topAnchor), - - ctaButton.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor), - ctaButton.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor), - ctaButton.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor) - ]) - } - - private func setObservable() { - - centerProfileButton - .rx.tap - .subscribe { [weak coordinator] _ in - coordinator?.showCenterProfile() - } - .disposed(by: disposeBag) - - ctaButton - .eventPublisher - .subscribe { [weak coordinator] _ in - coordinator?.registerFinished() - } - .disposed(by: disposeBag) - } - - public func bind(viewModel vm: ProfileRegisterCompleteViewModelable) { - - vm - .centerCardVO - .drive { [centerProfileButton] vo in - centerProfileButton.nameLabel.textString = vo.name - centerProfileButton.addressLabel.textString = vo.location - } - .disposed(by: disposeBag) - } -} diff --git a/project/Projects/Presentation/Feature/Center/Sources/View/RegisterCenterInfo/RegisterCenterInfoVC.swift b/project/Projects/Presentation/Feature/Center/Sources/View/RegisterCenterInfo/RegisterCenterInfoVC.swift index eb9c8cbc..998e5291 100644 --- a/project/Projects/Presentation/Feature/Center/Sources/View/RegisterCenterInfo/RegisterCenterInfoVC.swift +++ b/project/Projects/Presentation/Feature/Center/Sources/View/RegisterCenterInfo/RegisterCenterInfoVC.swift @@ -32,7 +32,6 @@ public protocol RegisterCenterInfoViewModelable: AddressInputViewModelable { // Output var nameAndNumberValidation: Driver? { get } var imageValidation: Driver? { get } - var profileRegisterSuccess: Driver? { get } } fileprivate protocol RegisterCenterInfoVCViews: UIView { @@ -509,39 +508,32 @@ extension RegisterCenterInfoVC { ]) } - public func bind(viewModel vm: RegisterCenterInfoViewModelable) { + public func bind(viewModel: RegisterCenterInfoViewModelable) { // Input centerIntroductionField .rx.text .compactMap { $0 } - .bind(to: vm.editingCenterIntroduction) + .bind(to: viewModel.editingCenterIntroduction) .disposed(by: disposeBag) centerImageView .selectedImage .compactMap { $0 } - .bind(to: vm.editingCenterImage) + .bind(to: viewModel.editingCenterImage) .disposed(by: disposeBag) // 완료버튼 ctaButton .eventPublisher - .bind(to: vm.completeButtonPressed) + .bind(to: viewModel.completeButtonPressed) .disposed(by: disposeBag) // Output - vm + viewModel .imageValidation? .drive(centerImageView.displayingImage) .disposed(by: disposeBag) - - vm - .profileRegisterSuccess? - .drive(onNext: { [weak coordinator] cardVO in - coordinator?.showCompleteScreen(cardVO: cardVO) - }) - .disposed(by: disposeBag) } } } diff --git a/project/Projects/Presentation/Feature/Center/Sources/ViewModel/RegisterCenterInfo/RegisterCenterInfoVM.swift b/project/Projects/Presentation/Feature/Center/Sources/ViewModel/RegisterCenterInfo/RegisterCenterInfoVM.swift index 2141efe2..bd56d343 100644 --- a/project/Projects/Presentation/Feature/Center/Sources/ViewModel/RegisterCenterInfo/RegisterCenterInfoVM.swift +++ b/project/Projects/Presentation/Feature/Center/Sources/ViewModel/RegisterCenterInfo/RegisterCenterInfoVM.swift @@ -15,6 +15,9 @@ import BaseFeature public class RegisterCenterInfoVM: BaseViewModel, RegisterCenterInfoViewModelable { + // Init + weak var coordinator: RegisterCenterInfoCoordinator? + // Input public var editingName: PublishRelay = .init() public var editingCenterNumber: PublishRelay = .init() @@ -29,13 +32,12 @@ public class RegisterCenterInfoVM: BaseViewModel, RegisterCenterInfoViewModelabl public var addressValidation: Driver? = nil public var introductionValidation: Driver? = nil public var imageValidation: Driver? = nil - public var profileRegisterSuccess: Driver? = nil // StatObject private let stateObject = CenterProfileRegisterState() - public init(profileUseCase useCase: CenterProfileUseCase) { - + public init(coordinator: RegisterCenterInfoCoordinator) { + self.coordinator = coordinator super.init() // Set stream @@ -114,41 +116,25 @@ public class RegisterCenterInfoVM: BaseViewModel, RegisterCenterInfoViewModelabl } .asDriver(onErrorJustReturn: .init()) - let profileRegisterResult = self.completeButtonPressed - .flatMap { [useCase, stateObject] _ in -#if DEBUG - return Single>.just(.success(())) -#endif - return useCase.registerCenterProfile(state: stateObject) - } - - profileRegisterSuccess = profileRegisterResult - .compactMap { $0.value } - .map { [stateObject] in - let cardVO = CenterProfileCardVO( - name: stateObject.centerName, - location: stateObject.roadNameAddress - ) - return cardVO - } - .asDriver(onErrorJustReturn: .default) - - let profileRegisterFailure = profileRegisterResult - .compactMap { $0.error } - .map { error in - DefaultAlertContentVO( - title: "센터정보 등록 실패", - message: error.message - ) - } + self.completeButtonPressed + .subscribe(onNext: { [weak self] _ in + + guard let self else { return } + + // 프리뷰화면으로 이동 + coordinator.showPreviewScreen(stateObject: stateObject) + }) + .disposed(by: disposeBag) // Alert Observable .merge( - imageValidationFailure, - profileRegisterFailure + imageValidationFailure ) - .subscribe(alert) + .subscribe(onNext: { [weak self] alertVO in + + self?.alert.onNext(alertVO) + }) .disposed(by: disposeBag) } diff --git a/project/Projects/Presentation/Feature/Center/Sources/ViewModel/RegisterCenterInfo/RegisterProfileOverviewVM.swift b/project/Projects/Presentation/Feature/Center/Sources/ViewModel/RegisterCenterInfo/RegisterProfileOverviewVM.swift new file mode 100644 index 00000000..7ed1a261 --- /dev/null +++ b/project/Projects/Presentation/Feature/Center/Sources/ViewModel/RegisterCenterInfo/RegisterProfileOverviewVM.swift @@ -0,0 +1,75 @@ +// +// RegisterProfileOverviewVM.swift +// CenterFeature +// +// Created by choijunios on 9/12/24. +// + +import Foundation +import BaseFeature +import Entity +import UseCaseInterface +import PresentationCore + +import RxSwift +import RxCocoa + +class RegisterProfileOverviewVM: BaseViewModel { + + // Init + weak var coordinator: CenterProfileRegisterOverviewCO? + let profileUseCase: CenterProfileUseCase + + // input + let backButtonClicked: PublishSubject = .init() + let requestProfileRegister: PublishSubject = .init() + + // output + var renderObject: CenterProfileRegisterState + + + init( + coordinator: CenterProfileRegisterOverviewCO, + stateObject: CenterProfileRegisterState, + profileUseCase: CenterProfileUseCase + ) { + self.coordinator = coordinator + self.renderObject = stateObject + self.profileUseCase = profileUseCase + + super.init() + + let registerResult = mapEndLoading(mapStartLoading(requestProfileRegister) + .flatMap { [profileUseCase, stateObject] _ -> Single> in + + return profileUseCase + .registerCenterProfile(state: stateObject) + }) + .share() + + backButtonClicked + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] _ in + self?.coordinator?.coordinatorDidFinish() + }) + .disposed(by: disposeBag) + + registerResult.subscribe(onNext: { [weak self] result in + + guard let self else { return } + + switch result { + case .success: + coordinator.showCompleteScreen() + case .failure(let error): + let alertVO = DefaultAlertContentVO( + title: "프로필 등록 오류", + message: error.message + ) + + alert.onNext(alertVO) + } + }) + .disposed(by: disposeBag) + } +} diff --git a/project/Projects/Presentation/Feature/Root/Sources/Screen/Common/InitialScreen/InitialScreenVM.swift b/project/Projects/Presentation/Feature/Root/Sources/Screen/Common/InitialScreen/InitialScreenVM.swift index 1a1dcf0d..432716b9 100644 --- a/project/Projects/Presentation/Feature/Root/Sources/Screen/Common/InitialScreen/InitialScreenVM.swift +++ b/project/Projects/Presentation/Feature/Root/Sources/Screen/Common/InitialScreen/InitialScreenVM.swift @@ -171,12 +171,6 @@ public class InitialScreenVM: BaseViewModel { case .approved: return info case .pending, .new: - - // Test - return info - - self.coordinator?.centerAuth() - return nil } } diff --git a/project/Projects/Presentation/PresentationCore/Sources/ScreenCoordinating/Interface/Profile/CenterProfileRegisterCoordinatable.swift b/project/Projects/Presentation/PresentationCore/Sources/ScreenCoordinating/Interface/Profile/CenterProfileRegisterCoordinatable.swift index a08e4579..301459a3 100644 --- a/project/Projects/Presentation/PresentationCore/Sources/ScreenCoordinating/Interface/Profile/CenterProfileRegisterCoordinatable.swift +++ b/project/Projects/Presentation/PresentationCore/Sources/ScreenCoordinating/Interface/Profile/CenterProfileRegisterCoordinatable.swift @@ -11,6 +11,6 @@ import Entity public protocol CenterProfileRegisterCoordinatable: ParentCoordinator { func registerFinished() - func showCompleteScreen(cardVO: CenterProfileCardVO) - func showMyCenterProfile() + func showPreviewScreen(stateObject: CenterProfileRegisterState) + func showCompleteScreen() }