Skip to content

Commit a1f9e59

Browse files
authored
fix: 3차 QA 반영 (#131)
* feat: 내 게시물 삭제 * Fix: menu button z-index 조정 * fix: 롤링페이퍼 게시판에서 z-index 해결 * fix: 공유 게시물 상세페이지 코멘트 길어질 경우 벗어나는 오류 해결 * fix: 랜덤편지 모달 z-index 조정 * fix: 공유게시물 삭제 api 수정 --------- Co-authored-by: nirii00 <[email protected]>
1 parent a441bd7 commit a1f9e59

File tree

12 files changed

+79
-103
lines changed

12 files changed

+79
-103
lines changed

.github/workflows/deploy.yml

Lines changed: 0 additions & 58 deletions
This file was deleted.

src/apis/share.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,6 @@ export const postSharePostLike = async (sharePostId: string) => {
163163
return response.data;
164164
} catch (error) {
165165
console.error('❌ 편지 좋아요 중 에러가 발생했습니다', error);
166-
throw new Error('편지 좋아요 실패');
167166
}
168167
};
169168

@@ -175,6 +174,15 @@ export const getSharePostLikeCount = async (sharePostId: string) => {
175174
return response.data;
176175
} catch (error) {
177176
console.error('❌ 편지 좋아요 갯수 조회 중 에러가 발생했습니다', error);
178-
throw new Error('편지 좋아요 갯수 조회 실패');
177+
}
178+
};
179+
180+
export const deleteSharePost = async (sharePostId: string) => {
181+
try {
182+
const response = await client.delete(`/api/share-posts/${sharePostId}`);
183+
if (!response) throw new Error('error while deleting post');
184+
return response;
185+
} catch (error) {
186+
console.error('❌ 편지 삭제 중 에러가 발생했습니다', error);
179187
}
180188
};

