Skip to content

Commit

Permalink
๐Ÿ”— :: (#178) ๋ฉด์ ‘ํ›„๊ธฐ ์ž‘์„ฑ & ์กฐํšŒ ๊ฐœ๋ฐœ
Browse files Browse the repository at this point in the history
  • Loading branch information
ray3238 committed Jun 21, 2024
2 parents 3a19767 + f068691 commit cfce963
Show file tree
Hide file tree
Showing 36 changed files with 1,422 additions and 42 deletions.
6 changes: 6 additions & 0 deletions Projects/Core/Sources/Steps/AddReviewStep.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import RxFlow

public enum AddReviewStep: Step {
case addReviewIsRequired
case dismissToWritableReview
}
4 changes: 4 additions & 0 deletions Projects/Core/Sources/Steps/CompanyDetailStep.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@ public enum CompanyDetailStep: Step {
case companyDetailIsRequired
case popIsRequired
case recruitmentDetailIsRequired(id: Int)
case interviewReviewDetailIsRequired(
id: Int,
name: String
)
}
5 changes: 5 additions & 0 deletions Projects/Core/Sources/Steps/InterviewReviewStep.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import RxFlow

public enum InterviewReviewDetailStep: Step {
case interviewReviewDetailIsRequired
}
1 change: 1 addition & 0 deletions Projects/Core/Sources/Steps/MyPageStep.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import RxFlow
public enum MyPageStep: Step {
case myPageIsRequired
case tabsIsRequired
case writableReviewIsRequired(_ id: Int)
case noticeIsRequired
case confirmIsRequired
}
7 changes: 7 additions & 0 deletions Projects/Core/Sources/Steps/WritableReviewStep.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import RxFlow

public enum WritableReviewStep: Step {
case writableReviewIsRequired
case addReviewIsRequired
case popToMyPage
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,19 @@ struct WritableReviewListResponseDTO: Decodable {
}

struct WritableReviewCompanyResponseDTO: Decodable {
let reviewID: Int
let companyID: Int
let name: String

enum CodingKeys: String, CodingKey {
case reviewID = "id"
case companyID = "id"
case name
}
}

extension WritableReviewListResponseDTO {
func toDomain() -> [WritableReviewCompanyEntity] {
companies.map {
WritableReviewCompanyEntity(reviewID: $0.reviewID, name: $0.name)
WritableReviewCompanyEntity(companyID: $0.companyID, name: $0.name)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import Foundation

public struct WritableReviewCompanyEntity: Equatable, Hashable {
public let reviewID: Int
public let companyID: Int
public let name: String

public init(reviewID: Int, name: String) {
self.reviewID = reviewID
public init(companyID: Int, name: String) {
self.companyID = companyID
self.name = name
}
}
21 changes: 21 additions & 0 deletions Projects/Flow/Sources/Company/CompanyDetailFlow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ public final class CompanyDetailFlow: Flow {

case let.recruitmentDetailIsRequired(id):
return navigateToRecruimtentDetail(recruitmentID: id)

case let .interviewReviewDetailIsRequired(id, name):
return navigateToInterviewReviewDetail(id, name)
}
}
}
Expand Down Expand Up @@ -62,4 +65,22 @@ private extension CompanyDetailFlow {
withNextStepper: OneStepper(withSingleStep: RecruitmentDetailStep.recruitmentDetailIsRequired)
))
}

func navigateToInterviewReviewDetail(_ id: Int, _ name: String) -> FlowContributors {
let interviewReviewDetailFlow = InterviewReviewDetailFlow(container: container)

Flows.use(interviewReviewDetailFlow, when: .created) { (root) in
let view = root as? InterviewReviewDetailViewController
view?.viewModel.reviewId = id
view?.viewModel.writerName = name
self.rootViewController.navigationController?.pushViewController(
view!, animated: true
)
}

return .one(flowContributor: .contribute(
withNextPresentable: interviewReviewDetailFlow,
withNextStepper: OneStepper(withSingleStep: InterviewReviewDetailStep.interviewReviewDetailIsRequired)
))
}
}
36 changes: 36 additions & 0 deletions Projects/Flow/Sources/Company/InterviewReviewFlow.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import UIKit
import Presentation
import Swinject
import RxFlow
import Core

public final class InterviewReviewDetailFlow: Flow {
public let container: Container
private let rootViewController: InterviewReviewDetailViewController
public var root: Presentable {
return rootViewController
}

public init(container: Container) {
self.container = container
self.rootViewController = container.resolve(InterviewReviewDetailViewController.self)!
}

public func navigate(to step: Step) -> FlowContributors {
guard let step = step as? InterviewReviewDetailStep else { return .none }

switch step {
case .interviewReviewDetailIsRequired:
return navigateToInterviewReviewDetail()
}
}
}

private extension InterviewReviewDetailFlow {
func navigateToInterviewReviewDetail() -> FlowContributors {
return .one(flowContributor: .contribute(
withNextPresentable: rootViewController,
withNextStepper: rootViewController.viewModel
))
}
}
20 changes: 20 additions & 0 deletions Projects/Flow/Sources/MyPage/MyPageFlow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ public final class MyPageFlow: Flow {
case .tabsIsRequired:
return .end(forwardToParentFlowWithStep: TabsStep.appIsRequired)

case let .writableReviewIsRequired(id):
return navigateToWritableReview(id)

case .noticeIsRequired:
return navigateToNotice()

Expand All @@ -49,6 +52,23 @@ private extension MyPageFlow {
))
}

