Skip to content
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

Merged
merged 5 commits into from
Nov 21, 2024

Conversation

jisu15-kim
Copy link
Member

@jisu15-kim jisu15-kim commented Nov 20, 2024

구현사항

  • View 에 종속되어있던 Toast 를 전역으로 관리
  • Toast 라이브러리 import
  • window 를 생성하여 띄우도록 구현함
  • 프로필 위젯 생성 / 수정 / 삭제시 토스트 적용

Summary by CodeRabbit

  • 신규 기능
    • 사용자 피드백을 위한 토스트 알림 기능 추가.
    • 프로필 위젯 삭제 후 사용자 정보 새로 고침 및 성공 메시지 표시 기능 개선.
    • 홈 화면에 새로운 버튼 추가로 사용자 상호작용 향상.
    • 사용자 정보 갱신 시 토스트 메시지 표시 기능 추가.
  • 버그 수정
    • 사용자 정보 갱신 시 오류 처리 로직 강화.
  • 문서화
    • 새로운 패키지 의존성 toast-swift 추가.
  • 리팩토링
    • 사용자 정보 처리 및 인증 상태 관리 로직 개선.
  • 스타일
    • 토스트 알림 스타일 및 구성 개선.

@jisu15-kim jisu15-kim added the Feature 기능 label Nov 20, 2024
@jisu15-kim jisu15-kim self-assigned this Nov 20, 2024
Copy link
Contributor

coderabbitai bot commented Nov 20, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

이 PR에서는 AppCoordinator 클래스의 사용자 정보 관리 및 인증 상태 처리를 개선하는 변경 사항과 함께, 새로운 Toast 기능을 도입하여 사용자 피드백을 강화합니다. AppCoordinatoruserInfo 속성이 @Published로 변경되어 UI가 자동으로 업데이트되며, 사용자 정보 갱신 메서드가 수정되었습니다. 또한, ToastHelperToastManager 클래스를 추가하여 애플리케이션 내에서 토스트 알림을 표시하는 기능이 구현되었습니다.

Changes

파일 경로 변경 요약
Projects/Core/CommonKit/Sources/AppCoordinator.swift userInfo 속성을 @Published로 변경, refreshMyUserInfo() 메서드의 반환 타입을 UserInfo?로 변경, validateToken 메서드 수정.
Projects/DesignSystem/DesignCore/Sources/Toast/Toast.swift ToastHelperToastManager 클래스 추가, 토스트 스타일을 정의하는 ToastStyle 열거형 추가, 여러 메서드 추가.
Projects/DesignSystem/DesignCore/Sources/Toast/ToastView.swift Toast 구조체를 ToastView로 이름 변경, 관련 메서드 업데이트.
Projects/DesignSystem/Project.swift designCore 타겟에 .toast 외부 의존성 추가.
Projects/Features/Home/Sources/HomeMain/HomeMainIntent.swift onTapNextButton 메서드에 토스트 메시지 표시 코드 추가.
Projects/Features/Home/Sources/HomeMain/HomeMainView.swift 첫 번째 탭에 "토스트!" 버튼 추가, onTapNextButton 메서드 호출.
Projects/Features/Home/Sources/Profile/ProfileIntent.swift refreshUserInfo() 메서드 추가, deleteWidget 메서드 수정하여 토스트 메시지 표시.
Projects/Features/Home/Sources/Profile/ProfileView.swift ForEach 루프에서 식별자 변경, 모달 프레젠테이션 후 사용자 정보 갱신 로직 수정.
Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionIntent.swift DataModel 구조체에 successHandler 속성 추가, 초기화 메서드 수정.
Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionModel.swift Stateful 프로토콜 및 WidgetSelectionModel 클래스에 successHandler 속성 추가.
Projects/Features/Home/Sources/Widget/WidgetSelection/WidgetSelectionView.swift WidgetSelectionView 초기화 메서드에 successHandler 매개변수 추가.
Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingIntent.swift DataModel 구조체에 successHandler 속성 추가, 메서드 변경.
Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingModel.swift Stateful 프로토콜 및 WidgetWritingModel 클래스에 successHandler 속성 추가.
Projects/Features/Home/Sources/Widget/WidgetWriting/WidgetWritingView.swift WidgetWritingView 초기화 메서드에 successHandler 매개변수 추가.
Tuist/Package.resolved toast-swift 패키지 의존성 추가.
Tuist/Package.swift toast-swift 패키지 의존성 추가.
Tuist/ProjectDescriptionHelpers/Dependency+extensions.swift ExternalDependency 열거형에 toast 케이스 추가.

