Skip to content
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
28 changes: 20 additions & 8 deletions src/apis/draftLetters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,30 @@ export interface DraftLetter {
matched: boolean;
}

export const getDraftLetters = async () // token: string
: Promise<DraftLetter[]> => {
export const getDraftLetters = async (): Promise<DraftLetter[]> => {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

생각해보니 저도 api 타입 넣는거 깜빡하고 있었네요..! 천천히 리팩토링 하겠습니다!!!

try {
const { data } = await client.get('/api/letters?status=draft', {
// headers: {
// Authorization: `Bearer ${token}`,
// },
});
const { data } = await client.get('/api/letters?status=draft', {});
console.log('임시저장된 편지 데이터', data);
return data.data;
} catch (error) {
console.error(`❌임시저장된 편지를 불러오던 중 에러가 발생했습니다`, error);
console.error('❌임시저장된 편지를 불러오던 중 에러가 발생했습니다', error);
throw new Error('임시저장된 편지 불러오기 실패');
}
};

export const deleteDraftLetters = async (letterId: number) => {
try {
const { data } = await client.delete(`/api/letters/${letterId}/temporary-save`);

if (data.data?.letterId) {
console.log('삭제된 임시저장 편지 ID:', data.data.letterId);
} else {
console.error('❌서버 응답에 letterId가 존재하지 않습니다.');
}

return data.data.letterId;
} catch (error) {
console.error('❌임시저장된 편지를 삭제하던 중 에러가 발생했습니다:', error);
throw error;
}
};
25 changes: 22 additions & 3 deletions src/pages/Home/components/ShowDraftModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import DeleteOutlineRoundedIcon from '@mui/icons-material/DeleteOutlineRounded';
import React, { useEffect, useState } from 'react';
// import { useNavigate } from 'react-router';

import { DraftLetter, getDraftLetters } from '@/apis/draftLetters';
import { DraftLetter, getDraftLetters, deleteDraftLetters } from '@/apis/draftLetters';
import ModalBackgroundWrapper from '@/components/ModalBackgroundWrapper';
import ModalOverlay from '@/components/ModalOverlay';

Expand All @@ -22,14 +22,29 @@ const ShowDraftModal = ({ onClose }: ShowDraftModalProps) => {
// });
// };

useEffect(() => {
const handleGetDraftLetters = () => {
getDraftLetters()
.then((data) => {
setDraftLetters(data || []);
})
.catch((error) => {
console.error('❌ 임시저장된 편지를 불러오는데 실패했습니다', error);
});
};

const handleDeleteDraftLetters = async (letterId: number) => {
//TODO: 정말로 삭제하시겠습니까? 모달창
try {
await deleteDraftLetters(letterId);
setDraftLetters((prev) => prev.filter((letter) => letter.letterId !== letterId));
console.log(`letterId는 `, letterId);
} catch (error) {
console.error(`❌임시저장된 편지를 삭제하던 중 에러가 발생했습니다.`, error);
}
};

useEffect(() => {
handleGetDraftLetters();
}, [onClose]);

return (
Expand All @@ -52,7 +67,11 @@ const ShowDraftModal = ({ onClose }: ShowDraftModalProps) => {
// onClick={() => handleNavigation(draft.letterId)}
>
<p className="truncate">{draft.title}</p>
<div className="text-gray-20">
<div
className="text-gray-20 active:text-gray-600"
tabIndex={0}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요 탭인덱스는 뭔가용??

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tabIndex 가 없으면 divspan 같은 요소들은 기본적으로 포커스를 받을 수 없어서 키보드 접근성을 위해 추가했습니다!

onClick={() => handleDeleteDraftLetters(draft.letterId)}
>
<DeleteOutlineRoundedIcon />
</div>
</div>
Expand Down
41 changes: 27 additions & 14 deletions src/pages/Home/components/ShowShareAccessModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react';
import { useNavigate } from 'react-router';

import { getSharePostDetail, getSharePostList } from '@/apis/share';
import { SharePostResponse } from '@/apis/share';
import { SharePostResponse, SharePost } from '@/apis/share';
import ModalBackgroundWrapper from '@/components/ModalBackgroundWrapper';
import ModalOverlay from '@/components/ModalOverlay';

Expand All @@ -14,20 +14,30 @@ interface ShowShareAccessModalProps {
const ShowShareAccessModal = ({ onClose }: ShowShareAccessModalProps) => {
const navigate = useNavigate();

const [sharePosts, setSharePosts] = useState<SharePostResponse>();
const [sharePosts, setSharePosts] = useState<SharePost[]>([]);
const [currentPage, setCurrentPage] = useState(1);
const [hasMore, setHasMore] = useState(true);

const fetchPosts = async (page: number) => {
try {
const data: SharePostResponse = await getSharePostList(page, 10);
setSharePosts((prev) => [...prev, ...data.content]);
setHasMore(page < data.totalPages);
} catch (error) {
console.error('❌ 게시글 목록을 불러오는 데 실패했습니다.', error);
}
};

useEffect(() => {
const fetchPosts = async () => {
try {
const data = await getSharePostList(1, 10);
setSharePosts(data);
} catch (error) {
console.error('❌ 게시글 목록을 불러오는 데 실패했습니다.', error);
}
};
fetchPosts(currentPage);
}, [currentPage]);

fetchPosts();
}, []);
const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {
const { scrollTop, scrollHeight, clientHeight } = e.currentTarget;
if (scrollTop + clientHeight >= scrollHeight - 10 && hasMore) {
setCurrentPage((prev) => prev + 1);
}
};

const handleNavigation = async (sharePostId: number) => {
try {
Expand Down Expand Up @@ -55,8 +65,11 @@ const ShowShareAccessModal = ({ onClose }: ShowShareAccessModalProps) => {
허락 여부를 체크해주세요!
</p>
</div>
<div className="mt-6 flex max-h-60 min-h-auto w-[251px] flex-col gap-[10px] overflow-y-scroll [&::-webkit-scrollbar]:hidden">
{sharePosts?.content.map((post) => (
<div
className="mt-6 flex max-h-60 min-h-auto w-[251px] flex-col gap-[10px] overflow-y-scroll [&::-webkit-scrollbar]:hidden"
onScroll={handleScroll}
>
{sharePosts?.map((post) => (
<button
className="text-gray-80 body-m flex h-10 w-full items-center justify-between gap-1 rounded-lg bg-white p-3"
key={post.sharePostId}
Expand Down