From 7444e007c8a48ec9aaeda68ea285a21db363342c Mon Sep 17 00:00:00 2001 From: dasosann Date: Thu, 29 Jan 2026 23:42:28 +0900 Subject: [PATCH 1/2] feat: add HEIC/HEIF to JPEG conversion utility with toast progress updates. --- src/feature/create-album/utils/heicToJpeg.ts | 62 ++++++++++++-------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/src/feature/create-album/utils/heicToJpeg.ts b/src/feature/create-album/utils/heicToJpeg.ts index 2f729977..dc1b6759 100644 --- a/src/feature/create-album/utils/heicToJpeg.ts +++ b/src/feature/create-album/utils/heicToJpeg.ts @@ -7,35 +7,47 @@ export async function convertHeicFilesToJpeg(files: File[]): Promise { /heic|heif/i.test(file.type) || /\.heic$|\.heif$/i.test(file.name), ); - if (heicFiles.length > 0) { - Toast.alert(`${heicFiles.length}개의 HEIC 파일을 변환 중입니다...`); + if (heicFiles.length === 0) { + return files; } - const convertedFiles = await Promise.all( - files.map(async (file) => { - if (/heic|heif/i.test(file.type) || /\.heic$|\.heif$/i.test(file.name)) { - try { - const jpegBlob = await heicTo({ - blob: file, + let convertedCount = 0; + const totalCount = heicFiles.length; + + // 초기 메시지 표시 + Toast.alert(`변환 중... 0/${totalCount}`); + + const convertedFiles: File[] = []; + + for (const file of files) { + if (/heic|heif/i.test(file.type) || /\.heic$|\.heif$/i.test(file.name)) { + try { + const jpegBlob = await heicTo({ + blob: file, + type: 'image/jpeg', + quality: 0.9, + }); + const convertedFile = new File( + [jpegBlob], + file.name.replace(/\.(heic|heif)$/i, '.jpg'), + { type: 'image/jpeg', - quality: 0.9, - }); - return new File( - [jpegBlob], - file.name.replace(/\.(heic|heif)$/i, '.jpg'), - { - type: 'image/jpeg', - lastModified: file.lastModified, - }, - ); - } catch (e) { - Toast.alert(`${file.name} 파일의 변환에 실패했습니다.`); - return file; - } + lastModified: file.lastModified, + }, + ); + convertedFiles.push(convertedFile); + + // 변환 완료마다 진행률 업데이트 + convertedCount++; + Toast.alert(`변환 중... ${convertedCount}/${totalCount}`); + } catch (e) { + Toast.alert(`${file.name} 파일의 변환에 실패했습니다.`); + convertedFiles.push(file); } - return file; - }), - ); + } else { + convertedFiles.push(file); + } + } return convertedFiles; } From 9b60f755fb9a77c42acfa9240cdf8c1562956240 Mon Sep 17 00:00:00 2001 From: dasosann Date: Thu, 29 Jan 2026 23:52:24 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/feature/create-album/utils/heicToJpeg.test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/feature/create-album/utils/heicToJpeg.test.ts b/src/feature/create-album/utils/heicToJpeg.test.ts index 3ad1fa07..89bf13e3 100644 --- a/src/feature/create-album/utils/heicToJpeg.test.ts +++ b/src/feature/create-album/utils/heicToJpeg.test.ts @@ -49,9 +49,8 @@ describe('convertHeicFilesToJpeg', () => { expect(result[0].type).toBe('image/jpeg'); // The second file should remain as is expect(result[1].name).toBe('image.jpg'); - expect(Toast.alert).toHaveBeenCalledWith( - '1개의 HEIC 파일을 변환 중입니다...', - ); + expect(Toast.alert).toHaveBeenCalledWith('변환 중... 0/1'); + expect(Toast.alert).toHaveBeenCalledWith('변환 중... 1/1'); }); it('should handle conversion failure gracefully', async () => {