Possibly related PRs

Suggested labels

Design

🐰 "변화의 바람이 불어와,
토스트가 솟아오르네!
사용자 피드백이 반짝이고,
정보가 새로워지네.
함께 뛰는 이 순간,
우리 모두 행복하네!" 🥕


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?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 구조체에 대한 개선 제안

다음 사항들을 고려해보시기 바랍니다:

  1. successHandler의 용도와 호출 시점에 대한 문서화가 필요합니다
  2. 메모리 순환 참조를 방지하기 위해 핸들러를 weak 캡처로 변경하는 것이 좋을 수 있습니다

다음과 같이 개선해보세요:

 struct DataModel {
+    /// 위젯 선택 작업이 성공적으로 완료되었을 때 호출되는 핸들러
+    /// 토스트 메시지 표시 등의 UI 피드백을 처리하는데 사용됩니다
-    let successHandler: (() -> Void)?
+    let successHandler: (() -> Void)? // [weak self] in 구문으로 캡처하는 것을 권장
 }
Tuist/Package.swift (1)

42-44: 토스트 구현 아키텍처 제안

전역 토스트 관리를 위한 의존성이 추가된 것으로 보입니다. 다음 사항들을 고려해 주세요:

  1. 싱글톤 패턴을 통한 전역 토스트 매니저 구현
  2. 토스트 표시 위치와 스타일의 일관성 유지
  3. 접근성(VoiceOver) 지원 확인

토스트 매니저 구현에 대한 상세한 가이드가 필요하시다면 도움을 드릴 수 있습니다.

Projects/DesignSystem/DesignCore/Sources/Toast/ToastView.swift (1)

Line range hint 49-89: 코드 개선을 위한 제안사항이 있습니다.

다음과 같은 개선사항들을 고려해보시면 좋을 것 같습니다:

  1. 매직 넘버를 상수로 추출
  2. 애니메이션 및 토스트 표시 시간을 외부에서 설정 가능하도록 수정
  3. 메모리 관리 개선

다음과 같이 수정해보시는 건 어떨까요?:

 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. 에러 처리 시 1초 지연은 불필요할 수 있습니다
  2. 매직 넘버(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: 버튼 스타일링 및 접근성 개선이 필요합니다.

현재 토스트 버튼 구현에 다음과 같은 개선사항을 제안드립니다:

  1. DesignCore의 일관된 스타일링 적용
  2. 접근성 레이블 추가
  3. 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

📥 Commits

Reviewing files that changed from the base of the PR and between c20ec95 and e89cc51.

📒 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 클래스를 통한 일관된 인터페이스 제공
  • 정상적인 사용 사례들이 HomeMainProfile 기능에서 확인됨
  • 디자인 시스템에 맞춘 커스텀 스타일링 구현
  • 적절한 에러 처리와 메시지 표시 기능 구현
🏁 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: ⚠️ Potential issue

메모리 관리 개선 필요

클로저 프로퍼티는 잠재적인 순환 참조 위험이 있습니다.

다음과 같이 수정하는 것을 권장합니다:

- 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 변환이 고유성을 보장하는 것이 확인되었습니다.

WidgetTypetoDto 구현을 확인한 결과, 각 위젯 타입이 서로 다른 고유한 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

@jisu15-kim
Copy link
Member Author

@coderabbitai resolve

@jisu15-kim jisu15-kim merged commit 29cae89 into develop Nov 21, 2024
0 of 2 checks passed
@jisu15-kim jisu15-kim deleted the feature/WEAV-137 branch November 21, 2024 15:28
Copy link
Contributor

coderabbitai bot commented Nov 21, 2024

✅ Actions performed

Comments resolved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feature 기능
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant