Skip to content

Refactor: 정렬 메뉴 (기준 × 방향) 재설계 및 메뉴 닫힘 버그 수정 #84

Description

@yeseonglee

목표

정렬 메뉴를 (정렬 기준 × 정렬 방향) 2축 구조로 재설계하고, 메뉴가 바깥 클릭으로 닫히지 않는 버그를 함께 해결한다.

  • divider 위: 정렬 기준 — 시간 / 만료 / 이름
  • divider 아래: 정렬 방향 — 오름차순 / 내림차순

현재 문제

1. SecretQuery.Sort가 기준과 방향을 한 enum에 섞어 놓았다

케이스 실제 의미
recentlyAdded createdAt ↓
oldestFirst createdAt ↑
expiringSoon expiresAt ↑
nameAscending name ↑
nameDescending name ↓

3기준 × 2방향 = 6 조합 중 5개만 존재하며, 만료 내림차순(만료 늦은 순)이 표현 불가하다.

2. 메뉴가 목록 컬럼 밖 클릭으로 닫히지 않는다

SecretListView.swift:57-61의 바깥 클릭 감지가 ZStack 안의 Color.clear다. 이 ZStack은 목록 컬럼 안에만 존재하므로 사이드바·상세 컬럼을 클릭하면 히트 테스트가 닿지 않는다. ESC 키, 창 포커스 상실도 처리되지 않는다.

3. 목록에 보이는 날짜와 정렬 기준이 다르다

행에는 secret.updatedAt을 표시하는데(SecretListView.swift:111) recentlyAdded 정렬은 createdAt 기준이다. → 새 "시간" 기준은 updatedAt으로 통일한다.

4. 만료 정렬 시 만료일 없는 항목이 맨 앞에 온다

expiresAt이 nil인 Secret이 오름차순 정렬에서 최상단에 쌓인다. Expired 탭은 predicate가 nil을 걸러 드러나지 않지만, All 탭에서 만료순을 고르면 노출된다. 방향과 무관하게 nil은 항상 뒤로 보내야 한다.

작업 범위

수정 — DVDomain

  • SecretQuery.Sortkey(time/expiry/name) + direction(ascending/descending) 구조로 변경
  • 기본값 정의 (시간 + 내림차순 = 기존 recentlyAdded와 동일 동작)

수정 — DVData

  • SecretFetchDescriptorBuilder.sortDescriptors를 새 구조에 맞게 재작성
  • time = updatedAt 기준으로 변경 (기존 createdAt에서 전환)
  • 만료 정렬에서 expiresAt == nil을 방향과 무관하게 후순위로 배치

수정 — DVPresentation

  • sortMenu를 커스텀 오버레이에서 시스템 Menu + Picker(inline) 2개로 교체 → 바깥 클릭·ESC·포커스 상실 처리를 시스템에 위임
  • isSortMenuPresented @State 제거 (시스템 메뉴가 표시 상태를 관리)
  • SecretListFeaturedidSelectSort 액션을 기준/방향 분리에 맞게 조정

테스트

  • sortDescriptors 6개 조합 검증
  • 만료 정렬에서 nil 후순위 검증
  • SecretListFeature 정렬 변경 시 재조회 동작 검증

참고

  • 기존 5케이스를 사용하는 모든 호출부를 함께 수정해야 한다
  • SecretListFeature.State.query.expired 컬렉션에서 sort: .expiringSoon을 강제하는 부분도 새 구조에 맞춰야 한다

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions