Skip to content

fix(afternote): 추억 노트 미디어 갤러리 피커 취소가 기존 첨부를 지운다 — 촬영 경로와 어긋난 갈래, 수정 모드는 서버 영상까지 소실 #1113

Closed

Description

@1hyok

📜 Overview (Required)

애프터노트 에디터(추억 노트)의 추억 노트 미디어 슬롯에서 갤러리 피커를 취소하면 이미 붙어 있던 첨부가 지워진다.

갤러리 런처가 취소 결과(uri == null)를 "선택 없음"으로 그대로 흘려보내, 폼 갱신 콜백이 기존 값을 null 로 덮어쓴다.

// MemorialMediaSourceState.kt — rememberMemorialMediaSourceState
val photoGalleryLauncher =
    rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri: Uri? ->
        onPhotoSelected(uri?.toString())   // ← 취소면 null 이 그대로 setMemorialPhoto 로 들어간다
    }
val videoGalleryLauncher =
    rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri: Uri? ->
        onVideoSelected(uri?.toString())
    }

같은 파일의 촬영 경로는 이미 성공했을 때만 반영한다(if (captured && uri != null) …). 즉 한 화면의 두 갈래가 어긋나 있고, 어긋난 쪽이 갤러리다.

재현

  1. 추억 노트 작성 → 영정사진(또는 장례식에 남길 영상) 슬롯 탭 → 갤러리에서 선택 → 파일 선택
  2. 같은 슬롯을 다시 탭 → 갤러리에서 선택 → 아무것도 고르지 않고 뒤로가기/취소
  3. 1에서 붙인 첨부가 사라져 있다

영향

슬롯 취소가 지우는 것 결과
영정사진 pickedPhotoUri 신규 작성은 방금 고른 사진이 소실. 수정 모드는 displayPhotoUri() = pickedPhotoUri ?: photoUrl 이라 예전 서버 사진으로 되돌아간다(바꾼 줄 알고 저장하면 옛 사진이 그대로 남음)
장례식에 남길 영상 videoUrl + thumbnailUrl videoUrl 이 로컬 pick·서버 prefill 을 겸하는 단일 칸이라 수정 모드에서 서버 영상까지 지워진다. 이 상태로 저장하면 videoMediaInput(null) → MediaInput.None 이라 payload 의 영상 URL 이 null 로 나가 서버에서도 영상이 떨어진다

첨부를 지우는 별도 수단은 화면에 없다(MemorialPhotoUpload·MemorialVideoUpload 모두 추가/변경 탭만 있음). 그래서 취소로 지워진 값은 되돌릴 길이 없고, 반대로 취소가 사실상 유일한 삭제 경로로 쓰이고 있었다 — 삭제 수단 자체는 별도 이슈로 분리한다.

해결 방향

  • 갤러리 취소는 아무 일도 일으키지 않는다 — 촬영 경로(captured == false)와 같은 규칙으로 맞춘다.
  • onPhotoSelected/onVideoSelected 를 (String?) -> Unit → (String) -> Unit 으로 좁혀 "취소가 null 로 흘러드는" 형태를 타입이 막게 한다. setMemorialPhoto/setMemorialVideo 는 (String?) -> Unit 이라 반공변으로 그대로 들어간다.
  • MemorialMediaSourceStateTest 옆에 회귀 테스트를 붙인다.

📍 Note (Optional)

  • #369(PR feat(afternote): 추억 노트 사진·영상 즉석 촬영 인텐트 추가 (closes 369) [base: develop] #1112) 이전부터 있던 동작이다. 그 PR 은 AfternoteEditorScreen 에 인라인이던 런처를 MemorialMediaSourceState.kt 로 옮기기만 해서 범위 밖으로 뒀다. 지금 이 결함이 있는 코드는 feat/369 브랜치에만 있으므로 base 는 feat/369(스택) 이다.
  • 같은 결함이 온보딩 프로필 사진에도 있다(OnboardingProfileEntry.kt — 취소 시 onProfileImagePicked(null)). 모듈이 달라 별도 이슈로 판다.
  • 수신자 증빙 업로드(DocumentUploadScreen.kt)는 이미 if (uri != null) 로 옳게 처리하고 있다 — 레포 안에 옳은 선례가 있다.

Activity

  1. self-assigned this
    on Aug 25, 2026
  2. added theissue type on Aug 25, 2026
  3. 1hyok commented on Aug 25, 2026

    @1hyok
    CollaboratorAuthor

    삭제 수단 부재는 #1114 로 분리했다. 온보딩 프로필 사진의 같은 결함은 #1115.

  4. added a commit that references this issue on Aug 25, 2026
    eb76589
  5. 1hyok commented on Aug 25, 2026

    @1hyok
    CollaboratorAuthor

    본문 '해결 방향' 의 회귀 테스트 항목은 철회한다. 유닛테스트 seam 을 만들려면 Uri? 를 우리 시그니처로 끌어올려야 하는데, 그러면 uri.toString()(= Any?.toString()) 이 컴파일되는 구멍이 새로 생기고 테스트는 그 구멍을 지키게 된다. 런처 람다에서 ?.let 으로 접으면 it 이 Uri 로 좁혀져 구멍 자체가 표현되지 않는다 — 가드는 타입이 맡는다. PR #1116.

  6. added a commit that references this issue on Aug 25, 2026
    208caed
  7. changed the title [-]fix(afternote): 추모 미디어 갤러리 피커 취소가 기존 첨부를 지운다 — 촬영 경로와 어긋난 갈래, 수정 모드는 서버 영상까지 소실[/-] [+]fix(afternote): 추억 노트 미디어 갤러리 피커 취소가 기존 첨부를 지운다 — 촬영 경로와 어긋난 갈래, 수정 모드는 서버 영상까지 소실[/+] on Aug 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions