Skip to content

Commit 30f3f35

Browse files
authored
Merge pull request #606 from sopt-makers/refactor/#566-attendance-flow
[Refactor] #566 - Attendance Flow에서의 Router 의존성 제거
2 parents 84902f9 + f2f4b01 commit 30f3f35

15 files changed

+227
-63
lines changed

SOPT-iOS/Projects/Features/AttendanceFeature/Interface/Sources/AttendanceFeatureBuildable.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22
// AttendanceFeatureBuildable.swift
33
// AttendanceFeatureInterface
44
//
5-
// Created by Junho Lee on 2023/06/22.
6-
// Copyright © 2023 SOPT-iOS. All rights reserved.
5+
// Created by Jae Hyun Lee on 6/3/25.
6+
// Copyright © 2025 SOPT-iOS. All rights reserved.
77
//
88

99
import BaseFeatureDependency
1010

1111
import Domain
1212

13-
public protocol AttendanceFeatureViewBuildable {
14-
func makeShowAttendanceVC() -> ShowAttendanceViewControllable
13+
public protocol AttendanceFeatureBuildable {
14+
func makeShowAttendanceVC() -> ShowAttendancePresentable
1515
func makeAttendanceVC(
1616
lectureRound: AttendanceRoundModel,
1717
dismissCompletion: (() -> Void)?
18-
) -> AttendanceViewControllable
18+
) -> AttendancePresentable
1919
}

