-
Notifications
You must be signed in to change notification settings - Fork 2
๐ :: (#379) ๋ง์ดํ์ด์ง ์์ธ ReactorKit #380
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
WalkthroughMyPage์ BugReport, InterestField(๋ฐ Check), NotificationSetting ๋ชจ๋์ MVVM(ViewModel)์์ ReactorKit(Reactor) ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฉด ๋ง์ด๊ทธ๋ ์ด์ ํ์ต๋๋ค. ๊ธฐ์กด ViewModel ํ์ผ ์ญ์ , ๋์ Reactor ์ถ๊ฐ, ViewController/Flow/DI์์ viewModel ์ฐธ์กฐ๋ฅผ reactor๋ก ๊ต์ฒดํ์ต๋๋ค. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant User as ์ฌ์ฉ์ (UI)
participant VC as ViewController
participant Reactor as Reactor
participant UseCase as UseCase
participant Flow as Flow(Stepper)
rect rgb(245,250,255)
Note right of VC: bindAction / bindState
end
User->>VC: UI ์ด๋ฒคํธ (์: ์ ์ถ/ํ ๊ธ/์ ํ)
VC->>Reactor: action (์: bugReportButtonDidTap / toggleNotification / selectButtonDidTap)
Reactor->>UseCase: execute / ์์ฒญ (๋คํธ์ํฌ/๋๋ฉ์ธ ์์
)
UseCase-->>Reactor: ๊ฒฐ๊ณผ(์ฑ๊ณต/์คํจ)
alt ์ฑ๊ณต
Reactor->>Reactor: emit Mutation -> state ์
๋ฐ์ดํธ
Reactor->>Flow: steps.emit(๋ค๋น๊ฒ์ด์
์คํ
) %% ๊ฐ์กฐ๋ ์ ์ํธ์์ฉ
else ์คํจ
Reactor->>Reactor: emit ์คํจ ๊ด๋ จ Mutation -> state ์
๋ฐ์ดํธ
end
Reactor->>VC: state ๋ณ๊ฒฝ (bindState๋ก UI ๋ฐ์)
Estimated code review effort๐ฏ 4 (Complex) | โฑ๏ธ ~45๋ถ Possibly related issues
Possibly related PRs
(์ต๋ 3๊ฐ๋ก ์ ํ) Suggested reviewers
Poem
Pre-merge checks and finishing touchesโ Failed checks (1 warning)
โ Passed checks (2 passed)
โจ Finishing touches
๐งช Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
All File Checked โ
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
Caution
Some comments are outside the diff and canโt be posted inline due to platform limitations.
โ ๏ธ Outside diff range comments (1)
Projects/Presentation/Sources/NotificationSetting/NotificationSettingViewController.swift (1)
164-172: ์ค๋ณต๋ UI ์ ๋ฐ์ดํธ ๋ก์ง์ผ๋ก ์ธํ ์ ์ฌ์ ์ถฉ๋
configureViewController()์์allNotificationSwitchView.clickSwitchButton์ ๊ตฌ๋ ํ์ฌ ๋ชจ๋ ์ค์์น ๋ทฐ๋ฅผ ์ง์ ์ ๋ฐ์ดํธํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋bindState()(Lines 128-161)์์๋ reactor state ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ์ค์์น ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์์ด, ๋ ๋ก์ง์ด ๋์์ ๋์ํ๋ฉด์ UI ์ํ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค.Reactor ํจํด์์๋ ๋ชจ๋ UI ์ ๋ฐ์ดํธ๊ฐ state๋ฅผ ํตํด ์ด๋ฃจ์ด์ ธ์ผ ํ๋ฏ๋ก, ์ด ์ง์ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๐ ์ค๋ณต ๋ก์ง ์ ๊ฑฐ ์ ์
public override func configureViewController() { - allNotificationSwitchView.clickSwitchButton - .asObservable() - .bind(onNext: { [weak self] isOn in - self?.switchViewArray.forEach { - $0.setup(isOn: isOn) - } - }).disposed(by: disposeBag) }
๐งน Nitpick comments (10)
Projects/Flow/Sources/MyPage/InterestField/InterestFieldFlow.swift (1)
28-34:InterestFieldCheckStep์ผ์ด์ค ์ฒ๋ฆฌ๊ฐ ๋ช ์์ ์ด์ง ์์ต๋๋ค.
default์ผ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ค์InterestFieldCheckStep์ ์๋ก์ด ์ผ์ด์ค๊ฐ ์ถ๊ฐ๋ ๋ ์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ ์์ด.none์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ชจ๋ ์ผ์ด์ค๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ํฅํ ์ ์ง๋ณด์์ ๋์์ด ๋ฉ๋๋ค.๐ ๋ช ์์ ์ผ์ด์ค ์ฒ๋ฆฌ ์ ์
} else if let step = step as? InterestFieldCheckStep { switch step { case .popHomeFieldIsRequired: return popToMyPage() - default: + case .interestFieldIsRequired, .interestFieldCheckIsRequired: return .none } }Projects/Flow/Sources/MyPage/InterestField/InterestFieldCheckFlow.swift (1)
58-61:popToMyPage()ํจ์๊ฐInterestFieldFlow.swift์ ์ค๋ณต๋ฉ๋๋ค.๋์ผํ ๊ตฌํ์ด ๋ Flow ํ์ผ์ ์กด์ฌํฉ๋๋ค. ๊ณตํต ํ์ฅ์ด๋ ํ๋กํ ์ฝ๋ก ์ถ์ถํ๋ฉด ์ฝ๋ ์ค๋ณต์ ์ค์ผ ์ ์์ต๋๋ค. ๋ค๋ง, Flow ๊ฐ ๋ ๋ฆฝ์ฑ์ ์ํด ์๋์ ์ผ๋ก ๋ถ๋ฆฌํ ๊ฒ์ผ ์ ์์ต๋๋ค.
Projects/Presentation/Sources/InterestField/InterestFieldCheckViewController.swift (1)
12-15: ์ฃผ์ ์ฒ๋ฆฌ๋ ์ฝ๋๋ฅผ ์ ๋ฆฌํด ์ฃผ์ธ์.
backButton๊ด๋ จ ์ฝ๋๊ฐ ์ฃผ์ ์ฒ๋ฆฌ๋์ด ์์ต๋๋ค. ๋ ์ด์ ํ์ํ์ง ์๋ค๋ฉด ์ ๊ฑฐํ๋ ๊ฒ์ด ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ ๋๋ค.Also applies to: 20-21, 29-33
Projects/Presentation/Sources/InterestField/InterestFieldViewController.swift (1)
105-116: ์ ๊ตฌ์ฑ ์reactor.currentState์ ๊ทผ์ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
rx.itemsํด๋ก์ ๋ด์์reactor.currentState.selectedInterests์ ์ ๊ทผํ๊ณ ์์ต๋๋ค. ์ด ํด๋ก์ ๋availableInterests๊ฐ emit๋ ๋ ํธ์ถ๋์ง๋ง,selectedInterests๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ ์ด ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.Lines 143-149์
reloadData()ํธ์ถ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ง๋ง,combineLatest๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋ฐ์์ ์ธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.๐ combineLatest ์ฌ์ฉ ์ ์
Observable.combineLatest( reactor.state.map { $0.availableInterests }, reactor.state.map { $0.selectedInterests } ) .bind(to: majorCollectionView.rx.items(...)) { index, (codeEntity, selectedInterests), cell in // ... }Projects/Presentation/Sources/BugReport/BugReportViewController.swift (1)
11-12: ์ด๋ฏธ์ง ์ํ๋ฅผ Reactor๋ก ์ด๋ํ๋ ๊ฒ์ ๊ณ ๋ คํด ์ฃผ์ธ์.
imageStringList์imageList๊ฐ ViewController์ ์ธ์คํด์ค ๋ณ์๋ก ๊ด๋ฆฌ๋๊ณ ์์ต๋๋ค. ReactorKit ํจํด์์๋ ์ํ๋ฅผ Reactor์ State์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ผ๊ด์ฑ ์๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.Projects/Presentation/Sources/InterestField/InterestFieldCheckReactor.swift (1)
35-38: fetchStudentInfo ์ก์ ์์ ์๋ฌ ์ฒ๋ฆฌ ๋๋ฝ
fetchStudentInfoUseCase.execute()๊ฐ ์คํจํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ์ ํ๋์ด ์คํธ๋ฆผ์ด ์ข ๋ฃ๋ ์ ์์ต๋๋ค.catchAndReturn๋๋catchErrorJustComplete๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.๐ ์๋ฌ ์ฒ๋ฆฌ ์ถ๊ฐ ์ ์
case .fetchStudentInfo: return fetchStudentInfoUseCase.execute() .asObservable() .map { .setStudentName($0.studentName) } + .catch { _ in .empty() }Projects/Presentation/Sources/DI/Assembly/SettingPresentationAssembly.swift (1)
81-88: ๋ฑ๋ก ์์ ๊ฐ์ ์ ์
BugReportViewController๊ฐBugReportReactor๋ณด๋ค ๋จผ์ ๋ฑ๋ก๋์ด ์์ต๋๋ค. ๊ฐ๋ ์ฑ์ ์ํด ์์กด์ฑ(Reactor)์ ๋จผ์ ๋ฑ๋กํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ๋ ViewController๋ฅผ ์ดํ์ ๋ฑ๋กํ๋ ๊ฒ์ด ์ข์ต๋๋ค.๐ ๋ฑ๋ก ์์ ๋ณ๊ฒฝ ์ ์
// Bug Report + container.register(BugReportReactor.self) { resolver in + BugReportReactor( + reportBugUseCase: resolver.resolve(ReportBugUseCase.self)! + ) + } container.register(BugReportViewController.self) { resolver in BugReportViewController(resolver.resolve(BugReportReactor.self)!) } - container.register(BugReportReactor.self) { resolver in - BugReportReactor( - reportBugUseCase: resolver.resolve(ReportBugUseCase.self)! - ) - }Projects/Presentation/Sources/InterestField/InterestFieldReactor.swift (2)
52-65: fetchInterestFields์์ ์๋ฌ ์ฒ๋ฆฌ ๋๋ฝ
fetchCodeListUseCase์fetchStudentInfoUseCaseํธ์ถ ์ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋คํธ์ํฌ ์คํจ ์ ์คํธ๋ฆผ์ด ์ข ๋ฃ๋์ด ์ดํ ์ก์ ์ด ์ฒ๋ฆฌ๋์ง ์์ ์ ์์ต๋๋ค.๐ ์๋ฌ ์ฒ๋ฆฌ ์ถ๊ฐ ์ ์
case .fetchInterestFields: let interests = fetchCodeListUseCase.execute( keyword: nil, type: .job, parentCode: nil ) .asObservable() .map { Mutation.setAvailableInterests($0) } + .catch { _ in .empty() } let studentInfo = fetchStudentInfoUseCase.execute() .asObservable() .map { Mutation.setStudentName($0.studentName) } + .catch { _ in .empty() } return .merge(interests, studentInfo)
70-78: selectButtonDidTap ์ก์ ์์ ์๋ฌ ์ฒ๋ฆฌ ๋๋ฝ
changeInterestsUseCase.execute()๊ฐ ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ํผ๋๋ฐฑ ์์ด ์คํจํ ์ ์์ต๋๋ค. ์๋ฌ ์ํ๋ฅผ State์ ์ถ๊ฐํ๊ฑฐ๋, ์ต์ํ ์๋ฌ๋ฅผ ๋ก๊น ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.๐ ์๋ฌ ์ฒ๋ฆฌ ์ถ๊ฐ ์ ์
case .selectButtonDidTap: let codeIDs = currentState.selectedInterests.map { $0.code } return changeInterestsUseCase.execute(codeIDs: codeIDs) .asObservable() .do(onCompleted: { [weak self] in self?.steps.accept(InterestFieldStep.interestFieldCheckIsRequired) }) .flatMap { _ in Observable<Mutation>.empty() } + .catch { _ in .empty() }Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift (1)
61-86: mutate ํจ์์์ ์๋ฌ ์ฒ๋ฆฌ ๋๋ฝ
fetchSubscribeStateUseCase,subscribeNotificationUseCase,subscribeAllNotificationUseCaseํธ์ถ ์ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋คํธ์ํฌ ์คํจ ์ ์ ์ ํ ์ฌ์ฉ์ ํผ๋๋ฐฑ์ด ํ์ํ ์ ์์ต๋๋ค.๐ ์๋ฌ ์ฒ๋ฆฌ ์ถ๊ฐ ์์
case .fetchNotificationSettings: return fetchSubscribeStateUseCase.execute() .asObservable() .map { entities -> [NotificationType: Bool] in var states: [NotificationType: Bool] = [:] entities.forEach { states[$0.topic] = $0.isSubscribed } return states } .map { .setSubscribeStates($0) } + .catch { _ in .empty() }
๐ Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
๐ Files selected for processing (17)
Projects/Flow/Sources/MyPage/BugReport/BugReportFlow.swiftProjects/Flow/Sources/MyPage/InterestField/InterestFieldCheckFlow.swiftProjects/Flow/Sources/MyPage/InterestField/InterestFieldFlow.swiftProjects/Flow/Sources/MyPage/Notification/NotificationSettingFlow.swiftProjects/Presentation/Sources/BugReport/BugReportReactor.swiftProjects/Presentation/Sources/BugReport/BugReportViewController.swiftProjects/Presentation/Sources/BugReport/BugReportViewModel.swiftProjects/Presentation/Sources/DI/Assembly/SettingPresentationAssembly.swiftProjects/Presentation/Sources/InterestField/InterestFieldCheckReactor.swiftProjects/Presentation/Sources/InterestField/InterestFieldCheckViewController.swiftProjects/Presentation/Sources/InterestField/InterestFieldCheckViewModel.swiftProjects/Presentation/Sources/InterestField/InterestFieldReactor.swiftProjects/Presentation/Sources/InterestField/InterestFieldViewController.swiftProjects/Presentation/Sources/InterestField/InterestFieldViewModel.swiftProjects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swiftProjects/Presentation/Sources/NotificationSetting/NotificationSettingViewController.swiftProjects/Presentation/Sources/NotificationSetting/NotificationSettingViewModel.swift
๐ค Files with no reviewable changes (4)
- Projects/Presentation/Sources/NotificationSetting/NotificationSettingViewModel.swift
- Projects/Presentation/Sources/BugReport/BugReportViewModel.swift
- Projects/Presentation/Sources/InterestField/InterestFieldViewModel.swift
- Projects/Presentation/Sources/InterestField/InterestFieldCheckViewModel.swift
๐งฐ Additional context used
๐งฌ Code graph analysis (7)
Projects/Presentation/Sources/NotificationSetting/NotificationSettingViewController.swift (1)
Projects/Presentation/Sources/NotificationSetting/Component/NotificationSectionView.swift (1)
setup(57-62)
Projects/Presentation/Sources/InterestField/InterestFieldCheckReactor.swift (3)
Projects/Presentation/Sources/InterestField/Components/InterestCheckView.swift (1)
setStudentName(57-65)Projects/Presentation/Sources/InterestField/InterestFieldReactor.swift (2)
mutate(50-79)reduce(81-100)Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift (2)
mutate(61-87)reduce(89-108)
Projects/Presentation/Sources/InterestField/InterestFieldReactor.swift (3)
Projects/Presentation/Sources/InterestField/Components/InterestCheckView.swift (1)
setStudentName(57-65)Projects/Presentation/Sources/InterestField/InterestFieldCheckReactor.swift (2)
mutate(33-50)reduce(52-61)Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift (2)
mutate(61-87)reduce(89-108)
Projects/Flow/Sources/MyPage/InterestField/InterestFieldCheckFlow.swift (1)
Projects/Flow/Sources/MyPage/InterestField/InterestFieldFlow.swift (1)
popToMyPage(59-62)
Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift (1)
Projects/App/Sources/AppDelegate.swift (1)
messaging(91-104)
Projects/Presentation/Sources/InterestField/InterestFieldCheckViewController.swift (2)
Projects/Presentation/Sources/InterestField/InterestFieldViewController.swift (2)
bindAction(83-102)bindState(104-150)Projects/Presentation/Sources/NotificationSetting/NotificationSettingViewController.swift (2)
bindAction(90-125)bindState(127-162)
Projects/Presentation/Sources/BugReport/BugReportViewController.swift (3)
Projects/Presentation/Sources/MyPage/MyPageViewController.swift (2)
bindAction(92-145)bindState(147-165)Projects/Presentation/Sources/BugReport/MajorBottomSheet/MajorBottomSheetViewController.swift (1)
bind(52-58)Projects/Modules/DesignSystem/Sources/Extensions/UIViewController/UIViewController+showJobisToast.swift (1)
showJobisToast(5-33)
โฐ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: JOBIS_DSM_iOS | JOBIS v2 CI | Test - iOS
- GitHub Check: JOBIS_DSM_iOS | JOBIS v2 CI | Build - iOS
๐ Additional comments (16)
Projects/Flow/Sources/MyPage/BugReport/BugReportFlow.swift (1)
36-36: ReactorKit ํจํด์ผ๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ ๋์์ต๋๋ค.
viewModel์์reactor๋ก์ ์ ํ์ด ์ผ๊ด๋๊ฒ ์ ์ฉ๋์์ผ๋ฉฐ,stepsrelay๋ฅผ ํตํ ๋ค๋น๊ฒ์ด์ ์คํ ์ฒ๋ฆฌ ๋ฐฉ์์ด ReactorKit์ Stepper ํ๋กํ ์ฝ๊ณผ ์ ๋ง์ต๋๋ค.Also applies to: 45-45
Projects/Presentation/Sources/BugReport/BugReportReactor.swift (1)
37-43: State ํ๋กํผํฐ์ ์ ๊ทผ ์ ์ด์๋ฅผ ํ์ธํด ์ฃผ์ธ์.
Statestruct์ ํ๋กํผํฐ๋ค์ดinternal์ ๊ทผ ์์ค์ ๋๋ค. ์ธ๋ถ ๋ชจ๋์์reactor.currentState์ ์ ๊ทผํด์ผ ํ๋ ๊ฒฝ์ฐpublic์ผ๋ก ์ ์ธํด์ผ ํ ์ ์์ต๋๋ค.Projects/Flow/Sources/MyPage/Notification/NotificationSettingFlow.swift (1)
33-33: LGTM!ReactorKit ํจํด์ผ๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋์์ต๋๋ค.
Projects/Flow/Sources/MyPage/InterestField/InterestFieldFlow.swift (1)
45-45: Reactor ๊ธฐ๋ฐ stepper๋ก์ ์ ํ์ด ์ ๋์์ต๋๋ค.
viewModel์์reactor๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ผ๊ด๋๊ฒ ์ ์ฉ๋์์ต๋๋ค.Also applies to: 55-55
Projects/Flow/Sources/MyPage/InterestField/InterestFieldCheckFlow.swift (1)
40-40: LGTM!Reactor ๊ธฐ๋ฐ stepper๋ก์ ์ ํ์ด ์ผ๊ด๋๊ฒ ์ ์ฉ๋์์ต๋๋ค.
Also applies to: 54-54
Projects/Presentation/Sources/InterestField/InterestFieldCheckViewController.swift (1)
41-61: ReactorKit ๋ฐ์ธ๋ฉ ํจํด์ด ์ ์ ์ฉ๋์์ต๋๋ค.
viewWillAppear์์ ๋ฐ์ดํฐ๋ฅผ fetchํ๊ณviewDidAppear์์ ์๋ ๋ค๋น๊ฒ์ด์ ์ ์์ํ๋ ํจํด์ด ๋ช ํํฉ๋๋ค. State ๋ฐ์ธ๋ฉ์์filter์distinctUntilChanged๋ฅผ ์ ์ ํ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.Projects/Presentation/Sources/InterestField/InterestFieldViewController.swift (1)
159-162: Safe subscript ํ์ฅ์ด ์ข์ต๋๋ค.๋ฐฐ์ด ๋ฒ์ ์ด๊ณผ ์ ๊ทผ์ ๋ฐฉ์งํ๋ ์์ ํ ํจํด์ ๋๋ค. ๋ค๋ง ์ด ํ์ฅ์ด ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉ๋๋ค๋ฉด Core ๋ชจ๋ ๋ฑ ๊ณตํต ์์น๋ก ์ด๋ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
Projects/Presentation/Sources/BugReport/BugReportViewController.swift (1)
169-176: ์ด๋ฏธ์ง ๋ฆฌ์คํธ ์ ๋ฐ์ดํธ์ ๋ฒํผ ํญ ์ก์ ์ ์์ ์์กด์ฑ์ด ์์ต๋๋ค.
do(onNext:)์์updateImageList๋ฅผ ๋ณด๋ธ ํbugReportButtonDidTap์ ๋ณด๋ด๋๋ฐ, ๋ ์ก์ ์ด ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค๋ ๋ณด์ฅ์ด ์์ด์ผ ํฉ๋๋ค. Reactor์mutate๊ฐ ๋๊ธฐ์ ์ด๋ฏ๋ก ํ์ฌ๋ ๋์ํ์ง๋ง, ์ด๋ฏธ์ง ๋ฆฌ์คํธ๋ฅผ Reactor State๋ก ์ด๋ํ๋ฉด ์ด ์์กด์ฑ์ด ๋ช ํํด์ง๋๋ค.Projects/Presentation/Sources/InterestField/InterestFieldCheckReactor.swift (1)
40-48: ์๋ ๋ค๋น๊ฒ์ด์ ํ์ด๋จธ ๊ตฌํ์ด ์ ์ ํฉ๋๋ค.2์ด ํ์ด๋จธ ํ
steps.accept๋ฅผ ํตํด ๋ค๋น๊ฒ์ด์ ์ ํธ๋ฆฌ๊ฑฐํ๋ ๊ตฌํ์ด ReactorKit ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.[weak self]๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋ฐฉ์งํ๊ณ ์์ต๋๋ค.Projects/Presentation/Sources/DI/Assembly/SettingPresentationAssembly.swift (2)
48-56: NotificationSettingReactor DI ๋ฑ๋ก์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ณ๊ฒฝ๋์์ต๋๋ค.ViewModel์์ Reactor๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ ์ ํ ๋ฐ์๋์์ต๋๋ค.
109-130: InterestField ๊ด๋ จ Reactor ๋ฑ๋ก์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์์ต๋๋ค.
InterestFieldReactor์InterestFieldCheckReactor์ ์์กด์ฑ ์ฃผ์ ์ด ์ ์ ํ ์ค์ ๋์ด ์์ต๋๋ค.Projects/Presentation/Sources/NotificationSetting/NotificationSettingViewController.swift (2)
90-125: bindAction ๊ตฌํ์ด ReactorKit ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.๊ฐ ์ค์์น ๋ฒํผ์
skip(1)์ ์ฌ์ฉํ์ฌ ์ด๊ธฐ๊ฐ ๋ฐฉ์ถ์ ๋ฐฉ์งํ๊ณ , ์ ์ ํ ์ก์ ์ผ๋ก ๋งคํํ๊ณ ์์ต๋๋ค.
127-162: bindState ๊ตฌํ์ด ์ ์ ํฉ๋๋ค.
distinctUntilChanged()๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ์ํ UI ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํ๊ณ ์์ผ๋ฉฐ, ๊ฐ ์ํ๋ฅผ ํด๋น UI ์ปดํฌ๋ํธ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์ธ๋ฉํ๊ณ ์์ต๋๋ค.Projects/Presentation/Sources/InterestField/InterestFieldReactor.swift (1)
81-100: reduce ํจ์ ๊ตฌํ์ด ์ ์ ํฉ๋๋ค.๊ฐ Mutation์ ๋ํ ์ํ ์ ๋ฐ์ดํธ๊ฐ ๋ช ํํ๊ณ ,
toggleSelectedInterest์ toggle ๋ก์ง์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift (2)
39-57: State ๊ตฌ์กฐ๊ฐ ์ ์ค๊ณ๋์์ต๋๋ค.
subscribeStates๋์ ๋๋ฆฌ์ computed properties๋ฅผ ์กฐํฉํ์ฌ ๊ฐ ์๋ฆผ ํ์ ์ ์ํ๋ฅผ ๊น๋ํ๊ฒ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค.isAllNotificationEnabled๊ฐ ๋ชจ๋ ๊ฐ๋ณ ์ํ์ AND ์กฐ๊ฑด์ผ๋ก ์ ์๋์ด ์์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ์ฌ๋ฐ๋ฆ ๋๋ค.
89-108: reduce ํจ์ ๊ตฌํ์ด ์ ์ ํฉ๋๋ค.๊ฐ Mutation์ ๋ํ ์ํ ์ ๋ฐ์ดํธ๊ฐ ๋ช ํํ๊ณ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ฉฐ ์๋ก์ด State๋ฅผ ๋ฐํํ๊ณ ์์ต๋๋ค.
Projects/Presentation/Sources/BugReport/BugReportViewController.swift
Outdated
Show resolved
Hide resolved
Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
โป๏ธ Duplicate comments (3)
Projects/Presentation/Sources/BugReport/BugReportReactor.swift (2)
75-84: ์๋ฌ ์ฒ๋ฆฌ๊ฐ ๋๋ฝ๋์ด ์ฌ์ฉ์ ํผ๋๋ฐฑ์ด ์์ต๋๋ค.๋คํธ์ํฌ ์ค๋ฅ๋ ์๋ฒ ์๋ฌ๊ฐ ๋ฐ์ํด๋ ์ฌ์ฉ์์๊ฒ ์๋ฌด๋ฐ ํผ๋๋ฐฑ์ด ์ ๊ณต๋์ง ์์ต๋๋ค. ์คํจ ์ ์๋ฌ ์ํ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๋์ mutation์ ํตํด ์ฌ์ฉ์์๊ฒ ์๋ ค์ผ ํฉ๋๋ค.
๐ ์๋ฌ ์ฒ๋ฆฌ ์ถ๊ฐ ์ ์
State์ ์๋ฌ ํ๋กํผํฐ ์ถ๊ฐ:
public struct State { var title: String = "" var content: String = "" var imageList: [String] = [] var majorType: String = "์ ์ฒด" var isBugReportButtonEnabled: Bool = false var isBugReportCompleted: Bool = false + var errorMessage: String? }Mutation์ ์๋ฌ ์ผ์ด์ค ์ถ๊ฐ:
public enum Mutation { case setTitle(String) case setContent(String) case setImageList([String]) case setMajorType(String) case setBugReportButtonIsEnabled(Bool) case setBugReportCompleted + case setError(String) }mutate์์ ์๋ฌ ์ฒ๋ฆฌ:
case .bugReportButtonDidTap: return reportBugUseCase.execute(req: .init( title: currentState.title, content: currentState.content, developmentArea: DevelopmentType(rawValue: currentState.majorType.uppercased()) ?? .all, attachmentUrls: currentState.imageList )) .asObservable() .map { _ in Mutation.setBugReportCompleted } + .catch { error in + return .just(.setError(error.localizedDescription)) + }ViewController์์ ์๋ฌ ์ํ ๊ตฌ๋ ํ์ฌ ํ ์คํธ ํ์:
reactor.state.compactMap { $0.errorMessage } .bind(onNext: { [weak self] message in self?.showJobisToast(text: message, inset: 70) }) .disposed(by: disposeBag)
79-79:majorType์ด ํ๊ธ ๋ฌธ์์ด์ด๋ฏ๋กDevelopmentType๋ณํ์ด ์คํจํฉ๋๋ค.
majorType์ ๊ธฐ๋ณธ๊ฐ์ "์ ์ฒด"(ํ๊ธ)์ด๊ณ ์ฌ์ฉ์๊ฐ ์ ํํ๋ ๊ฐ๋ ํ๊ธ์ ๋๋ค.DevelopmentType์ rawValue๋ "ALL", "SERVER", "WEB" ๋ฑ ์๋ฌธ์ด๋ฏ๋ก,uppercased()๋ฅผ ์ ์ฉํด๋ ํ๊ธ์ ๋ณํ๋์ง ์์DevelopmentType(rawValue:)์ด ํญ์nil์ ๋ฐํํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ ํํ ๊ฐ๋ฐ ๋ถ์ผ๊ฐ ๋ฌด์๋๊ณ ํญ์.all๋ก ์ ์ก๋ฉ๋๋ค.๐ ์์ ๋ฐฉ์
๋ฐฉ์ 1: ํ๊ธ-์๋ฌธ ๋งคํ ํจ์ ์ถ๊ฐ
private func mapMajorTypeToEnglish(_ majorType: String) -> String { switch majorType { case "์ ์ฒด": return "ALL" case "์๋ฒ": return "SERVER" case "์น": return "WEB" case "์๋๋ก์ด๋": return "ANDROID" case "iOS": return "IOS" case "๋์์ธ": return "DESIGN" case "ํฌ๋ก์คํ๋ซํผ": return "CROSS_PLATFORM" default: return "ALL" } } // mutate์์ ์ฌ์ฉ: developmentArea: DevelopmentType(rawValue: mapMajorTypeToEnglish(currentState.majorType)) ?? .all๋ฐฉ์ 2: State์์ majorType์ ์๋ฌธ์ผ๋ก ์ ์ฅ
State๋ฅผ ์๋ฌธ์ผ๋ก ์ ์ฅํ๊ณ , UI ํ์์ฉ ํ๊ธ ๋ณํ์ ViewController์์ ์ฒ๋ฆฌ:
public struct State { var title: String = "" var content: String = "" var imageList: [String] = [] - var majorType: String = "์ ์ฒด" + var majorType: String = "ALL" var isBugReportButtonEnabled: Bool = false var isBugReportCompleted: Bool = false }๊ทธ๋ฆฌ๊ณ ViewController์์ ํ๊ธ๋ก ๋ณํ:
reactor.state.map { $0.majorType } .distinctUntilChanged() .map { englishType in switch englishType { case "ALL": return "์ ์ฒด" case "SERVER": return "์๋ฒ" // ... ๋๋จธ์ง ๋งคํ default: return "์ ์ฒด" } } .bind(to: bugReportMajorView.majorLabel.rx.text) .disposed(by: disposeBag)Projects/Presentation/Sources/BugReport/BugReportViewController.swift (1)
207-214: ์๋ฃ ์ฒ๋ฆฌ ๋ก์ง์take(1)์ด ๋๋ฝ๋์์ต๋๋ค.์ด์ ๋ฆฌ๋ทฐ์์ ์ง์ ๋
reactor.action๊ตฌ๋ ๋ฌธ์ ๋ ํด๊ฒฐ๋์์ต๋๋ค. ์ด์ API ํธ์ถ ์๋ฃ ํ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.ํ์ง๋ง ํ์ฌ ๊ตฌ๋ ์
take(1)์ฐ์ฐ์๊ฐ ์์ด, ์ด๋ก ์ ์ผ๋กisBugReportCompleted๊ฐ ์ฌ๋ฌ ๋ฒtrue๋ก ๋ณ๊ฒฝ๋๋ฉด ํ ์คํธ์ pop์ด ์ฌ๋ฌ ๋ฒ ์คํ๋ ์ ์์ต๋๋ค. ๋ํ ํ๋ฉด์ด dismiss๋ ํ์๋ ๊ตฌ๋ ์ด ์ ์ง๋ ์ ์์ต๋๋ค.๐ ์ ์ํ๋ ์์
reactor.state.map { $0.isBugReportCompleted } .distinctUntilChanged() .filter { $0 } + .take(1) .bind(onNext: { [weak self] _ in self?.showJobisToast(text: "๋ฒ๊ทธ์ ๋ณด๊ฐ ์๋ฃ๋์์ต๋๋ค.", inset: 70) self?.navigationController?.popViewController(animated: true) }) .disposed(by: disposeBag)
๐ Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
๐ Files selected for processing (2)
Projects/Presentation/Sources/BugReport/BugReportReactor.swiftProjects/Presentation/Sources/BugReport/BugReportViewController.swift
โฐ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: JOBIS_DSM_iOS | JOBIS v2 CI | Build - iOS
๐ Additional comments (7)
Projects/Presentation/Sources/BugReport/BugReportViewController.swift (2)
10-10: ReactorKit ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋์์ต๋๋ค.ํด๋์ค ์๊ทธ๋์ฒ๊ฐ
BaseReactorViewController<BugReportReactor>๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๋ณ๊ฒฝ๋์ด ReactorKit ์ํคํ ์ฒ์ ๋ถํฉํฉ๋๋ค.
179-189: State ๋ฐ์ธ๋ฉ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.๋ฒํผ ํ์ฑํ ์ํ์ ์ ๊ณต ๋ ์ด๋ธ์ด reactor state์ ์ ํํ๊ฒ ๋ฐ์ธ๋ฉ๋์ด ์์ผ๋ฉฐ,
distinctUntilChanged()๋ฅผ ํตํด ๋ถํ์ํ UI ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํ๊ณ ์์ต๋๋ค.Projects/Presentation/Sources/BugReport/BugReportReactor.swift (5)
8-18: ReactorKit ๊ตฌ์กฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.
BaseReactor์Stepper๋ฅผ ์ค์ํ๊ณ , ์์กด์ฑ ์ฃผ์ ์ ํตํด use case๋ฅผ ๋ฐ์ ์ด๊ธฐํํ๋ ๊ตฌ์กฐ๊ฐ ReactorKit ํจํด์ ๋ถํฉํฉ๋๋ค.
38-45: State ์ ์๊ฐ ์ ์ ํฉ๋๋ค.ํ์ํ ์ํ๋ค์ด ๋ชจ๋ ์ ์๋์ด ์์ผ๋ฉฐ, ReactorKit์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ก์ฐ๋ฅผ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
isBugReportCompletedํ๋๊ทธ๋ฅผ ํตํด ์๋ฃ ์ํ๋ฅผ ๋ช ํํ๊ฒ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค.
51-63: ์ ๋ ฅ ๊ฒ์ฆ ๋ก์ง์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.์ ๋ชฉ๊ณผ ๋ด์ฉ์ด ๋ชจ๋ ์ ๋ ฅ๋์์ ๋๋ง ๋ฒํผ์ ํ์ฑํํ๋ ๋ก์ง์ด ์ ์ ํ๋ฉฐ,
concat์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ mutation์ ์์ฐจ์ ์ผ๋ก ๋ฐํํ๋ ๋ฐฉ์๋ ReactorKit์ Best Practice๋ฅผ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
65-73: Navigation๊ณผ ์ํ ์ ๋ฐ์ดํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค.
majorViewDidTap์์steps๋ฅผ ํตํด navigation์ ์ฒ๋ฆฌํ๋ ๊ฒ์ RxFlow ํจํด์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ์ด๋ฉฐ, ๋๋จธ์ง ์ก์ ๋ค๋ ์ ์ ํ๊ฒ mutation์ ๋ฐํํ๊ณ ์์ต๋๋ค.
87-109: Reduce ๋ก์ง์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.๋ชจ๋ mutation์ด state์ ์ ํํ๊ฒ ๋ฐ์๋๊ณ ์์ผ๋ฉฐ, ReactorKit์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ก์ฐ๋ฅผ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
โป๏ธ Duplicate comments (1)
Projects/Presentation/Sources/BugReport/BugReportReactor.swift (1)
75-84: ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์ฌ์ ํ ๋๋ฝ๋์ด ์์ต๋๋ค.
reportBugUseCase.execute()๊ฐ ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ํผ๋๋ฐฑ์ด ์ ๊ณต๋์ง ์์ต๋๋ค. ์ด์ ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.๐ ์๋ฌ ์ฒ๋ฆฌ ์ถ๊ฐ ์ ์
case .bugReportButtonDidTap: return reportBugUseCase.execute(req: .init( title: currentState.title, content: currentState.content, developmentArea: DevelopmentType(localizedString: currentState.majorType) ?? .all, attachmentUrls: currentState.imageList )) .asObservable() .map { _ in Mutation.setBugReportCompleted } + .catch { error in + // TODO: ์๋ฌ๋ฅผ State์ ์ ์ฅํ๊ฑฐ๋ ๋ณ๋ ์ฒ๋ฆฌ + print("Bug report failed: \(error)") + return .empty() + }
๐งน Nitpick comments (1)
Projects/Domain/Sources/Enums/DevelopmentType.swift (1)
29-38: ๋์๋ฌธ์ ์ฒ๋ฆฌ ๋ฐ ์ ์ง๋ณด์์ฑ ๊ฒํ ํ์์๋ฌธ ๋ฌธ์์ด ๋งค์นญ์ด ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด
"all"๋๋"ALL"์ ์ ๋ ฅํ๋ฉดnil์ด ๋ฐํ๋ฉ๋๋ค. ์ ๋ ฅ ์์ค์ ๋ฐ๋ผ ์ด๊ฒ์ด ์๋๋ ๋์์ธ์ง ํ์ธ์ด ํ์ํฉ๋๋ค.๋ํ,
localizedString()๋ฉ์๋์ ์ด ์ด๋์ ๋ผ์ด์ ๊ฐ์ ๋งคํ์ ๋๊ธฐํํด์ผ ํ๋ฏ๋ก, ํฅํ ์ ์ง๋ณด์ ์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.๐ ๋์๋ฌธ์ ๋ฌด์ ๋งค์นญ์ ์ํ ๊ฐ์ ์
public init?(localizedString: String) { - switch localizedString { + switch localizedString.lowercased() { - case "์ ์ฒด", "All": self = .all - case "์๋ฒ", "Server": self = .server - case "์น", "Web": self = .web - case "์๋๋ก์ด๋", "Android": self = .android - case "iOS": self = .ios + case "์ ์ฒด", "all": self = .all + case "์๋ฒ", "server": self = .server + case "์น", "web": self = .web + case "์๋๋ก์ด๋", "android": self = .android + case "ios": self = .ios default: return nil } }
๐ Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
๐ Files selected for processing (2)
Projects/Domain/Sources/Enums/DevelopmentType.swiftProjects/Presentation/Sources/BugReport/BugReportReactor.swift
๐งฐ Additional context used
๐งฌ Code graph analysis (1)
Projects/Presentation/Sources/BugReport/BugReportReactor.swift (3)
Projects/Modules/DesignSystem/Sources/Alert/AlertBuilder.swift (1)
setTitle(22-25)Projects/Presentation/Sources/CompanyDetail/Components/CompanyDetailLabel.swift (1)
setContent(22-24)Projects/Domain/Sources/Enums/DevelopmentType.swift (1)
localizedString(10-27)
โฐ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: JOBIS_DSM_iOS | JOBIS v2 CI | Test - iOS
- GitHub Check: JOBIS_DSM_iOS | JOBIS v2 CI | Build - iOS
๐ Additional comments (8)
Projects/Presentation/Sources/BugReport/BugReportReactor.swift (8)
1-18: ํด๋์ค ๊ตฌ์กฐ์ ์ด๊ธฐํ๊ฐ ์ฌ๋ฐ๋ฆ ๋๋ค.ReactorKit ํจํด์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ๋ฅด๊ณ ์์ผ๋ฉฐ, ์์กด์ฑ ์ฃผ์ ๋ฐ RxFlow ํตํฉ์ด ์ ์ ํฉ๋๋ค.
20-27: ์ก์ ์ ์๊ฐ ๋ช ํํฉ๋๋ค.๋ชจ๋ ์ฌ์ฉ์ ์ธํฐ๋์ ์ ์ ์ ํ ํํํ๊ณ ์์ต๋๋ค.
29-45: Mutation๊ณผ State ์ ์๊ฐ ์ ์ ํฉ๋๋ค.์ํ ๋ณํ๋ฅผ ๋ช ํํ๊ฒ ํํํ๊ณ ์์ผ๋ฉฐ, ์ด๊ธฐ๊ฐ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
51-63: ์ ๋ชฉ๊ณผ ๋ด์ฉ ์ ๋ฐ์ดํธ ๋ก์ง์ด ์ฌ๋ฐ๋ฆ ๋๋ค.๋ฒํผ ํ์ฑํ ์กฐ๊ฑด์ ์ ํํ ๊ฒ์ฆํ๊ณ ์์ต๋๋ค.
65-73: ์ด๋ฏธ์ง ๋ฆฌ์คํธ, ๋ถ์ผ ํ์ ์ ๋ฐ์ดํธ ๋ฐ ๋ค๋น๊ฒ์ด์ ์ฒ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฆ ๋๋ค.Stepper ํจํด์ ์ ์ ํ ํ์ฉํ๊ณ ์์ต๋๋ค.
87-109: ๋ฆฌ๋์ ๊ตฌํ์ด ์ฌ๋ฐ๋ฆ ๋๋ค.๊ฐ Mutation์ ์ ์ ํ State์ ๋ฐ์ํ๊ณ ์์ต๋๋ค.
75-84: ๋ฒ๊ทธ ์ ๋ณด ์ฑ๊ณต ์์ ๋ค๋น๊ฒ์ด์ ์ฒ๋ฆฌ์ ์๋ฆผ์ ์ด๋ฏธ ๊ตฌํ๋์ด ์์ต๋๋ค.BugReportViewController์ 207-212์ค์์
isBugReportCompleted์ํ๋ฅผ ๊ด์ฐฐํ์ฌ "๋ฒ๊ทธ์ ๋ณด๊ฐ ์๋ฃ๋์์ต๋๋ค." ํ ์คํธ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณnavigationController?.popViewController(animated: true)๋ก ํ๋ฉด์ ๋ซ๋ ๋ก์ง์ด ์กด์ฌํฉ๋๋ค.Likely an incorrect or invalid review comment.
75-84:DevelopmentType(localizedString:)์ด๋์ ๋ผ์ด์ ๋ ์ด๋ฏธ ์กด์ฌํ๋ฏ๋ก ์ด ์ฝ๋๋ ์ ์์ ๋๋ค.Projects/Domain/Sources/Enums/DevelopmentType.swift (line 29-38)์์
public init?(localizedString: String)์ด๋์ ๋ผ์ด์ ๊ฐ ์ ์๋์ด ์์ผ๋ฏ๋ก, line 79์ ์ฝ๋๋ ๋ฌธ์ ์์ด ์๋ํฉ๋๋ค.Likely an incorrect or invalid review comment.
๊ฐ์
์์ ์ฌํญ
UI
Summary by CodeRabbit
๋ฆด๋ฆฌ์ค ๋ ธํธ
New Features
Refactor
Other
โ๏ธ Tip: You can customize this high-level summary in your review settings.