Skip to content

Fix/#149 1차 QA#154

Merged
sum130 merged 7 commits intodevelopfrom
feat/#149-challenge7planlogic
Jan 22, 2026
Merged

Fix/#149 1차 QA#154
sum130 merged 7 commits intodevelopfrom
feat/#149-challenge7planlogic

Conversation

@sum130
Copy link
Contributor

@sum130 sum130 commented Jan 21, 2026

🔗 연결된 이슈

📄 작업 내용

  • 1차 QA

👀 기타 더 이야기해볼 점

image

@sum130 sum130 requested a review from a team January 21, 2026 20:58
@sum130 sum130 self-assigned this Jan 21, 2026
@sum130 sum130 requested review from soseoyo12, wotjs020708 and y-eonee and removed request for a team January 21, 2026 20:58
@sum130 sum130 added 수민🐶 Fix 버그 수정 labels Jan 21, 2026
@sum130 sum130 linked an issue Jan 21, 2026 that may be closed by this pull request
1 task
@coderabbitai
Copy link

coderabbitai bot commented Jan 21, 2026

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

챌린지 관련 뷰의 레이아웃·타이포그래피 조정, ChallengeProgressViewModel에 완료 판정 속성(isChallengeCompleted) 추가 및 완료 시 Coordinator로 조건부 네비게이션 로직 추가, 다수 이미지 자산을 SVG에서 PNG(1x/2x/3x)로 마이그레이션함.

Changes

Cohort / File(s) 변경 사항
ViewModel 로직 변경
\Cherrish-iOS/Presentation/Feature/ChallengeView/Coordinator/ViewModel/ChallengeProgressViewModel.swift``
challengeTitle 기본값을 "챌린지"에서 ""로 변경; isChallengeCompleted 계산 속성 추가 (currentDay == 7); updateInfo()에서 challengeTitle = challengeData.title + " 챌린지"로 변경
Progress View / 네비게이션
\.../ChallengeProgressView.swift``
@EnvironmentObject private var challengeCoordinator: ChallengeCoordinator 추가; 레이아웃 프레임/패딩 조정; 버튼 타이틀을 isChallengeCompleted에 따라 변경하고, 완료 시 challengeCoordinator.push(.startChallenge) 호출하도록 액션 분기 추가
로딩/선택/시작 뷰 레이아웃·타이포그래피
\.../ChallengeLoadingView.swift`, `.../ChallengeSelectMissionView.swift`, `.../ChallengeSelectRoutineView.swift`, `.../StartChallengeView.swift``
텍스트 스타일·프레임(높이) 및 패딩/스페이싱 조정, 일부 멀티라인 텍스트 병합·분할로 렌더링 변경
이미지 자산 마이그레이션 (ChallengeImage)
\Resources/Assets.xcassets/ChallengeImage//.imageset``
다수 imageset에서 SVG 항목을 제거하고 PNG 래스터 1x/2x/3x 항목으로 대체(예: challenge_gaugebar_*, cherry*.imageset 등); challenge_gaugebar_0.imageset/Contents.json 삭제
아이콘 자산 업데이트 (cherrishIcon)
\Resources/Assets.xcassets/cherrishIcon/checkbox_active.imageset/Contents.json`, `.../checkbox_default.imageset/Contents.json``
SVG 파일명 참조를 PNG 파일명으로 변경 (checkbox_active.svgicon_checkbox_active.png 등)

Sequence Diagram(s)

sequenceDiagram
    participant View as ChallengeProgressView
    participant VM as ChallengeProgressViewModel
    participant Coord as ChallengeCoordinator

    View->>VM: await viewModel.advanceDay()
    Note right of VM: currentDay 증가 및 상태 업데이트
    VM-->>View: Published 상태 변경
    alt VM.isChallengeCompleted == true
        View->>Coord: challengeCoordinator.push(.startChallenge)
    else
        Note right of View: 추가 네비게이션 없음
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • y-eonee
  • soseoyo12
