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-46] Design Component 구현 #19

Merged
merged 8 commits into from
Sep 22, 2024
Merged

[WEAV-46] Design Component 구현 #19

merged 8 commits into from
Sep 22, 2024

Conversation

jisu15-kim
Copy link
Member

@jisu15-kim jisu15-kim commented Sep 22, 2024

구현사항

필요한 작업

  • Icon Button (디자인 필요)
  • Navigation Bar (Feature 와 함께 적용 필요)

Summary by CodeRabbit

  • 새로운 기능
    • 앱 아이콘 이미지 파일명이 logo.png에서 appicon.png로 변경되었습니다.
    • South Korean 모바일 번호를 처리하는 메소드가 추가되었습니다.
    • 사용자가 화면을 탭하여 키보드를 숨길 수 있는 기능이 추가되었습니다.
    • 새로운 SwiftUI 컴포넌트들이 추가되었습니다: BackgroundTextureView, CTABottomButton, CTAButton, TextInputView, ToastView, TooltipView, DesignBackgroundTextureView, DesignButtonView, DesignTextInputPreview, DesignToastView, DesignToolTipView, DesignShadowView.
    • 새로운 색상 자원 및 이미지 자원이 추가되었습니다.
  • 버그 수정
    • 디자인 색상 참조가 업데이트되었습니다.
  • 문서화
    • PreviewTypes 열거형에 여러 새로운 케이스가 추가되었습니다.

jisu15-kim and others added 8 commits September 21, 2024 00:50
* [WEAV-54] background texture image import

* [WEAV-54] Texture Background View, Modifier 생성 적용

* [WEAV-54] Device Size 로 설정하도록 변경, aspectRatio 수정
* [WEAV-48] CTA Bottom Button 생성

* [WEAV-48] CTA Button 컴포넌트 생성

* [WEAV-48] CTA Button Preview 생성
* [WEAV-49] TextInput 생성

* [WEAV-49] Design Preview 생성

* [WEAV-49] 전화번호 검증 텍스트필드 생성

* [WEAV-49] 전화번호 검증 테스트코드 작성
* [WEAV-50] Toast, View Modifier, Extension 생성

* [WEAV-50] Toast Preview 생성
@jisu15-kim jisu15-kim self-assigned this Sep 22, 2024
Copy link

coderabbitai bot commented Sep 22, 2024

Walkthrough

이번 변경 사항은 iOS 프로젝트의 다양한 파일에서 여러 기능을 추가하고 수정하는 내용을 포함합니다. 주요 변경 사항으로는 앱 아이콘 파일 이름 변경, SwiftUI 뷰 및 메서드 추가, 색상 자원 정의, 그리고 테스트 파일의 추가 및 삭제가 있습니다. 이러한 변경은 디자인 시스템과 UI 구성 요소의 일관성을 높이는 데 기여합니다.

Changes

