Skip to content

Commit 6917b3b

Browse files
authored
fix: reissue 문제, 내 편지함 data 최신화 문제 해결 (#100)
* fix: 에러나는 경우 무조건 로그아웃되는 현상 해결 * fix: client.ts 주석 제거 * fix: 탈퇴시 로그아웃 자동적으로 되도록 수정 * feat: 탈퇴 에러시 alert 추가 * fix: 마이페이지, 내 공유 게시물 데이터 없을때 자잘한 에러 수정 * fix: 편치 쿼리 갱신 로직 추가 - queryClient.invalidateQueries로 쿼리를 갱신 * fix: 에러시 alert 추가 * fix: 탈퇴한 회원 로직 추가, 온보딩 from 왼쪽 정렬 * fix: 편지 전송/삭제 시 편지함에서 바로 수정사항 반영되도록 함 - 편지 삭제/전송시 queryClient.invalidateQueries 적용 * fix: 게시판에서 response 없을 경우 페이지 로딩이 안되는 문제 해결 - 추후 지속적으로 확인 예정 * fix: 파비콘, 사이트 이름 수정 * feat: ToastUI 적용 -내 편지함의 alert를 toastUI로 변경했습니다. * fix: reissue token 담기지 않는 문제 해결 * fix: letterBoard length 없음 문제 해결 - 계속 확인 필 --------- Co-authored-by: nirii00 <[email protected]>
1 parent 4aced28 commit 6917b3b

File tree

16 files changed

+109
-86
lines changed

16 files changed

+109
-86
lines changed

index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<!doctype html>
2-
<html lang="en">
2+
<html lang="kr">
33
<head>
44
<meta charset="UTF-8" />
5-
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
5+
<link rel="icon" type="image/svg+xml" href="/public/favicon.ico" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7-
<title>Vite + React + TS</title>
7+
<title>36.5</title>
88
<link
99
rel="stylesheet"
1010
as="style"

public/favicon.ico

15 KB
Binary file not shown.

public/vite.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/apis/auth.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export const getNewToken = async () => {
3333
try {
3434
const response = await client.post('/api/reissue', {}, { withCredentials: true });
3535
if (!response) throw new Error('getNewToken: no response data');
36+
console.log(response.data);
3637
return response;
3738
} catch (error) {
3839
console.error(error);

src/apis/client.ts

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,13 @@ const client = axios.create({
99
headers: { 'Content-Type': 'application/json' },
1010
});
1111

12-
// type FailedRequest = {
13-
// resolve: (token: string) => void;
14-
// reject: (error: unknown) => void;
15-
// };
16-
1712
let isRefreshing = false;
18-
// let failedQueue: FailedRequest[] = [];
19-
20-
// const processQueue = (error: unknown, token: string | null = null) => {
21-
// failedQueue.forEach((prom) => {
22-
// if (error) {
23-
// prom.reject(error);
24-
// } else {
25-
// if (token) {
26-
// prom.resolve(token);
27-
// }
28-
// }
29-
// });
30-
31-
// failedQueue = [];
32-
// };
3313

3414
const callReissue = async () => {
3515
try {
3616
const response = await getNewToken();
37-
const newToken = response?.data.accessToken;
17+
if(response?.status !== 200) throw new Error('error while fetching newToken');
18+
const newToken = response?.data.data.accessToken;
3819
return newToken;
3920
} catch (e) {
4021
return Promise.reject(e);
@@ -48,6 +29,7 @@ client.interceptors.request.use(
4829
const accessToken = useAuthStore.getState().accessToken;
4930
if (config.url !== '/api/reissue' && accessToken) {
5031
config.headers.Authorization = `Bearer ${accessToken}`;
32+
console.log('interceptor', config);
5133
}
5234
return config;
5335
},
@@ -72,38 +54,21 @@ client.interceptors.response.use(
7254
retry = true;
7355
if (isRefreshing) {
7456
if (isLoggedIn) logout();
75-
// try {
76-
// return new Promise((resolve, reject) => {
77-
// failedQueue.push({
78-
// resolve: (token: string) => {
79-
// originalRequest.headers.Authorization = `Bearer ${token}`;
80-
// resolve(client(originalRequest));
81-
// },
82-
// reject: (err: unknown) => reject(err),
83-
// });
84-
// });
85-
// } catch (e) {
86-
// return Promise.reject(e);
87-
// }
8857
} else {
8958
isRefreshing = true;
9059
try {
9160
const newToken = await callReissue();
9261
setAccessToken(newToken);
93-
// processQueue(null, newToken);
9462
isRefreshing = false;
9563
originalRequest.headers.Authorization = `Bearer ${newToken}`;
9664
return client(originalRequest);
9765
} catch (e) {
98-
// processQueue(e, null);
9966
isRefreshing = false;
10067
if (isLoggedIn) logout();
10168
return Promise.reject(e);
10269
}
10370
}
10471
}
105-
// if (isLoggedIn) logout();
106-
// console.error('Failed to refresh token', error);
10772
return Promise.reject(error);
10873
},
10974
);

src/apis/mailBox.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const getMailbox = async () => {
1313
export const getMailboxDetail = async (id: number, pageParam: number) => {
1414
try {
1515
const response = await client.get(`/api/mailbox/${id}/detail?page=${pageParam}&size=20`);
16-
16+
console.log(response.data);
1717
if (!response) throw new Error('error while fetching mailbox detail data');
1818
return response.data;
1919
} catch (error) {

src/components/ToastItem.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@ export default function ToastItem({ toastObj, index }: { toastObj: ToastObj; ind
1414

1515
const TOAST_DESIGN = {
1616
Warning: { style: 'bg-primary-4', imoji: '⚠️' },
17-
Success: { style: 'bg-[#38d9a9] text-[#FFFFFF]', imoji: '✅' },
17+
Success: { style: 'bg-[#DFFFDA] text-[#000000]', imoji: '✅' },
1818
Error: { style: 'bg-[#FFDCD8] text-[#FF0000]', imoji: '🚨' },
1919
Info: { style: 'bg-[#FFFFFF]', imoji: '📫' },
2020
};
2121

2222
const TOAST_POSITION = {
2323
Top: 'top-20',
24-
Bottom: 'bottom-20',
24+
Bottom: 'bottom-5',
2525
};
2626

2727
const animation = `toast-blink ${toastObj.time}s ease-in-out forwards`;
2828
const toastStyle = twMerge(
29-
'fixed bottom-20 left-1/2 z-40 flex h-[40px] max-w-150 min-w-[335px] w-[85%] -translate-1/2 items-center justify-center rounded-2xl caption-sb',
29+
'fixed bottom-5 left-1/2 z-40 flex h-[40px] max-w-150 min-w-[300px] w-[100%] -translate-1/2 items-center justify-center rounded-lg caption-sb shadow-[0_1px_6px_rgba(200,200,200,0.2)]',
3030
TOAST_POSITION[toastObj.position],
3131
TOAST_DESIGN[toastObj.toastType].style,
3232
);

src/pages/Auth/index.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import useAuthStore from '@/stores/authStore';
77
const AuthCallbackPage = () => {
88
const stateToken = new URLSearchParams(window.location.search).get('state');
99
const redirectURL = new URLSearchParams(window.location.search).get('redirect');
10+
const error = new URLSearchParams(window.location.search).get('error');
1011

1112
const login = useAuthStore((state) => state.login);
1213
const logout = useAuthStore((state) => state.logout);
@@ -32,6 +33,8 @@ const AuthCallbackPage = () => {
3233
login();
3334
if (userInfo.accessToken) setAccessToken(userInfo.accessToken);
3435

36+
console.log(redirectURL);
37+
3538
switch (redirectURL) {
3639
case 'home':
3740
{
@@ -67,6 +70,9 @@ const AuthCallbackPage = () => {
6770
useEffect(() => {
6871
if (!stateToken) {
6972
navigate('/notFound');
73+
if (error === 'deleted_member') {
74+
alert('탈퇴한 회원입니다.');
75+
}
7076
return;
7177
}
7278

src/pages/LetterBoard/index.tsx

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@ const LetterBoardPage = () => {
1717
const fetchPostList = async (page: number = 1) => {
1818
try {
1919
const response = await getSharePostList(page);
20-
if (!response) throw new Error('게시글 목록을 불러오는데 실패했습니다.');
20+
if (!response || !response.content) {
21+
console.error('게시글 목록을 불러오는데 실패했습니다.');
22+
return { content: [], currentPage: page, totalPages: 1 };
23+
}
2124
console.log('page', response);
2225
return response as SharePostResponse;
2326
} catch (e) {
2427
console.error(e);
28+
return { content: [], currentPage: page, totalPages: 1 };
2529
}
2630
};
2731

@@ -32,7 +36,7 @@ const LetterBoardPage = () => {
3236
enabled: true,
3337
initialPageParam: 1,
3438
getNextPageParam: (res) => {
35-
if (!res || res.currentPage >= res.totalPages) {
39+
if (!res || !res?.content || res?.currentPage >= res?.totalPages) {
3640
return undefined;
3741
}
3842
return res.currentPage + 1;
@@ -41,7 +45,7 @@ const LetterBoardPage = () => {
4145
gcTime: 1000 * 60 * 10,
4246
});
4347

44-
const postLists = data?.pages.flatMap((page) => page?.content) || [];
48+
const postLists = data?.pages?.flatMap((page) => page?.content || []) || [];
4549

4650
useEffect(() => {
4751
if (!hasNextPage) return;
@@ -65,24 +69,30 @@ const LetterBoardPage = () => {
6569
</p>
6670
</>
6771
{isLoading ? (
68-
<p>loading</p>
69-
) : postLists && postLists?.length > 0 ? (
70-
<section className="mt-6 grid grid-cols-2 gap-x-5 gap-y-4">
71-
{postLists?.map((item, index) => {
72-
return (
73-
<LetterPreview
74-
key={index}
75-
id={item?.sharePostId || 0}
76-
to={item?.receiverZipCode || 'ERROR'}
77-
from={item?.writerZipCode || 'ERROR'}
78-
content={item?.content || 'no Data'}
79-
ref={index === postLists.length - 1 ? ref : null}
80-
/>
81-
);
82-
})}
83-
</section>
72+
<p className="body-m text-gray-60 mt-10 text-center">로딩 중 입니다.</p>
73+
) : postLists ? (
74+
postLists?.length > 0 ? (
75+
<section className="mt-6 grid grid-cols-2 gap-x-5 gap-y-4">
76+
{postLists?.map((item, index) => {
77+
return (
78+
<LetterPreview
79+
key={index}
80+
id={item?.sharePostId || 0}
81+
to={item?.receiverZipCode || 'ERROR'}
82+
from={item?.writerZipCode || 'ERROR'}
83+
content={item?.content || 'no Data'}
84+
ref={index === postLists.length - 1 ? ref : null}
85+
/>
86+
);
87+
})}
88+
</section>
89+
) : (
90+
<p className="body-m text-gray-60 mt-10 text-center">게시글이 없습니다.</p>
91+
)
8492
) : (
85-
<p className="body-m text-gray-60 mt-10 text-center">게시글이 없습니다.</p>
93+
<p className="body-m text-gray-60 mt-10 text-center">
94+
오류가 발생했습니다. 다시 한 번 시도해주세요
95+
</p>
8696
)}
8797
</main>
8898
<BackgroundBottom />

src/pages/LetterBox/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const LetterBoxPage = () => {
3232
isLoading,
3333
isError,
3434
} = useQuery({
35-
queryKey: ['mailbox'],
35+
queryKey: ['mailBox'],
3636
queryFn: fetchMailLists,
3737
staleTime: 1000 * 60 * 5,
3838
gcTime: 1000 * 60 * 10,

0 commit comments

Comments
 (0)