🚥 Pre-merge checks | ✅ 3 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive PR 제목은 '1차 QA'라는 작업 내용을 언급하지만, 구체적인 변경 사항(UI 레이아웃 조정, 이미지 자산 형식 변경 등)을 명확히 설명하지 않아 다소 모호합니다. PR 제목을 더욱 구체적으로 작성하세요. 예: 'Fix: Challenge view layouts and update image assets for QA' 또는 '1차 QA 반영: 레이아웃 조정 및 이미지 자산 형식 변경'.
✅ Passed checks (3 passed)
Check name Status Explanation
Description check ✅ Passed PR 설명은 연결된 이슈 #149를 명시하고 '1차 QA' 작업 내용을 언급하여 변경 사항과 관련이 있습니다.
Linked Issues check ✅ Passed 연결된 이슈 #149의 주요 요구 사항인 '1차 QA' 적용이 완료되었으며, 코드 변경 사항(UI 레이아웃 조정, 이미지 자산 형식 변경, 챌린지 완료 로직 추가)이 QA 피드백을 반영합니다.
Out of Scope Changes check ✅ Passed 모든 변경 사항이 1차 QA 반영과 직접적으로 관련되어 있습니다(UI 레이아웃, 이미지 자산 형식, 챌린지 진행 상태 표시 로직).

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/#149-challenge7planlogic

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

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: 2

🤖 Fix all issues with AI agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/Coordinator/ViewModel/ChallengeProgressViewModel.swift`:
- Around line 97-99: The isChallengeCompleted property currently hardcodes the
7-day completion check; change it to use a configurable duration value (e.g., a
Challenge.duration / totalDays constant or a value from the Challenge
model/repository) instead of the literal 7. Update ChallengeProgressViewModel to
reference that configurable property (for example challengeDuration or
challenge.totalDays) when evaluating currentDay in isChallengeCompleted so
different challenge lengths are supported. Ensure the new source is injected or
accessible in the ViewModel constructor or via its existing challenge/currentDay
data so you don't introduce globals.

In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift`:
- Around line 160-175: The completion branch calls
challengeCoordinator.push(.startChallenge) regardless of whether
viewModel.advanceDay() succeeded; modify the branch handling in the
CherrishButton action so you await and verify success before navigating: call
viewModel.advanceDay() and check its result (or catch errors if it throws) and
only call challengeCoordinator.push(.startChallenge) when advanceDay reports
success; update viewModel.advanceDay() to return a Bool or throw if it currently
doesn't so you can gate navigation in the completion path (symbols:
CherrishButton, viewModel.isChallengeCompleted, viewModel.advanceDay(),
challengeCoordinator.push(.startChallenge)).

Comment on lines +97 to +99
var isChallengeCompleted: Bool {
currentDay == 7
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

완료 기준(7일) 하드코딩 확인 필요.
챌린지 기간이 고정 7일이 아니라면 데이터/상수로 분리해 기준을 맞추는 편이 안전합니다.

🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/Coordinator/ViewModel/ChallengeProgressViewModel.swift`
around lines 97 - 99, The isChallengeCompleted property currently hardcodes the
7-day completion check; change it to use a configurable duration value (e.g., a
Challenge.duration / totalDays constant or a value from the Challenge
model/repository) instead of the literal 7. Update ChallengeProgressViewModel to
reference that configurable property (for example challengeDuration or
challenge.totalDays) when evaluating currentDay in isChallengeCompleted so
different challenge lengths are supported. Ensure the new source is injected or
accessible in the ViewModel constructor or via its existing challenge/currentDay
data so you don't introduce globals.

Comment on lines 160 to +175
CherrishButton(
title: "오늘 미션 종료하기",
title: viewModel.isChallengeCompleted ? "챌린지 종료하기":"오늘 미션 종료하기",
type: .small,
state: .constant(buttonState),
leadingIcon: nil,
trailingIcon: nil
) {
Task {
await viewModel.advanceDay()
if viewModel.isChallengeCompleted {
Task {
await viewModel.advanceDay()
challengeCoordinator.push(.startChallenge)
}
}else {
Task {
await viewModel.advanceDay()
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

완료 분기에서 advanceDay 실패 시에도 네비게이션됩니다.
advanceDay()가 실패해도 곧바로 새 챌린지로 이동하면 서버 상태와 UI가 어긋날 수 있습니다. 성공 확인 후 이동하도록 가드가 필요합니다.

✅ 수정 제안
-                if viewModel.isChallengeCompleted {
-                    Task {
-                        await viewModel.advanceDay()
-                        challengeCoordinator.push(.startChallenge)
-                    }
-                }else {
-                    Task {
-                        await viewModel.advanceDay()
-                    }
-                }
+                if viewModel.isChallengeCompleted {
+                    Task {
+                        await viewModel.advanceDay()
+                        guard viewModel.errorMessage == nil else { return }
+                        challengeCoordinator.push(.startChallenge)
+                    }
+                } else {
+                    Task {
+                        await viewModel.advanceDay()
+                    }
+                }
🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift`
around lines 160 - 175, The completion branch calls
challengeCoordinator.push(.startChallenge) regardless of whether
viewModel.advanceDay() succeeded; modify the branch handling in the
CherrishButton action so you await and verify success before navigating: call
viewModel.advanceDay() and check its result (or catch errors if it throws) and
only call challengeCoordinator.push(.startChallenge) when advanceDay reports
success; update viewModel.advanceDay() to return a Bool or throw if it currently
doesn't so you can gate navigation in the completion path (symbols:
CherrishButton, viewModel.isChallengeCompleted, viewModel.advanceDay(),
challengeCoordinator.push(.startChallenge)).