파일 경로 변경 요약
Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json 앱 아이콘 이미지 파일 이름을 logo.png에서 appicon.png로 변경.
Projects/App/Sources/ContentView.swift, ThreeDaysApp.swift 색상 참조를 DesignCore.red300에서 DesignCore.Colors.red300으로 변경.
Projects/Core/CoreKit/Sources/String+Ext.swift String 클래스에 한국 모바일 번호를 처리하는 두 개의 공개 메서드 추가.
Projects/Core/CoreKit/Sources/UIApplication+Ext.swift UIApplication 클래스에 키보드를 숨기는 메서드 추가.
Projects/Core/CoreKit/UnitTest/CoreKitTest.swift CoreKitTest 클래스 삭제.
Projects/Core/CoreKit/UnitTest/StringExtensionText.swift 전화번호 유효성 검사 및 포맷을 위한 테스트 클래스 추가.
Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/* 여러 색상 자원 정의 추가 및 기존 색상 값 수정.
Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/* 여러 이미지 자원 정의 추가.
Projects/DesignSystem/DesignCore/Sources/* 여러 SwiftUI 뷰 및 메서드 추가, UI 구성 요소의 기능 확장.
Tuist/ResourceSynthesizers/Assets.stencil image 프로퍼티를 선택적 속성에서 비선택적 속성으로 변경.

Possibly related PRs

🐰 변화의 춤을 춰요,
색과 아이콘이 빛나죠!
새로운 뷰가 나타나,
디자인이 더 멋져져요.
함께 뛰어놀며 즐겨요! 🌈


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

@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 (7)
Projects/DesignSystem/DesignCore/Sources/CornerRadius+Ext.swift (1)

17-26: RoundedCorner 모양 구현을 승인합니다.

RoundedCorner 모양은 UIBezierPath를 사용하여 둥근 모서리 사각형 경로를 올바르게 생성합니다. 구현이 명확하고 간결합니다.

정적 분석 힌트에 따라 fileprivate 대신 private 액세스 제어자를 사용하는 것이 좋습니다.

다음 diff를 적용하여 fileprivateprivate로 변경하세요:

-fileprivate struct RoundedCorner: Shape {
+private struct RoundedCorner: Shape {
Tools
SwiftLint

[Warning] 17-17: Prefer private over fileprivate declarations

(private_over_fileprivate)

Projects/Features/DesignPreview/Sources/DesignToastView.swift (1)

24-24: 하드코딩된 한국어 텍스트를 지역화된 문자열로 추출하는 것이 좋겠습니다.

현재 토스트 메시지가 한국어로 하드코딩되어 있어, 추후 앱의 국제화에 제한이 될 수 있습니다. 이 텍스트를 지역화된 문자열로 추출하여 향후 번역을 용이하게 하는 것이 좋겠습니다.

Projects/Core/CoreKit/Sources/String+Ext.swift (1)

22-36: 가독성을 높이기 위해 components(separatedBy:)를 사용하는 것을 고려해보세요.

현재 구현은 잘 동작하지만, 번호를 부분별로 나누는 로직이 조금 복잡해 보입니다. components(separatedBy:) 메서드를 사용하면 코드를 더 간결하고 이해하기 쉽게 만들 수 있습니다.

예를 들면 다음과 같이 리팩토링할 수 있습니다:

public func formattedPhoneNumber() -> String {
    let onlyNumbers = self.filter { $0.isNumber }
    let parts = onlyNumbers.components(separatedBy: [3, 7])
    
    switch parts.count {
    case 1:
        return parts[0]
    case 2:
        return "\(parts[0])-\(parts[1])"
    default:
        return "\(parts[0])-\(parts[1])-\(parts[2])"
    }
}

이렇게 하면 번호를 부분별로 나누는 로직이 더 명확해집니다. 어떻게 생각하시나요?

Projects/Features/DesignPreview/Sources/DesignShadowView.swift (1)

12-42: 잘 구현되었습니다!

DesignShadowView는 그림자 스타일의 사용법을 명확하게 보여주는 잘 구조화된 뷰입니다. 뷰와 구성 요소의 이름이 설명적이며 프로젝트의 명명 규칙을 따릅니다. 또한 DesignCore 모듈을 사용하여 프로젝트 전반에 걸쳐 일관성을 유지하고 있습니다.

개선 제안으로는, 향후 다양한 그림자 스타일을 추가할 경우를 대비하여 HStackspacing을 조정 가능한 상수로 추출하는 것이 좋겠습니다. 이렇게 하면 뷰의 레이아웃을 더 쉽게 제어할 수 있습니다.

Projects/Features/DesignPreview/Sources/DesignButtonView.swift (2)

20-21: Placeholder 텍스트를 하드코딩하는 대신 뷰 속성으로 제공하는 것이 좋습니다.

현재 placeholder 텍스트가 하드코딩되어 있어 지역화나 재사용성 측면에서 이상적이지 않습니다. 대신 뷰 속성으로 placeholder 텍스트를 제공하면 뷰를 더 유연하게 사용할 수 있습니다.

-TextField("Placeholder", text: $text)
+TextField(placeholderText, text: $text)

22-32: 버튼 패딩을 하드코딩하는 대신 뷰 속성으로 제공하는 것이 좋습니다. 또한 버튼 액션을 구현해야 합니다.

현재 버튼의 수평 패딩이 하드코딩되어 있어 다양한 화면 크기에 적응하기 어려울 수 있습니다. 대신 뷰 속성으로 패딩 값을 제공하면 뷰를 더 유연하게 사용할 수 있습니다.

또한 버튼의 액션 클로저가 비어 있는데, 이는 아직 버튼 액션이 구현되지 않았음을 나타냅니다. 버튼 액션을 구현해야 합니다.

버튼 액션 구현을 도와드릴까요? 아니면 이 작업을 추적하기 위해 GitHub 이슈를 열어드릴까요?

Projects/Features/DesignPreview/Sources/DesignTextInputPreview.swift (1)

75-80: 전화번호 유효성 검사 로직을 개선해 보세요.

현재 전화번호 유효성 검사는 phoneTextInput의 변경 사항에 대해 onChange 수정자 내에서 수행됩니다. 그러나 이 접근 방식은 유효성 검사 로직이 뷰 코드에 포함되어 있어 관심사의 분리 원칙을 위반할 수 있습니다.

대신 전화번호 유효성 검사 로직을 별도의 함수 또는 확장으로 추출하는 것이 좋습니다. 이렇게 하면 코드의 가독성과 유지 관리성이 향상되고 필요한 경우 로직을 더 쉽게 재사용할 수 있습니다.

예를 들어 다음과 같이 변경할 수 있습니다:

+private func validatePhoneNumber(_ phone: String) -> Bool {
+    let editedPhone = phone.formattedPhoneNumber()
+    return editedPhone.isValidPhoneNumber()
+}

 TextInput(
     placeholder: "전화번호를 입력하세요",
     backgroundColor: .white,
     text: $phoneTextInput,
     keyboardType: .phonePad,
     leftView: {
         HStack(spacing: 6) {
             DesignCore.Images.flagKorea.image
             Text("+82")
                 .foregroundStyle(DesignCore.Colors.grey200)
                 .typography(.medium_16)
             Rectangle()
                 .frame(
                     width: 1,
                     height: 11
                 )
                 .foregroundStyle(Color(hex: 0xE8E6E4))
         }
     },
     rightIcon: phoneRightIcon
 )
 .onChange(of: phoneTextInput) {
-    print(phoneTextInput)
-    let editedPhone = phoneTextInput.formattedPhoneNumber()
-    phoneTextInput = editedPhone
-    isPhoneValidated = editedPhone.isValidPhoneNumber()
+    phoneTextInput = phoneTextInput.formattedPhoneNumber()
+    isPhoneValidated = validatePhoneNumber(phoneTextInput)
 }
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 812bbe9 and 375641f.

Files ignored due to path filters (16)
  • Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/appicon.png is excluded by !**/*.png
  • Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/logo.png is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/alert.imageset/alert.png is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/alert.imageset/[email protected] is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/alert.imageset/[email protected] is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/background_default.imageset/[email protected] is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/background_default.imageset/[email protected] is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/check_bold.imageset/check_bold.png is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/check_bold.imageset/[email protected] is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/check_bold.imageset/[email protected] is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/flag_korea.imageset/flag_korea.png is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/flag_korea.imageset/[email protected] is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/flag_korea.imageset/[email protected] is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/search.imageset/search.png is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/search.imageset/[email protected] is excluded by !**/*.png
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/search.imageset/[email protected] is excluded by !**/*.png
Files selected for processing (40)
  • Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json (1 hunks)
  • Projects/App/Sources/ContentView.swift (1 hunks)
  • Projects/App/Sources/ThreeDaysApp.swift (1 hunks)
  • Projects/Core/CoreKit/Sources/String+Ext.swift (1 hunks)
  • Projects/Core/CoreKit/Sources/UIApplication+Ext.swift (1 hunks)
  • Projects/Core/CoreKit/UnitTest/CoreKitTest.swift (0 hunks)
  • Projects/Core/CoreKit/UnitTest/StringExtensionText.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Blue300.colorset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Green100.colorset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Grey50.colorset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Pink100.colorset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Yellow100.colorset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/alert.imageset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/background_default.imageset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/check_bold.imageset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/flag_korea.imageset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/search.imageset/Contents.json (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/BackgroundTextureView.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/CTAButton/CTABottomButton.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/CTAButton/CTAButton.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/CornerRadius+Ext.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/Device.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/KeyboardResponder.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/LinearGradient+Ext.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/Shadows.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/TextInput/TextInputView.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/Toast/ToastView.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/Tooltip/ToolTip.swift (1 hunks)
  • Projects/DesignSystem/DesignCore/Sources/Typography.swift (3 hunks)
  • Projects/Features/DesignPreview/Sources/DesignBackgroundTextureView.swift (1 hunks)
  • Projects/Features/DesignPreview/Sources/DesignButtonView.swift (1 hunks)
  • Projects/Features/DesignPreview/Sources/DesignColorPreview.swift (1 hunks)
  • Projects/Features/DesignPreview/Sources/DesignPreview.swift (2 hunks)
  • Projects/Features/DesignPreview/Sources/DesignShadowView.swift (1 hunks)
  • Projects/Features/DesignPreview/Sources/DesignTextInputPreview.swift (1 hunks)
  • Projects/Features/DesignPreview/Sources/DesignToastView.swift (1 hunks)
  • Projects/Features/DesignPreview/Sources/DesignToolTipView.swift (1 hunks)
  • Projects/Features/DesignPreview/Sources/DesignTypographyPreview.swift (2 hunks)
  • Tuist/ResourceSynthesizers/Assets.stencil (1 hunks)
Files not reviewed due to no reviewable changes (1)
  • Projects/Core/CoreKit/UnitTest/CoreKitTest.swift
Files skipped from review due to trivial changes (1)
  • Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/Contents.json
Additional context used
SwiftLint
Projects/DesignSystem/DesignCore/Sources/BackgroundTextureView.swift

[Warning] 26-26: Prefer private over fileprivate declarations

(private_over_fileprivate)

Projects/DesignSystem/DesignCore/Sources/CTAButton/CTABottomButton.swift

[Error] 35-35: Force casts should be avoided

(force_cast)

Projects/DesignSystem/DesignCore/Sources/CTAButton/CTAButton.swift

[Error] 32-32: Force casts should be avoided

(force_cast)

Projects/DesignSystem/DesignCore/Sources/CornerRadius+Ext.swift

[Warning] 17-17: Prefer private over fileprivate declarations

(private_over_fileprivate)

Projects/DesignSystem/DesignCore/Sources/Shadows.swift

[Warning] 16-16: Prefer private over fileprivate declarations

(private_over_fileprivate)

Projects/DesignSystem/DesignCore/Sources/Tooltip/ToolTip.swift

[Warning] 47-47: Prefer private over fileprivate declarations

(private_over_fileprivate)

Additional comments not posted (75)
Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json (1)

4-4: 파일명 변경이 적절해 보입니다.

앱 아이콘 이미지 파일명을 logo.png에서 appicon.png로 변경한 것은 적절해 보입니다. 다만, 실제로 appicon.png 파일이 존재하고 유효한 앱 아이콘 이미지인지 확인이 필요합니다.

appicon.png 파일이 실제로 존재하고 유효한 앱 아이콘 이미지인지 확인해 주세요. 파일이 없거나 유효하지 않은 이미지라면 앱 아이콘이 제대로 표시되지 않을 수 있습니다.

Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Blue300.colorset/Contents.json (1)

8-10: 변경 사항이 적절해 보입니다.

Blue300 색상 세트의 RGB 값을 조정하는 것은 문제없어 보입니다. 색상 공간과 형식이 일관되게 유지되고 있습니다.

Projects/DesignSystem/DesignCore/Sources/LinearGradient+Ext.swift (1)

13-13: LGTM!

DesignCore.Colors 네임스페이스를 통해 그라디언트 색상을 참조하도록 변경한 것은 적절해 보입니다. 이 변경은 코드 구조를 개선하고 가독성을 높이는 데 도움이 될 것 같습니다.

Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Green100.colorset/Contents.json (1)

1-20: 잘 구현되었습니다!

이 파일은 Xcode의 색상 리소스를 정의하기 위한 올바른 JSON 구조를 따르고 있습니다. 색상 공간과 구성 요소가 정확하게 지정되었으며, 이디엄이 "universal"로 설정되어 디자인 시스템 색상에 적합합니다. "info" 섹션의 메타데이터는 Xcode에서 생성된 파일에 대한 표준입니다.

Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Grey50.colorset/Contents.json (1)

1-20: 잘 구현되었습니다!

이 파일은 Xcode에서 색상 리소스를 정의하기 위한 올바른 구조와 규칙을 따르고 있습니다. 색상 값은 "display-p3" 색상 공간과 RGBA 구성 요소를 사용하여 정확하게 지정되었으며, "idiom" 키는 "universal"로 설정되어 다양한 기기에서 사용할 수 있도록 보장합니다.

Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Pink100.colorset/Contents.json (1)

1-20: 잘 정의된 색상 에셋입니다!

이 JSON 파일은 "Pink100"이라는 새로운 색상 에셋을 올바르게 정의하고 있습니다. 색상 공간, 컴포넌트 값, 이디엄 설정 등이 모두 유효하고 적절해 보입니다. 이 색상 에셋은 디자인 시스템에서 잘 활용될 수 있을 것 같네요.

Projects/DesignSystem/DesignCore/Resources/Colors/Colors.xcassets/Yellow100.colorset/Contents.json (1)

1-20: 새로운 색상 리소스 추가를 승인합니다!

이 파일은 Yellow100이라는 새로운 색상 리소스를 정의합니다. 색상은 "display-p3" 색상 공간에서 RGBA 구성 요소로 지정되며, 모든 기기 유형에 사용할 수 있도록 보편적인 이디엄으로 지정됩니다.

이 색상 리소스를 추가하면 디자인 시스템의 색상 팔레트가 확장되며, Yellow100 리소스를 참조하여 앱 전체에서 일관되게 사용할 수 있습니다.

Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/background_default.imageset/Contents.json (1)

1-22: 잘 구성된 에셋 카탈로그입니다!

이 파일은 Xcode의 에셋 카탈로그 구조를 잘 따르고 있습니다. 1x, 2x, 3x 스케일의 이미지를 정의하여 다양한 해상도의 기기에서 선명한 배경 이미지를 제공할 수 있습니다. 코드 변경 사항을 승인합니다.

Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/alert.imageset/Contents.json (1)

1-23: 잘 구성된 이미지 에셋 파일입니다!

이 파일은 Xcode에서 이미지 에셋을 정의하기 위한 표준 구조를 따르고 있습니다. 다양한 디바이스 해상도에 맞게 1x, 2x, 3x 스케일의 이미지가 포함되어 있어, 모든 기기에서 선명한 이미지를 제공할 수 있을 것으로 보입니다.

Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/search.imageset/Contents.json (1)

1-23: 좋아 보입니다!

이 파일은 검색 기능에 필요한 이미지 세트를 정의하는 표준 에셋 카탈로그 구조를 따르고 있습니다. 이미지 배열은 적절한 스케일과 이디엄으로 올바르게 정의되어 있으며, 정보 객체도 올바른 형식입니다.

이 파일은 검색 이미지가 제대로 작동하는 데 필요한 에셋 카탈로그의 필수 부분이며, 구조나 내용에 문제가 없어 보입니다.

Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/check_bold.imageset/Contents.json (1)

1-23: 잘 작성된 에셋 카탈로그 파일입니다!

이 파일은 "check_bold" 에셋에 대한 이미지 변형을 정의하고 있습니다. 1x, 2x, 3x 스케일에 대한 이미지가 모두 포함되어 있어, 다양한 화면 해상도에서 에셋이 올바르게 표시될 것으로 보입니다.

파일 구조와 형식이 Xcode의 에셋 카탈로그 표준을 잘 따르고 있습니다.

Projects/DesignSystem/DesignCore/Resources/Images/Images.xcassets/flag_korea.imageset/Contents.json (1)

1-23: 잘 되어 있습니다!

Contents.json 파일은 한국 국기 이미지 에셋을 위해 잘 구성되어 있습니다. 1x, 2x, 3x의 세 가지 해상도를 지원하며, 파일 이름과 경로도 적절합니다. 이 추가 사항으로 디자인 시스템에서 다양한 해상도의 한국 국기를 사용할 수 있게 되었네요.

Projects/Features/DesignPreview/Sources/DesignBackgroundTextureView.swift (1)

12-21: LGTM!

이 뷰 구조체는 SwiftUI의 표준 뷰 구조를 따르고 있으며, 텍스트 레이블과 텍스처 배경을 포함하는 ZStack을 사용하여 구현되었습니다. 텍스트 스타일링과 내비게이션 타이틀 설정도 적절히 이루어졌습니다. 코드에는 문제가 없어 보입니다.

Projects/App/Sources/ContentView.swift (1)

21-21: 좋아 보입니다!

DesignCore.red300에서 DesignCore.Colors.red300으로의 변경은 DesignCore 모듈 내에서 색상 정의를 더 잘 구성하고 구조화하는 방향으로의 개선을 나타냅니다. 이는 관련 색상 정의를 함께 그룹화함으로써 코드 구성과 유지 관리성을 향상시킵니다.

색상 값 자체는 변경되지 않았으므로 SampleComponent의 기능에는 영향을 미치지 않을 것으로 보입니다.

Projects/DesignSystem/DesignCore/Sources/CornerRadius+Ext.swift (1)

11-15: LGTM!

View 확장은 특정 모서리를 둥글게 만드는 간단하고 유용한 방법을 제공합니다. 메서드 시그니처와 구현이 명확하고 간결합니다.

Projects/Features/DesignPreview/Sources/DesignToastView.swift (1)

1-35: DesignToastView 구현이 잘 되었습니다!

SwiftUI 모범 사례를 따르고 있으며, 뷰의 구조가 깔끔합니다. @State 변수를 사용하여 토스트 표시 여부를 적절히 관리하고 있고, ZStack을 활용하여 배경과 버튼을 깔끔하게 배치했습니다. CTAButton도 다른 디자인 컴포넌트와 일관되게 사용되고 있습니다. 네비게이션 속성도 사용자 경험을 고려하여 올바르게 설정되었으며, 프리뷰를 통해 개발 중에 뷰를 시각화할 수 있어 좋습니다.

Projects/Core/CoreKit/Sources/UIApplication+Ext.swift (2)

11-19: 잘 구현되었습니다!

hideKeyboard() 메서드는 UIApplication의 window에 tap gesture recognizer를 추가하여 키보드를 숨기는 기능을 잘 구현하고 있습니다. 코드의 로직과 구현이 정확합니다.


21-25: 프로토콜 채택과 메서드 구현이 잘 되었습니다!

UIApplicationUIGestureRecognizerDelegate 프로토콜을 채택하고, gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) 메서드를 구현하여 gesture recognizer가 다른 gesture recognizer와 동시에 제스처를 인식하지 않도록 설정한 것이 올바릅니다.