SOPT-iOS/Projects/Features/AttendanceFeature/Interface/Sources/AttendanceFeatureViewControllable.swift

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//
2+
// AttendancePresentable.swift
3+
// AttendanceFeature
4+
//
5+
// Created by 김영인 on 2023/03/18.
6+
// Copyright © 2023 SOPT-iOS. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
import BaseFeatureDependency
12+
import Core
13+
import Domain
14+
15+
public protocol LegacyAttendanceViewControllable: LegacyViewControllable { }
16+
17+
public typealias AttendanceViewModelType = ViewModelType
18+
public typealias AttendancePresentable = (vc: UIViewController, vm: any AttendanceViewModelType)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// LegacyAttendanceFeatureBuildable.swift
3+
// AttendanceFeatureInterface
4+
//
5+
// Created by Junho Lee on 2023/06/22.
6+
// Copyright © 2023 SOPT-iOS. All rights reserved.
7+
//
8+
9+
import BaseFeatureDependency
10+
11+
import Domain
12+
13+
public protocol LegacyAttendanceFeatureBuildable {
14+
func makeShowAttendanceVC() -> LegacyShowAttendanceViewControllable
15+
func makeAttendanceVC(
16+
lectureRound: AttendanceRoundModel,
17+
dismissCompletion: (() -> Void)?
18+
) -> LegacyAttendanceViewControllable
19+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//
2+
// LegacyShowAttendanceViewControllable.swift
3+
// AttendanceFeature
4+
//
5+
// Created by Jae Hyun Lee on 6/3/25.
6+
// Copyright © 2025 SOPT-iOS. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
import BaseFeatureDependency
12+
import Core
13+
import Domain
14+
15+
public protocol LegacyShowAttendanceViewControllable: LegacyViewControllable & ShowAttendanceCoordinatable { }
16+
public protocol ShowAttendanceViewControllable: UIViewController & ShowAttendanceCoordinatable { }
17+
public protocol ShowAttendanceCoordinatable {
18+
var onAttendanceButtonTap: ((AttendanceRoundModel, (() -> Void)?) -> Void)? { get set }
19+
var onNaviBackTap: (() -> Void)? { get set }
20+
}
21+
public typealias ShowAttendanceViewModelType = ViewModelType & ShowAttendanceCoordinatable
22+
// TODO: coordinating vc -> vm 위임 시 활용
23+
public typealias ShowAttendancePresentable = (vc: ShowAttendanceViewControllable, vm: any ShowAttendanceViewModelType)

SOPT-iOS/Projects/Features/AttendanceFeature/Sources/AttendanceScene/VC/AttendanceVC.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import Then
1818
import AttendanceFeatureInterface
1919
import BaseFeatureDependency
2020

21-
public final class AttendanceVC: UIViewController, AttendanceViewControllable {
21+
public final class AttendanceVC: UIViewController, LegacyAttendanceViewControllable {
2222
private enum Metric {
2323
static let baseInset = 20.f
2424
static let contentInset = 16.f

SOPT-iOS/Projects/Features/AttendanceFeature/Sources/AttendanceScene/ViewModel/AttendanceViewModel.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import Foundation
1111

1212
import Core
1313
import Domain
14+
import AttendanceFeatureInterface
1415

15-
public final class AttendanceViewModel: ViewModelType {
16+
public final class AttendanceViewModel: AttendanceViewModelType {
1617

1718
// MARK: - Properties
1819

SOPT-iOS/Projects/Features/AttendanceFeature/Sources/Coordinator/AttendanceBuilder.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// AttendanceBuilder.swift
33
// AttendanceFeatureInterface
44
//
5-
// Created by Junho Lee on 2023/06/22.
6-
// Copyright © 2023 SOPT-iOS. All rights reserved.
5+
// Created by Jae Hyun Lee on 6/3/25.
6+
// Copyright © 2025 SOPT-iOS. All rights reserved.
77
//
88

99
import Core
@@ -18,19 +18,19 @@ final class AttendanceBuilder {
1818
public init() { }
1919
}
2020

21-
extension AttendanceBuilder: AttendanceFeatureViewBuildable {
22-
public func makeShowAttendanceVC() -> ShowAttendanceViewControllable {
21+
extension AttendanceBuilder: AttendanceFeatureBuildable {
22+
public func makeShowAttendanceVC() -> ShowAttendancePresentable {
2323
let useCase = DefaultShowAttendanceUseCase(repository: showAttendanceRepository)
2424
let viewModel = ShowAttendanceViewModel(useCase: useCase)
2525
let showAttendanceVC = ShowAttendanceVC(viewModel: viewModel)
26-
return showAttendanceVC
26+
return (showAttendanceVC, viewModel)
2727
}
28-
29-
public func makeAttendanceVC(lectureRound: AttendanceRoundModel, dismissCompletion: (() -> Void)?) -> AttendanceViewControllable {
28+
29+
public func makeAttendanceVC(lectureRound: AttendanceRoundModel, dismissCompletion: (() -> Void)?) -> AttendancePresentable {
3030
let useCase = DefaultAttendanceUseCase(repository: attendanceRepository)
3131
let viewModel = AttendanceViewModel(useCase: useCase, lectureRound: lectureRound)
3232
let attendanceVC = AttendanceVC(viewModel: viewModel)
3333
attendanceVC.dismissCompletion = dismissCompletion
34-
return attendanceVC
34+
return (attendanceVC, viewModel)
3535
}
3636
}

SOPT-iOS/Projects/Features/AttendanceFeature/Sources/Coordinator/AttendanceCoordinator.swift

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,67 @@
22
// AttendanceCoordinator.swift
33
// AttendanceFeatureInterface
44
//
5-
// Created by Junho Lee on 2023/06/22.
6-
// Copyright © 2023 SOPT-iOS. All rights reserved.
5+
// Created by Jae Hyun Lee on 6/3/25.
6+
// Copyright © 2025 SOPT-iOS. All rights reserved.
77
//
88

9+
import UIKit
10+
911
import Core
1012
import Domain
1113
import BaseFeatureDependency
1214
import AttendanceFeatureInterface
1315

14-
public
15-
final class AttendanceCoordinator: DefaultCoordinator {
16+
public final class AttendanceCoordinator: DefaultCoordinator {
17+
18+
// MARK: - Properties
1619

1720
public var finishFlow: (() -> Void)?
1821

19-
private let factory: AttendanceFeatureViewBuildable
20-
private let router: LegacyRouter
22+
private let factory: AttendanceFeatureBuildable
23+
private let navigationController: UINavigationController
24+
25+
// MARK: - Init
2126

22-
public init(router: LegacyRouter, factory: AttendanceFeatureViewBuildable) {
27+
public init(
28+
navigationController: UINavigationController,
29+
factory: AttendanceFeatureBuildable
30+
) {
31+
self.navigationController = navigationController
2332
self.factory = factory
24-
self.router = router
2533
}
2634

35+
// MARK: - Coordinator Life Cycle
36+
2737
public override func start() {
2838
showShowAttendance()
2939
}
3040

41+
// MARK: - Navigation
42+
3143
private func showShowAttendance() {
3244
var showAttendance = factory.makeShowAttendanceVC()
33-
showAttendance.onNaviBackTap = { [weak self] in
34-
self?.router.popModule()
45+
46+
showAttendance.vc.onNaviBackTap = { [weak self] in
47+
self?.navigationController.popViewController(animated: true)
3548
self?.finishFlow?()
3649
}
37-
showAttendance.onAttendanceButtonTap = { [weak self] lectureRound, completion in
50+
51+
showAttendance.vc.onAttendanceButtonTap = { [weak self] lectureRound, completion in
3852
self?.showAttendance(lectureRound, completion)
3953
}
40-
router.push(showAttendance)
54+
55+
navigationController.pushViewController(showAttendance.vc, animated: true)
4156
}
4257

4358
internal func showAttendance(_ lectureRound: AttendanceRoundModel, _ dismissCompletion: (() -> Void)?) {
4459
let attendance = factory.makeAttendanceVC(
45-
lectureRound: lectureRound, dismissCompletion: dismissCompletion
46-
)
47-
router.present(
48-
attendance,
49-
animated: true,
50-
modalPresentationSytle: .overFullScreen,
51-
modalTransitionStyle: .crossDissolve
60+
lectureRound: lectureRound,
61+
dismissCompletion: dismissCompletion
5262
)
63+
64+
attendance.vc.modalPresentationStyle = .overFullScreen
65+
attendance.vc.modalTransitionStyle = .crossDissolve
66+
navigationController.present(attendance.vc, animated: true)
5367
}
5468
}

SOPT-iOS/Projects/Features/AttendanceFeature/Sources/Coordinator/AttendanceModalDeepLink.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public struct AttendanceModalDeepLink: DeepLinkExecutable {
1818
public init() {}
1919

2020
public func execute(with coordinator: Coordinator, queryItems: [URLQueryItem]?) -> Coordinator? {
21-
guard let coordinator = coordinator as? AttendanceCoordinator else { return nil }
21+
guard let coordinator = coordinator as? LegacyAttendanceCoordinator else { return nil }
2222

2323
guard let subLectureIdValue = queryItems?.getQueryValue(key: "subLectureId"),
2424
let roundValue = queryItems?.getQueryValue(key: "round"),

0 commit comments

Comments
 (0)