Skip to content

feature/#54 - 리스트뷰 placeholder 모델 적용 - #59

Merged
yeseonglee merged 3 commits into
developfrom
feature/#54
Jul 25, 2026
Merged

feature/#54 - 리스트뷰 placeholder 모델 적용#59
yeseonglee merged 3 commits into
developfrom
feature/#54

Conversation

@yeseonglee

@yeseonglee yeseonglee commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

✨ What’s this PR?

📌 관련 이슈 (Related Issue)


🧶 주요 변경 내용 (Summary)

  • DVVaultContainer 아바타에 3단계 폴백 추가: 서비스 로고 매칭 → service 첫 글자 이니셜 → secretType 아이콘
  • Google/GitHub/Naver/KakaoTalk 브랜드 로고 SVG 번들 및 ServiceLogoCatalog로 별칭(alias) 매핑 (Simple Icons, CC0 라이선스)

📸 스크린샷 (Optional)

스크린샷 2026-07-25 13 27 52 스크린샷 2026-07-25 13 27 45

🧪 테스트 / 검증 내역

  • UI 정상 동작 확인
  • My Mac, macOS 13.0 환경에서 정상 동작

💬 기타 공유 사항

  • UI 컴포넌트 위치가 디자이너 시안과 다를 수 있어요 → 후속 PR에서 반영 예정
  • API 에러 대응 로직은 공통 모듈화하는 작업과 함께 처리할 예정입니다

🙇🏻‍♀️ 리뷰 가이드 (선택)

  • 'DVVaultContainer₩avatarCircle`의 3단계 폴백 우선순위가 맞는지

Summary by CodeRabbit

  • 새로운 기능
    • 시크릿 항목에 서비스 로고(구글, 깃허브, 네이버, 카카오톡)를 표시하고, 없을 땐 서비스 이니셜 또는 시크릿 유형 아이콘으로 대체합니다.
    • 시크릿 목록 행에 서비스/유형 아이콘을 함께 노출합니다.
    • 프리뷰 목록의 만료·삭제·즐겨찾기 등 상태 기반 표시가 더 정확해졌습니다.
  • 개선 사항
    • 서비스명 입력 형식이 달라도 로고 매칭이 더 안정적으로 동작합니다.
    • 시크릿 유형 아이콘 표시 로직이 일관되게 개선되었습니다.

@yeseonglee yeseonglee self-assigned this Jul 25, 2026
@yeseonglee yeseonglee linked an issue Jul 25, 2026 that may be closed by this pull request
2 tasks
@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

서비스 로고 카탈로그와 이미지 세트 메타데이터를 추가하고, DVVaultContainer가 서비스 로고·이니셜·타입 아이콘을 폴백으로 표시하도록 변경했습니다. Secret 목록과 프리뷰 조회가 새 UI 데이터 경로를 사용합니다.

Changes

서비스 로고 아바타

Layer / File(s) Summary
서비스 로고 카탈로그 및 자산
Projects/DVDesign/Sources/Foundations/ServiceLogo/..., Projects/DVDesign/Sources/Foundations/Color/..., Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/...
서비스명을 정규화하고 별칭으로 로고를 조회하는 카탈로그와 Color(hex:) 변환을 추가했습니다. Google, GitHub, Naver, KakaoTalk 이미지 세트 메타데이터도 추가했습니다.
프리뷰 데이터 및 컬렉션 조회
Projects/DVPresentation/Sources/Dependencies/SecretClient.swift, Projects/DVPresentation/Sources/Dependencies/SecretClient+Preview.swift
서비스, 타입, 만료·삭제·좋아요 상태를 포함하는 프리뷰 Secret과 프로젝트 데이터를 추가하고, 컬렉션별 필터링 조회를 구현했습니다.
DVVaultContainer 아바타 렌더링
Projects/DVDesign/Sources/Components/DVVaultContainer.swift, Projects/DVPresentation/Sources/Support/SecretType+Icon.swift, Projects/DVPresentation/Sources/Features/CreateSecret/Model/CreatableSecretType.swift
DVVaultContainerservicetypeIcon을 추가하고, 로고·서비스 이니셜·타입 아이콘 순서로 아바타를 표시하도록 변경했습니다. Secret 타입 아이콘의 공통 생성 경로도 추가했습니다.
목록 및 샘플 연결
Projects/DVPresentation/Sources/Features/SecretList/SecretListView.swift, Projects/DVDesign/SampleApp/Sources/DVVaultContainerPreviewView.swift
목록과 샘플 뷰가 서비스 및 타입 아이콘을 DVVaultContainer에 전달하도록 갱신했습니다.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant SecretListView
  participant DVVaultContainer
  participant ServiceLogoCatalog
  SecretListView->>DVVaultContainer: service와 typeIcon 전달
  DVVaultContainer->>ServiceLogoCatalog: 서비스 로고 조회
  ServiceLogoCatalog-->>DVVaultContainer: 로고 또는 nil 반환
  DVVaultContainer-->>SecretListView: 로고, 이니셜 또는 타입 아이콘 표시