@y-eonee y-eonee changed the title Feat/#149 1차 QA Fix/#149 1차 QA Jan 22, 2026
Copy link
Member

@y-eonee y-eonee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMG_1164
수고해떠여

Copy link
Contributor

@soseoyo12 soseoyo12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와~!!!~ 수고하셨숨디앙

Copy link
Contributor

@wotjs020708 wotjs020708 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다. 근데 폰트 마다 높이 잡아주셔야 하는 거 아닌가요?

@sum130 sum130 merged commit 0306683 into develop Jan 22, 2026
@sum130 sum130 deleted the feat/#149-challenge7planlogic branch January 22, 2026 09:20
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: 4

🤖 Fix all issues with AI agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeLoadingView.swift`:
- Around line 16-29: The fixed frame heights applied to TypographyText in
ChallengeLoadingView (the TypographyText(...) calls with .frame(height: ...))
prevent Dynamic Type resizing and can truncate text; remove the explicit
.frame(height:) on those TypographyText instances (or replace with a flexible
.frame(minHeight: ...) or no height constraint), add .lineLimit(nil) and
.fixedSize(horizontal: false, vertical: true) so lines can grow, and ensure the
TypographyText view itself uses a scalable font (applies .font with a
.scaledFont / .dynamicType support or .environment(\.sizeCategory) handling) so
the text responds to accessibility Dynamic Type changes.

In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift`:
- Around line 51-53: The ChallengeProgressView currently declares
`@EnvironmentObject` private var challengeCoordinator: ChallengeCoordinator which
can crash if not injected and declares `@StateObject` var viewModel:
ChallengeProgressViewModel with non-private visibility; update the view to
ensure safe EnvironmentObject usage by either (1) asserting or providing a
fallback when ChallengeCoordinator is missing at creation sites (verify all
ChallengeProgressView initializers call
.environmentObject(ChallengeCoordinator()) or wrap uses in a parent that injects
it) or (2) change the property to `@EnvironmentObject` private var
challengeCoordinator: ChallengeCoordinator? and guard/handle the nil case to
avoid runtime crashes; also make viewModel private (change to `@StateObject`
private var viewModel) and adopt the init-injection pattern for
ChallengeProgressView by adding an init(_ viewModel: ChallengeProgressViewModel)
that assigns _viewModel = StateObject(wrappedValue: viewModel) to satisfy
SwiftLint and visibility expectations, and then update all call sites to pass
the viewModel and ensure .environmentObject(ChallengeCoordinator) is applied
where the view is created.

In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeSelectRoutineView.swift`:
- Around line 21-31: The two TypographyText views inside the VStack are forced
to a fixed height via .frame(height: 27.adjustedH) which can cause truncation
for longer translations or Dynamic Type; remove the fixed height or replace it
with a dynamic-friendly approach for the TypographyText components used here
(e.g., allow flexible height, remove .frame(height:), and if necessary add
modifiers like lineLimit(nil) / fixedSize(horizontal: false, vertical: true) or
use .multilineTextAlignment and a minHeight constraint) so the text can grow
with accessibility font sizes and long locales while keeping the existing VStack
and TypographyText usages intact.

In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/StartChallengeView.swift`:
- Around line 20-23: The two TypographyText instances (the one with "이번엔 어떤 루틴으로
관리할까요?" using .frame(height: 30.adjustedH) and the one with "루틴을 지킬수록 체리가 성장해요."
using .frame(height: 24.adjustedH)) use fixed heights that can truncate wrapped
or localized text; remove the fixed .frame(height: ...) or replace it with a
flexible layout approach and enable multiline by adding lineLimit(nil) and
allowing vertical expansion (e.g., fixedSize(horizontal: false, vertical: true)
or no explicit height constraint) so the text can grow for wrapping/localization
while keeping any intended spacing via surrounding containers or Spacer.
♻️ Duplicate comments (1)
Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift (1)

169-183: 완료 분기에서 advanceDay 실패 여부 확인 없이 네비게이션됨

advanceDay()가 실패해도 종료 화면으로 이동할 수 있어 서버 상태와 UI가 어긋날 수 있습니다. 성공 확인 후 이동하도록 가드가 필요합니다.

✅ 수정 제안
-                if viewModel.isChallengeCompleted {
-                    Task {
-                        await viewModel.advanceDay()
-                        challengeCoordinator.push(.startChallenge)
-                    }
-                }else {
-                    Task {
-                        await viewModel.advanceDay()
-                    }
-                }
+                if viewModel.isChallengeCompleted {
+                    Task {
+                        await viewModel.advanceDay()
+                        guard viewModel.errorMessage == nil else { return }
+                        challengeCoordinator.push(.startChallenge)
+                    }
+                } else {
+                    Task {
+                        await viewModel.advanceDay()
+                    }
+                }

Comment on lines 16 to +29
highlight(highlightText: viewModel.selectedRoutine?.description ?? "", normalText: "방향을 바탕으로")
.padding(.top, 113.adjustedH)
.frame(height: 27.adjustedH)
.padding(.top, 94.adjustedH)
TypographyText("TO-DO 미션을 만들고 있어요.", style: .title1_sb_18, color: .gray800)

LottieView(animationName: "splash", loopMode: .loop)
.frame(width: 130.adjustedW, height: 154.adjustedH)
.padding(.top, 60.adjustedH)

Spacer()
.frame(height: 80.adjustedH)

TypographyText("잠시만 기다려주세요!", style: .title2_sb_16, color: .gray800)
.frame(height: 27.adjustedH)
Image(.loading)
.frame(height: 364.adjustedH)
.padding(.top, 17.adjustedH)
TypographyText("잠시만 기다려주세요!", style: .title2_m_16, color: .gray800)
.frame(height: 24.adjustedH)
.padding(.top, 17.adjustedH)

Spacer()

TypographyText("AI가 맞춤형 루틴을 제작하고 있어요.", style: .body3_m_12, color: .gray600)
.frame(height: 17.adjustedH)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# ChallengeLoadingView.swift 파일 위치 및 크기 확인
find . -name "ChallengeLoadingView.swift" -type f

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 196


🏁 Script executed:

# 파일 내용 확인 (전체 구조 파악)
cat -n Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeLoadingView.swift

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 1841


🏁 Script executed:

# adjustedH가 무엇인지 확인 (커스텀 modifier 또는 extension 검색)
rg "adjustedH" --type swift -B 2 -A 2

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 50383


🏁 Script executed:

# TypographyText 구현 확인
find . -name "*.swift" -type f -exec grep -l "struct TypographyText" {} \;

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 139


🏁 Script executed:

# 다른 뷰에서 동적 타입 처리 방식 확인 (lineLimit, minimumScaleFactor 등)
rg "lineLimit|minimumScaleFactor|\.font\(" --type swift | head -30

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 585


🏁 Script executed:

# TypographyText 구현 찾기
find . -name "*.swift" -type f | xargs grep -l "struct TypographyText\|typealias TypographyText"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 139


🏁 Script executed:

# TypographyText의 전체 구현 확인
rg "struct TypographyText" -A 20 --type swift

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 1678


🏁 Script executed:

# Font+.swift 파일 내용 확인
cat -n ./Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Font+.swift

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 3963


🏁 Script executed:

# Adjust+.swift 전체 내용 확인
cat -n Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Adjust+.swift

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 1218


TypographyText 동적 타입 대응 검토 필요

adjustedH는 기기별 비례 스케일링이므로 SE/Pro Max 간 높이 차이는 자동 조정됩니다. 그러나 TypographyText의 명시적 frame(height:)은 동적 타입 크기 변화에 대응하지 않아, 접근성 설정(Dynamic Type XL 이상)에서 텍스트 절단 가능성이 있습니다. 동적 타입 환경에서 테스트하고 필요시 lineLimit 또는 최소 높이 조정을 고려하세요.

🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeLoadingView.swift`
around lines 16 - 29, The fixed frame heights applied to TypographyText in
ChallengeLoadingView (the TypographyText(...) calls with .frame(height: ...))
prevent Dynamic Type resizing and can truncate text; remove the explicit
.frame(height:) on those TypographyText instances (or replace with a flexible
.frame(minHeight: ...) or no height constraint), add .lineLimit(nil) and
.fixedSize(horizontal: false, vertical: true) so lines can grow, and ensure the
TypographyText view itself uses a scalable font (applies .font with a
.scaledFont / .dynamicType support or .environment(\.sizeCategory) handling) so
the text responds to accessibility Dynamic Type changes.

Comment on lines +51 to 53
@EnvironmentObject private var challengeCoordinator: ChallengeCoordinator
@StateObject var viewModel: ChallengeProgressViewModel

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

EnvironmentObject 주입 보장 및 @StateObject 가시성 정리 필요

새로 추가된 EnvironmentObject가 상위에서 주입되지 않으면 런타임 크래시가 납니다. 생성 위치에서 주입 여부를 확인해 주세요. 또한 @StateObject는 보통 private로 두고 init에서 주입하는 패턴이 권장됩니다(SwiftLint 경고).

♻️ `@StateObject` 접근성 정리 제안
-    `@StateObject` var viewModel: ChallengeProgressViewModel
+    `@StateObject` private var viewModel: ChallengeProgressViewModel
+
+    init(viewModel: ChallengeProgressViewModel) {
+        _viewModel = StateObject(wrappedValue: viewModel)
+    }
#!/bin/bash
# ChallengeProgressView 생성 위치와 EnvironmentObject 주입 여부 확인
rg -n --type=swift -C3 '\bChallengeProgressView\b'
rg -n --type=swift -C3 '\.environmentObject\([^)]*ChallengeCoordinator'
🧰 Tools
🪛 SwiftLint (0.57.0)

[Warning] 52-52: SwiftUI state properties should be private

(private_swiftui_state)

🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift`
around lines 51 - 53, The ChallengeProgressView currently declares
`@EnvironmentObject` private var challengeCoordinator: ChallengeCoordinator which
can crash if not injected and declares `@StateObject` var viewModel:
ChallengeProgressViewModel with non-private visibility; update the view to
ensure safe EnvironmentObject usage by either (1) asserting or providing a
fallback when ChallengeCoordinator is missing at creation sites (verify all
ChallengeProgressView initializers call
.environmentObject(ChallengeCoordinator()) or wrap uses in a parent that injects
it) or (2) change the property to `@EnvironmentObject` private var
challengeCoordinator: ChallengeCoordinator? and guard/handle the nil case to
avoid runtime crashes; also make viewModel private (change to `@StateObject`
private var viewModel) and adopt the init-injection pattern for
ChallengeProgressView by adding an init(_ viewModel: ChallengeProgressViewModel)
that assigns _viewModel = StateObject(wrappedValue: viewModel) to satisfy
SwiftLint and visibility expectations, and then update all call sites to pass
the viewModel and ensure .environmentObject(ChallengeCoordinator) is applied
where the view is created.

