Conversation
주요 변경 사항메모 상태에 따른 아이콘 표시 기능을 구현합니다. 변경 사항
예상 코드 리뷰 시간🎯 3 (Moderate) | ⏱️ ~20 분 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@fastlane/Fastfile`:
- Around line 24-29: Restore an explicit build-number bump step before
build_app: call the existing mechanism you use for iOS build numbers (e.g.,
agvtool bump -all / fastlane action increment_build_number /
increment_version_number) to update CURRENT_PROJECT_VERSION across all targets,
ensure the bumped value is committed or surfaced to the CI, and keep
MARKETING_VERSION management in GitHub Actions as-is; specifically insert a
pre-build step that updates CURRENT_PROJECT_VERSION for every target (not just
MARKETING_VERSION), verifies the new build number is applied, and only then runs
build_app (scheme: "Neki-iOS"), so repeated uploads won’t fail due to duplicate
build numbers.
In
`@Neki-iOS/Features/Archive/Sources/Presentation/Sources/Components/ArchiveImageFooter.swift`:
- Around line 150-151: The PNG note icons are not set to template rendering so
.foregroundStyle(.gray700) may not tint them; update the Image(hasMemo ?
.iconNoteFill : .iconNote) usage in ArchiveImageFooter (same pattern as the
trash icon) to explicitly call .renderingMode(.template) before applying
.foregroundStyle to ensure the PNG is tinted correctly.
🪄 Autofix (Beta)
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: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: d6f036f2-328d-42e8-8ad6-96f76383edcd
⛔ Files ignored due to path filters (7)
Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/icon_note.svgis excluded by!**/*.svgNeki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/icon_note1.pngis excluded by!**/*.pngNeki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/icon_note2.pngis excluded by!**/*.pngNeki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/icon_note3.pngis excluded by!**/*.pngNeki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note_fill.imageset/icon_note_fill1.pngis excluded by!**/*.pngNeki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note_fill.imageset/icon_note_fill2.pngis excluded by!**/*.pngNeki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note_fill.imageset/icon_note_fill3.pngis excluded by!**/*.png
📒 Files selected for processing (5)
Neki-iOS/Features/Archive/Sources/Presentation/Sources/Components/ArchiveImageFooter.swiftNeki-iOS/Features/Archive/Sources/Presentation/Sources/View/ArchivePhotoDetailView.swiftNeki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/Contents.jsonNeki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note_fill.imageset/Contents.jsonfastlane/Fastfile
| # 4. 앱 빌드 및 아카이브 | ||
| build_app( | ||
| scheme: "Neki-iOS", | ||
| configuration: "Release", | ||
| export_method: "app-store" | ||
| ) |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# 빌드 번호/마케팅 버전 설정 확인
rg -n -C2 'CURRENT_PROJECT_VERSION|MARKETING_VERSION' -- 'Neki-iOS.xcodeproj/project.pbxproj'
# Fastlane 및 릴리스 워크플로에서 빌드 번호 갱신 경로 확인
rg -n -C3 'increment_build_number|latest_testflight_build_number|agvtool|CURRENT_PROJECT_VERSION|MARKETING_VERSION' -- 'fastlane/Fastfile' '.github/workflows/release.yml'Repository: YAPP-Github/Neki-iOS
Length of output: 3135
빌드 번호 갱신 경로를 복구하거나 대체 경로를 명시해 주세요.
Line 24 이후 build_app 전에 빌드 번호를 올리는 단계가 없어졌습니다. CURRENT_PROJECT_VERSION = 1이 모든 타겟에서 고정되어 있고, GitHub Actions 워크플로는 MARKETING_VERSION만 관리하므로, 동일 버전의 두 번째 업로드부터 중복 빌드 번호로 인해 TestFlight/App Store Connect 업로드가 실패합니다.
수정 예시
- # 4. 앱 빌드 및 아카이브
+ # 4. 빌드 번호 갱신
+ version = get_version_number(
+ xcodeproj: "Neki-iOS.xcodeproj",
+ target: "Neki-iOS"
+ )
+ latest_build = latest_testflight_build_number(version: version)
+ increment_build_number(build_number: latest_build + 1)
+
+ # 5. 앱 빌드 및 아카이브
build_app(
scheme: "Neki-iOS",
configuration: "Release",
export_method: "app-store"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # 4. 앱 빌드 및 아카이브 | |
| build_app( | |
| scheme: "Neki-iOS", | |
| configuration: "Release", | |
| export_method: "app-store" | |
| ) | |
| # 4. 빌드 번호 갱신 | |
| version = get_version_number( | |
| xcodeproj: "Neki-iOS.xcodeproj", | |
| target: "Neki-iOS" | |
| ) | |
| latest_build = latest_testflight_build_number(version: version) | |
| increment_build_number(build_number: latest_build + 1) | |
| # 5. 앱 빌드 및 아카이브 | |
| build_app( | |
| scheme: "Neki-iOS", | |
| configuration: "Release", | |
| export_method: "app-store" | |
| ) |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@fastlane/Fastfile` around lines 24 - 29, Restore an explicit build-number
bump step before build_app: call the existing mechanism you use for iOS build
numbers (e.g., agvtool bump -all / fastlane action increment_build_number /
increment_version_number) to update CURRENT_PROJECT_VERSION across all targets,
ensure the bumped value is committed or surfaced to the CI, and keep
MARKETING_VERSION management in GitHub Actions as-is; specifically insert a
pre-build step that updates CURRENT_PROJECT_VERSION for every target (not just
MARKETING_VERSION), verifies the new build number is applied, and only then runs
build_app (scheme: "Neki-iOS"), so repeated uploads won’t fail due to duplicate
build numbers.
| Image(hasMemo ? .iconNoteFill : .iconNote) | ||
| .foregroundStyle(.gray700) |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# 설명: note 계열 asset에 template-rendering-intent가 있는지와 SwiftUI 사용부가 template rendering을 명시하는지 확인합니다.
python3 - <<'PY'
import json
from pathlib import Path
for path in Path(".").rglob("Contents.json"):
text_path = str(path)
if "icon_note" not in text_path:
continue
data = json.loads(path.read_text())
print(f"\n{path}")
print("properties:", data.get("properties", {}))
PY
rg -n -C2 'Image\(hasMemo\s*\?\s*\.iconNoteFill\s*:\s*\.iconNote\)|renderingMode\(\.template\)' --glob '*.swift'Repository: YAPP-Github/Neki-iOS
Length of output: 2375
PNG 아이콘 틴팅을 명시해 주세요.
icon_note/icon_note_fill이 PNG 이미지셋인데 asset JSON에 template rendering 설정이 없어서, Line 151의 .foregroundStyle(.gray700)가 실제 아이콘 색상에 적용되지 않을 수 있습니다. 코드에서 .renderingMode(.template)를 명시해 주세요. (같은 파일의 trash 아이콘과 다른 곳의 사용 패턴을 참고하세요.)
🎨 제안 수정
Image(hasMemo ? .iconNoteFill : .iconNote)
+ .renderingMode(.template)
.foregroundStyle(.gray700)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Image(hasMemo ? .iconNoteFill : .iconNote) | |
| .foregroundStyle(.gray700) | |
| Image(hasMemo ? .iconNoteFill : .iconNote) | |
| .renderingMode(.template) | |
| .foregroundStyle(.gray700) |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@Neki-iOS/Features/Archive/Sources/Presentation/Sources/Components/ArchiveImageFooter.swift`
around lines 150 - 151, The PNG note icons are not set to template rendering so
.foregroundStyle(.gray700) may not tint them; update the Image(hasMemo ?
.iconNoteFill : .iconNote) usage in ArchiveImageFooter (same pattern as the
trash icon) to explicitly call .renderingMode(.template) before applying
.foregroundStyle to ensure the PNG is tinted correctly.
Remaked-Swain
left a comment
There was a problem hiding this comment.
아주좋아용
아 저는 약간 느낌표 부정문으로 선언하는 hasMemo 같은 식이 잘 작성되어 있는가 판단하는게 왤케 어렵죠
뭔가 한눈에 파악이 안된달까
LGTM
| public init( | ||
| style: ArchiveFooterStyle = .detail, | ||
| isEnabled: Bool = true, | ||
| isFavorite: Bool? = nil, | ||
| hasMemo: Bool = false, | ||
| onDownload: @escaping () -> Void, | ||
| onDelete: @escaping () -> Void, | ||
| onFavorite: (() -> Void)? = nil, | ||
| onTapMemo: (() -> Void)? = nil, | ||
| onDuplicate: (() -> Void)? = nil, | ||
| onMove: (() -> Void)? = nil | ||
| ) { | ||
| self.style = style | ||
| self.isEnabled = isEnabled | ||
| self.isFavorite = isFavorite | ||
| self.hasMemo = hasMemo | ||
| self.onDownload = onDownload | ||
| self.onDelete = onDelete | ||
| self.onFavorite = onFavorite |
There was a problem hiding this comment.
p3)
이렇게 전달되는 파라미터가 많아질 때 유용한 디자인 패턴같은게 있을까요?
There was a problem hiding this comment.
오오 이거 정처기 공부할 때 봤던 거 같은데 빌더패턴??
There was a problem hiding this comment.
SwiftUI는 기본적으로 선언형 패러다임을 완성하기 위해 뷰빌더를 사용합니다.
빌더 패턴과 연결지어 설명할 수 있나요?
🌴 작업한 브랜치
✅ 작업한 내용
메모 여부에 따른 아이콘 분기를 추가했습니다.
❗️PR Point
나중에 아카이브 푸터 컴포넌트 좀 깔끔하게 정리해야겠네요
📸 스크린샷
📟 관련 이슈
Summary by CodeRabbit
릴리스 노트