Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/144 그림 일기 저장 수정 #158

Merged
merged 4 commits into from
Aug 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/apis/image.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ class ImageController extends Api {
});
};

// 이미지 여러개 한 번에 업로드
uploadImgs = async (formData) => {
return await this.post("/image/all", formData, {
headers: { "Content-Type": "multipart/form-data" },
});
};

// 키워드 별 이미지 저장
saveImgByKeyword = async (keywordId, imgUrl) => {
return await this.post(`/keyword/${keywordId}/image`, {
Expand Down
9 changes: 7 additions & 2 deletions src/components/diaryDetail/DiaryKeywordImagesSlider.jsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import useFetchDiary from "../../hooks/diary/queries/useFetchDiary";
import Slider from "react-slick";
import React from "react";
import React, { useEffect } from "react";
import useCreateDiary from "../../hooks/diaryDetail/queries/useCreateDiary";
import useUpdateDiary from "../../hooks/diaryDetail/queries/useUpdateDiary";
import useGoDiaryDraw from "../../hooks/canvas/useGoDiaryDraw";
import "../../styles/diarySliderDots.css";

const settings = {
infinite: false,
Expand All @@ -13,7 +14,11 @@ const settings = {
};

const DiaryKeywordImagesSlider = () => {
let { isDiaryExist, isCanRender, diary } = useFetchDiary();
useEffect(() => {
refetch();
}, []);

let { isDiaryExist, isCanRender, diary, refetch } = useFetchDiary();
// console.log(isMutating);
const create = useCreateDiary();
const update = useUpdateDiary();
Expand Down
31 changes: 16 additions & 15 deletions src/hooks/canvas/useSaveCanvas.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ const useSaveCanvas = () => {

// 그림 저장
const saveCanvas = async (canvasRefs, canvasBgRefs) => {
const imgUrlsOfCanvas = [];
const formData = new FormData();

for (let i = 0; i < canvasRefs.length; i++) {
const resultCanvas = await mergeCanvas(canvasRefs[i], canvasBgRefs[i]);
const blob = await canvasToBlob(resultCanvas);
const imgUrl = await uploadCanvasImgToUrl(blob);

imgUrlsOfCanvas.push(imgUrl);
formData.append("images", blob, `image${i}.png`);
}
await saveCanvasToImg(imgUrlsOfCanvas);
const imageUrls = await uploadImages(formData);

await saveCanvasToImg(imageUrls);
};

// 그림 그리는 캔버스와 ai 도움 받기 사진을 한 캔버스로 합치기
Expand Down Expand Up @@ -52,29 +52,30 @@ const useSaveCanvas = () => {
});
};

// 캔버스를 이미지로 변환 후, imgUrl 반환
const uploadCanvasImgToUrl = async (blob) => {
const uploadImages = async (formData) => {
try {
const formData = new FormData();
formData.append("image", blob, "image.png");
const response = await ImageController.uploadImg(formData);
return response.data.result.imageUrl;
const res = await ImageController.uploadImgs(formData);
if (res.data.isSuccess) {
return res.data.result.imageUrls;
} else {
console.error(res.data.message);
}
} catch (error) {
console.error("Error uploading canvas image : ", error);
console.error("Error uploading images : ", error);
}
};

// 변환 된 이미지를 키워드/일기 아이디로 저장
const saveCanvasToImg = async (imgUrlsOfCanvas) => {
const saveCanvasToImg = async (imageUrls) => {
try {
if (isKeywordEmpty) {
await ImageController.saveImgByDiaryId(diaryId, imgUrlsOfCanvas[0]);
await ImageController.saveImgByDiaryId(diaryId, imageUrls[0]);
} else {
await Promise.all(
keywords.map(({ keywordId }, index) => {
return ImageController.saveImgByKeyword(
keywordId,
imgUrlsOfCanvas[index]
imageUrls[index]
);
})
);
Expand Down
4 changes: 3 additions & 1 deletion src/hooks/diary/queries/useFetchDiary.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import DiaryController from "../../../apis/diary.controller";
import { dateToDashString, HOUR } from "../../../utils/api/dateConverter";
import { useCalendarStore } from "../../../stores/CalendarStore";
import useRequireAuth from "../../auth/useRequireAuth";
import { useEffect } from "react";

/**
* @return {{diary: Diary, isFetching: boolean, isDiaryExist: boolean, isCanRender: boolean}}
Expand All @@ -17,6 +18,7 @@ const useFetchDiary = () => {
isFetching,
isSuccess,
data: diary,
refetch,
} = useQuery({
queryKey: diaryQueryKey(selectedDate),
queryFn: async () => {
Expand All @@ -31,7 +33,7 @@ const useFetchDiary = () => {

const isCanRender = !isFetching && isSuccess;

return { isFetching, isCanRender, diary, isDiaryExist };
return { isFetching, isCanRender, diary, isDiaryExist, refetch };
};

export const diaryQueryKey = (selectedDate) => {
Expand Down
16 changes: 16 additions & 0 deletions src/styles/diarySliderDots.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
.slick-dots li button::before {
width: 10px;
height: 10px;
content: "";
background-color: #fff;
border-radius: 999px;
border: 1px solid #000;
}

.slick-dots > li {
opacity: 50%;
}

.slick-dots > li.slick-active {
opacity: 1;
}