Projects/App/Sources/ThreeDaysApp.swift (1)

46-46: 좋아 보입니다!

디자인 코어의 색상 정의가 재구성되거나 재구성된 것으로 보입니다. 새로운 색상 참조는 더 구조화된 명명 규칙을 따르므로 코드 가독성과 유지 관리성이 향상됩니다.

Projects/DesignSystem/DesignCore/Sources/Shadows.swift (2)

11-14: 잘 구현되었습니다!

ShadowType enum은 적용할 그림자의 유형을 지정하는 깔끔하고 간결한 방법을 제공합니다. case 이름도 적절하게 지어졌으며 Swift 명명 규칙을 잘 따르고 있습니다.


41-45: 잘 구현되었습니다!

View 확장의 shadow(_:) 메서드는 ShadowType을 전달하여 모든 SwiftUI 뷰에 ShadowViewModifier를 쉽게 적용할 수 있는 편리한 방법을 제공합니다. 메서드 시그니처도 명확하고 Swift 명명 규칙을 잘 따르고 있습니다.

Projects/Core/CoreKit/Sources/String+Ext.swift (1)

13-20: 잘 구현되었습니다!

정규식을 사용하여 한국 휴대폰 번호 형식을 정확하게 검증하고 있습니다. 코드가 간결하고 이해하기 쉽습니다.