Loading

Possibly related PRs

Suggested labels: 🎨 Design

Suggested reviewers: dlguszoo, doyeonk429

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 리스트뷰 placeholder 적용이라는 핵심 변경을 잘 요약하며, 실제 변경 범위와도 대체로 일치합니다.
Linked Issues check ✅ Passed #54의 로고 이미지 처리와 placeholder 모델 연결이 DVVaultContainer, ServiceLogoCatalog, SecretListView 변경으로 모두 반영되었습니다.
Out of Scope Changes check ✅ Passed 색상 hex 유틸과 프리뷰 픽스처 정리는 로고/placeholder 렌더링을 지원하는 범위로 보여, 명확한 범위 이탈은 없습니다.
✨ 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 feature/#54

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
Projects/DVPresentation/Sources/Dependencies/SecretClient.swift (1)

75-78: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

public extension 대신 선언에 직접 접근 제어를 지정하세요.

preview만 공개해야 하므로 extension은 기본 접근 수준으로 두고 public static let preview를 명시하는 편이 API 범위를 분명히 합니다.

수정 예시
-public extension [Secret] {
+extension [Secret] {
-  static let preview: [Secret] = [
+  public static let preview: [Secret] = [

As per path instructions, "public extension 패턴 대신 각 선언에 직접 접근 제어가 명시되어 있는지 확인하세요."

🤖 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/DVPresentation/Sources/Dependencies/SecretClient.swift` around lines
75 - 78, Change the [Secret] extension to use the default access level instead
of public, and mark only the preview property with explicit public access. Keep
the existing preview fixture contents unchanged.

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/DVDesign/SampleApp/Sources/DVVaultContainerPreviewView.swift`:
- Around line 10-22: Update the sample data in the vaults array to include a
typeIcon fallback for entries whose service is nil, and update the
DVVaultContainer call site to pass that tuple value through as typeIcon.
Preserve existing service and status values while ensuring the sample exercises
the avatar fallback behavior.

In `@Projects/DVPresentation/Sources/Dependencies/SecretClient.swift`:
- Around line 31-41: Split the `.all`, `.liked`, and `.project` branches in
`fetchByQuery` so each collection applies its own preview predicate: `.all`
returns non-deleted secrets, `.liked` returns only secrets with `liked == true`,
and `.project` returns only secrets linked to the requested `projectID`; update
the corresponding preview fixtures so each collection’s list state can be
validated independently.

---

Nitpick comments:
In `@Projects/DVPresentation/Sources/Dependencies/SecretClient.swift`:
- Around line 75-78: Change the [Secret] extension to use the default access
level instead of public, and mark only the preview property with explicit public
access. Keep the existing preview fixture contents unchanged.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 691eedf6-9858-4676-9542-407e4b85613b

📥 Commits

Reviewing files that changed from the base of the PR and between 7d6068e and 8cba26b.

⛔ Files ignored due to path filters (4)
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/github.imageset/github.svg is excluded by !**/*.svg
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/google.imageset/google.svg is excluded by !**/*.svg
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/kakaotalk.imageset/kakaotalk.svg is excluded by !**/*.svg
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/naver.imageset/naver.svg is excluded by !**/*.svg
📒 Files selected for processing (12)
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/Contents.json
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/github.imageset/Contents.json
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/google.imageset/Contents.json
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/kakaotalk.imageset/Contents.json
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/naver.imageset/Contents.json
  • Projects/DVDesign/SampleApp/Sources/DVVaultContainerPreviewView.swift
  • Projects/DVDesign/Sources/Components/DVVaultContainer.swift
  • Projects/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift
  • Projects/DVPresentation/Sources/Dependencies/SecretClient.swift
  • Projects/DVPresentation/Sources/Features/CreateSecret/Model/CreatableSecretType.swift
  • Projects/DVPresentation/Sources/Features/SecretList/SecretListView.swift
  • Projects/DVPresentation/Sources/Support/SecretType+Icon.swift

Comment thread Projects/DVDesign/SampleApp/Sources/DVVaultContainerPreviewView.swift Outdated
Comment thread Projects/DVPresentation/Sources/Dependencies/SecretClient.swift
@doyeonk429

Copy link
Copy Markdown
Contributor
  1. KakaoTalk 로고가 template rendering 때문에 뭉개질 위험

DVVaultContainer.swift:71 — renderingMode(.template) + .foregroundStyle(Color.dv(.white))로 SVG 전체를 흰색 단색으로
렌더링.

  • GitHub/Google/Naver는 심볼 단일 path라 잘 나오지만, KakaoTalk SVG는 사각 배경 + 안쪽 K/A/K 심볼이 한 path에
    all-in-one으로 그려짐. template 렌더링하면 사각형 안까지 몽땅 흰색으로 채워져 로고 형태를 잃음.
  • Assets의 template-rendering-intent: template도 같은 문제. 옵션:
    • KakaoTalk만 preserves-vector-representation + original rendering + Circle fill을 KakaoTalk yellow(0xFFCD00, 지금
      brandColor)로 유지 (심볼은 원본 검정 그대로).
    • 아니면 심볼만 뽑힌 다른 소스로 교체.
  • 실제 프리뷰에서 확인 필요 — PR 스크린샷엔 카카오톡이 없어서 미확인.
  1. .oauth 아이콘이 조용히 바뀜 (side-effect)

CreatableSecretType.swift 원본은 person.badge.key.fill. 새 SecretType+Icon.swift에선 checkmark.shield.fill.

  • CreatableSecretType.icon → domainType.icon으로 위임하면서 SelectSecretType 그리드의 OAuth 카드 아이콘도 함께 바뀜.
  • PR 본문/커밋 메시지에 이 변경 언급 없음. 의도한 통일이면 body에 남기고, 아니면 SecretType+Icon 쪽을
    person.badge.key.fill로 원복.

@doyeonk429

Copy link
Copy Markdown
Contributor

🟡 P2 · 설계/유지보수

  1. ServiceLogoCatalog의 aliases + entries 이원화가 과설계

ServiceLogoCatalog.swift:24-44 — 별칭 dict와 로고 dict를 따로 두면, 로고 추가 시 두 곳을 동기화해야 하는 실수 소지.
4개 서비스 규모에선 flat [String: DVServiceLogo] 하나로 별칭별 매핑을 두는 편이 단순. 또는 entries 값에 aliases:
[String]을 두고 부팅 시 역인덱스 한 번만 만들기.

  1. SecretClient.swift가 preview fixture로 비대해짐 (+82줄)

Dependency 정의 파일에 preview 데이터 80줄이 몰림. SecretClient+Preview.swift로 분리 권장 — Dependency 인터페이스와
fixture는 관심사가 다름.

  1. public extension [Secret] 접근 제어 (coderabbit 지적 재확인)

프로젝트 룰이 "선언마다 접근 제어 명시"라면 (coderabbit path instructions), public extension 대신 extension [Secret]
{ public static let preview ... }로. previewFixtures, secret(...) 헬퍼가 public로 새어나가지 않게 하는 효과.

  1. Color(hex: UInt32) 이니셜라이저 위치

ServiceLogoCatalog.swift에 private extension Color 정의. DVDesign에 DVColor 유틸이 이미 있으니 Color+Hex.swift로
뽑으면 재사용 가능. 지금은 여기서만 쓰지만 브랜드 컬러 하드코딩(0x4285F4 등)이 늘어나면 공용 위치가 필요해질 것.

-> 이거는 선택적으로 반영

@doyeonk429

Copy link
Copy Markdown
Contributor
  1. avatarCircle의 3-branch 렌더링이 한 프로퍼티에 인라인
  • 로고/이니셜/타입아이콘 각 분기가 Circle+overlay 스택을 반복. logoAvatar, initialAvatar, typeIconAvatar 3개 private
    var로 뽑으면 진단이 쉬움.
  1. DVVaultContainerPreviewView의 튜플 5-필드
  • (String, String, DVVaultContainer.TrailingIcon?, String?, Bool) — 필드가 늘어 가독성 저하. struct PreviewVault {
    name; date; trailing; service; showsTypeIcon } 정도로.
  1. normalize가 alphanumeric-only — "google workspace" → "googleworkspace" 매치 OK지만, 향후 "Google Cloud", "Naver Cloud Platform" 같은 별칭 추가 시 별칭에 미리 붙여넣지 않으면 조용히 fail. 정책을 주석에 한 줄 남겨두면 좋음.

-> 이거는 스타일에 따라 반영 여부 결정하면 될 듯.

@doyeonk429 doyeonk429 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

my CC 칭찬 보내드립니다

✅ 잘한 부분

- service → 이니셜 → typeIcon 3단 폴백 우선순위 명료.
- KakaoTalk 제외한 SVG 자산에 CC0 라이선스 근거(Simple Icons) 첨부.
- Preview fixture가 폴백 3단계 × SecretType 6종을 실제로 커버 — 회귀 감지에 유용.
- SecretType+Icon.swift를 만들어 SelectSecretType/SecretList 두 곳이 같은 소스를 쓰게 만든 방향은 좋음(단, P1의 side-effect만 정리).

@yeseonglee
yeseonglee requested a review from doyeonk429 July 25, 2026 06:49

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
Projects/DVPresentation/Sources/Dependencies/SecretClient+Preview.swift (1)

24-24: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

프리뷰 fixture를 공개 API에서 제외하세요.

제공된 사용처는 모두 DVPresentation 내부이므로, 외부 모듈 사용이 없다면 public을 제거해 fixture가 모듈 API 계약에 포함되지 않게 하세요.

  • Projects/DVPresentation/Sources/Dependencies/SecretClient+Preview.swift#L24-L24: [Secret].previewpublic을 제거하세요.
  • Projects/DVPresentation/Sources/Dependencies/SecretClient+Preview.swift#L27-L27: preview(in:)public을 제거하세요.
  • Projects/DVPresentation/Sources/Dependencies/SecretClient+Preview.swift#L87-L87: [Project].previewpublic을 제거하세요.

As per path instructions, “접근 제어가 가능한 가장 엄격한 수준인지 확인하세요.”

수정 예시
-  public static let preview: [Secret] = previewFixtures.map(\.secret)
+  static let preview: [Secret] = previewFixtures.map(\.secret)

-  public static func preview(in projectID: Project.ID) -> [Secret] {
+  static func preview(in projectID: Project.ID) -> [Secret] {

-  public static let preview: [Project] = [
+  static let preview: [Project] = [
🤖 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/DVPresentation/Sources/Dependencies/SecretClient`+Preview.swift at
line 24, 프리뷰 fixture가 공개 모듈 API에 노출되지 않도록 SecretClient+Preview.swift의
[Secret].preview, preview(in:), [Project].preview 선언에서 public 접근 제어자를 제거하고, 외부
접근이 불가능한 가장 엄격한 수준을 적용하세요.

Source: Path instructions

Projects/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift (1)

52-55: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Alias 인덱스 생성에도 동일한 정규화를 적용하세요.

현재 조회 시에는 normalize(service)를 사용하지만 인덱스 생성 시에는 alias를 그대로 키로 저장합니다. 향후 "Google Workspace" 같은 alias를 추가하면 저장 키와 조회 키가 달라져 매칭이 실패합니다.

수정 예시
         for alias in entry.aliases {
-            result[alias] = entry.logo
+            result[normalize(alias)] = entry.logo
         }
🤖 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/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift`
around lines 52 - 55, Update the logosByAlias index construction to apply
normalize(alias) before storing each alias key, matching the normalization used
by service lookup. Keep mapping the normalized key to entry.logo and preserve
the existing entries.reduce flow.
Projects/DVDesign/SampleApp/Sources/DVVaultContainerPreviewView.swift (1)

13-25: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Bool 플래그 대신 명명된 샘플 모델을 사용하세요.

vaults[index].4typeIcon 사용 여부를 의미해 데이터의 의도가 호출부에 숨겨져 있습니다. VaultPreviewItem 구조체의 typeIcon: Image? 프로퍼티로 표현하면 필드 순서 변경이나 잘못된 인덱스 전달을 예방할 수 있습니다.

개선 예시
+private struct VaultPreviewItem {
+    let name: String
+    let date: String
+    let trailingIcon: DVVaultContainer.TrailingIcon?
+    let service: String?
+    let typeIcon: Image?
+}
+
-    private let vaults: [(String, String, DVVaultContainer.TrailingIcon?, String?, Bool)] = [
+    private let vaults: [VaultPreviewItem] = [
-        ("내가 설정한 이름", "2026.04.01", nil, nil, true),
+        .init(name: "내가 설정한 이름", date: "2026.04.01", trailingIcon: nil, service: nil, typeIcon: placeholderTypeIcon),
-                    typeIcon: vaults[index].4 ? placeholderTypeIcon : nil,
+                    typeIcon: vaults[index].typeIcon,

Also applies to: 71-71

🤖 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/DVDesign/SampleApp/Sources/DVVaultContainerPreviewView.swift` around
lines 13 - 25, Replace the positional vault tuple and its Boolean flag in
DVVaultContainerPreviewView with a named VaultPreviewItem model containing a
typeIcon: Image? property. Update the vaults sample data and all consumers,
including the referenced later usage, to access named properties instead of
tuple indices while preserving the current preview behavior.
🤖 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/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift`:
- Around line 22-26: Update ServiceLogoCatalog.normalize to make its filtering
behavior match the documented and alias-supported character range: retain only
ASCII English letters and digits, or consistently revise the comment and alias
policy to support Unicode. Prefer the smallest change that preserves the
existing ASCII alias behavior.

---

Nitpick comments:
In `@Projects/DVDesign/SampleApp/Sources/DVVaultContainerPreviewView.swift`:
- Around line 13-25: Replace the positional vault tuple and its Boolean flag in
DVVaultContainerPreviewView with a named VaultPreviewItem model containing a
typeIcon: Image? property. Update the vaults sample data and all consumers,
including the referenced later usage, to access named properties instead of
tuple indices while preserving the current preview behavior.

In `@Projects/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift`:
- Around line 52-55: Update the logosByAlias index construction to apply
normalize(alias) before storing each alias key, matching the normalization used
by service lookup. Keep mapping the normalized key to entry.logo and preserve
the existing entries.reduce flow.

In `@Projects/DVPresentation/Sources/Dependencies/SecretClient`+Preview.swift:
- Line 24: 프리뷰 fixture가 공개 모듈 API에 노출되지 않도록 SecretClient+Preview.swift의
[Secret].preview, preview(in:), [Project].preview 선언에서 public 접근 제어자를 제거하고, 외부
접근이 불가능한 가장 엄격한 수준을 적용하세요.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 964d0415-ff45-47e2-a674-1e23881e21d2

📥 Commits

Reviewing files that changed from the base of the PR and between 8cba26b and 0acfe59.

📒 Files selected for processing (7)
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/kakaotalk.imageset/Contents.json
  • Projects/DVDesign/SampleApp/Sources/DVVaultContainerPreviewView.swift
  • Projects/DVDesign/Sources/Components/DVVaultContainer.swift
  • Projects/DVDesign/Sources/Foundations/Color/Color+Hex.swift
  • Projects/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift
  • Projects/DVPresentation/Sources/Dependencies/SecretClient+Preview.swift
  • Projects/DVPresentation/Sources/Dependencies/SecretClient.swift
🚧 Files skipped from review as they are similar to previous changes (2)
  • Projects/DVDesign/Resources/Assets.xcassets/ServiceLogos/kakaotalk.imageset/Contents.json
  • Projects/DVDesign/Sources/Components/DVVaultContainer.swift

Comment on lines +22 to +26
/// 영문/숫자만 남기고 비교한다. "Google Cloud"처럼 알려지지 않은 표기는
/// `aliases`에 미리 추가해두지 않는 한 조용히 매칭 실패해 이니셜 폴백으로 빠진다.
private static func normalize(_ raw: String) -> String {
raw.lowercased().filter { $0.isLetter || $0.isNumber }
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate and inspect the target file and relevant symbol usages without executing repo code.
if [ -f Projects/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift ]; then
  echo "== file exists =="
  wc -l Projects/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift
  echo "== outline =="
  ast-grep outline Projects/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift || true
  echo "== relevant lines =="
  nl -ba Projects/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift | sed -n '1,140p'
else
  echo "target file not found"
  fd -a 'ServiceLogoCatalog.swift' .
fi

echo "== related ServiceLogo references =="
rg -n "normalize|aliases|ServiceLogo|ServiceLogoCatalog|isASCII|isLetter|isNumber" Projects/DVDesign -g '*.swift' || true

echo "== Swift/unicode properties probe =="
python3 - <<'PY'
# Read-only semantic probe: inspect how Swift Unicode scalar properties are commonly documented
# and demonstrate equivalent Python-style Unicode is_alnum split behavior, without running repo code.
samples = {
    "Google Cloud": ["Google Cloud"],
    "3D": ["3D"],
    "Cafe": ["Cafe"],
    "Zürich": ["Zürich"],
    "1ø1": ["1ø1"],
    "α": ["α"],
    "Ω": ["Ω"],
}
print("In Swift Character.isLetter/isNumber, Unicode letters/digits are included, e.g.:")
for sample, chars in samples.items():
    print(f"{sample!r}: {' '.join(f\"'{c}'={ord(c):04X}\" for c in sample)}")
PY

Repository: DevaultProject/Devault-macOS

Length of output: 514


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== target file =="
cat -n Projects/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift

echo "== related ServiceLogo references =="
rg -n "normalize|aliases|ServiceLogo|ServiceLogoCatalog|isASCII|isLetter|isNumber" Projects/DVDesign -g '*.swift' || true

echo "== Swift/unicode properties probe =="
python3 - <<'PY'
samples = {
    "Google Cloud": ["Google Cloud"],
    "3D": ["3D"],
    "Cafe": ["Cafe"],
    "Zürich": ["Zürich"],
    "1ø1": ["1ø1"],
    "α": ["α"],
    "Ω": ["Ω"],
}
print("Examples of Unicode letters/digits that String.CharacterSet.letters/digits would include:")
for sample, chars in samples.items():
    print(f"{sample!r}: {' '.join(f\"'{c}'={ord(c):04X}\" for c in sample)}")
PY

Repository: DevaultProject/Devault-macOS

Length of output: 5826


정규화 규칙과 구현의 문자 범위를 일치시키세요.

주석은 영문/숫자만 남긴다고 설명하지만 isLetter/isNumber는 Unicode 문자와 숫자도 통과시킵니다. 현재 alias가 영문 ASCII로 정의되어 있다면 영어+숫자로 엄격히 필터링하거나, Unicode alias가 허용된다고 주석과 alias 정책을 함께 명시하세요.

수정 예시
-        raw.lowercased().filter { $0.isLetter || $0.isNumber }
+        raw.lowercased().filter { $0.isASCII && ($0.isLetter || $0.isNumber) }
📝 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
/// 영문/숫자만 남기고 비교한다. "Google Cloud"처럼 알려지지 않은 표기는
/// `aliases`에 미리 추가해두지 않는 한 조용히 매칭 실패해 이니셜 폴백으로 빠진다.
private static func normalize(_ raw: String) -> String {
raw.lowercased().filter { $0.isLetter || $0.isNumber }
}
/// 영문/숫자만 남기고 비교한다. "Google Cloud"처럼 알려지지 않은 표기는
/// `aliases`에 미리 추가해두지 않는 한 조용히 매칭 실패해 이니셜 폴백으로 빠진다.
private static func normalize(_ raw: String) -> String {
raw.lowercased().filter { $0.isASCII && ($0.isLetter || $0.isNumber) }
}
🤖 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/DVDesign/Sources/Foundations/ServiceLogo/ServiceLogoCatalog.swift`
around lines 22 - 26, Update ServiceLogoCatalog.normalize to make its filtering
behavior match the documented and alias-supported character range: retain only
ASCII English letters and digits, or consistently revise the comment and alias
policy to support Unicode. Prefer the smallest change that preserves the
existing ASCII alias behavior.

@doyeonk429

Copy link
Copy Markdown
Contributor

.oauth 아이콘 : SecretType+Icon.swift:17에 여전히 checkmark.shield.fill. SelectSecretType 카드 그리드 아이콘이 원본(person.badge.key.fill)에서 바뀐 채로 유지 되는데 @yeseonglee 의도 맞나용?

@yeseonglee

Copy link
Copy Markdown
Contributor Author

넹 checkmark shield 맞습니당

@yeseonglee
yeseonglee merged commit c7eb099 into develop Jul 25, 2026
1 check passed
@yeseonglee
yeseonglee deleted the feature/#54 branch July 25, 2026 07:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature: 리스트 뷰 placeholder 로고

2 participants