🗓️ 마감일
No response
🙋 담당자(Assignee)
seongwon030
🎟️ 상위 스토리 (Story Key)
MOA-1169
🌳 브랜치명 (Branch)
feature/feedback-image-partial-retry
🧭 분기할 브랜치 선택
develop-fe
📝 상세 내용(Description)
우체통 작성 화면의 첨부 사진(최대 4장)은 Promise.all로 올려서 한 장만 실패해도 전송 전체가 실패한다. 먼저 끝난 PUT은 취소되지 않아 R2에 남지만 어디에도 등록되지 않는 고아 파일이 되고, 다시 보내면 presigned URL을 새로 받아 4장을 처음부터 올린다. 활동사진과 홍보 이미지는 allSettled로 장별 결과를 받아 실패한 장만 다시 올리는데 우체통만 다르다. 활동사진처럼 성공한 칸은 URL로 바꿔 두고 실패한 칸에 재전송 버튼을 띄우되, 편지는 모든 칸이 URL일 때만 한 번 보낸다. 실패 칸 표시는 활동사진의 업로드 중/실패 오버레이를 우체통 썸네일(107px, 10px 라운드)에 맞춰 옮긴다.
✅ 체크리스트(Tasks)
🗓️ 마감일
No response
🙋 담당자(Assignee)
seongwon030
🎟️ 상위 스토리 (Story Key)
MOA-1169
🌳 브랜치명 (Branch)
feature/feedback-image-partial-retry
🧭 분기할 브랜치 선택
develop-fe
📝 상세 내용(Description)
우체통 작성 화면의 첨부 사진(최대 4장)은
Promise.all로 올려서 한 장만 실패해도 전송 전체가 실패한다. 먼저 끝난 PUT은 취소되지 않아 R2에 남지만 어디에도 등록되지 않는 고아 파일이 되고, 다시 보내면 presigned URL을 새로 받아 4장을 처음부터 올린다. 활동사진과 홍보 이미지는allSettled로 장별 결과를 받아 실패한 장만 다시 올리는데 우체통만 다르다. 활동사진처럼 성공한 칸은 URL로 바꿔 두고 실패한 칸에 재전송 버튼을 띄우되, 편지는 모든 칸이 URL일 때만 한 번 보낸다. 실패 칸 표시는 활동사진의 업로드 중/실패 오버레이를 우체통 썸네일(107px, 10px 라운드)에 맞춰 옮긴다.✅ 체크리스트(Tasks)
ImageItem)을 관리자 폴더 밖 공용 위치로 이동 (buildFinalUrls는 모든 칸이 URL일 때만 보내 필요 없어 그대로 둠)uploadFeedbackImages를allSettled+ 장별 결과 반환으로 변경useCreateFeedback을 업로드와 저장으로 분리ImageItem으로 바꾸고 모든 칸이 URL일 때만 전송FeedbackImageGrid에 업로드 중/실패+재전송 오버레이 추가 (보낸 편지 화면은 그대로)