Skip to content

[Chore] #228 - 메모 존재 여부에 따른 분기 추가#229

Merged
OneTen19 merged 3 commits intodevelopfrom
chore/#228
Apr 20, 2026
Merged

[Chore] #228 - 메모 존재 여부에 따른 분기 추가#229
OneTen19 merged 3 commits intodevelopfrom
chore/#228

Conversation

@OneTen19
Copy link
Copy Markdown
Member

@OneTen19 OneTen19 commented Apr 20, 2026

🌴 작업한 브랜치

  • #이슈번호

✅ 작업한 내용

메모 여부에 따른 아이콘 분기를 추가했습니다.

❗️PR Point

나중에 아카이브 푸터 컴포넌트 좀 깔끔하게 정리해야겠네요

📸 스크린샷

기능 스크린샷
GIF
GIF

📟 관련 이슈

Summary by CodeRabbit

릴리스 노트

  • 개선 사항
    • 사진 상세 보기에서 메모 아이콘이 메모 존재 여부에 따라 동적으로 표시됩니다. 메모가 있으면 채워진 아이콘, 없으면 빈 아이콘으로 표시되어 메모 상태를 한눈에 확인할 수 있습니다.

@OneTen19 OneTen19 added this to the 4차 스프린트 milestone Apr 20, 2026
@OneTen19 OneTen19 requested a review from Remaked-Swain April 20, 2026 15:13
@OneTen19 OneTen19 self-assigned this Apr 20, 2026
@OneTen19 OneTen19 added Chore 🪡 자잘한 코드 수정 한열 🧄 한열 작업 labels Apr 20, 2026
@OneTen19 OneTen19 linked an issue Apr 20, 2026 that may be closed by this pull request
2 tasks
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 20, 2026

주요 변경 사항

메모 상태에 따른 아이콘 표시 기능을 구현합니다. hasMemo 속성을 추가하여 메모 유무를 추적하고, 조건부로 메모 아이콘(채워진 형태 vs. 윤곽선)을 렌더링합니다. SVG 아이콘을 PNG 변형으로 교체하고 새로운 filled 아이콘 애셋을 추가합니다. Fastlane 빌드 번호 자동 증가 로직도 제거됩니다.

변경 사항

파일 그룹 요약
메모 아이콘 표시 로직
Neki-iOS/Features/Archive/.../ArchiveImageFooter.swift, Neki-iOS/Features/Archive/.../ArchivePhotoDetailView.swift
메모 상태 추적을 위해 hasMemo: Bool = false 파라미터를 ArchiveImageFooter 이니셜라이저에 추가하고, 메모 유무에 따라 .iconNoteFill 또는 .iconNote 아이콘을 조건부로 선택하는 로직 구현. ArchivePhotoDetailView에서 현재 아이템의 메모 내용(!currentItem.memo.isEmpty)을 기반으로 이 값을 전달.
아이콘 애셋
Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/Contents.json, Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note_fill.imageset/Contents.json
icon_note 애셋을 단일 SVG에서 세 가지 스케일(1x, 2x, 3x)의 PNG 래스터 이미지로 변환. 새로운 icon_note_fill 애셋 추가 (icon_note_fill1.png, icon_note_fill2.png, icon_note_fill3.png의 세 가지 변형 포함).
Fastlane 구성
fastlane/Fastfile
빌드 번호 자동 증가 로직 제거 (Xcode 프로젝트 버전 조회 및 TestFlight 최신 빌드 번호 쿼리 기능 삭제). 이후 주석 번호 재정렬.

예상 코드 리뷰 시간

🎯 3 (Moderate) | ⏱️ ~20 분

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning Fastlane 파일의 빌드 번호 자동증가 로직 제거는 이슈 #228의 범위 외입니다: asset/아이콘 분기 구현과 무관한 배포 자동화 변경입니다. Fastlane 변경사항을 별도 PR로 분리하거나, #228 이슈 scope에 배포 자동화 변경을 명시적으로 추가하세요.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 주요 변경사항(메모 존재 여부에 따른 아이콘 분기 추가)을 명확하게 요약하고 있습니다.
Description check ✅ Passed PR 설명이 필수 섹션(작업 내용, PR Point, 스크린샷, 관련 이슈)을 포함하고 있으나, 작업한 브랜치 필드가 '#이슈번호'로 미완성 상태입니다.
Linked Issues check ✅ Passed 이슈 #228의 모든 요구사항(asset 추가, 상태별 아이콘 분기)이 충족되었습니다: icon_note_fill.imageset 추가, hasMemo 기반 아이콘 선택 로직 구현.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/#228

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
Copy Markdown

@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

🤖 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

📥 Commits

Reviewing files that changed from the base of the PR and between bda7793 and 12906b0.

⛔ Files ignored due to path filters (7)
  • Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/icon_note.svg is excluded by !**/*.svg
  • Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/icon_note1.png is excluded by !**/*.png
  • Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/icon_note2.png is excluded by !**/*.png
  • Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/icon_note3.png is excluded by !**/*.png
  • Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note_fill.imageset/icon_note_fill1.png is excluded by !**/*.png
  • Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note_fill.imageset/icon_note_fill2.png is excluded by !**/*.png
  • Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note_fill.imageset/icon_note_fill3.png is excluded by !**/*.png
📒 Files selected for processing (5)
  • Neki-iOS/Features/Archive/Sources/Presentation/Sources/Components/ArchiveImageFooter.swift
  • Neki-iOS/Features/Archive/Sources/Presentation/Sources/View/ArchivePhotoDetailView.swift
  • Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note.imageset/Contents.json
  • Neki-iOS/Shared/DesignSystem/Resources/Assets.xcassets/Common/icon_note_fill.imageset/Contents.json
  • fastlane/Fastfile

Comment thread fastlane/Fastfile
Comment on lines +24 to 29
# 4. 앱 빌드 및 아카이브
build_app(
scheme: "Neki-iOS",
configuration: "Release",
export_method: "app-store"
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 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.

Suggested change
# 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.

Comment on lines +150 to 151
Image(hasMemo ? .iconNoteFill : .iconNote)
.foregroundStyle(.gray700)
Copy link
Copy Markdown

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:

#!/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.

Suggested change
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.

Copy link
Copy Markdown
Member

@Remaked-Swain Remaked-Swain left a comment

Choose a reason for hiding this comment

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

아주좋아용
아 저는 약간 느낌표 부정문으로 선언하는 hasMemo 같은 식이 잘 작성되어 있는가 판단하는게 왤케 어렵죠
뭔가 한눈에 파악이 안된달까

LGTM

Comment on lines 34 to 52
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
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

p3)

이렇게 전달되는 파라미터가 많아질 때 유용한 디자인 패턴같은게 있을까요?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

오오 이거 정처기 공부할 때 봤던 거 같은데 빌더패턴??

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

SwiftUI는 기본적으로 선언형 패러다임을 완성하기 위해 뷰빌더를 사용합니다.
빌더 패턴과 연결지어 설명할 수 있나요?

@OneTen19 OneTen19 merged commit 150d635 into develop Apr 20, 2026
1 check passed
@OneTen19 OneTen19 deleted the chore/#228 branch April 20, 2026 15:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Chore 🪡 자잘한 코드 수정 한열 🧄 한열 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Chore] 메모 상태별 아이콘 추가

2 participants