Skip to content

Commit 9812d33

Browse files
authored
feat: 임시저장된 편지 조회 기능 구현 (#75)
* refactor: 함수명 통일성을 위해 fetchIncomingLettersApi → getIncomingLetters 변경 * design: 홈 페이지 임시저장 편지 모달에 스크롤 기능 추가 * feat: 임시저장된 편지 조회 기능 구현 * fix: 모달 재오픈 시 임시저장 편지 최신화 되지 않는 문제 수정 * feat: ShowDraftModal에서 임시저장 편지 클릭 시 이동 로직 추가 (주석 처리)
1 parent 2cce4ee commit 9812d33

File tree

4 files changed

+63
-14
lines changed

4 files changed

+63
-14
lines changed

src/apis/draftLetters.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import client from './client';
2+
3+
export interface DraftLetter {
4+
letterId: number;
5+
writerId: number;
6+
receiverId: number;
7+
parentLetterId: number;
8+
zipCode: string;
9+
title: string;
10+
content: string;
11+
category: string;
12+
paperType: string;
13+
fontType: string;
14+
deliveryStartedAt: string;
15+
deliveryCompletedAt: string;
16+
matched: boolean;
17+
}
18+
19+
export const getDraftLetters = async () // token: string
20+
: Promise<DraftLetter[]> => {
21+
try {
22+
const { data } = await client.get('/api/letters?status=draft', {
23+
// headers: {
24+
// Authorization: `Bearer ${token}`,
25+
// },
26+
});
27+
console.log('임시저장된 편지 데이터', data);
28+
return data.data;
29+
} catch (error) {
30+
console.error(`❌임시저장된 편지를 불러오던 중 에러가 발생했습니다`, error);
31+
throw new Error('임시저장된 편지 불러오기 실패');
32+
}
33+
};

src/apis/incomingLetters.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import client from './client';
22

3-
export const fetchIncomingLettersApi = async (token: string) => {
3+
export const getIncomingLetters = async (token: string) => {
44
try {
55
const { data } = await client.get('/api/letters?status=delivery', {
66
headers: {

src/pages/Home/components/ShowDraftModal.tsx

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import DeleteOutlineRoundedIcon from '@mui/icons-material/DeleteOutlineRounded';
2-
import React from 'react';
2+
import React, { useEffect, useState } from 'react';
3+
// import { useNavigate } from 'react-router';
34

5+
import { DraftLetter, getDraftLetters } from '@/apis/draftLetters';
46
import ModalBackgroundWrapper from '@/components/ModalBackgroundWrapper';
57
import ModalOverlay from '@/components/ModalOverlay';
68

@@ -9,14 +11,27 @@ interface ShowDraftModalProps {
911
onClose: () => void;
1012
}
1113

12-
const DUMMY_DRAFT = [
13-
{ id: 1, title: '취업 때문에 고민이 많아요!!' },
14-
{ id: 2, title: '배고파서 죽을 거 같아요 😭' },
15-
{ id: 3, title: '개발하니까 밖에 나갈 일이 없어서 너무 심심하고 피곤해요' },
16-
{ id: 4, title: '마라샹궈 먹고 싶어요' },
17-
];
18-
1914
const ShowDraftModal = ({ onClose }: ShowDraftModalProps) => {
15+
const [draftLetters, setDraftLetters] = useState<DraftLetter[]>([]);
16+
17+
// const navigate = useNavigate();
18+
19+
// const handleNavigation = (incomingId: number) => {
20+
// navigate(`/board/letter/${incomingId}`, {
21+
// state: { isShareLetterPreview: false },
22+
// });
23+
// };
24+
25+
useEffect(() => {
26+
getDraftLetters()
27+
.then((data) => {
28+
setDraftLetters(data || []);
29+
})
30+
.catch((error) => {
31+
console.error('❌ 임시저장된 편지를 불러오는데 실패했습니다', error);
32+
});
33+
}, [onClose]);
34+
2035
return (
2136
<ModalOverlay closeOnOutsideClick onClose={onClose}>
2237
<div className="flex h-full flex-col items-center justify-center">
@@ -29,11 +44,12 @@ const ShowDraftModal = ({ onClose }: ShowDraftModalProps) => {
2944
<p className="body-sb text-gray-80">임시저장 편지</p>
3045
<p className="caption-r text-black">로그아웃 시 임시 저장된 편지는 사라집니다</p>
3146
</div>
32-
<div className="mt-6 flex w-[251px] flex-col gap-[10px]">
33-
{DUMMY_DRAFT.map((draft) => (
47+
<div className="mt-6 flex max-h-60 min-h-auto w-[251px] flex-col gap-[10px] overflow-y-scroll [&::-webkit-scrollbar]:hidden">
48+
{draftLetters.map((draft) => (
3449
<div
3550
className="text-gray-80 body-m flex h-10 w-full items-center justify-between gap-1 rounded-lg bg-white p-3"
36-
key={draft.id}
51+
key={draft.letterId}
52+
// onClick={() => handleNavigation(draft.letterId)}
3753
>
3854
<p className="truncate">{draft.title}</p>
3955
<div className="text-gray-20">

src/stores/incomingLettersStore.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { create } from 'zustand';
22

3-
import { fetchIncomingLettersApi } from '@/apis/incomingLetters';
3+
import { getIncomingLetters } from '@/apis/incomingLetters';
44

55
interface IncomingLetters {
66
letterId: number;
@@ -42,7 +42,7 @@ export const useIncomingLettersStore = create<IncomingLettersStore>((set) => ({
4242
fetchIncomingLetters: async () => {
4343
try {
4444
const token = localStorage.getItem('token') || '';
45-
const data = await fetchIncomingLettersApi(token);
45+
const data = await getIncomingLetters(token);
4646

4747
let arrivedCount = 0;
4848
const updatedLetters = data.data.map((letter: IncomingLetters) => {

0 commit comments

Comments
 (0)