-
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-46] Design Component 구현 #19
Conversation
* [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 생성
Walkthrough이번 변경 사항은 iOS 프로젝트의 다양한 파일에서 여러 기능을 추가하고 수정하는 내용을 포함합니다. 주요 변경 사항으로는 앱 아이콘 파일 이름 변경, SwiftUI 뷰 및 메서드 추가, 색상 자원 정의, 그리고 테스트 파일의 추가 및 삭제가 있습니다. 이러한 변경은 디자인 시스템과 UI 구성 요소의 일관성을 높이는 데 기여합니다. Changes
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? 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 (7)
Projects/DesignSystem/DesignCore/Sources/CornerRadius+Ext.swift (1)
17-26
:RoundedCorner
모양 구현을 승인합니다.
RoundedCorner
모양은UIBezierPath
를 사용하여 둥근 모서리 사각형 경로를 올바르게 생성합니다. 구현이 명확하고 간결합니다.정적 분석 힌트에 따라
fileprivate
대신private
액세스 제어자를 사용하는 것이 좋습니다.다음 diff를 적용하여
fileprivate
를private
로 변경하세요:-fileprivate struct RoundedCorner: Shape { +private struct RoundedCorner: Shape {Tools
SwiftLint
[Warning] 17-17: Prefer
private
overfileprivate
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
모듈을 사용하여 프로젝트 전반에 걸쳐 일관성을 유지하고 있습니다.개선 제안으로는, 향후 다양한 그림자 스타일을 추가할 경우를 대비하여
HStack
의spacing
을 조정 가능한 상수로 추출하는 것이 좋겠습니다. 이렇게 하면 뷰의 레이아웃을 더 쉽게 제어할 수 있습니다.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
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
overfileprivate
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
overfileprivate
declarations(private_over_fileprivate)
Projects/DesignSystem/DesignCore/Sources/Shadows.swift
[Warning] 16-16: Prefer
private
overfileprivate
declarations(private_over_fileprivate)
Projects/DesignSystem/DesignCore/Sources/Tooltip/ToolTip.swift
[Warning] 47-47: Prefer
private
overfileprivate
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
: 프로토콜 채택과 메서드 구현이 잘 되었습니다!
UIApplication
이UIGestureRecognizerDelegate
프로토콜을 채택하고,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
: 구조가 깔끔해요!
ZStack
과VStack
을 사용하여 뷰의 구조를 명확하게 구성했네요. 둥근 사각형 사이의 간격도 일관성이 있어 보기 좋아요.
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
:colorGroups
에lightColors
를 잘 추가했어요!
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
: 잘 구현되었습니다!
ToolTipViewModifier
는message
와offset
파라미터를 받아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 버전을 확인하십시오:
구현사항
필요한 작업
Summary by CodeRabbit
logo.png
에서appicon.png
로 변경되었습니다.BackgroundTextureView
,CTABottomButton
,CTAButton
,TextInputView
,ToastView
,TooltipView
,DesignBackgroundTextureView
,DesignButtonView
,DesignTextInputPreview
,DesignToastView
,DesignToolTipView
,DesignShadowView
.PreviewTypes
열거형에 여러 새로운 케이스가 추가되었습니다.