Projects/DesignSystem/DesignCore/Sources/BackgroundTextureView.swift (2)

11-24: 잘 구현되었습니다!

BackgroundTextureView 구조체는 배경 이미지를 화면 전체에 채우고 안전 영역을 무시하도록 올바르게 구현되었습니다. 이미지 크기와 화면 비율도 적절하게 설정되었습니다.


42-46: 잘 구현되었습니다!

View 확장은 textureBackground() 메서드를 통해 어떤 SwiftUI 뷰에서도 쉽게 배경 텍스처를 적용할 수 있도록 잘 구현되었습니다.

Projects/DesignSystem/DesignCore/Sources/KeyboardResponder.swift (1)

12-38: 잘 구현되었습니다!

KeyboardResponder 클래스는 SwiftUI의 반응형 데이터 흐름과 잘 통합되도록 설계되었습니다. 키보드 표시 및 숨김 알림에 대한 게시자를 올바르게 설정하고 AnyCancellable을 사용하여 구독을 관리합니다. 게시된 속성을 사용하면 뷰가 키보드 가시성 변경에 반응적으로 응답할 수 있습니다. 코드의 논리와 구문에는 문제가 없어 보입니다.

Projects/Features/DesignPreview/Sources/DesignToolTipView.swift (4)

14-39: 구조가 깔끔해요!

