로그인 시안 UI와 Feature Preview 구성 - #15
Conversation
📝 WalkthroughSummary by CodeRabbit
Walkthrough프로젝트 생성기가 프레임워크 제품 유형을 전달하도록 변경되었습니다. 로그인 화면에 숏폼 마키와 새 레이아웃을 추가했습니다. 로그인 오류를 토스트 또는 알림으로 전달합니다. 주요 화면과 오버레이에 상태별 SwiftUI 프리뷰를 추가했습니다. Changes프레임워크 제품 설정
로그인 흐름 및 화면
SwiftUI 상태 프리뷰
소셜 로그인 간격
Estimated code review effort: 3 (Moderate) | ~30 minutes Sequence Diagram(s)sequenceDiagram
participant LoginFeature
participant AppCoordinatorFeature
participant OverlayFeature
LoginFeature->>AppCoordinatorFeature: 로그인 오류 delegate 전달
AppCoordinatorFeature->>OverlayFeature: 토스트 또는 알림 표시 action 전달
OverlayFeature-->>AppCoordinatorFeature: 표시 메시지 상태 갱신
Possibly related PRs
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
Projects/Feature/Sources/Scene/Login/LoginView.swift (2)
124-124: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
marqueeHeight가 카드 높이를 중복 정의합니다.
LoginShortformMarqueeView.cardSize.height도172입니다. 두 값이 독립적으로 관리되면 카드 크기를 바꿀 때 컨테이너 높이가 어긋납니다. 마키 뷰의 상수를 직접 참조해 주세요.♻️ 제안 리팩터
- static let marqueeHeight: CGFloat = 172 + static let marqueeHeight: CGFloat = LoginShortformMarqueeView.cardSize.height🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/Feature/Sources/Scene/Login/LoginView.swift` at line 124, Update LoginView’s marqueeHeight to reference LoginShortformMarqueeView.cardSize.height instead of defining the literal 172, keeping the container height synchronized with the marquee card size.
96-101: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value로딩 오버레이가 배경 터치를 차단하지 않습니다.
변경 설명은 로딩 중 터치 입력 차단을 명시합니다. 그러나
ProgressView에.allowsHitTesting(false)가 적용되어 터치가 뒤쪽 뷰로 통과합니다. 현재는 두 로그인 버튼이.disabled(store.isLoading)으로 개별 차단되므로 실제 결함은 없습니다.배경 차단이 의도라면 오버레이가 히트 테스트를 받도록 바꿔 주세요.
♻️ 제안 수정
if store.isLoading { - ProgressView() - .tint(Color.ds.text.neutral.white) - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) - .allowsHitTesting(false) + Color.clear + .contentShape(Rectangle()) + .overlay { + ProgressView() + .tint(Color.ds.text.neutral.white) + } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/Feature/Sources/Scene/Login/LoginView.swift` around lines 96 - 101, Update the loading overlay around ProgressView so it participates in hit testing and blocks touches from reaching the background while store.isLoading is true; remove the allowsHitTesting(false) modifier, while preserving the existing visual layout and button disabled behavior.Projects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swift (1)
18-20: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
copies계산식을 여러 줄로 분리해 주세요.Line 20은 약 105자입니다. CONVENTIONS의 100자 경고 기준을 넘습니다. 중간 값을 이름 있는 상수로 빼면 길이와 가독성이 함께 개선됩니다.
♻️ 제안 리팩터
GeometryReader { proxy in let sequenceWidth = Self.sequenceWidth(cardCount: images.count) - let copies = max(3, Int(ceil((proxy.size.width + sequenceWidth) / max(sequenceWidth, 1))) + 1) + let requiredWidth = proxy.size.width + sequenceWidth + let sequenceCount = Int(ceil(requiredWidth / max(sequenceWidth, 1))) + 1 + let copies = max(3, sequenceCount)As per coding guidelines: "Swift 코드는 4칸 들여쓰기, 100자 경고/120자 오류 기준을 따르고".
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swift` around lines 18 - 20, GeometryReader 내부의 copies 계산을 여러 줄로 분리해 100자 경고 기준을 준수하세요. sequenceWidth를 활용한 화면 너비 기반 계산을 별도의 이름 있는 상수로 추출한 뒤, copies는 해당 중간값과 최소값을 사용하도록 수정하세요.Source: Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Projects/Feature/Sources/Scene/Login/LoginView.swift`:
- Around line 114-117: 로그인 화면의 고정 콘텐츠 높이가 소형 기기의 안전 영역을 초과하므로, LoginView 레이아웃에서
고정 .frame(height:)를 제거하고 Spacer(minLength: 0) 또는 화면 높이에 따라 여백을 축소하는 방식으로 조정하세요.
두 SocialLoginButton의 48pt 높이와 오류 메시지 표시 동작은 유지하면서 iPhone SE에서도 버튼이 화면 밖으로 밀리지 않게
하세요.
---
Nitpick comments:
In `@Projects/Feature/Sources/Scene/Login/LoginView.swift`:
- Line 124: Update LoginView’s marqueeHeight to reference
LoginShortformMarqueeView.cardSize.height instead of defining the literal 172,
keeping the container height synchronized with the marquee card size.
- Around line 96-101: Update the loading overlay around ProgressView so it
participates in hit testing and blocks touches from reaching the background
while store.isLoading is true; remove the allowsHitTesting(false) modifier,
while preserving the existing visual layout and button disabled behavior.
In
`@Projects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swift`:
- Around line 18-20: GeometryReader 내부의 copies 계산을 여러 줄로 분리해 100자 경고 기준을 준수하세요.
sequenceWidth를 활용한 화면 너비 기반 계산을 별도의 이름 있는 상수로 추출한 뒤, copies는 해당 중간값과 최소값을 사용하도록
수정하세요.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 6a1aed37-6941-4a33-8146-8febff5e96bf
⛔ Files ignored due to path filters (13)
Config/Example.xcconfigis excluded by!Config/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Brand/Contents.jsonis excluded by!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Brand/logo_mozi.imageset/Contents.jsonis excluded by!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Brand/logo_mozi.imageset/mozi_BI.svgis excluded by!**/*.svg,!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/Contents.jsonis excluded by!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_01.imageset/Contents.jsonis excluded by!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_01.imageset/login_shortform_01.jpgis excluded by!**/*.jpg,!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_02.imageset/Contents.jsonis excluded by!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_02.imageset/login_shortform_02.jpgis excluded by!**/*.jpg,!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_03.imageset/Contents.jsonis excluded by!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_03.imageset/login_shortform_03.jpgis excluded by!**/*.jpg,!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_04.imageset/Contents.jsonis excluded by!**/*.xcassets/**Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_04.imageset/login_shortform_04.jpgis excluded by!**/*.jpg,!**/*.xcassets/**
📒 Files selected for processing (16)
Projects/Domain/Project.swiftProjects/Feature/Sources/AppCoordinator/AppCoordinatorView.swiftProjects/Feature/Sources/AppCoordinator/Overlay/OverlayView.swiftProjects/Feature/Sources/Root/RootView.swiftProjects/Feature/Sources/Scene/Login/LoginView.swiftProjects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swiftProjects/Feature/Sources/Scene/OnboardingPlaceholder/OnboardingPlaceholderView.swiftProjects/Feature/Sources/Scene/Placeholder/PlaceholderView.swiftProjects/Shared/DesignSystem/Project.swiftProjects/Shared/DesignSystem/Sources/Components/Social/SocialLoginProvider.swiftProjects/Shared/DesignSystem/Tests/Components/SocialLoginProviderTests.swiftProjects/Shared/Logger/Project.swiftProjects/Shared/Util/Project.swiftProjects/ThirdParty/ThirdParty/Project.swiftProjects/ThirdParty/ThirdPartyUI/Project.swiftTuist/ProjectDescriptionHelpers/ProjectFactory.swift
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Projects/Feature/Tests/Login/LoginFeatureTests.swift`:
- Line 62: Rename the affected test methods to follow the test_한글_한글 convention:
update toast_delegate at Projects/Feature/Tests/Login/LoginFeatureTests.swift
lines 62-62 and 82-82, alert_delegate at lines 102-102, idle at line 122-122,
and toast_delegate/overlay_toast plus alert_delegate/overlay_alert at
Projects/Feature/Tests/AppCoordinator/AppCoordinatorFeatureTests.swift lines
228-228 and 243-243 to Korean event or state names while preserving each test’s
behavior.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 9d5348c5-dde8-4cb0-b105-87c8af19b7a9
📒 Files selected for processing (6)
Projects/Feature/Sources/AppCoordinator/AppCoordinatorFeature.swiftProjects/Feature/Sources/AppCoordinator/AppCoordinatorView.swiftProjects/Feature/Sources/Scene/Login/LoginFeature.swiftProjects/Feature/Sources/Scene/Login/LoginView.swiftProjects/Feature/Tests/AppCoordinator/AppCoordinatorFeatureTests.swiftProjects/Feature/Tests/Login/LoginFeatureTests.swift
💤 Files with no reviewable changes (1)
- Projects/Feature/Sources/Scene/Login/LoginView.swift
📌 변경 요약
📌 변경 내용
Login UI
Projects/Feature/Sources/Scene/Login/LoginView.swiftProjects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swiftDesignSystem / Social
Projects/Shared/DesignSystem/Resources/Assets.xcassets/Brandlogo_mozi에셋 등록Projects/Shared/DesignSystem/Resources/Assets.xcassets/Loginlogin_shortform_01..04에셋 등록Projects/Shared/DesignSystem/Sources/Components/Social/SocialLoginProvider.swiftProjects/Shared/DesignSystem/Tests/Components/SocialLoginProviderTests.swiftPreview 인프라
Tuist/ProjectDescriptionHelpers/ProjectFactory.swiftProjects/Domain/Project.swiftProjects/Shared/{Util,DesignSystem,Logger}/Project.swiftProjects/ThirdParty/{ThirdParty,ThirdPartyUI}/Project.swift상태별 Preview
Projects/Feature/Sources/Root/RootView.swiftProjects/Feature/Sources/AppCoordinator/AppCoordinatorView.swiftProjects/Feature/Sources/AppCoordinator/Overlay/OverlayView.swiftProjects/Feature/Sources/Scene/OnboardingPlaceholder/OnboardingPlaceholderView.swiftProjects/Feature/Sources/Scene/Placeholder/PlaceholderView.swift로컬 설정 템플릿
Config/Example.xcconfig