diff --git a/src/pages/LetterBoard/components/LetterPreview.tsx b/src/pages/LetterBoard/components/LetterPreview.tsx
new file mode 100644
index 0000000..fd7c973
--- /dev/null
+++ b/src/pages/LetterBoard/components/LetterPreview.tsx
@@ -0,0 +1,27 @@
+import { Link } from 'react-router';
+
+import PinkLetterBg from '@/assets/images/letter-pink.png';
+
+interface LetterPreviewProps {
+ id: string;
+ to: string;
+ from: string;
+ content: string;
+}
+
+const LetterPreview = ({ id, to, from, content }: LetterPreviewProps) => {
+ return (
+
+
+ From.{from}
+ {content}
+ To.{to}
+
+
+ );
+};
+
+export default LetterPreview;
diff --git a/src/pages/LetterBoard/index.tsx b/src/pages/LetterBoard/index.tsx
index bd658c3..52c04b8 100644
--- a/src/pages/LetterBoard/index.tsx
+++ b/src/pages/LetterBoard/index.tsx
@@ -1,5 +1,49 @@
+import { twMerge } from 'tailwind-merge';
+
+import BackgroundBottom from '@/components/BackgroundBottom';
+import NoticeRolling from '@/components/NoticeRolling';
+import PageTitle from '@/components/PageTitle';
+
+import LetterPreview from './components/LetterPreview';
+
const LetterBoardPage = () => {
- return
LetterBoardPage
;
+ const isMyBoard = window.location.pathname.includes('/mypage');
+
+ return (
+ <>
+
+ {isMyBoard ? (
+ 내가 올린 게시물
+ ) : (
+ <>
+
+ 게시판
+
+ 따숨이에게 힘이 되었던 다양한 편지들을 모아두었어요
+
+ >
+ )}
+
+ {Array.from({ length: 10 }).map((_, index) => (
+
+ ))}
+
+
+
+ >
+ );
};
export default LetterBoardPage;
diff --git a/src/pages/LetterBoardDetail/components/Header.tsx b/src/pages/LetterBoardDetail/components/Header.tsx
new file mode 100644
index 0000000..f2a791f
--- /dev/null
+++ b/src/pages/LetterBoardDetail/components/Header.tsx
@@ -0,0 +1,51 @@
+import { Link } from 'react-router';
+
+import {
+ ArrowLeftIcon,
+ DeleteIcon,
+ LikeFilledIcon,
+ LikeOutlinedIcon,
+ SirenOutlinedIcon,
+} from '@/assets/icons';
+
+interface HeaderProps {
+ likeCount: number;
+ isLike: boolean;
+ isWriter: boolean;
+ onToggleLike: () => void;
+ onOpenReportModal: () => void;
+}
+
+const Header = ({ likeCount, isLike, isWriter, onToggleLike, onOpenReportModal }: HeaderProps) => {
+ return (
+
+
+
+
+
+
+
+
+
{likeCount}
+
+ {isWriter ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ );
+};
+
+export default Header;
diff --git a/src/pages/LetterBoardDetail/components/Letter.tsx b/src/pages/LetterBoardDetail/components/Letter.tsx
new file mode 100644
index 0000000..f1960df
--- /dev/null
+++ b/src/pages/LetterBoardDetail/components/Letter.tsx
@@ -0,0 +1,28 @@
+import PinkMemoBg from '@/assets/images/memo-pink.png';
+import YellowMemoBg from '@/assets/images/memo-yellow.png';
+
+interface LetterProps {
+ letter: {
+ receiver: string;
+ content: string;
+ sender: string;
+ };
+ isSender?: boolean;
+}
+
+const Letter = ({ letter, isSender = false }: LetterProps) => {
+ return (
+
+ To. {letter.receiver}
+ {letter.content}
+ From. {letter.sender}
+
+ );
+};
+
+export default Letter;
diff --git a/src/pages/LetterBoardDetail/index.tsx b/src/pages/LetterBoardDetail/index.tsx
index 2efa63d..2292ff9 100644
--- a/src/pages/LetterBoardDetail/index.tsx
+++ b/src/pages/LetterBoardDetail/index.tsx
@@ -1,5 +1,65 @@
+import { useState } from 'react';
+import { twMerge } from 'tailwind-merge';
+
+import ReportModal from '@/components/ReportModal';
+
+import Header from './components/Header';
+import Letter from './components/Letter';
+
+const DUMMY_LETTER = {
+ receiver: '12E21',
+ content:
+ '편지 내용 어쩌구저쩌구 뾰로롱 편지 내용 어쩌구저쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 저쩌구 끝~!!',
+ sender: '12345',
+};
+
const LetterBoardDetailPage = () => {
- return
LetterBoardDetailPage
;
+ const [likeCount, setLikeCount] = useState(122);
+ const [isLike, setIsLike] = useState(false);
+ const isWriter = false;
+ const [activeReportModal, setActiveReportModal] = useState(false);
+
+ const handleToggleLike = () => {
+ setLikeCount((prev) => prev + (isLike ? -1 : 1));
+ setIsLike((prev) => !prev);
+ };
+
+ return (
+ <>
+ {activeReportModal &&
setActiveReportModal(false)} />}
+
+ >
+ );
};
export default LetterBoardDetailPage;
diff --git a/src/pages/MyPage/index.tsx b/src/pages/MyPage/index.tsx
index 5c3a4a6..4bed508 100644
--- a/src/pages/MyPage/index.tsx
+++ b/src/pages/MyPage/index.tsx
@@ -1,4 +1,5 @@
import { useState } from 'react';
+import { Link } from 'react-router';
import ConfirmModal from '@/components/ConfirmModal';
@@ -29,7 +30,7 @@ const MyPage = () => {
onConfirm={() => setIsOpenModal(false)}
/>
)}
-
+
{DUMMY_ZIP_CODE.split('').map((code, index) => (
{
활동
-
내가 올린 게시물
+
+
내가 올린 게시물
+
고객 센터
diff --git a/src/pages/Notifications/components/WarningModal.tsx b/src/pages/Notifications/components/WarningModal.tsx
index e378603..8e7e922 100644
--- a/src/pages/Notifications/components/WarningModal.tsx
+++ b/src/pages/Notifications/components/WarningModal.tsx
@@ -1,4 +1,3 @@
-import { useEffect, useRef } from 'react';
import { twMerge } from 'tailwind-merge';
import ModalOverlay from '@/components/ModalOverlay';
@@ -9,26 +8,11 @@ interface WarningModalProps {
}
const WarningModal = ({ isOpen, onClose }: WarningModalProps) => {
- const ref = useRef
(null);
-
- useEffect(() => {
- const handleOutsideClick = (e: MouseEvent) => {
- if (ref.current && !ref.current.contains(e.target as Node)) onClose();
- };
-
- if (isOpen) document.addEventListener('click', handleOutsideClick);
-
- return () => {
- document.removeEventListener('click', handleOutsideClick);
- };
- }, [isOpen, onClose]);
-
if (!isOpen) return null;
return (
-
+
>
> = {
letter: EnvelopeIcon,
- warning: SirenIcon,
+ warning: SirenFilledIcon,
board: BoardIcon,
};
diff --git a/src/pages/Notifications/index.tsx b/src/pages/Notifications/index.tsx
index 2248f21..50aef8b 100644
--- a/src/pages/Notifications/index.tsx
+++ b/src/pages/Notifications/index.tsx
@@ -30,7 +30,7 @@ const NotificationsPage = () => {
return (
<>
setIsOpenWarningModal(false)} />
-
+
알림