Comment on lines +21 to +31
VStack(alignment: .leading, spacing: 0){
TypographyText("지금 나에게 가장 필요한",
style: .title1_sb_18,
color: .gray1000
)
.frame(height: 27.adjustedH)
TypographyText("관리 루틴을 선택해주세요.",
style: .title1_sb_18,
color: .gray1000
)
.frame(height: 27.adjustedH)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# 파일 구조 탐색
find . -type f -name "*.swift" | grep -i typography | head -20

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 196


🏁 Script executed:

# ChallengeSelectRoutineView.swift 전체 내용 확인
find . -path "*ChallengeSelectRoutineView.swift" -type f

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 196


🏁 Script executed:

# TypographyText 정의 찾기
rg "struct TypographyText|class TypographyText" -A 10

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 1081


🏁 Script executed:

# adjustedH 정의 찾기
rg "adjustedH" -B 2 -A 2

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 50383


🏁 Script executed:

# adjustedH 확장 함수 정의 찾기
rg "adjustedH" -B 5 -A 2 | grep -A 7 "func adjustedH\|extension.*adjustedH\|var adjustedH"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 2224


🏁 Script executed:

# TypographyText 전체 구현 확인
cat -n Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Font+.swift | head -100

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 3963


🏁 Script executed:

# 다이나믹 타입 지원 여부 확인
rg "dynamicTypeSize|preferredContentSizeCategory|@Environment.*dynamicTypeSize" -A 3

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 52


고정 높이로 다중 언어 확대 및 다이나믹 타입에서 텍스트 잘림 위험

.frame(height: 27.adjustedH)는 화면 비율만 조정하고 다이나믹 타입(시스템 폰트 설정)을 고려하지 않습니다. 긴 번역이 필요한 로케일이나 사용자가 텍스트 크기를 확대했을 때 두 줄이 지정된 높이를 초과하여 잘릴 수 있습니다.

🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeSelectRoutineView.swift`
around lines 21 - 31, The two TypographyText views inside the VStack are forced
to a fixed height via .frame(height: 27.adjustedH) which can cause truncation
for longer translations or Dynamic Type; remove the fixed height or replace it
with a dynamic-friendly approach for the TypographyText components used here
(e.g., allow flexible height, remove .frame(height:), and if necessary add
modifiers like lineLimit(nil) / fixedSize(horizontal: false, vertical: true) or
use .multilineTextAlignment and a minHeight constraint) so the text can grow
with accessibility font sizes and long locales while keeping the existing VStack
and TypographyText usages intact.

Comment on lines 20 to +23
TypographyText("이번엔 어떤 루틴으로 관리할까요?", style: .headline_sb_20, color: .gray1000)
.frame(height: 30.adjustedH)
TypographyText("루틴을 지킬수록 체리가 성장해요.", style: .title2_m_16, color: .gray800)
.frame(height: 24.adjustedH)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

fd "StartChallengeView.swift" --type f

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 160


🏁 Script executed:

find . -name "StartChallengeView.swift" -type f

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 162


🏁 Script executed:

git ls-files | grep -i "startchallenge"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 121


🏁 Script executed:

wc -l "Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/StartChallengeView.swift"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 163


🏁 Script executed:

cat -n "Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/StartChallengeView.swift"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 2345


🏁 Script executed:

rg "\.adjustedH" --type swift | head -20

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 2610


🏁 Script executed:

rg "extension.*Int\|extension.*CGFloat" --type swift -A 3 | grep -A 5 "adjustedH"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 52


🏁 Script executed:

fd "TypographyText" --type swift

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 242


🏁 Script executed:

rg "adjustedH" --type swift -B 2 -A 2 | grep -E "extension|computed|var" | head -20

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 2215


🏁 Script executed:

find . -name "*TypographyText*" -o -name "*typography*" | grep -i swift

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 52


🏁 Script executed:

rg "struct TypographyText|class TypographyText" --type swift

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 167


🏁 Script executed:

cat -n "Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Adjust+.swift"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 1218


🏁 Script executed:

cat -n "Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Font+.swift"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 3963


고정 높이가 텍스트 래핑과 로컬라이제이션 시 텍스트 잘림 위험 가능

텍스트에 고정 height를 지정하면 다중 라인 텍스트나 긴 언어 문자열(한국어 등)에서 높이 초과 시 잘릴 수 있습니다. 특히 30.adjustedH(line 21)와 24.adjustedH(line 23, 38)는 단일 라인 기준으로 설정되었으나, 텍스트가 래핑될 경우 콘텐츠를 담기 부족할 수 있습니다. 필요시 lineLimit(nil) 추가나 동적 높이 조정을 검토해 주세요.

🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/StartChallengeView.swift`
around lines 20 - 23, The two TypographyText instances (the one with "이번엔 어떤
루틴으로 관리할까요?" using .frame(height: 30.adjustedH) and the one with "루틴을 지킬수록 체리가
성장해요." using .frame(height: 24.adjustedH)) use fixed heights that can truncate
wrapped or localized text; remove the fixed .frame(height: ...) or replace it
with a flexible layout approach and enable multiline by adding lineLimit(nil)
and allowing vertical expansion (e.g., fixedSize(horizontal: false, vertical:
true) or no explicit height constraint) so the text can grow for
wrapping/localization while keeping any intended spacing via surrounding
containers or Spacer.

This was referenced Jan 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Fix 버그 수정 수민🐶

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Fix] 1차 QA 반영

4 participants