ZStackVStack을 사용하여 뷰의 구조를 명확하게 구성했네요. 둥근 사각형 사이의 간격도 일관성이 있어 보기 좋아요.


18-37: 둥근 사각형과 툴팁이 잘 구현되었어요.

세 개의 RoundedRectangle이 일관된 스타일과 크기로 구성되어 있네요. 각 사각형에 연결된 툴팁은 사용자 상호 작용과 관련된 유용한 정보를 제공해요. 툴팁의 오프셋도 적절히 설정되어 있어요.


41-42: 내비게이션 타이틀과 표시 모드가 적절해요.

"Tooltip"이라는 내비게이션 타이틀은 뷰의 목적을 명확하게 나타내요. 인라인 표시 모드로 설정하여 타이틀이 내비게이션 바에 적절히 표시되도록 했네요.


46-48: 프리뷰 제공자 포함이 좋아요.

DesignToolTipView를 Xcode의 캔버스에 렌더링하기 위한 프리뷰 제공자를 포함했네요. 이는 뷰의 개발과 테스트를 용이하게 해주고, 앱을 실행하지 않고도 뷰의 모습을 확인할 수 있게 해줘요.

Projects/Features/DesignPreview/Sources/DesignButtonView.swift (2)

36-45: 하단 CTA 버튼의 구현이 훌륭합니다!

하단 CTA 버튼의 구현이 매우 잘 되었습니다. 버튼의 활성 상태를 동적으로 제어할 수 있고, 키보드 동작이 텍스트 필드의 포커스 상태와 올바르게 연결되어 있습니다. 또한 텍스트 필드에 포커스가 있는 상태에서 버튼을 탭하면 포커스를 해제하는 것도 사용자 경험 측면에서 좋습니다.


47-49: 네비게이션 속성 구성이 적절합니다.

뷰의 네비게이션 속성 구성이 적절합니다. 컨테이너의 하단 가장자리에서 안전 영역을 무시하는 것은 버튼 뷰에 적합하며, 네비게이션 제목을 설정하면 뷰의 목적을 명확히 할 수 있습니다. 또한 "CTA Button"과 같은 간결한 제목에는 인라인 네비게이션 바 제목 표시 모드를 사용하는 것이 좋습니다.

