diff --git a/src/pages/Photobook/PhotoSelect.module.scss b/src/pages/Photobook/PhotoSelect.module.scss
index 036567c..b5b75bd 100644
--- a/src/pages/Photobook/PhotoSelect.module.scss
+++ b/src/pages/Photobook/PhotoSelect.module.scss
@@ -14,21 +14,22 @@
align-items: center;
justify-content: center;
background-color: white;
- margin-top: 44px;
- button {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ .inactive, .active {
height: 50px;
width: 340px;
border-radius: 10px;
- border: 1px solid #009eff;
+ border: 2px solid #009eff;
color: #009eff;
text-align: center;
font-size: 14px;
font-weight: 500;
background-color: white;
- &:hover {
- background-color: #009eff;
- color: white;
- }
+ }
+ .active {
+ background-color: #009eff;
+ color: white;
}
}
diff --git a/src/pages/Photobook/Photobook.jsx b/src/pages/Photobook/Photobook.jsx
index 0290cde..8d84578 100644
--- a/src/pages/Photobook/Photobook.jsx
+++ b/src/pages/Photobook/Photobook.jsx
@@ -2,13 +2,13 @@ import { useEffect, useState, useRef } from "react";
import { useSprings, useSpring, animated } from "@react-spring/web";
import useMeasure from "react-use-measure";
import { useDrag } from "react-use-gesture";
+// import { useParams } from "react-router-dom";
import clamp from "lodash/clamp";
import styles from "./Photobook.module.scss";
// import memoIcon from "../../img/icon-memo.png";
import shareIcon from "../../img/icon-share.png";
import navBottom from "../../img/nav-bottom.png";
import memoModal from "../../img/memo-modal.png";
-import home from "../../img/home.png";
import emoji1 from "../../img/emoji1.png";
import emoji2 from "../../img/emoji2.png";
import emoji3 from "../../img/emoji3.png";
@@ -27,12 +27,10 @@ import memopic5 from "../../img/memopic5.png";
import useAxios from "../../apis/axiosWithToken";
export default function Photobook() {
- {
- /* 포토북 UI 시작 */
- }
+ {/* 포토북 UI 시작 */}
const index = useRef(0);
const [ref, { width }] = useMeasure();
- const [photos, setPhotos] = useState([]);
+ const [photos, setPhotos] = useState([]);
const [activeDot, setActiveDot] = useState(0);
const [props, api] = useSprings(
photos.length,
@@ -46,7 +44,7 @@ export default function Photobook() {
const bind = useDrag(
({ active, movement: [mx], direction: [xDir], distance, cancel }) => {
if (active && distance > width / 2) {
- setActiveDot(null);
+ setActiveDot(null);
index.current = clamp(
index.current + (xDir > 0 ? -1 : 1),
0,
@@ -61,18 +59,17 @@ export default function Photobook() {
const scale = active ? 1 - distance / width / 2 : 1;
return { x, scale, display: "block" };
});
-
- // 스크롤에 따른 활성화를 유지
- // setActiveDot(clamp(Math.round(index.current), 0, photos.length - 1));
- // 클릭한 동그라미가 있다면 스크롤로 인한 활성화를 무시하고 클릭한 동그라미를 유지
- const activeDotIndex = clamp(
- Math.round(index.current),
- 0,
- photos.length - 1
- );
- setActiveDot(activeDotIndex);
- // console.log("스크롤 점 인덱스: ", activeDotIndex);
- }
+
+ // 스크롤에 따른 활성화를 유지
+ // 클릭한 동그라미가 있다면 스크롤로 인한 활성화를 무시하고 클릭한 동그라미를 유지
+ const activeDotIndex = clamp(
+ Math.round(index.current),
+ 0,
+ photos.length - 1
+ );
+ setActiveDot(activeDotIndex);
+ // console.log("스크롤 점 인덱스: ", activeDotIndex);
+ }
);
// 동그라미를 클릭했을 때 해당 사진으로 이동하는 함수
const handleDotClick = (dotIndex) => {
@@ -83,17 +80,20 @@ export default function Photobook() {
const x = (i - index.current) * width;
return { x, scale: 1, display: "block" };
});
- setActiveDot(null); // 클릭한 동그라미를 활성화 상태로 설정
+ setActiveDot(null); // 클릭한 동그라미를 활성화 상태로 설정
};
- {
- /* 포토북 UI 마침 */
- }
+ {/* 포토북 UI 마침 */}
const axios = useAxios();
const [modal, setModal] = useState(0);
const [selectedEmoji, setSelectedEmoji] = useState(null);
+ const [selectedPhotoIndex, setSelectedPhotoIndex] = useState(null);
const [uuid, setUuid] = useState(null);
const [isEmojiBoxVisible, setIsEmojiBoxVisible] = useState(false);
+ // const { uuid } = useParams();
+ const [memos, setMemos] = useState([]); // 메모 리스트 Dto배열 저장
+ const [modalMemoContent, setModalMemoContent] = useState(""); // 선택한 메모 content 저장
+ const [modalMemoVisible, setModalMemoVisible] = useState(false); // 모달 창 오픈 시 메모 컨텐츠 보여줄지 말지 상태 저장
const emojiArray = [emoji1, emoji2, emoji3, emoji4, emoji5];
const emojiArray2 = [emoji01, emoji02, emoji03, emoji04, emoji05];
@@ -106,25 +106,24 @@ export default function Photobook() {
console.log(response.data);
setPhotos(response.data.photoList);
setUuid(response.data.uuid);
+ setMemos(response.data.memoList);
})
.catch((error) => console.error(error));
- });
+ }, []);
- const selectEmoji = (index) => {
- setSelectedEmoji(index);
- // // 이미 선택된 emoji가 있다면 선택 취소
- // if (selectedEmoji !== null && selectedEmoji === index) {
- // // 이미 선택된 경우에는 아무 동작도 하지 않음
- // return;
- // } else {
- // // 선택된 emoji가 없거나 다른 emoji를 선택한 경우 크기 조절
- // setSelectedEmoji(index);
- // }
+ const handleMemosClick = (memoIndex) => {
+ const modalContent = memos[memoIndex].content;
+ setModalMemoContent(modalContent);
+ setModal(1);
+ setModalMemoVisible(true);
};
- // const toggleEmojiBox = () => {
- // setIsEmojiBoxVisible(!isEmojiBoxVisible);
- // };
+ const selectEmoji = (i) => {
+ // 선택한 emoji 정보를 저장
+ setSelectedEmoji(i);
+ // 이미지 선택 시 포토인덱스 저장
+ setSelectedPhotoIndex(index.current);
+ };
// 이모지 박스 애니메이션 스타일 설정
const emojiBoxSpring = useSpring({
@@ -133,19 +132,71 @@ export default function Photobook() {
config: { tension: 200, friction: 20, mass: 1, duration: 100 },
});
+ // 메모픽 위치 상태 추가
+ const [memopicPosition, setMemopicPosition] = useState({
+ top: Math.floor(Math.random() * 365) - 10,
+ left: Math.floor(Math.random() * 250) - 10,
+ });
+
+ const handleMemopicClick = () => {
+ setModal(1);
+ setMemopicPosition({
+ top: memopicPosition.top,
+ left: memopicPosition.left,
+ });
+ setIsEmojiBoxVisible(false);
+ };
+
+ // 이모지 박스에서의 클릭 이벤트 핸들러
+ const handleEmojiClick = (index) => {
+ // 선택한 emoji 정보를 저장
+ selectEmoji(index);
+
+ // 새로운 랜덤 위치를 생성하고 설정
+ setMemopicPosition({
+ top: Math.floor(Math.random() * 365) - 10,
+ left: Math.floor(Math.random() * 250) - 10,
+ });
+ };
const shareLink = () => {
// 현재 경로에 uuid를 붙여서 공유할 링크 생성
const shareableLink = `${window.location.href}/${uuid}`;
+
// 클립보드에 복사
- navigator.clipboard
- .writeText(shareableLink)
- .then(() => {
- console.log("링크가 클립보드에 복사되었습니다.");
- })
- .catch((err) => {
- console.error("링크 복사 중 오류 발생:", err);
- });
+ const copyToClipboard = (text) => {
+ if (navigator.clipboard) {
+ navigator.clipboard.writeText(text).then(
+ () => {
+ alert("링크가 클립보드에 복사되었습니다.");
+ },
+ (err) => {
+ console.error("링크 복사 중 오류 발생:", err);
+ alert("링크 복사 중 오류 발생");
+ }
+ );
+ } else {
+ // Navigator clipboard API가 지원되지 않는 경우 대체 방법 사용
+ const textArea = document.createElement("textarea");
+ textArea.value = text;
+ textArea.style.position = "fixed"; // 임시로 고정 위치에 텍스트 영역 생성
+ document.body.appendChild(textArea);
+ textArea.focus();
+ textArea.select();
+
+ try {
+ document.execCommand("copy");
+ alert("링크가 클립보드에 복사되었습니다.");
+ } catch (err) {
+ console.error("링크 복사 중 오류 발생:", err);
+ alert("링크 복사 중 오류 발생");
+ } finally {
+ document.body.removeChild(textArea); // 생성한 텍스트 영역 제거
+ }
+ }
+ };
+
+ copyToClipboard(shareableLink);
console.log("링크:", `${window.location.href}/${uuid}`);
// // 현재 주소에 uuid 파라미터 추가
// const currentUrl = new URL(window.location.href);
@@ -159,7 +210,36 @@ export default function Photobook() {
// });
};
- const saveMemo = () => {};
+ // 메모 저장
+ const [memoText, setMemoText] = useState(""); // 메모 작성한 내용 저장
+
+ const saveMemo = async (uuid) => {
+ const apiURL = `http://ec2-3-35-208-177.ap-northeast-2.compute.amazonaws.com:8080/memo/${uuid}`
+ const saveMemoDto = {
+ "x": memopicPosition.left,
+ "y": memopicPosition.top,
+ "pageNum": selectedPhotoIndex,
+ "content": memoText,
+ "emojiNum": selectedEmoji
+ };
+ console.log(saveMemoDto);
+ try {
+ // 서버에 메모 저장 요청
+ const response = await axios.post(apiURL, saveMemoDto);
+
+ // 응답이 200이면 성공
+ if (response.status === 200) {
+ alert("메모가 성공적으로 저장되었습니다.");
+ } else {
+ // 다른 상태 코드가 반환된 경우
+ alert("메모 저장에 실패했습니다.");
+ }
+ } catch (error) {
+ // 오류가 발생한 경우 (401 등)
+ alert("오류가 발생했습니다. 다시 시도해주세요.");
+ console.error(error);
+ }
+ };
return (
@@ -183,12 +263,38 @@ export default function Photobook() {
className={styles.photo}
style={{ scale, backgroundImage: `url(${photos[i]})` }}
/>
- {selectedEmoji !== null && (
+ {memos.map((memo, memoIndex) => {
+ if (memo.pageNum === i) {
+ // Check if there is a memo for the current photo
+ return (
+
handleMemosClick(memoIndex)}
+ />
+ );
+ } else {
+ return null; // No memo for the current photo
+ }
+ })}
+ {selectedEmoji !== null && selectedPhotoIndex === i && (
setModal(1)}
+ style={{
+ scale,
+ position: "absolute",
+ top: `${memopicPosition.top}px`, // 클릭 시의 위치를 고정
+ left: `${memopicPosition.left}px`, // 클릭 시의 위치를 고정
+ }}
+ onClick={handleMemopicClick}
/>
)}
@@ -227,15 +333,28 @@ export default function Photobook() {
-
-
+ {modalMemoVisible === true && (
+
+ {modalMemoContent}
+
+ )}
+ {modalMemoVisible !== true && (
+ <>
+
{
- selectEmoji(index);
+ handleEmojiClick(index);
}}
/>
))}
@@ -265,3 +384,4 @@ export default function Photobook() {
);
}
+
diff --git a/src/pages/Photobook/Photobook.module.scss b/src/pages/Photobook/Photobook.module.scss
index d9de091..be0b692 100644
--- a/src/pages/Photobook/Photobook.module.scss
+++ b/src/pages/Photobook/Photobook.module.scss
@@ -1,3 +1,22 @@
+@keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 100% {
+ opacity: 1;
+ }
+}
+
+@keyframes scrollAnimation {
+ 0% {
+ transform: translateY(0);
+ }
+ 100% {
+ transform: translateY(100%);
+ }
+}
+
*,
*:after,
*:before {
@@ -162,23 +181,23 @@
display: none;
}
.modal1 {
- animation: fadeIn ease-in-out 1s;
+ animation: fadeIn ease-in-out 0.5s;
position: absolute;
// box-shadow: 2px 4px 12px #cacaca;
- z-index: 2;
+ z-index: 7;
width: 344px;
height: 234px;
top: 33vh;
left: 6vw;
- background-color: url("../../img/memo-modal.png");
+ background-color: url('../../img/memo-modal.png');
background-size: cover; /* 이미지를 화면에 꽉 채우도록 조정 */
background-position: center; /* 이미지를 가운데 정렬 */
background-repeat: no-repeat; /* 이미지 반복 방지 */
.memoModal {
width: 88vw;
- height: auto;
+ height: 28vh;
position: absolute;
- z-index: 3;
+ z-index: 8;
top: 0;
left: 0;
}
@@ -186,21 +205,29 @@
width: 88vw;
height: 28vh;
position: absolute;
- z-index: 4;
+ top: 0;
+ left: 0;
+ z-index: 9;
display: flex;
flex-direction: column;
align-items: center;
- justify-content: space-between;
+ justify-content: space-around;
+ padding: 20px 0;
+ .modalMemo {
+ width: 66%;
+ max-height: 70%;
+ font-size: 18px;
+ font-weight: 500;
+ overflow-y: scroll;
+ }
textarea {
width: 66%;
- height: 43%;
+ height: 66%;
padding: 10px;
- margin-top: 0px;
color: #000;
text-align: center;
- font-family: "SUIT Variable", -apple-system, BlinkMacSystemFont,
- Pretendard, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans",
- "Helvetica Neue", sans-serif;
+ font-family: "SUIT Variable", -apple-system, BlinkMacSystemFont, Pretendard, "Segoe UI", Roboto, Oxygen,
+ Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
font-size: 16px;
font-weight: 400;
line-height: normal;
@@ -211,19 +238,18 @@
background-color: #f8f8f8;
resize: none;
&:focus {
- border: 1px solid #009eff;
+ border: 1px solid #009EFF;
}
}
.saveBtn {
width: 45px;
height: 24px;
font-size: 18px;
- margin-bottom: 24px;
display: flex;
align-items: center;
justify-content: center;
color: white;
- background-color: #009eff;
+ background-color: #009EFF;
border: none;
border-radius: 19px;
cursor: pointer;
@@ -236,12 +262,12 @@
}
.modalBG1 {
- animation: fadeIn2 ease-in-out 1s;
- z-index: 1;
+ animation: fadeIn ease-in-out 0.5s;
+ z-index: 6;
width: 100vw;
height: 1100vh;
position: absolute;
- background-color: rgba(0, 40, 64, 0.6);
+ background-color: rgba(0, 40, 64, 0.60);
// opacity: 40%;
top: 0px;
left: 0px;
@@ -252,8 +278,8 @@
.emojiBox {
position: absolute;
- z-index: 10;
- bottom: 31vh;
+ z-index: 5;
+ bottom: 12px;
width: 80vw;
height: 72px;
padding: 0 22px;
@@ -266,4 +292,4 @@
opacity: 0;
transform: translateY(20px);
transition: opacity 0.5s ease, transform 0.5s ease;
-}
+}
\ No newline at end of file
diff --git a/src/pages/Photobook/PhotobookUuid.jsx b/src/pages/Photobook/PhotobookUuid.jsx
index d86754b..b27965e 100644
--- a/src/pages/Photobook/PhotobookUuid.jsx
+++ b/src/pages/Photobook/PhotobookUuid.jsx
@@ -24,15 +24,13 @@ import memopic2 from "../../img/memopic2.png";
import memopic3 from "../../img/memopic3.png";
import memopic4 from "../../img/memopic4.png";
import memopic5 from "../../img/memopic5.png";
-import useAxios from "../../apis/axiosWithToken";
+import axios from "axios";
export default function Photobook() {
- {
- /* 포토북 UI 시작 */
- }
+ {/* 포토북 UI 시작 */}
const index = useRef(0);
const [ref, { width }] = useMeasure();
- const [photos, setPhotos] = useState([]);
+ const [photos, setPhotos] = useState([]);
const [activeDot, setActiveDot] = useState(0);
const [props, api] = useSprings(
photos.length,
@@ -46,7 +44,7 @@ export default function Photobook() {
const bind = useDrag(
({ active, movement: [mx], direction: [xDir], distance, cancel }) => {
if (active && distance > width / 2) {
- setActiveDot(null);
+ setActiveDot(null);
index.current = clamp(
index.current + (xDir > 0 ? -1 : 1),
0,
@@ -61,18 +59,17 @@ export default function Photobook() {
const scale = active ? 1 - distance / width / 2 : 1;
return { x, scale, display: "block" };
});
-
- // 스크롤에 따른 활성화를 유지
- // setActiveDot(clamp(Math.round(index.current), 0, photos.length - 1));
- // 클릭한 동그라미가 있다면 스크롤로 인한 활성화를 무시하고 클릭한 동그라미를 유지
- const activeDotIndex = clamp(
- Math.round(index.current),
- 0,
- photos.length - 1
- );
- setActiveDot(activeDotIndex);
- // console.log("스크롤 점 인덱스: ", activeDotIndex);
- }
+
+ // 스크롤에 따른 활성화를 유지
+ // 클릭한 동그라미가 있다면 스크롤로 인한 활성화를 무시하고 클릭한 동그라미를 유지
+ const activeDotIndex = clamp(
+ Math.round(index.current),
+ 0,
+ photos.length - 1
+ );
+ setActiveDot(activeDotIndex);
+ // console.log("스크롤 점 인덱스: ", activeDotIndex);
+ }
);
// 동그라미를 클릭했을 때 해당 사진으로 이동하는 함수
const handleDotClick = (dotIndex) => {
@@ -83,48 +80,48 @@ export default function Photobook() {
const x = (i - index.current) * width;
return { x, scale: 1, display: "block" };
});
- setActiveDot(null); // 클릭한 동그라미를 활성화 상태로 설정
+ setActiveDot(null); // 클릭한 동그라미를 활성화 상태로 설정
};
- {
- /* 포토북 UI 마침 */
- }
+ {/* 포토북 UI 마침 */}
- const axios = useAxios();
const [modal, setModal] = useState(0);
const [selectedEmoji, setSelectedEmoji] = useState(null);
- const [uuidData, setUuidData] = useState(null);
+ const [selectedPhotoIndex, setSelectedPhotoIndex] = useState(null);
+ // const [uuidData, setUuidData] = useState(null);
const [isEmojiBoxVisible, setIsEmojiBoxVisible] = useState(false);
const { uuid } = useParams();
+ const [memos, setMemos] = useState([]); // 메모 리스트 Dto배열 저장
+ const [modalMemoContent, setModalMemoContent] = useState(""); // 선택한 메모 content 저장
+ const [modalMemoVisible, setModalMemoVisible] = useState(false); // 모달 창 오픈 시 메모 컨텐츠 보여줄지 말지 상태 저장
const emojiArray = [emoji1, emoji2, emoji3, emoji4, emoji5];
const emojiArray2 = [emoji01, emoji02, emoji03, emoji04, emoji05];
const memopicArray = [memopic1, memopic2, memopic3, memopic4, memopic5];
useEffect(() => {
+ const apiUrl = `http://ec2-3-35-208-177.ap-northeast-2.compute.amazonaws.com:8080/photoBook/${uuid}`
axios
- .get(`/photoBook/${uuid}`) // 인스턴스로 axios 요청 보내기
+ .get(apiUrl) // 인스턴스로 axios 요청 보내기
.then((response) => {
console.log(response.data);
- setPhotos(response.data.photoList);
- setUuidData(response.data.uuid);
+ setPhotos(response.data.photoList);
+ setMemos(response.data.memoList);
})
.catch((error) => console.error(error));
}, [uuid]);
- const selectEmoji = (index) => {
- setSelectedEmoji(index);
- // // 이미 선택된 emoji가 있다면 선택 취소
- // if (selectedEmoji !== null && selectedEmoji === index) {
- // // 이미 선택된 경우에는 아무 동작도 하지 않음
- // return;
- // } else {
- // // 선택된 emoji가 없거나 다른 emoji를 선택한 경우 크기 조절
- // setSelectedEmoji(index);
- // }
+ const handleMemosClick = (memoIndex) => {
+ const modalContent = memos[memoIndex].content;
+ setModalMemoContent(modalContent);
+ setModal(1);
+ setModalMemoVisible(true);
};
- const toggleEmojiBox = () => {
- setIsEmojiBoxVisible(!isEmojiBoxVisible);
+ const selectEmoji = (i) => {
+ // 선택한 emoji 정보를 저장
+ setSelectedEmoji(i);
+ // 이미지 선택 시 포토인덱스 저장
+ setSelectedPhotoIndex(index.current);
};
// 이모지 박스 애니메이션 스타일 설정
@@ -134,33 +131,115 @@ export default function Photobook() {
config: { tension: 200, friction: 20, mass: 1, duration: 100 },
});
- // const shareLink = () => {
- // // 현재 경로에 uuid를 붙여서 공유할 링크 생성
- // const shareableLink = `${window.location.href}/${uuidData}`;
+ // 메모픽 위치 상태 추가
+ const [memopicPosition, setMemopicPosition] = useState({
+ top: Math.floor(Math.random() * 365) - 10,
+ left: Math.floor(Math.random() * 250) - 10,
+ });
- // // 클립보드에 복사
- // navigator.clipboard
- // .writeText(shareableLink)
- // .then(() => {
- // console.log("링크가 클립보드에 복사되었습니다.");
- // })
- // .catch((err) => {
- // console.error("링크 복사 중 오류 발생:", err);
- // });
- // console.log("링크:", `${window.location.href}/${uuidData}`);
- // // // 현재 주소에 uuid 파라미터 추가
- // // const currentUrl = new URL(window.location.href);
- // // currentUrl.searchParams.set('uuid', 'YOUR_UUID'); // 여기에 받아온 uuid 변수를 넣어주세요
- // // navigator.clipboard.writeText(currentUrl.href)
- // // .then(() => {
- // // alert('링크가 복사되었습니다.');
- // // })
- // // .catch((error) => {
- // // console.error('링크 복사 중 오류 발생:', error);
- // // });
- // };
+ const handleMemopicClick = () => {
+ setModal(1);
+ setModalMemoVisible(false);
+ setMemopicPosition({
+ top: memopicPosition.top,
+ left: memopicPosition.left,
+ });
+ setIsEmojiBoxVisible(false);
+ };
- const saveMemo = () => {};
+ // 이모지 박스에서의 클릭 이벤트 핸들러
+ const handleEmojiClick = (index) => {
+ // 선택한 emoji 정보를 저장
+ selectEmoji(index);
+
+ // 새로운 랜덤 위치를 생성하고 설정
+ setMemopicPosition({
+ top: Math.floor(Math.random() * 365) - 10,
+ left: Math.floor(Math.random() * 250) - 10,
+ });
+ };
+ const shareLink = () => {
+ // 현재 경로에 uuid를 붙여서 공유할 링크 생성
+ const shareableLink = `${window.location.href}/${uuid}`;
+
+
+ // 클립보드에 복사
+ const copyToClipboard = (text) => {
+ if (navigator.clipboard) {
+ navigator.clipboard.writeText(text).then(
+ () => {
+ alert("링크가 클립보드에 복사되었습니다.");
+ },
+ (err) => {
+ console.error("링크 복사 중 오류 발생:", err);
+ alert("링크 복사 중 오류 발생");
+ }
+ );
+ } else {
+ // Navigator clipboard API가 지원되지 않는 경우 대체 방법 사용
+ const textArea = document.createElement("textarea");
+ textArea.value = text;
+ textArea.style.position = "fixed"; // 임시로 고정 위치에 텍스트 영역 생성
+ document.body.appendChild(textArea);
+ textArea.focus();
+ textArea.select();
+
+ try {
+ document.execCommand("copy");
+ alert("링크가 클립보드에 복사되었습니다.");
+ } catch (err) {
+ console.error("링크 복사 중 오류 발생:", err);
+ alert("링크 복사 중 오류 발생");
+ } finally {
+ document.body.removeChild(textArea); // 생성한 텍스트 영역 제거
+ }
+ }
+ };
+
+ copyToClipboard(shareableLink);
+ console.log("링크:", `${window.location.href}/${uuid}`);
+ // // 현재 주소에 uuid 파라미터 추가
+ // const currentUrl = new URL(window.location.href);
+ // currentUrl.searchParams.set('uuid', 'YOUR_UUID'); // 여기에 받아온 uuid 변수를 넣어주세요
+ // navigator.clipboard.writeText(currentUrl.href)
+ // .then(() => {
+ // alert('링크가 복사되었습니다.');
+ // })
+ // .catch((error) => {
+ // console.error('링크 복사 중 오류 발생:', error);
+ // });
+ };
+
+ // 메모 저장
+ const [memoText, setMemoText] = useState(""); // 메모 작성한 내용 저장
+
+ const saveMemo = async (uuid) => {
+ const apiURL = `http://ec2-3-35-208-177.ap-northeast-2.compute.amazonaws.com:8080/memo/${uuid}`
+ const saveMemoDto = {
+ "x": memopicPosition.left,
+ "y": memopicPosition.top,
+ "pageNum": selectedPhotoIndex,
+ "content": memoText,
+ "emojiNum": selectedEmoji
+ };
+ console.log(saveMemoDto);
+ try {
+ // 서버에 메모 저장 요청
+ const response = await axios.post(apiURL, saveMemoDto);
+
+ // 응답이 200이면 성공
+ if (response.status === 200) {
+ alert("메모가 성공적으로 저장되었습니다.");
+ } else {
+ // 다른 상태 코드가 반환된 경우
+ alert("메모 저장에 실패했습니다.");
+ }
+ } catch (error) {
+ // 오류가 발생한 경우 (401 등)
+ alert("오류가 발생했습니다. 다시 시도해주세요.");
+ console.error(error);
+ }
+ };
return (
@@ -184,13 +263,38 @@ export default function Photobook() {
className={styles.photo}
style={{ scale, backgroundImage: `url(${photos[i]})` }}
/>
- {/* 선택된 photo일 때만 memopic을 렌더링 */}
- {selectedEmoji !== null && i === index.current && (
+ {memos.map((memo, memoIndex) => {
+ if (memo.pageNum === i) {
+ // Check if there is a memo for the current photo
+ return (
+
handleMemosClick(memoIndex)}
+ />
+ );
+ } else {
+ return null; // No memo for the current photo
+ }
+ })}
+ {selectedEmoji !== null && selectedPhotoIndex === i && (
setModal(1)}
+ style={{
+ scale,
+ position: "absolute",
+ top: `${memopicPosition.top}px`, // 클릭 시의 위치를 고정
+ left: `${memopicPosition.left}px`, // 클릭 시의 위치를 고정
+ }}
+ onClick={handleMemopicClick}
/>
)}
@@ -209,10 +313,30 @@ export default function Photobook() {
{/*
*/}
+ {/* 이모지 박스 */}
+ {isEmojiBoxVisible && (
+
+ {emojiArray.map((emoji, index) => (
+ {
+ handleEmojiClick(index);
+ }}
+ />
+ ))}
+
+ )}
-
);
}
+
diff --git a/src/pages/Photobook/PhotobookUuid.module.scss b/src/pages/Photobook/PhotobookUuid.module.scss
deleted file mode 100644
index 8536dfb..0000000
--- a/src/pages/Photobook/PhotobookUuid.module.scss
+++ /dev/null
@@ -1,265 +0,0 @@
-*,
-*:after,
-*:before {
- box-sizing: border-box;
-}
-
-.wrapper {
- width: 100vw;
- height: 100vh;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
-}
-
-.photosWrapper {
- width: 100vw;
- height: 56vh;
- display: flex;
- align-items: center;
- justify-content: center;
- position: relative;
-}
-
-.photos {
- position: absolute;
- width: 290px;
- height: 431.4px;
- will-change: transform;
- .photo {
- position: absolute;
- z-index: 2;
- touch-action: none;
- background-size: cover;
- background-repeat: no-repeat;
- background-position: center center;
- width: 290px;
- height: 430px;
- margin-top: -12px;
- will-change: transform;
- box-shadow:
- 0 62.5px 125px -25px rgba(50, 50, 73, 0.5),
- 0 37.5px 75px -37.5px rgba(0, 0, 0, 0.6);
- }
- .memopic {
- position: absolute;
- z-index: 12;
- width: 60px;
- height: 60px;
- }
-}
-
-.dotsWrapper {
- position: absolute;
- bottom: 6px;
- left: 50%;
- transform: translateX(-50%);
- display: flex;
- align-items: center;
-}
-
-.dot {
- width: 10px;
- height: 10px;
- background-color: #ccc;
- border-radius: 50%;
- margin: 0 5px;
- cursor: pointer;
- transition: background-color 0.3s ease;
-
- &:hover {
- background-color: #555;
- }
-}
-
-.activeDot {
- background-color: #555;
-}
-
-.section1 {
- width: 100vw;
- height: 12vh;
- display: flex;
- flex-direction: row;
- align-items: flex-start;
- justify-content: flex-start;
- background-color: white;
- border-bottom: 1.5px solid rgba(0, 0, 0, 0.06);
- p {
- font-family: Pretendard;
- margin-left: 18px;
- margin-top: 22px;
- font-size: 18px;
- font-weight: 600;
- line-height: normal;
- text-align: start;
- }
-}
-
-.section2 {
- width: 100%;
- height: 58vh;
- overflow-x: auto;
- background-color: #DCF2FF;
- display: flex;
- align-items: center;
- justify-content: center;
- overflow: hidden;
- position: relative;
-}
-
-.section3 {
- position: relative;
- height: 21vh;
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- background-color: white;
- .buttonBox {
- width: 72px;
- height: 89px;
- display: flex;
- flex-direction: column;
- button {
- width: 72px;
- height: 72px;
- border-radius: 15px;
- background: #F7F7F7;
- display: flex;
- align-items: center;
- justify-content: center;
- border: none;
- img {
- width: 72px;
- height: 72px;
- margin: 0;
- }
- }
- p {
- color: #009EFF;
- text-align: center;
- font-family: Pretendard;
- font-size: 10px;
- font-weight: 700;
- line-height: normal;
- }
- }
-}
-
-.navBottom {
- width: 100vw;
- img {
- width: 100vw;
- }
-}
-
-.modal0 {
- display: none;
-}
-.modal1 {
- animation: fadeIn ease-in-out 1s;
- position: absolute;
- // box-shadow: 2px 4px 12px #cacaca;
- z-index: 2;
- width: 344px;
- height: 234px;
- top: 33vh;
- left: 6vw;
- background-color: url('../../img/memo-modal.png');
- background-size: cover; /* 이미지를 화면에 꽉 채우도록 조정 */
- background-position: center; /* 이미지를 가운데 정렬 */
- background-repeat: no-repeat; /* 이미지 반복 방지 */
- .memoModal {
- width: 88vw;
- height: auto;
- position: absolute;
- z-index: 3;
- top: 0;
- left: 0;
- }
- .modalBox {
- width: 88vw;
- height: 28vh;
- position: absolute;
- z-index: 4;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: space-between;
- textarea {
- width: 66%;
- height: 43%;
- padding: 10px;
- margin-top: 0px;
- color: #000;
- text-align: center;
- font-family: "SUIT Variable", -apple-system, BlinkMacSystemFont, Pretendard, "Segoe UI", Roboto, Oxygen,
- Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
- font-size: 16px;
- font-weight: 400;
- line-height: normal;
- outline: none;
- border: none;
- border-radius: 14px;
- white-space: pre-wrap;
- background-color: #f8f8f8;
- resize: none;
- &:focus {
- border: 1px solid #009EFF;
- }
- }
- .saveBtn {
- width: 45px;
- height: 24px;
- font-size: 18px;
- margin-bottom: 24px;
- display: flex;
- align-items: center;
- justify-content: center;
- color: white;
- background-color: #009EFF;
- border: none;
- border-radius: 19px;
- cursor: pointer;
- text-align: center;
- font-family: Pretendard;
- font-size: 12px;
- font-weight: 400;
- }
- }
-}
-
-.modalBG1 {
- animation: fadeIn2 ease-in-out 1s;
- z-index: 1;
- width: 100vw;
- height: 1100vh;
- position: absolute;
- background-color: rgba(0, 40, 64, 0.60);
- // opacity: 40%;
- top: 0px;
- left: 0px;
-}
-.modalBG0 {
- display: none;
-}
-
-.emojiBox {
- position: absolute;
- z-index: 10;
- bottom: 5px;
- width: 80vw;
- height: 72px;
- padding: 0 22px;
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: space-between;
- border-radius: 70px;
- background-color: white;
- opacity: 0;
- transform: translateY(20px);
- transition: opacity 0.5s ease, transform 0.5s ease;
-}
\ No newline at end of file