-
Notifications
You must be signed in to change notification settings - Fork 0
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
[WEAV-137] 토스트 전역으로 구현되도록 수정, 프로필 위젯 토스트 구현 #46
Conversation
Caution Review failedThe pull request is closed. Walkthrough이 PR에서는 Changes
Possibly related PRs
Suggested labels
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
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: 9
🧹 Outside diff range and nitpick comments (15)
Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionIntent.swift (1)
42-44
: DataModel 구조체에 대한 개선 제안다음 사항들을 고려해보시기 바랍니다:
- successHandler의 용도와 호출 시점에 대한 문서화가 필요합니다
- 메모리 순환 참조를 방지하기 위해 핸들러를 weak 캡처로 변경하는 것이 좋을 수 있습니다
다음과 같이 개선해보세요:
struct DataModel { + /// 위젯 선택 작업이 성공적으로 완료되었을 때 호출되는 핸들러 + /// 토스트 메시지 표시 등의 UI 피드백을 처리하는데 사용됩니다 - let successHandler: (() -> Void)? + let successHandler: (() -> Void)? // [weak self] in 구문으로 캡처하는 것을 권장 }Tuist/Package.swift (1)
42-44
: 토스트 구현 아키텍처 제안전역 토스트 관리를 위한 의존성이 추가된 것으로 보입니다. 다음 사항들을 고려해 주세요:
- 싱글톤 패턴을 통한 전역 토스트 매니저 구현
- 토스트 표시 위치와 스타일의 일관성 유지
- 접근성(VoiceOver) 지원 확인
토스트 매니저 구현에 대한 상세한 가이드가 필요하시다면 도움을 드릴 수 있습니다.
Projects/DesignSystem/DesignCore/Sources/Toast/ToastView.swift (1)
Line range hint
49-89
: 코드 개선을 위한 제안사항이 있습니다.다음과 같은 개선사항들을 고려해보시면 좋을 것 같습니다:
- 매직 넘버를 상수로 추출
- 애니메이션 및 토스트 표시 시간을 외부에서 설정 가능하도록 수정
- 메모리 관리 개선
다음과 같이 수정해보시는 건 어떨까요?:
struct ToastView: View { let message: String @Binding var isPresent: Bool + private enum Constants { + static let cornerRadius: CGFloat = 14 + static let height: CGFloat = 52 + static let horizontalPadding: CGFloat = 28 + static let animationDuration: CGFloat = 0.25 + static let displayDuration: TimeInterval = 2 + } + // 토스트 표시 시간을 외부에서 설정할 수 있도록 함 + var displayDuration: TimeInterval = Constants.displayDuration var body: some View { ZStack { - RoundedRectangle(cornerRadius: 14) + RoundedRectangle(cornerRadius: Constants.cornerRadius) .inset(by: 1) // ... rest of the implementation } - .frame(height: 52) - .padding(.horizontal, 28) + .frame(height: Constants.height) + .padding(.horizontal, Constants.horizontalPadding) .offset(y: isPresent ? 0 : 100) .opacity(isPresent ? 1 : 0) - .animation(.bouncy(duration: 0.25), value: isPresent) + .animation(.bouncy(duration: Constants.animationDuration), value: isPresent) .onChange(of: isPresent) { if isPresent { - DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + // 타이머를 사용하여 메모리 관리 개선 + Task { + try? await Task.sleep(for: .seconds(displayDuration)) isPresent = false - } + } } } } }Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionModel.swift (2)
39-39
: 콜백 프로퍼티 구현이 적절합니다.성공 핸들러 프로퍼티가 적절하게 구현되었습니다. 다만, 프로퍼티의 용도를 명확히 하기 위해 문서화 주석을 추가하면 좋을 것 같습니다.
다음과 같이 문서화 주석을 추가하는 것을 제안합니다:
+/// 위젯 선택 작업 성공 시 실행될 콜백 var successHandler: (() -> Void)?
83-85
: 메모리 관리를 고려한 구현이 필요할 수 있습니다.현재 구현은 정상적으로 작동하지만, 클로저 사용 시 발생할 수 있는 강한 참조 순환을 방지하기 위한 처리가 필요할 수 있습니다.
다음과 같이
[weak self]
를 사용하는 것을 고려해보세요:func setSuccessHandler(handler: (() -> Void)?) { - successHandler = handler + successHandler = { [weak self] in + handler?() + } }Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingIntent.swift (1)
Line range hint
94-96
: 에러 처리 구현 필요TODO 주석으로 표시된 에러 처리 로직을 구현해야 합니다. 사용자에게 적절한 피드백을 제공하는 것이 필요합니다.
에러 처리 로직 구현을 도와드릴까요? 토스트 메시지를 통한 에러 피드백 구현을 제안드립니다.
🧰 Tools
🪛 SwiftLint
[Warning] 94-94: TODOs should be resolved (에러처리)
(todo)
Projects/Features/Home/Sources/Profile/ProfileIntent.swift (1)
78-87
: 위젯 삭제 로직 개선 필요토스트 메시지 표시 전에 지연시간을 주는 것은 좋은 UX 실천사례입니다. 하지만 몇 가지 개선이 필요합니다:
- 에러 처리 시 1초 지연은 불필요할 수 있습니다
- 매직 넘버(500ms, 1.0s)는 상수로 정의하는 것이 좋습니다
다음과 같이 개선해보세요:
+ private enum Constants { + static let successDelay: TimeInterval = 0.5 + static let errorDelay: TimeInterval = 1.0 + } func deleteWidget(_ widget: ProfileWidget) async { do { model?.setLoading(status: true) try await requestDeleteWidget(widget) await refreshUserInfo() model?.setLoading(status: false) - try await Task.sleep(for: .milliseconds(500)) + try await Task.sleep(for: .seconds(Constants.successDelay)) ToastHelper.show("위젯이 삭제되었어요") } catch { print(error) model?.setLoading(status: false) - DispatchQueue.main.asyncAfter(wallDeadline: .now() + 1.0) { + ToastHelper.showErrorMessage() - ToastHelper.showErrorMessage() - } } }Projects/Features/Home/Sources/HomeMain/HomeMainView.swift (1)
67-72
: 버튼 스타일링 및 접근성 개선이 필요합니다.현재 토스트 버튼 구현에 다음과 같은 개선사항을 제안드립니다:
- DesignCore의 일관된 스타일링 적용
- 접근성 레이블 추가
- VStack 내 적절한 간격 조정
다음과 같이 수정해보시는 건 어떨까요?
VStack { Text("첫 번째 탭") + Spacer().frame(height: 16) Button { intent.onTapNextButton() } label: { - Text("토스트!") + Text("토스트!") + .typography(.en_medium_16) + .foregroundColor(DesignCore.Colors.grey500) + .padding(.horizontal, 16) + .padding(.vertical, 8) + .background(DesignCore.Colors.grey100) + .cornerRadius(8) } + .accessibilityLabel("토스트 메시지 표시") }Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingModel.swift (2)
29-30
: 프로토콜에 successHandler 속성 추가 검토
Stateful
프로토콜에 콜백 핸들러를 추가한 것은 적절해 보이나, 프로토콜 문서화가 필요합니다.다음과 같이 문서화를 추가하는 것을 제안합니다:
+ /// 위젯 작성 성공 시 호출될 핸들러 + /// - Note: 메모리 순환 참조를 방지하기 위해 weak 캡처 사용을 권장합니다. var successHandler: (() -> Void)? { get }
73-74
: 프로토콜 메서드 문서화 필요새로 추가된 프로토콜 메서드들의 용도와 사용법에 대한 설명이 필요합니다.
다음과 같이 문서화를 추가하는 것을 제안합니다:
+ /// 성공 핸들러를 설정합니다. + /// - Parameter handler: 위젯 작성 성공 시 호출될 핸들러 func setSuccessHandler(handler: (() -> Void)?) + /// 설정된 성공 핸들러를 실행합니다. func doSuccessAction()Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionView.swift (1)
115-117
: 프리뷰 코드의 가독성을 개선해주세요.빈 클로저보다는 의미 있는 예시 구현을 추가하면 좋을 것 같습니다.
다음과 같이 수정하는 것을 제안합니다:
-WidgetSelectionView(isPresented: .constant(true)) { - -} +WidgetSelectionView(isPresented: .constant(true)) { + print("위젯 선택 완료") +}Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingView.swift (2)
45-46
: 성공 핸들러의 용도에 대한 문서화가 필요합니다.새로 추가된
successHandler
매개변수의 목적과 사용 시점을 명확히 하기 위해 문서화를 추가하는 것이 좋겠습니다.다음과 같이 문서 주석을 추가하는 것을 제안합니다:
+ /// 위젯 작성/수정 완료 시 호출되는 핸들러 + /// - Parameter successHandler: 위젯 작성/수정이 성공적으로 완료된 후 실행될 콜백 public init( widgetType: WidgetType, isModalPresented: Binding<Bool>, isPushed: Binding<Bool>, isEditing: Bool = false, contentString: String? = nil, successHandler: (() -> Void)? )
153-155
: 프리뷰에서 더 의미 있는 예제를 보여주면 좋겠습니다.빈 클로저보다는 실제 사용 사례를 보여주는 것이 더 도움이 될 것 같습니다.
다음과 같이 수정하는 것을 제안합니다:
WidgetWritingView( widgetType: .body, isModalPresented: .constant(false), isPushed: .constant(false) - ) { - - } + ) { + print("위젯이 성공적으로 생성되었습니다.") + }Projects/DesignSystem/DesignCore/Sources/Toast/Toast.swift (1)
44-48
: 에러 메시지 상수화 제안기본 에러 메시지가 하드코딩되어 있습니다. 다국어 지원과 메시지 관리를 위해 상수로 분리하는 것이 좋습니다.
다음과 같이 수정하는 것을 제안합니다:
+ private enum Constants { + static let defaultErrorMessage = "에러가 발생했어요 다시 시도해주세요" + } public static func showErrorMessage( - _ message: String = "에러가 발생했어요 다시 시도해주세요" + _ message: String = Constants.defaultErrorMessage ) { manager.showToast(message: message, style: .error) }Projects/Features/Home/Sources/Profile/ProfileView.swift (1)
215-222
: 성공 핸들러 로직이 중복됩니다.위젯 추가와 수정의 성공 핸들러 로직이 거의 동일합니다. 코드 재사용성을 위해 공통 함수로 추출하는 것이 좋겠습니다.
다음과 같은 리팩토링을 제안합니다:
+private func handleWidgetOperation(operation: String) async throws { + await intent.refreshUserInfo() + try await Task.sleep(for: .seconds(1)) + ToastHelper.show("위젯이 \(operation)되었어요") +} // 사용 예시: successHandler: { Task { do { try await handleWidgetOperation(operation: "추가") } catch { ToastHelper.show("위젯 추가 중 오류가 발생했습니다") } } }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (17)
Projects/Core/CommonKit/Sources/AppCoordinator.swift
(2 hunks)Projects/DesignSystem/DesignCore/Sources/Toast/Toast.swift
(1 hunks)Projects/DesignSystem/DesignCore/Sources/Toast/ToastView.swift
(2 hunks)Projects/DesignSystem/Project.swift
(1 hunks)Projects/Features/Home/Sources/HomeMain/HomeMainIntent.swift
(2 hunks)Projects/Features/Home/Sources/HomeMain/HomeMainView.swift
(1 hunks)Projects/Features/Home/Sources/Profile/ProfileIntent.swift
(4 hunks)Projects/Features/Home/Sources/Profile/ProfileView.swift
(4 hunks)Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionIntent.swift
(2 hunks)Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionModel.swift
(4 hunks)Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionView.swift
(3 hunks)Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingIntent.swift
(4 hunks)Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingModel.swift
(4 hunks)Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingView.swift
(2 hunks)Tuist/Package.resolved
(1 hunks)Tuist/Package.swift
(1 hunks)Tuist/ProjectDescriptionHelpers/Dependency+extensions.swift
(1 hunks)
🔇 Additional comments (25)
Tuist/ProjectDescriptionHelpers/Dependency+extensions.swift (2)
14-14
: 코드 변경이 적절합니다!
Toast 의존성 추가가 전역 토스트 알림 구현이라는 PR의 목적과 잘 부합합니다.
14-14
: Toast 라이브러리 의존성 선언을 확인해주세요.
Package.swift 또는 관련 의존성 설정 파일에 Toast 라이브러리가 올바르게 선언되어 있는지 확인이 필요합니다.
✅ Verification successful
Toast 라이브러리 의존성이 올바르게 설정되어 있습니다.
Package.swift에서 Toast 라이브러리가 다음과 같이 정확하게 선언되어 있습니다:
.package(
url: "https://github.com/BastiaanJansen/toast-swift.git",
exact: "2.1.2"
)
또한 프로젝트 내에서 다음과 같이 의존성이 올바르게 사용되고 있습니다:
- DesignCore 모듈에서 Toast 컴포넌트를 구현하고 있음
- Projects/DesignSystem/Project.swift에서
.external(.toast)
의존성이 선언되어 있음 - 실제 코드에서 Toast 기능이 정상적으로 import되어 사용되고 있음
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Toast 라이브러리 의존성 선언 확인
# Package.swift 파일에서 Toast 관련 설정 확인
fd -e swift -x rg -A 5 "package\(name: \"Toast\""
# Tuist 프로젝트 설정 파일에서 Toast 의존성 확인
fd "Project.swift" -x rg -A 5 "\.toast"
Length of output: 232
Script:
#!/bin/bash
# Let's check for Toast dependency declarations more thoroughly
# Check for Toast-related imports and usages
rg -i "import.*Toast" -A 2
# Check for any Toast-related dependency declarations in Project files
fd "Project" -x rg -i "toast" -A 3
# Check for any SPM package declarations
fd "Package.swift" -x cat {}
# Check for any Tuist dependency declarations
fd "Dependencies.swift" -x cat {}
Length of output: 19614
Projects/DesignSystem/Project.swift (2)
17-18
: 의존성 추가가 적절합니다.
토스트 기능의 전역 구현을 위한 .toast
의존성 추가가 PR 목적에 부합합니다.
17-18
: toast 라이브러리 통합 검증이 필요합니다.
toast 라이브러리가 프로젝트 전체에서 올바르게 구성되었는지 확인이 필요합니다.
다음 스크립트를 실행하여 검증하세요:
✅ Verification successful
Let me gather more information about the Toast implementation to ensure it's properly integrated.
Toast 라이브러리가 올바르게 통합되었음을 확인했습니다.
Toast 구현이 다음과 같이 적절하게 이루어져 있습니다:
ToastHelper
클래스를 통한 일관된 인터페이스 제공- 정상적인 사용 사례들이
HomeMain
과Profile
기능에서 확인됨 - 디자인 시스템에 맞춘 커스텀 스타일링 구현
- 적절한 에러 처리와 메시지 표시 기능 구현
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: toast 라이브러리 통합 검증
# Tuist 패키지 설정에서 toast-swift 버전 확인
echo "Checking toast-swift version in Package.swift:"
cat Tuist/Package.swift | grep -A 2 "toast-swift"
# toast 관련 import 문 검색
echo -e "\nChecking toast imports across the project:"
rg "import.*Toast" --type swift
# toast 사용 패턴 검색
echo -e "\nChecking toast usage patterns:"
rg "Toast\." --type swift
Length of output: 831
Script:
#!/bin/bash
# Check Toast implementation details
echo "Checking Toast implementation file content:"
cat Projects/DesignSystem/DesignCore/Sources/Toast/Toast.swift
# Check if there are any test files for Toast
echo -e "\nChecking for Toast test files:"
fd "Toast.*Test" --type f
# Check for any usage of Toast in other UI components
echo -e "\nChecking Toast usage in UI components:"
rg "Toast" --type swift --glob '!**/Toast/**'
Length of output: 5957
Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionIntent.swift (1)
26-26
: 성공 핸들러 초기화가 올바르게 구현되었습니다.
의존성 주입 패턴을 잘 따르고 있으며, 입력으로 받은 핸들러를 모델에 적절하게 전달하고 있습니다.
Tuist/Package.swift (1)
42-44
: 토스트 라이브러리 버전 검토 필요
현재 지정된 버전(2.1.2)이 최신 보안 패치와 기능을 포함하고 있는지 확인이 필요합니다.
✅ Verification successful
현재 사용 중인 버전이 최신 버전입니다
Package.swift에 지정된 toast-swift 2.1.2 버전이 현재 GitHub의 최신 릴리스 버전과 일치합니다. 또한 리포지토리가 최근까지도 활발하게 유지보수되고 있어 안정적인 선택으로 판단됩니다.
최근 업데이트 내용:
- iOS 12.0 이상 지원으로 업데이트 (2024-02-07)
- visionOS 지원 추가 (2024-02-07)
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check latest version and activity of toast-swift repository
# Get latest release version
gh api \
-H "Accept: application/vnd.github+json" \
repos/BastiaanJansen/toast-swift/releases/latest --jq .tag_name
# Check recent commits and activity
gh api \
-H "Accept: application/vnd.github+json" \
repos/BastiaanJansen/toast-swift/commits --jq '.[0:3] | .[] | {sha: .sha, date: .commit.author.date, message: .commit.message}'
Length of output: 960
Projects/Features/Home/Sources/HomeMain/HomeMainIntent.swift (1)
14-14
: DesignCore import의 필요성 확인 필요
DesignCore import가 ToastHelper를 위해 필요한 것으로 보이나, 실제로 이 파일에서 DesignCore의 다른 컴포넌트를 사용하는지 확인이 필요합니다.
✅ Verification successful
DesignCore import는 ToastHelper 사용을 위해 필요합니다
DesignCore 모듈의 ToastHelper를 사용하고 있어 해당 import 구문이 필요한 것으로 확인되었습니다. ToastHelper는 DesignCore의 Toast 컴포넌트에 정의되어 있습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check if DesignCore is used elsewhere in the file
rg -l "DesignCore\." Projects/Features/Home/Sources/HomeMain/
Length of output: 122
Script:
#!/bin/bash
# Check the actual usage of DesignCore in HomeMainView.swift and HomeMainIntent.swift
rg "DesignCore\." Projects/Features/Home/Sources/HomeMain/HomeMainView.swift Projects/Features/Home/Sources/HomeMain/HomeMainIntent.swift -A 2
Length of output: 924
Script:
#!/bin/bash
# Check if there are any toast-related components from DesignCore being used
rg "Toast" Projects/Features/Home/Sources/HomeMain/HomeMainIntent.swift -A 2
Length of output: 126
Script:
#!/bin/bash
# Check where ToastHelper is defined and if it's from DesignCore
rg "class ToastHelper" -A 2
Length of output: 282
Script:
#!/bin/bash
# Check all imports in HomeMainIntent.swift
rg "^import" Projects/Features/Home/Sources/HomeMain/HomeMainIntent.swift
Length of output: 174
Tuist/Package.resolved (2)
65-73
: 의존성 추가 승인
전역 토스트 기능 구현을 위한 toast-swift 라이브러리 추가가 적절해 보입니다.
67-73
: toast-swift 라이브러리 버전 및 보안 검증 필요
새로운 종속성 추가가 PR의 목적(전역 토스트 구현)과 잘 부합합니다. 하지만 안정성을 위해 다음 사항들을 확인해주세요.
✅ Verification successful
toast-swift 라이브러리 버전이 최신이며 보안 문제 없음을 확인했습니다
현재 사용 중인 2.1.2 버전이 최신 릴리스 버전과 일치하며, 보안 관련 이슈도 발견되지 않았습니다. 안전하게 사용하셔도 좋습니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check latest version and security concerns for toast-swift
# Check latest release version from GitHub API
echo "Latest release version:"
gh api repos/BastiaanJansen/toast-swift/releases/latest --jq .tag_name
# Check open issues related to security
echo -e "\nSecurity related issues:"
gh api repos/BastiaanJansen/toast-swift/issues --jq '.[] | select(.title | test("security|vulnerability"; "i")) | {title: .title, url: .html_url}'
Length of output: 349
Projects/DesignSystem/DesignCore/Sources/Toast/ToastView.swift (1)
22-25
: 구조적으로 잘 구현되었습니다!
SwiftUI의 관례를 잘 따르고 있으며, 디바이스의 bottom inset을 고려한 구현이 적절합니다.
Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionModel.swift (2)
23-23
: 프로토콜 구현이 적절합니다!
상태 프로토콜에 성공 핸들러를 읽기 전용 프로퍼티로 추가한 것이 적절합니다. 이는 MVVM 패턴의 단방향 데이터 흐름을 잘 준수하고 있습니다.
58-58
: 액션 메서드 선언이 일관성 있게 작성되었습니다!
setSuccessHandler
메서드가 다른 액션 메서드들과 동일한 네이밍 패턴을 따르고 있어 일관성이 잘 유지되었습니다.
Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingIntent.swift (3)
32-32
: 성공 핸들러 설정이 적절히 구현되었습니다.
초기화 시점에 successHandler를 설정하는 것이 적절합니다. 옵셔널 체이닝도 올바르게 처리되었습니다.
56-56
: DataModel의 successHandler 선언이 적절합니다.
옵셔널 클로저 타입으로 선언된 것이 Swift의 관례에 맞습니다.
91-93
: 모달 닫기 후 성공 핸들러 호출 순서 검토 필요
모달을 닫은 후에 성공 핸들러를 호출하고 있습니다. 토스트 메시지가 적절히 표시되기 위해서는 순서가 올바른지 확인이 필요합니다.
토스트 메시지가 모달이 닫힌 후에도 정상적으로 표시되는지 확인해주세요.
Projects/Features/Home/Sources/Profile/ProfileIntent.swift (3)
14-14
: DesignCore 모듈 import 확인됨
토스트 기능 구현을 위한 DesignCore 모듈 import가 적절히 추가되었습니다.
44-44
: 프로토콜에 refreshUserInfo 메서드가 적절히 추가됨
사용자 정보 갱신을 위한 비동기 메서드가 프로토콜에 잘 정의되었습니다.
95-99
: 사용자 정보 갱신 로직 승인
refreshUserInfo 메서드가 적절히 구현되었습니다. 옵셔널 체이닝과 에러 처리가 잘 되어있습니다.
Projects/Core/CommonKit/Sources/AppCoordinator.swift (1)
24-24
: @published 수식어 추가로 반응형 데이터 처리 개선
SwiftUI의 반응형 데이터 흐름을 위해 @Published
수식어를 추가한 것이 적절합니다. 이를 통해 userInfo
변경 시 관련 뷰들이 자동으로 업데이트될 수 있습니다.
Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingModel.swift (1)
46-46
:
메모리 관리 개선 필요
클로저 프로퍼티는 잠재적인 순환 참조 위험이 있습니다.
다음과 같이 수정하는 것을 권장합니다:
- var successHandler: (() -> Void)?
+ private weak var successHandler: (() -> Void)?
또한 프로퍼티를 private으로 선언하여 캡슐화를 개선하는 것이 좋습니다.
Likely invalid or redundant comment.
Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionView.swift (2)
27-34
: 초기화 구문에 성공 핸들러가 잘 추가되었습니다.
성공 핸들러를 통해 위젯 선택 완료 시의 콜백을 처리할 수 있도록 개선되었습니다. 이는 PR의 목적인 전역 토스트 구현과 잘 부합합니다.
83-84
: WidgetWritingView로의 네비게이션이 개선되었습니다.
isPushed와 successHandler를 전달하여 위젯 작성 화면에서도 성공 처리가 가능하도록 구현되었습니다.
Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingView.swift (1)
51-55
: 구조화된 초기화 구현이 잘 되었습니다.
명명된 매개변수를 사용하여 의도가 명확하고 가독성이 좋습니다.
Projects/DesignSystem/DesignCore/Sources/Toast/Toast.swift (1)
80-82
: 윈도우 레벨 관리 개선 필요
현재 구현된 윈도우 레벨(.statusBar + 1)이 다른 시스템 오버레이나 얼럿과 충돌할 수 있습니다.
다음 스크립트로 다른 윈도우 레벨 사용을 확인해보세요:
윈도우 레벨을 설정값으로 관리하고, 다른 오버레이와의 우선순위를 고려하여 결정하는 것이 좋습니다.
✅ Verification successful
Let me search for more context about window management in the codebase.
Let me check one more thing to see if there are any other window-related implementations or system overlays in the codebase.
토스트 윈도우 레벨 설정이 적절합니다
코드베이스 분석 결과, 현재 구현된 윈도우 레벨(.statusBar + 1)은 적절한 것으로 판단됩니다. 다음과 같은 이유로 충돌 우려가 없습니다:
- 프로젝트 내에서 다른 시스템 오버레이나 윈도우 레벨 설정이 발견되지 않았습니다
- 토스트는 일시적으로 표시되는 UI 요소이므로 현재 레벨이 적합합니다
- 키보드나 다른 시스템 UI와의 충돌 가능성이 낮습니다
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# 프로젝트에서 UIWindow.Level 사용 검색
rg "windowLevel|UIWindow.Level"
Length of output: 141
Script:
#!/bin/bash
# Search for window-related code and alert/overlay implementations
rg -A 5 "class.*Window|UIWindow|overlay|alert" --type swift
Length of output: 6822
Script:
#!/bin/bash
# Search for any other window or system overlay related implementations
rg "\.statusBar|\.alert|\.normal|\.key" --type swift
Length of output: 4524
Projects/Features/Home/Sources/Profile/ProfileView.swift (1)
114-114
: 식별자 변경이 적절해 보입니다만, 검증이 필요합니다.
\.widgetType.toDto
를 식별자로 사용하는 것이 \.self
보다 안정적입니다. 하지만 toDto
구현이 고유성을 보장하는지 확인이 필요합니다.
✅ Verification successful
toDto
변환이 고유성을 보장하는 것이 확인되었습니다.
WidgetType
의 toDto
구현을 확인한 결과, 각 위젯 타입이 서로 다른 고유한 enum 케이스(HOBBY
, STYLE
, MBTI
, MUSIC
, BODY_TYPE
)로 1:1 매핑되어 있어 식별자로 사용하기에 안전합니다.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify toDto implementation in WidgetType
ast-grep --pattern 'enum WidgetType {
$$$
func toDto($$$) {
$$$
}
$$$
}'
Length of output: 86
Script:
#!/bin/bash
# Search for WidgetType and toDto in Swift files
rg -t swift "WidgetType|toDto" -A 5
Length of output: 34433
Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingIntent.swift
Show resolved
Hide resolved
Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingModel.swift
Show resolved
Hide resolved
@coderabbitai resolve |
✅ Actions performedComments resolved. |
구현사항
Summary by CodeRabbit
toast-swift
추가.