func navigateToWritableReview(_ id: Int) -> FlowContributors {
let writableReviewFlow = WritableReviewFlow(container: container)

Flows.use(writableReviewFlow, when: .created) { (root) in
let view = root as? WritableReviewViewController
view?.viewModel.companyID = id
self.rootViewController.pushViewController(
view!, animated: true
)
}

return .one(flowContributor: .contribute(
withNextPresentable: writableReviewFlow,
withNextStepper: OneStepper(withSingleStep: WritableReviewStep.writableReviewIsRequired)
))
}

func navigateToNotice() -> FlowContributors {
let noticeFlow = NoticeFlow(container: container)

Expand Down
48 changes: 48 additions & 0 deletions Projects/Flow/Sources/MyPage/Review/AddReviewFlow.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import UIKit
import Presentation
import Swinject
import RxFlow
import Core

public final class AddReviewFlow: Flow {
public let container: Container
private let rootViewController: AddReviewViewController
public var root: Presentable {
return rootViewController
}

public init(container: Container) {
self.container = container
self.rootViewController = AddReviewViewController(
container.resolve(AddReviewViewModel.self)!,
state: .custom(height: 500)
)
}

public func navigate(to step: Step) -> FlowContributors {
guard let step = step as? AddReviewStep else { return .none }

switch step {
case .addReviewIsRequired:
return navigateToAddReview()

case .dismissToWritableReview:
return dismissToWritableReview()
}
}
}

private extension AddReviewFlow {
func navigateToAddReview() -> FlowContributors {
return .one(flowContributor: .contribute(
withNextPresentable: rootViewController,
withNextStepper: rootViewController.viewModel
))
}

func dismissToWritableReview(
) -> FlowContributors {
self.rootViewController.dismissBottomSheet()
return .none
}
}
76 changes: 76 additions & 0 deletions Projects/Flow/Sources/MyPage/Review/WritableReviewFlow.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import UIKit
import Presentation
import Swinject
import RxFlow
import Core
import Domain

public final class WritableReviewFlow: Flow {
public let container: Container
private let rootViewController: WritableReviewViewController
public var root: Presentable {
return rootViewController
}

public init(container: Container) {
self.container = container
self.rootViewController = container.resolve(WritableReviewViewController.self)!
}

public func navigate(to step: Step) -> FlowContributors {
guard let step = step as? WritableReviewStep else { return .none }

switch step {
case .writableReviewIsRequired:
return navigateToWritableReview()

case .addReviewIsRequired:
return navigateToAddReview()

case .popToMyPage:
return popToMyPage()
}
}
}

private extension WritableReviewFlow {
func navigateToWritableReview() -> FlowContributors {
return .one(flowContributor: .contribute(
withNextPresentable: rootViewController,
withNextStepper: rootViewController.viewModel
))
}

func navigateToAddReview() -> FlowContributors {
let addReviewFlow = AddReviewFlow(container: container)
Flows.use(addReviewFlow, when: .created) { root in
let view = root as? AddReviewViewController
view?.dismiss = { question, answer, techCode in
self.rootViewController.viewModel.techCode = techCode.code
self.rootViewController.viewModel.interviewReviewInfo.accept(
QnaEntity(
question: question,
answer: answer,
area: techCode.keyword
)
)
}
self.rootViewController.present(
root,
animated: false
)
}

return .one(flowContributor: .contribute(
withNextPresentable: addReviewFlow,
withNextStepper: OneStepper(
withSingleStep: AddReviewStep.addReviewIsRequired
)
))
}

func popToMyPage() -> FlowContributors {
self.rootViewController.navigationController?.popViewController(animated: true)
return .none
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,14 @@ public extension UITextField {
self.rightView = UIView(frame: CGRect(x: 0, y: 0, width: size, height: 0))
self.rightViewMode = .always
}

func setPlaceholderColor(_ placeholderColor: UIColor) {
attributedPlaceholder = NSAttributedString(
string: placeholder ?? "",
attributes: [
.foregroundColor: placeholderColor,
.font: font
].compactMapValues { $0 }
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import DesignSystem

public class CompanyDetailViewController: BaseViewController<CompanyDetailViewModel> {
private let companyDetailProfileView = CompanyDetailProfileView()
public var isTabNavigation: Bool = true
private let scrollView = UIScrollView().then {
$0.showsVerticalScrollIndicator = false
}
Expand Down Expand Up @@ -118,7 +119,14 @@ public class CompanyDetailViewController: BaseViewController<CompanyDetailViewMo
public override func bind() {
let input = CompanyDetailViewModel.Input(
viewAppear: self.viewWillAppearPublisher,
recruitmentButtonDidTap: recruitmentButton.rx.tap.asSignal()
recruitmentButtonDidTap: recruitmentButton.rx.tap.asSignal(),
interviewReviewTableViewDidTap: interviewReviewTableView.rx
.modelSelected(ReviewEntity.self)
.asObservable()
.map { ($0.reviewID, $0.writer) }
.do(onNext: { _ in
self.isTabNavigation = false
})
)

let output = viewModel.transform(input)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public final class CompanyDetailViewModel: BaseViewModel, Stepper {
public struct Input {
let viewAppear: PublishRelay<Void>
let recruitmentButtonDidTap: Signal<Void>
let interviewReviewTableViewDidTap: Observable<(Int, String)>
}

public struct Output {
Expand Down Expand Up @@ -64,6 +65,12 @@ public final class CompanyDetailViewModel: BaseViewModel, Stepper {
.bind(to: steps)
.disposed(by: disposeBag)

input.interviewReviewTableViewDidTap.asObservable()
.map { id, name in
CompanyDetailStep.interviewReviewDetailIsRequired(id: id, name: name)
}
.bind(to: steps)
.disposed(by: disposeBag)
return Output(
companyDetailInfo: companyDetailInfo,
reviewListInfo: reviewListInfo
Expand Down
Loading

0 comments on commit cfce963

Please sign in to comment.