Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,10 @@ struct ArchiveImageFooter: View {

let style: ArchiveFooterStyle

/// 버튼 활성화 여부
let isEnabled: Bool
/// 즐겨찾기 상태 (상세 모드 전용)
let isFavorite: Bool?
let hasMemo: Bool

// 아이콘 액션
let onDownload: () -> Void
let onDelete: () -> Void
let onFavorite: (() -> Void)?
Expand All @@ -37,6 +35,7 @@ struct ArchiveImageFooter: View {
style: ArchiveFooterStyle = .detail,
isEnabled: Bool = true,
isFavorite: Bool? = nil,
hasMemo: Bool = false,
onDownload: @escaping () -> Void,
onDelete: @escaping () -> Void,
onFavorite: (() -> Void)? = nil,
Expand All @@ -47,6 +46,7 @@ struct ArchiveImageFooter: View {
self.style = style
self.isEnabled = isEnabled
self.isFavorite = isFavorite
self.hasMemo = hasMemo
self.onDownload = onDownload
self.onDelete = onDelete
self.onFavorite = onFavorite
Expand Down Expand Up @@ -122,14 +122,14 @@ extension ArchiveImageFooter {
Text(title)
.nekiFont(.body14Medium)
.foregroundStyle(isEnabled ? .gray700 : .gray400)

}
.frame(maxWidth: .infinity)
.contentShape(Rectangle())
}
.disabled(!isEnabled)
}

private var detailModeFooter: some View {
HStack(alignment: .center, spacing: 0) {
Button(action: onDownload) {
Expand All @@ -147,7 +147,7 @@ extension ArchiveImageFooter {

if let onTapMemo = onTapMemo {
Button(action: onTapMemo) {
Image(.iconNote)
Image(hasMemo ? .iconNoteFill : .iconNote)
.foregroundStyle(.gray700)
Comment on lines +150 to 151
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.

}
.padding(.leading, 16)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,7 @@ extension ArchivePhotoDetailView {
ArchiveImageFooter(
isEnabled: true,
isFavorite: currentItem.isFavorite,
hasMemo: !currentItem.memo.isEmpty,
onDownload: { store.send(.onTapDownload) },
onDelete: { showDeleteAlert = true },
onFavorite: { store.send(.onTapFavorite) },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
{
"images" : [
{
"filename" : "icon_note.svg",
"idiom" : "universal"
"filename" : "icon_note1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "icon_note2.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "icon_note3.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

This file was deleted.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "icon_note_fill1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "icon_note_fill2.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "icon_note_fill3.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 2 additions & 18 deletions fastlane/Fastfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,30 +21,14 @@ platform :ios do
readonly: true
)

# 4. 버전별 빌드 번호 자동 관리 로직
# 현재 Xcode 프로젝트에 설정된 버전(예: 1.2.0)을 가져옵니다.
current_version = get_version_number(target: "Neki-iOS")

# 해당 버전에서 TestFlight에 올라간 가장 높은 빌드 번호를 확인합니다.
# 만약 새 버전이라 데이터가 없다면 0을 반환합니다.
latest_build = latest_testflight_build_number(
version: current_version,
initial_build_number: 0
)

# 확인된 번호에 +1을 해서 로컬 프로젝트에 적용합니다.
increment_build_number(
build_number: latest_build + 1
)

# 5. 앱 빌드 및 아카이브
# 4. 앱 빌드 및 아카이브
build_app(
scheme: "Neki-iOS",
configuration: "Release",
export_method: "app-store"
)
Comment on lines +24 to 29
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.


# 6. TestFlight 업로드
# 5. TestFlight 업로드
upload_to_app_store(
skip_metadata: true,
skip_screenshots: true,
Expand Down