src/components/MenuButton.tsx

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,44 +16,48 @@ export default function MenuButton() {
1616
<Link
1717
to="/letter/box"
1818
className={twMerge(
19-
'bg-primary-3 fixed bottom-[220px] z-50 h-12 w-12 rotate-360 content-center rounded-full text-white transition-all duration-200 hover:scale-105 active:scale-90',
19+
'bg-primary-3 fixed bottom-[220px] z-30 flex h-12 w-12 rotate-360 content-center items-center justify-center rounded-full text-white transition-all duration-200 hover:scale-105 active:scale-90',
2020
isOpen
2121
? 'translate-y-0 rotate-0 opacity-100'
22-
: 'translate-y-[120%] rotate-180 opacity-0',
22+
: 'pointer-events-none translate-y-[120%] rotate-180 opacity-0',
2323
)}
24+
onClick={() => setIsOpen(false)}
2425
>
25-
<MarkunreadOutlinedIcon fontSize="small" onClick={() => setIsOpen(false)} />
26+
<MarkunreadOutlinedIcon fontSize="small" />
2627
</Link>
2728
<Link
2829
to="/board/letter"
2930
className={twMerge(
30-
'bg-primary-3 fixed bottom-[160px] z-50 h-12 w-12 rotate-360 content-center rounded-full text-white transition-all duration-200 hover:scale-105 active:scale-90',
31+
'bg-primary-3 fixed bottom-[160px] z-30 flex h-12 w-12 rotate-360 content-center items-center justify-center rounded-full text-white transition-all duration-200 hover:scale-105 active:scale-90',
3132
isOpen
3233
? 'translate-y-0 rotate-0 opacity-100'
33-
: 'translate-y-[120%] rotate-180 opacity-0',
34+
: 'pointer-events-none translate-y-[120%] rotate-180 opacity-0',
3435
)}
36+
onClick={() => setIsOpen(false)}
3537
>
36-
<CalendarTodayOutlinedIcon fontSize="small" onClick={() => setIsOpen(false)} />
38+
<CalendarTodayOutlinedIcon fontSize="small" />
3739
</Link>
3840
<Link
3941
to="/letter/write"
4042
className={twMerge(
41-
'bg-primary-3 fixed bottom-[100px] z-50 h-12 w-12 rotate-360 content-center rounded-full text-white transition-all duration-200 hover:scale-105 active:scale-90',
43+
'bg-primary-3 fixed bottom-[100px] z-30 flex h-12 w-12 rotate-360 content-center items-center justify-center rounded-full text-white transition-all duration-200 hover:scale-105 active:scale-90',
4244
isOpen
4345
? 'translate-y-0 rotate-0 opacity-100'
44-
: 'translate-y-[120%] rotate-180 opacity-0',
46+
: 'pointer-events-none translate-y-[120%] rotate-180 opacity-0',
4547
)}
48+
onClick={() => setIsOpen(false)}
4649
>
47-
<EditNoteRoundedIcon fontSize="medium" onClick={() => setIsOpen(false)} />
50+
<EditNoteRoundedIcon fontSize="medium" />
4851
</Link>
4952

5053
<div
5154
className={twMerge(
52-
'bg-primary-3 fixed bottom-[30px] z-50 h-13 w-13 content-center rounded-full text-white transition-all duration-200 hover:scale-105 active:scale-90',
55+
'bg-primary-3 fixed bottom-[30px] z-30 flex h-13 w-13 content-center items-center justify-center rounded-full text-white transition-all duration-200 hover:scale-105 active:scale-90',
5356
isOpen ? 'rotate-90' : 'rotate-0',
5457
)}
58+
onClick={() => setIsOpen((state) => !state)}
5559
>
56-
<MenuRoundedIcon onClick={() => setIsOpen((state) => !state)} />
60+
<MenuRoundedIcon />
5761
</div>
5862
</div>
5963
</>

src/main.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ queryClient.setDefaultOptions({
1515
});
1616

1717
createRoot(document.getElementById('root')!).render(
18-
<StrictMode>
19-
<QueryClientProvider client={queryClient}>
20-
<BrowserRouter>
21-
<App />
22-
</BrowserRouter>
23-
</QueryClientProvider>
24-
</StrictMode>,
18+
// <StrictMode>
19+
<QueryClientProvider client={queryClient}>
20+
<BrowserRouter>
21+
<App />
22+
</BrowserRouter>
23+
</QueryClientProvider>,
24+
// </StrictMode>,
2525
);

src/pages/LetterBoardDetail/components/Header.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ interface HeaderProps {
1414
isWriter: boolean;
1515
onToggleLike: () => void;
1616
onOpenReportModal: () => void;
17+
onDeleteLetter: () => void;
1718
isShareLetterPreview?: boolean;
1819
}
1920

@@ -23,10 +24,10 @@ const Header = ({
2324
isWriter,
2425
onToggleLike,
2526
onOpenReportModal,
27+
onDeleteLetter,
2628
isShareLetterPreview = false,
2729
}: HeaderProps) => {
2830
const navigate = useNavigate();
29-
3031
return (
3132
<header className="fixed top-0 z-40 w-full max-w-150">
3233
<div className="flex h-16 items-center justify-between bg-white p-5">
@@ -46,8 +47,7 @@ const Header = ({
4647
<p className="body-l-m text-primary-1">{likeCount}</p>
4748
</div>
4849
{isWriter ? (
49-
// TODO: 게시물 삭제
50-
<DeleteIcon className="text-primary-1 h-6 w-6" />
50+
<DeleteIcon className="text-primary-1 h-6 w-6" onClick={onDeleteLetter} />
5151
) : (
5252
<button type="button" onClick={onOpenReportModal}>
5353
<SirenOutlinedIcon className="text-primary-1 h-6 w-6" />

src/pages/LetterBoardDetail/components/Letter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const Letter = ({ letter, isWriter = false }: LetterProps) => {
1414
<MemoWrapper isSender={isWriter}>
1515
<div className="flex flex-col gap-2 text-black">
1616
<p className="body-sb">To. {letter.receiverZipCode}</p>
17-
<p className="body-r leading-[26px] whitespace-pre-wrap">{letter.content}</p>
17+
<p className="body-r leading-[26px] break-all whitespace-pre-wrap">{letter.content}</p>
1818
<p className="body-m place-self-end">From. {letter.writerZipCode}</p>
1919
</div>
2020
</MemoWrapper>

src/pages/LetterBoardDetail/index.tsx

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,28 @@ import {
66
SharePost,
77
getSharePostLikeCount,
88
postSharePostLike,
9+
deleteSharePost,
910
} from '@/apis/share';
1011
import ReportModal from '@/components/ReportModal';
1112

1213
import Header from './components/Header';
1314
import Letter from './components/Letter';
14-
import { useParams } from 'react-router';
15+
16+
import { useNavigate, useParams } from 'react-router';
1517
import useAuthStore from '@/stores/authStore';
18+
import useToastStore from '@/stores/toastStore';
1619

1720
const LetterBoardDetailPage = () => {
1821
const [likeCount, setLikeCount] = useState(0);
1922
const [isLike, setIsLike] = useState(false);
2023
const [isWriter, setIsWriter] = useState(false);
2124
const [postDetail, setPostDetail] = useState<SharePost>();
2225
const [activeReportModal, setActiveReportModal] = useState(false);
23-
// const location = useLocation();
24-
// const sharePostId: string = location.pathname.split('/')[3];
25-
// const isShareLetterPreview = location.state?.isShareLetterPreview || false;
2626

2727
const { id } = useParams();
28-
2928
const myZipCode = useAuthStore.getState().zipCode;
29+
const setToastActive = useToastStore((state) => state.setToastActive);
30+
const navigate = useNavigate();
3031

3132
const postLike = async (sharePostId: string) => {
3233
try {
@@ -35,7 +36,6 @@ const LetterBoardDetailPage = () => {
3536
console.log('✅ 편지 좋아요 추가됨:', response);
3637
} catch (error) {
3738
console.error('❌ 편지 좋아요 추가 중 에러가 발생했습니다', error);
38-
throw new Error('편지 좋아요 추가 실패');
3939
}
4040
};
4141

@@ -48,6 +48,26 @@ const LetterBoardDetailPage = () => {
4848
postLike(sharePostId);
4949
};
5050

51+
const handleDeleteLetter = async () => {
52+
try {
53+
if (id) {
54+
const response = await deleteSharePost(id);
55+
if (!response) throw new Error('deleteSharePost: no response');
56+
navigate(-1);
57+
setToastActive({
58+
toastType: 'Success',
59+
title: '게시물 삭제 완료',
60+
});
61+
} else throw new Error('deleteSharePost: id 값을 조회할 수 없습니다.');
62+
} catch (error) {
63+
console.error(error);
64+
setToastActive({
65+
toastType: 'Error',
66+
title: '삭제 실패했습니다. 다시 시도해주세요.',
67+
});
68+
}
69+
};
70+
5171
useEffect(() => {
5272
const fetchPostDetail = async (postId: string) => {
5373
try {
@@ -100,12 +120,13 @@ const LetterBoardDetailPage = () => {
100120
isWriter={isWriter}
101121
onToggleLike={() => (id ? handleToggleLike(id) : handleToggleLike('error'))}
102122
onOpenReportModal={() => setActiveReportModal(true)}
123+
onDeleteLetter={() => handleDeleteLetter()}
103124
/>
104125
<main className="px-5 pt-18 pb-3">
105126
<p className="body-b mb-6 px-5">FROM. {postDetail?.zipCode}</p>
106127
<p
107128
className={twMerge(
108-
'body-r bg-[repeating-linear-gradient(transparent,transparent_25px,#ffe6e3_26px)] px-5 whitespace-pre-wrap',
129+
'body-r bg-[repeating-linear-gradient(transparent,transparent_25px,#ffe6e3_26px)] px-5 break-all whitespace-pre-wrap',
109130
'leading-[26px]',
110131
)}
111132
>

src/pages/LetterBoxDetail/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,11 @@ const LetterBoxDetailPage = () => {
222222
disabled={selected.length === 0}
223223
onClick={() => setIsOpenShareModal(true)}
224224
>
225-
다음으로
225+
공유하기
226226
</button>
227227
</div>
228228
)}
229-
<MenuButton />
229+
{!isShareMode && <MenuButton />}
230230
</>
231231
);
232232
};

src/pages/RandomLetters/components/Matched.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { deleteRandomLetterMatching } from '@/apis/randomLetter';
55
import ResultLetter from '@/components/ResultLetter';
66
import { formatNumber } from '@/utils/formatNumber';
77
import { timeFormatter } from '@/utils/timeFormatter';
8+
import useToastStore from '@/stores/toastStore';
89

910
export default function Matched({
1011
matchedLetter,
@@ -18,6 +19,7 @@ export default function Matched({
1819
setOpenSelectedDetailModal: React.Dispatch<React.SetStateAction<boolean>>;
1920
}) {
2021
const navigate = useNavigate();
22+
const setToastActive = useToastStore((state) => state.setToastActive);
2123

2224
const [isDisabled, setIsDisabled] = useState<boolean>(false);
2325

@@ -43,7 +45,7 @@ export default function Matched({
4345
const handleDeleteRandomLetterMatching = async () => {
4446
const res = await deleteRandomLetterMatching();
4547
if (res?.status === 200) {
46-
alert('매칭이 취소되었습니다.');
48+
setToastActive({ title: '매칭이 취소되었습니다.', toastType: 'Success' });
4749
navigate(-1);
4850
}
4951
};

src/pages/RandomLetters/components/MatchedLetter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const MatchedLetter = ({ matchedLetter }: { matchedLetter: MatchedLetter }) => {
1414
<>
1515
<div
1616
className={twMerge(
17-
`flex grow flex-col gap-3 px-5 pb-7.5`,
17+
`z-50 flex grow flex-col gap-3 px-5 pb-7.5`,
1818
PAPER_TYPE_OBJ[matchedLetter.paperType],
1919
)}
2020
>

0 commit comments

Comments
 (0)