Repository navigation
refactor: registerAllCustomFonts 제거 + .shared 제거 + Recovery Router 클로저 전환 - #102
Conversation
…outer 클로저 전환 - NewdokApp: registerAllCustomFonts() 제거 (Tuist auto-registration 사용) - BrandDetailViewModel: SubscribePopupPreference.shared 기본값 제거, DIContainer에서 주입 - FindIdPhoneInputView, FindIdResultView: Router 제거 → onSignUp/onLogin/onContact 클로저 - PasswordRecoveryNewPasswordView, PasswordRecoveryResultView: Router 제거 → onPasswordResetComplete/onLogin 클로저 - RecoveryView(부모)에서 클로저로 네비게이션 위임 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Code Review
This pull request refactors the recovery flows (FindIdPagerView and PasswordRecoveryPagerView) to delegate navigation actions via closures instead of directly accessing the router environment, and updates BrandDetailViewModel initialization. The review feedback suggests improving Swift 6 concurrency safety by marking these navigation closures with @MainActor, and recommends adopting the modern Task.sleep(for:) API instead of Task.sleep(nanoseconds:) for better consistency and readability.
| Task { @MainActor in | ||
| try? await Task.sleep(nanoseconds: 500_000_000) | ||
| ToastCenter.shared.show("비밀번호가 재설정되었습니다.") | ||
| } |
There was a problem hiding this comment.
iOS 16 이상부터는 Task.sleep(nanoseconds:) 대신 Task.sleep(for:) API를 사용하는 것이 권장됩니다. 또한 프로젝트 내 다른 파일(예: PasswordRecoveryPagerView.swift의 244라인)에서도 Task.sleep(for: .seconds(...)) 형식을 사용하고 있으므로, 코드의 일관성과 현대적인 Swift API 준수를 위해 변경하는 것이 좋습니다.
| Task { @MainActor in | |
| try? await Task.sleep(nanoseconds: 500_000_000) | |
| ToastCenter.shared.show("비밀번호가 재설정되었습니다.") | |
| } | |
| Task { @MainActor in | |
| try? await Task.sleep(for: .seconds(0.5)) | |
| ToastCenter.shared.show("비밀번호가 재설정되었습니다.") | |
| } |
| let onPasswordResetComplete: () -> Void | ||
| let onLogin: () -> Void |
There was a problem hiding this comment.
이 클로저들은 UI 내비게이션 및 화면 전환을 트리거하는 역할을 합니다. Swift 6의 엄격한 동시성(Strict Concurrency) 검사를 준수하고 메인 스레드에서 안전하게 실행되도록 보장하기 위해, 클로저 타입을 @MainActor로 명시하는 것이 좋습니다.
| let onPasswordResetComplete: () -> Void | |
| let onLogin: () -> Void | |
| let onPasswordResetComplete: @MainActor () -> Void | |
| let onLogin: @MainActor () -> Void |
| struct PasswordRecoveryNewPasswordView: View { | ||
| @Bindable var viewModel: RecoveryViewModel | ||
| @Environment(AppRouter.self) private var router | ||
| let onPasswordResetComplete: () -> Void |
| @Bindable var viewModel: RecoveryViewModel | ||
| @Environment(AppRouter.self) private var router | ||
| let onLogin: () -> Void |
| let onSignUp: () -> Void | ||
| let onLogin: () -> Void | ||
| let onContact: () -> Void |
There was a problem hiding this comment.
| } | ||
| struct FindIdPhoneInputView: View { | ||
| @Bindable var viewModel: RecoveryViewModel | ||
| let onSignUp: () -> Void |
| let onLogin: () -> Void | ||
| let onContact: () -> Void |
SwiftLint만 유지, 빌드 검증은 로컬에서 수행. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Summary
NewdokApp:registerAllCustomFonts()제거 — Tuist auto-registration으로 충분BrandDetailViewModel:SubscribePopupPreference.shared기본값 제거,DetailDIContainer에서 주입FindIdPhoneInputView,FindIdResultView,PasswordRecoveryNewPasswordView,PasswordRecoveryResultView)에서@Environment(AppRouter.self)제거 → 클로저로 전환RecoveryView에서 클로저를 통해 네비게이션 위임Test plan
🤖 Generated with Claude Code