Skip to content

Commit a7bb63a

Browse files
committed
design: 롤링페이퍼 페이지 메시지 상세조회 모달 퍼블리싱
1 parent aad7fb9 commit a7bb63a

File tree

5 files changed

+63
-11
lines changed

5 files changed

+63
-11
lines changed

src/assets/.gitkeep

Whitespace-only changes.

src/layouts/Header.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const Header = () => {
66
// TODO: 뒤로 가기 버튼이 보이는 조건 추가
77
// TODO: 스크롤 발생 시, 어떻게 보여져야 하는지
88
return (
9-
<header className="sticky top-0 flex h-16 items-center justify-between p-5">
9+
<header className="sticky top-0 z-40 flex h-16 items-center justify-between p-5">
1010
<ArrowLeftIcon className="h-6 w-6 text-white" />
1111
<div className="flex items-center gap-3">
1212
<Link to="/mypage/notifications">

src/pages/RollingPaper/components/Message.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
import MessageBg from '@/assets/images/memo-pink.png';
22

33
interface MessageProps {
4-
content: string;
4+
message: {
5+
content: string;
6+
sender: string;
7+
};
8+
onClick: () => void;
59
}
610

7-
const Message = ({ content }: MessageProps) => {
11+
const Message = ({ message, onClick }: MessageProps) => {
812
return (
913
<article
10-
className="caption-m min-h-20 bg-[image:var(--bg-image)] bg-[length:100%_100%] bg-center p-4 whitespace-pre-wrap text-black"
14+
className="flex min-h-20 cursor-pointer flex-col bg-[image:var(--bg-image)] bg-[length:100%_100%] bg-center p-4 text-black"
1115
style={{ '--bg-image': `url(${MessageBg})` } as React.CSSProperties}
16+
onClick={onClick}
1217
>
13-
{content}
18+
<p className="caption-r whitespace-pre-wrap">{message.content}</p>
19+
<p className="caption-m mt-1 place-self-end">From. {message.sender}</p>
1420
</article>
1521
);
1622
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import ModalBg from '@/assets/images/memo-pink.png';
2+
import ModalOverlay from '@/components/ModalOverlay';
3+
4+
interface MessageDetailModalProps {
5+
message: {
6+
content: string;
7+
sender: string;
8+
};
9+
isWriter: boolean;
10+
onClose: () => void;
11+
}
12+
13+
const MessageDetailModal = ({ message, isWriter, onClose }: MessageDetailModalProps) => {
14+
return (
15+
<ModalOverlay closeOnOutsideClick onClose={onClose}>
16+
<>
17+
<button type="button" className="body-b ml-auto text-white">
18+
{isWriter ? '삭제하기' : '신고하기'}
19+
</button>
20+
<article
21+
className="mt-1 flex max-h-1/2 w-78 flex-col gap-3 overflow-y-auto bg-[image:var(--bg-image)] bg-[length:100%_100%] bg-center px-5 py-4 text-black"
22+
style={{ '--bg-image': `url(${ModalBg})` } as React.CSSProperties}
23+
>
24+
<p className="body-r leading-[26px]">{message.content}</p>
25+
<p className="body-m place-self-end">From. {message.sender}</p>
26+
</article>
27+
</>
28+
</ModalOverlay>
29+
);
30+
};
31+
32+
export default MessageDetailModal;

src/pages/RollingPaper/index.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,44 @@
11
import { MasonryInfiniteGrid } from '@egjs/react-infinitegrid';
2+
import { useState } from 'react';
23

34
import EnvelopeImg from '@/assets/images/envelope.png';
45
import BgItem from '@/assets/images/field-4.png';
56
import PageTitle from '@/components/PageTitle';
67
import Header from '@/layouts/Header';
78

89
import Message from './components/Message';
10+
import MessageDetailModal from './components/MessageDetailModal';
911

12+
const DUMMY_USER_ZIP_CODE = '12E12';
1013
const DUMMY_TITLE = '침수 피해를 복구중인 포스코 임직원 분들에게 응원의 메시지를 보내주세요!';
1114
const DUMMY_MESSAGE_COUNT = 20;
12-
13-
const DUMMY_CONTENT_1 =
14-
'편지 내용 어쩌구저쩌구 뾰로롱 편지 내용 어쩌구저쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 저쩌구 끝~!!';
15-
const DUMMY_CONTENT_2 = '구현해보고 정신없지 않은 범위 기준으로 자를까요?';
15+
const DUMMY_MESSAGE = {
16+
content:
17+
'편지 내용 어쩌구저쩌구 뾰로롱 편지 내용 어쩌구저쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 뾰로롱편지 내용 어쩌구 저쩌구 끝~!!',
18+
sender: '12E12',
19+
};
20+
const DUMMY_MESSAGES = Array.from({ length: 10 }, () => ({ ...DUMMY_MESSAGE }));
1621

1722
const RollingPaperPage = () => {
23+
const [activeMessageIndex, setActiveMessageIndex] = useState<number | null>(null);
24+
1825
return (
1926
<>
27+
{activeMessageIndex !== null && (
28+
<MessageDetailModal
29+
message={DUMMY_MESSAGES[activeMessageIndex]}
30+
isWriter={DUMMY_MESSAGES[activeMessageIndex].sender === DUMMY_USER_ZIP_CODE}
31+
onClose={() => setActiveMessageIndex(null)}
32+
/>
33+
)}
2034
<Header />
2135
<main className="flex grow flex-col items-center px-5 pt-4 pb-12">
2236
<PageTitle className="mb-18 max-w-73 text-center">{DUMMY_TITLE}</PageTitle>
2337
<p className="body-sb text-gray-60 w-full">등록된 편지 {DUMMY_MESSAGE_COUNT}</p>
2438
<section className="w-full">
2539
<MasonryInfiniteGrid column={2} align="stretch" gap={16}>
26-
{Array.from({ length: DUMMY_MESSAGE_COUNT }).map((_, index) => (
27-
<Message key={index} content={index % 3 === 0 ? DUMMY_CONTENT_1 : DUMMY_CONTENT_2} />
40+
{DUMMY_MESSAGES.map((message, index) => (
41+
<Message key={index} message={message} onClick={() => setActiveMessageIndex(index)} />
2842
))}
2943
</MasonryInfiniteGrid>
3044
</section>

0 commit comments

Comments
 (0)