+
+
+ {
+ // (DnD로 인해 string[] 들어오는 경우는 스킵)
+ if (files.length > 0 && files[0] instanceof File) {
+ setIsUploading(true);
+ try {
+ // 업로드
+ const uploadPromises = (files as File[]).map((file) => uploadImage(file));
+ const uploadedUrls = await Promise.all(uploadPromises);
+
+ // 2-1) 미리보기용 state에도 추가
+ const newImages: ImageInputType[] = uploadedUrls.map((url, idx) => ({
+ id: `image-${Date.now()}-${idx}`,
+ url,
+ }));
+ setUploadedImages((prev) => [...prev, ...newImages]);
+
+ // 2-2) RHF에도 이미지 URL 병합
+ // (기존 imageUrl + 새 URL)
+ const oldValue = methods.getValues("imageUrl"); // ex) "url1,url2"
+ const merged = oldValue ? oldValue + "," + uploadedUrls.join(",") : uploadedUrls.join(",");
+
+ setValue("imageUrl", merged, { shouldDirty: true });
+ } catch (error) {
+ console.error("이미지 업로드 실패:", error);
+ } finally {
+ setIsUploading(false);
+ }
+ }
+ // 3) DnD 재정렬로 string[]이 들어오면, 순서가 바뀐 이미지 목록을 반영
+ else if (files.length > 0 && typeof files[0] === "string") {
+ // files: string[] 형태로 URL 목록이 들어옴
+ // 이제 uploadedImages를 해당 순서에 맞게 재정렬
+ const newOrder: ImageInputType[] = (files as string[]).map((url) => {
+ // 기존 state에서 찾기
+ const found = uploadedImages.find((img) => img.url === url);
+ if (found) return found;
+ // 혹은 없는 경우 새로 만들 수도 있음(예외적)
+ return { id: `image-${Date.now()}`, url };
+ });
+ setUploadedImages(newOrder);
+ // RHF에도 순서 반영해주고 싶다면:
+ setValue("imageUrl", newOrder.map((i) => i.url).join(","), {
+ shouldDirty: true,
+ });
+ }
+ }}
/>
- )}
- />
-
+ {/* 업로드 진행중이면 로딩스피너 표시 */}
+ {isUploading && (
+
+
+
+ )}
+
+