Projects/DesignSystem/DesignCore/Sources/CTAButton/CTAButton.swift (3)

11-16: 구조체 선언과 속성이 잘 정의되어 있습니다!

구조체와 속성의 접근 제어가 적절하게 설정되어 있고, Swift 명명 규칙을 잘 따르고 있습니다. 제네릭 타입 매개변수를 사용하여 배경 스타일을 유연하게 지정할 수 있도록 한 점도 좋습니다.


18-28: 초기화 메서드가 잘 정의되어 있습니다!

초기화 메서드의 매개변수가 적절하게 정의되어 있고, 배경 스타일과 활성 상태에 대한 기본값도 잘 설정되어 있습니다. handler 매개변수에 @escaping 키워드를 사용한 것도 클로저 기반 콜백에 필요하므로 적절합니다.


37-54: 버튼의 구현이 잘 되어 있습니다!

SwiftUI의 선언적 문법을 사용하여 버튼의 구조와 스타일이 잘 정의되어 있습니다. 버튼의 동작은 초기화 메서드에 전달된 handler 클로저에 의해 처리되며, 활성 상태에 따라 버튼이 적절하게 비활성화됩니다.

Projects/DesignSystem/DesignCore/Sources/Device.swift (9)

12-14: 좋아 보입니다!

isMiniSize 프로퍼티는 디바이스의 너비가 380 포인트 미만인지 확인하는 명확하고 간결한 로직을 가지고 있습니다.


16-18: 좋아 보입니다!

width 프로퍼티는 UIScreen.main.bounds.width를 사용하여 디바이스의 화면 너비를 정확하게 가져옵니다.


21-23: 좋아 보입니다!

height 프로퍼티는 UIScreen.main.bounds.height를 사용하여 디바이스의 화면 높이를 정확하게 가져옵니다.


26-28: 좋아 보입니다!

isNotch 프로퍼티는 UIApplication.shared.windows.first?.safeAreaInsets.bottom을 사용하여 하단 안전 영역 삽입을 가져온 다음, 이 값이 0보다 큰지 확인하여 디바이스에 노치가 있는지 판단합니다. 로직이 정확하고 프로퍼티 이름도 명확합니다.


31-33: 좋아 보입니다!

statusBarHeight 프로퍼티는 UIApplication.shared.windows.first?.windowScene?.statusBarManager?.statusBarFrame.height를 사용하여 상태 표시줄의 높이를 가져옵니다. 높이를 가져올 수 없는 경우를 대비하여 nil 병합 연산자 ??를 사용하여 기본값 0을 제공합니다. 로직이 정확하고 프로퍼티 이름도 명확합니다.


36-38: 좋아 보입니다!

navigationBarHeight 프로퍼티는 UINavigationController의 새 인스턴스를 생성하고 navigationBar.frame.height를 사용하여 내비게이션 바의 높이를 가져옵니다. 로직이 정확하고 프로퍼티 이름도 명확합니다.


41-43: 좋아 보입니다!

tabBarHeight 프로퍼티는 UITabBarController의 새 인스턴스를 생성하고 tabBar.frame.height를 사용하여 탭 바의 높이를 가져옵니다. 로직이 정확하고 프로퍼티 이름도 명확합니다.


47-49: 좋아 보입니다!

topInset 프로퍼티는 UIApplication.shared.windows.first?.safeAreaInsets.top을 사용하여 상단 안전 영역 삽입을 가져옵니다. 삽입을 가져올 수 없는 경우를 대비하여 nil 병합 연산자 ??를 사용하여 기본값 0을 제공합니다. 로직이 정확하고 프로퍼티 이름도 명확합니다.


53-55: 좋아 보입니다!

bottomInset 프로퍼티는 UIApplication.shared.windows.first?.safeAreaInsets.bottom을 사용하여 하단 안전 영역 삽입을 가져옵니다. 삽입을 가져올 수 없는 경우를 대비하여 nil 병합 연산자 ??를 사용하여 기본값 0을 제공합니다. 로직이 정확하고 프로퍼티 이름도 명확합니다.

Projects/Features/DesignPreview/Sources/DesignColorPreview.swift (5)

15-20: LGTM!

blackColors 배열이 DesignCore.Colors의 새로운 색상 정의를 잘 참조하고 있습니다. 변경 사항이 명확하고 문제가 없어 보입니다.


24-26: 좋아 보입니다!

tintColors 배열도 DesignCore.Colors의 새로운 색상을 잘 사용하고 있네요. 변경된 부분이 깔끔하고 이상이 없습니다.


28-33: 새로운 lightColors 배열이 잘 추가되었어요!

DesignCore.Colors에서 가져온 색상들로 lightColors 배열을 새롭게 정의했는데, 문제없이 잘 되어 있습니다.


37-40: pastelColors 배열의 색상 정의가 잘 업데이트되었습니다!

DesignCore.Colors의 새로운 파스텔 색상들로 배열 내용을 교체했는데, 변경 사항이 명확하고 이상이 없네요.


47-47: colorGroupslightColors를 잘 추가했어요!

lightColors 배열을 새롭게 정의한 만큼 colorGroups 계산 속성에도 포함시켜 주셨네요. 변경된 그룹 구조도 의도한 대로 잘 반영되었습니다.

Projects/Features/DesignPreview/Sources/DesignPreview.swift (3)

14-19: 잘 구현되었습니다!

새로운 디자인 프리뷰 타입들이 PreviewTypes 열거형에 잘 추가되었습니다. 열거형 케이스들의 이름이 명확하고 기존 네이밍 컨벤션을 잘 따르고 있습니다.


25-30: 좋아요!

name 계산 프로퍼티가 새로운 열거형 케이스들에 대한 문자열 표현을 잘 반환하도록 업데이트되었습니다. 선택된 문자열 표현들이 잘 설명되어 있고 이해하기 쉽습니다.


41-52: 잘 되었어요!

nextView 함수가 새로운 열거형 케이스들에 해당하는 뷰 타입을 잘 반환하도록 업데이트되었습니다. @ViewBuilder 프로퍼티 래퍼를 사용하여 뷰들이 적절하게 구성되고 선택된 열거형 케이스에 따라 반환됩니다.

Projects/DesignSystem/DesignCore/Sources/CTAButton/CTABottomButton.swift (4)

40-64: 버튼의 구현이 깔끔하고 잘 되어 있습니다!

SwiftUI의 선언적 문법을 활용하여 버튼의 모양을 명확하게 정의하였고, 배경 사각형과 텍스트 레이블을 포함하는 수직 스택을 사용한 것도 좋습니다.

키보드 가시성에 따라 버튼의 높이를 조정하는 조건부 로직과 비활성 상태일 때 버튼을 비활성화하는 것도 사용자 경험 측면에서 좋은 판단이라고 생각합니다.

하단 버튼의 특성상 안전 영역 삽입을 무시하여 화면 가장자리까지 확장되도록 한 것도 적절해 보입니다.


19-31: 초기화 함수가 명확하고 사용하기 쉽게 잘 정의되어 있습니다!

파라미터 이름이 명확하고 일부 파라미터에 기본값을 제공하여 호출자의 부담을 줄인 점이 좋습니다.

handler 파라미터에 @escaping 속성을 사용한 것도 클로저가 초기화 함수보다 오래 살아남을 수 있도록 하는 데 필요하므로 적절합니다.


1-10: 파일 헤더와 import 문이 적절히 포함되어 있습니다.

파일 이름, 프로젝트 이름, 생성 일자, 저작권 고지 등 유용한 메타데이터를 제공하는 헤더 주석과 법적 이유로 중요한 저작권 고지가 잘 작성되어 있습니다.

SwiftUI 컴포넌트를 사용하기 위해 SwiftUI 프레임워크를 가져오는 것도 필수적입니다.


12-17: 구조체의 private 속성들이 적절하게 정의되어 있습니다.

버튼의 제목, 배경 스타일, 제목 색상, 활성 상태, 키보드 가시성, 동작 핸들러를 저장하는 속성들이 모두 구조체 내부에서만 사용되므로 private으로 적절히 표시되었습니다.

속성 이름도 명확하고 설명적이며, titleColor 속성에 기본값을 제공하여 일관된 모양을 보장하는 것도 좋습니다.

Projects/DesignSystem/DesignCore/Sources/Tooltip/ToolTip.swift (2)

11-15: LGTM!

View 확장은 tooltip 수정자를 통해 어떤 View에도 툴팁을 쉽게 추가할 수 있도록 해줍니다. 구현이 깔끔하고 사용하기 편리해 보입니다.


17-45: 잘 구현되었습니다!

ToolTipViewModifiermessageoffset 파라미터를 받아 View에 스타일이 적용된 툴팁을 오버레이합니다. 툴팁의 배경, 삼각형 표시, 오프셋 등이 모두 잘 처리되어 있습니다. 코드가 깔끔하고 이해하기 쉽습니다.

Projects/Features/DesignPreview/Sources/DesignTypographyPreview.swift (5)

18-18: LGTM!

DesignCore.Colors.black을 사용하여 색상 참조를 업데이트하는 것이 좋습니다. 이 변경은 색상 참조를 보다 구조화된 방식으로 만듭니다.


21-21: LGTM!

DesignCore.Colors.grey400을 사용하여 색상 참조를 업데이트하는 것이 좋습니다. 이 변경은 색상 참조를 보다 구조화된 방식으로 만듭니다.


24-24: LGTM!

DesignCore.Colors.grey500을 사용하여 색상 참조를 업데이트하는 것이 좋습니다. 이 변경은 색상 참조를 보다 구조화된 방식으로 만듭니다.


33-33: 색상 참조 업데이트를 승인합니다. darkGreen에서 green500으로의 변경 사항을 확인하세요.

DesignCore.Colors를 사용하여 색상 참조를 업데이트하는 것이 좋습니다. 이러한 변경은 색상 참조를 보다 구조화된 방식으로 만듭니다.

그러나 DesignCore.darkGreen에서 DesignCore.Colors.green500으로의 변경은 사용 중인 녹색 음영의 변경을 나타낼 수 있습니다. 디자인 사양에 대해 이 변경 사항을 확인하세요.

Also applies to: 36-36, 39-39, 42-42


47-47: 타이포그래피 스타일 변경 사항을 확인하세요.

"연락한 지 2일차" 텍스트의 타이포그래피 스타일을 .medium_18에서 .semibold_18로 변경하면 텍스트의 시각적 모양과 계층 구조에 영향을 줄 수 있습니다. 디자인 사양에 대해 이 변경 사항을 확인하세요.

Projects/DesignSystem/DesignCore/Sources/Typography.swift (3)

20-20: 좋아 보입니다!

semibold_18 케이스를 추가한 것은 기존 네이밍 컨벤션과 일치하며 적절해 보입니다.


41-41: 좋습니다!

semibold_18에 대한 폰트 크기를 18로 설정한 것은 올바르며, 기존 switch case 구조와 일치합니다.


66-66: 좋아 보입니다!

semibold_18._600 가중치 케이스에 추가하고 medium_18._500 가중치 케이스에서 제거한 것은 네이밍 컨벤션 및 변경 사항 목록과 일치합니다. 업데이트된 switch case 로직에는 문제가 없어 보입니다.

Also applies to: 69-69

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

11-31: 잘 구현되었습니다!

ToastViewModifier 구조체는 ViewModifier 프로토콜을 잘 따르고 있으며, 토스트 메시지를 화면 하단에 오버레이하는 역할을 정확히 수행하고 있습니다. 패딩과 디바이스의 하단 인셋을 고려하여 위치를 조정하는 것도 좋습니다.


33-47: 훌륭한 확장 기능입니다!

View 프로토콜에 대한 이 확장은 toast 메서드를 추가하여 토스트 기능을 쉽게 통합할 수 있도록 해줍니다. 메시지, 표시 여부, 하단 패딩을 인자로 받아 ToastViewModifier를 적용하는 방식이 깔끔하고 사용하기 편리합니다.


49-87: 토스트 뷰가 잘 구현되었습니다!

Toast 구조체는 실제 토스트 알림을 나타내며, 메시지와 가시성 상태를 포함하고 있습니다. 둥근 사각형, 그림자, 경고 아이콘으로 스타일이 지정되어 있고, isPresent 상태에 따라 나타나고 사라지는 애니메이션이 잘 구현되어 있습니다. 토스트가 표시될 때 2초 후에 자동으로 사라지는 동작도 올바르게 처리되고 있습니다.

Projects/Features/DesignPreview/Sources/DesignTextInputPreview.swift (1)

13-94: 전반적으로 잘 구현된 DesignTextInputPreview 구조체입니다!

  • 입력 필드와 유효성 검사 상태를 관리하기 위해 상태 변수와 계산된 속성을 적절하게 사용했습니다.
  • TextInput 컴포넌트는 관련 플레이스홀더, 배경색 및 아이콘으로 구성되어 있습니다.
  • 전화번호 입력 필드는 추가 포맷팅 및 유효성 검사 로직으로 향상되었습니다.
  • 뷰는 내비게이션을 위해 적절하게 설정되었으며 키보드를 숨기기 위한 제스처가 포함되어 있습니다.

이 코드는 다양한 텍스트 입력 필드를 사용자 정의 스타일 및 유효성 검사와 함께 구현하는 포괄적인 예제를 제공합니다. SwiftUI에서 상태 관리, 계산된 속성 및 사용자 상호 작용을 위한 모범 사례를 보여줍니다. 코드는 모듈식이며 유사한 사용 사례에 쉽게 적용하거나 확장할 수 있습니다.

Projects/Core/CoreKit/UnitTest/StringExtensionText.swift (4)

12-157: 테스트 클래스 구조가 잘 되어 있습니다!

PhoneNumberTests 클래스는 전화번호 검증과 포맷팅에 대한 다양한 테스트 케이스를 포함하고 있습니다. 테스트 메서드들이 각각의 기능을 명확하게 검증하고 있어 좋습니다.


23-29: 유효한 전화번호 검증 테스트가 잘 작성되었습니다.

testValidPhoneNumber 메서드는 하이픈 없는 11자리 유효한 전화번호에 대해 true를 반환하는지 검증합니다.
어설션 메시지도 기대하는 동작을 명확히 설명하고 있습니다.


32-64: 다양한 유효하지 않은 전화번호 검증 테스트가 잘 작성되었습니다.

testInvalidPhoneNumber 메서드는 잘못된 길이, 하이픈 포함, 영숫자 포함 등 다양한 유효하지 않은 전화번호 케이스에 대해 false를 반환하는지 검증합니다.
각 케이스에 대한 어설션 메시지도 기대하는 동작을 명확히 설명하고 있습니다.
유효하지 않은 시나리오를 잘 포괄하는 좋은 테스트 케이스들입니다.


67-156: 전화번호 포맷팅 로직에 대한 다양한 테스트 케이스가 잘 작성되었습니다.

testFormattedPhoneNumberAddHyphen 메서드는 다양한 길이의 입력 문자열이 기대한 하이픈 포맷으로 변환되는지 검증합니다.
2자리부터 11자리까지 다양한 길이의 입력을 테스트하고 있으며, 각 케이스에 대한 어설션 메시지도 기대하는 동작을 명확히 설명하고 있습니다.

Tuist/ResourceSynthesizers/Assets.stencil (1)

181-182: 변경 사항을 승인합니다.

image 프로퍼티의 반환 타입을 non-optional로 변경한 것은 적절해 보입니다. 다만 uiImage가 nil인 경우 런타임 에러가 발생할 수 있으므로, 해당 케이스에 대한 고려가 되어 있는지 확인이 필요할 것 같습니다.

Projects/DesignSystem/DesignCore/Sources/TextInput/TextInputView.swift (1)

77-77: .shadow(.default)의 호환성 확인 필요

.shadow(.default) modifier는 iOS 15 이상에서 지원됩니다. 최소 지원 버전을 확인하고, 필요한 경우 이전 버전과 호환되는 .shadow(color:radius:x:y:)를 사용해야 합니다.

다음 스크립트를 실행하여 프로젝트의 최소 iOS 버전을 확인하십시오:

@jisu15-kim jisu15-kim merged commit e4fa962 into develop Sep 22, 2024
2 checks passed
@jisu15-kim jisu15-kim deleted the feature/WEAV-46 branch September 22, 2024 11:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant