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
1 change: 1 addition & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export default tseslint.config(
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
'@tanstack/query/exhaustive-deps': 'error',
'@typescript-eslint/no-empty-object-type': off,
'import/order': [
'error',
{
Expand Down
6 changes: 3 additions & 3 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<!doctype html>
<html lang="en">
<html lang="kr">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link rel="icon" type="image/svg+xml" href="/public/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
<title>36.5</title>
<link
rel="stylesheet"
as="style"
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"@tailwindcss/vite": "^4.0.6",
"@tanstack/react-query": "^5.66.0",
"axios": "^1.7.9",
"event-source-polyfill": "^1.0.31",
"gsap": "^3.12.7",
"react": "^18.3.1",
"react-dom": "^18.3.1",
Expand All @@ -31,6 +32,7 @@
"devDependencies": {
"@eslint/js": "^9.19.0",
"@tanstack/eslint-plugin-query": "^5.66.1",
"@types/event-source-polyfill": "^1.0.5",
"@types/react": "^19.0.8",
"@types/react-dom": "^19.0.3",
"@vitejs/plugin-react-swc": "^3.5.0",
Expand Down
16 changes: 16 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added public/favicon.ico
Binary file not shown.
1 change: 0 additions & 1 deletion public/vite.svg

This file was deleted.

4 changes: 3 additions & 1 deletion src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import AdminPage from './pages/Admin';
import FilteredLetterManage from './pages/Admin/FilteredLetter';
import FilteringManage from './pages/Admin/Filtering';
import ReportManage from './pages/Admin/Report';
import AdminRollingPaper from './pages/Admin/RollingPaper';
import AuthCallbackPage from './pages/Auth';
import Home from './pages/Home';
import Landing from './pages/Landing';
Expand Down Expand Up @@ -36,10 +37,10 @@ const App = () => {
<Route path="landing" element={<Landing />} />
<Route path="*" element={<NotFoundPage />} />
<Route path="auth-callback" element={<AuthCallbackPage />} />
<Route index element={<Home />} />
<Route path="onboarding" element={<OnboardingPage />} />

<Route element={<PrivateRoute />}>
<Route index element={<Home />} />
<Route path="letter">
<Route element={<Layout />}>
<Route path="random" element={<RandomLettersPage />} />
Expand Down Expand Up @@ -69,6 +70,7 @@ const App = () => {
<Route path="report" element={<ReportManage />} />
<Route path="badwords" element={<FilteringManage />} />
<Route path="filtered-letter" element={<FilteredLetterManage />} />
<Route path="rolling-paper" element={<AdminRollingPaper />} />
</Route>
</Route>
</Routes>
Expand Down
20 changes: 8 additions & 12 deletions src/apis/admin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ import client from './client';
const postReports = async (postReportRequest: PostReportRequest) => {
try {
const res = await client.post(`/api/reports`, postReportRequest);
if (res.status === 200) {
return res;
}
if (!res) throw new Error('신고 요청중 에러가 발생했습니다.');
return res;
} catch (error) {
console.error(error);
}
Expand Down Expand Up @@ -51,25 +50,22 @@ const getBadWords = async (setBadWords: React.Dispatch<React.SetStateAction<BadW
}
};

const postBadWords = async (badWordsRequest: BadWords, callBack?: () => void) => {
const postBadWords = async (badWordsRequest: BadWords) => {
try {
const res = await client.post('/api/bad-words', badWordsRequest);
if (callBack) callBack();
console.log(res);
if (!res) throw new Error('금칙어 등록 도중 에러가 발생했습니다.');
return res;
} catch (error) {
console.error(error);
}
};

// 내 상상대로 만든 필터링 단어 취소 버튼
const patchBadWords = async (
badWordId: number,
badWordsRequest: BadWords,
callBack?: () => void,
) => {
const patchBadWords = async (badWordId: number) => {
try {
const res = await client.patch(`/api/bad-words/${badWordId}/status`, badWordsRequest);
if (callBack) callBack();
const res = await client.patch(`/api/bad-words/${badWordId}/status`, { isUsed: false });
if (!res) throw new Error('검열 단어 삭제 도중 에러가 발생했습니다.');
console.log(res);
} catch (error) {
console.error(error);
Expand Down
1 change: 1 addition & 0 deletions src/apis/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export const getNewToken = async () => {
try {
const response = await client.post('/api/reissue', {}, { withCredentials: true });
if (!response) throw new Error('getNewToken: no response data');
console.log(response.data);
return response;
} catch (error) {
console.error(error);
Expand Down
45 changes: 4 additions & 41 deletions src/apis/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,32 +9,13 @@ const client = axios.create({
headers: { 'Content-Type': 'application/json' },
});

// type FailedRequest = {
// resolve: (token: string) => void;
// reject: (error: unknown) => void;
// };

let isRefreshing = false;
// let failedQueue: FailedRequest[] = [];

// const processQueue = (error: unknown, token: string | null = null) => {
// failedQueue.forEach((prom) => {
// if (error) {
// prom.reject(error);
// } else {
// if (token) {
// prom.resolve(token);
// }
// }
// });

// failedQueue = [];
// };

const callReissue = async () => {
try {
const response = await getNewToken();
const newToken = response?.data.accessToken;
if(response?.status !== 200) throw new Error('error while fetching newToken');
const newToken = response?.data.data.accessToken;
return newToken;
} catch (e) {
return Promise.reject(e);
Expand All @@ -45,11 +26,10 @@ let retry = false;

client.interceptors.request.use(
(config) => {
console.log('response again', config);

const accessToken = useAuthStore.getState().accessToken;
if (config.url !== '/auth/reissue' && accessToken) {
if (config.url !== '/api/reissue' && accessToken) {
config.headers.Authorization = `Bearer ${accessToken}`;
console.log('interceptor', config);
}
return config;
},
Expand All @@ -74,38 +54,21 @@ client.interceptors.response.use(
retry = true;
if (isRefreshing) {
if (isLoggedIn) logout();
// try {
// return new Promise((resolve, reject) => {
// failedQueue.push({
// resolve: (token: string) => {
// originalRequest.headers.Authorization = `Bearer ${token}`;
// resolve(client(originalRequest));
// },
// reject: (err: unknown) => reject(err),
// });
// });
// } catch (e) {
// return Promise.reject(e);
// }
} else {
isRefreshing = true;
try {
const newToken = await callReissue();
setAccessToken(newToken);
// processQueue(null, newToken);
isRefreshing = false;
originalRequest.headers.Authorization = `Bearer ${newToken}`;
return client(originalRequest);
} catch (e) {
// processQueue(e, null);
isRefreshing = false;
if (isLoggedIn) logout();
return Promise.reject(e);
}
}
}
if (isLoggedIn) logout();
console.error('Failed to refresh token', error);
return Promise.reject(error);
},
);
Expand Down
34 changes: 21 additions & 13 deletions src/apis/draftLetters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,40 @@ import client from './client';

export interface DraftLetter {
letterId: number;
writerId: number;
matchingId: number;
receiverId: number;
parentLetterId: number;
zipCode: string;
title: string;
content: string;
category: string;
paperType: string;
fontType: string;
deliveryStartedAt: string;
deliveryCompletedAt: string;
matched: boolean;
}

export const getDraftLetters = async () // token: string
: Promise<DraftLetter[]> => {
export const getDraftLetters = async (): Promise<DraftLetter[]> => {
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;
}
};
10 changes: 3 additions & 7 deletions src/apis/incomingLetters.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
import client from './client';

export const getIncomingLetters = async (token: string) => {
export const getIncomingLetters = async () => {
try {
const { data } = await client.get('/api/letters?status=delivery', {
headers: {
Authorization: `Bearer ${token}`,
},
});
console.log('불러온 데이터', data);
const { data } = await client.get('/api/letters?status=delivery');
console.log('오고있는 편지 데이터', data);
return data;
} catch (error) {
console.error('❌오고 있는 편지 목록을 불러오던 중 에러 발생', error);
Expand Down
15 changes: 14 additions & 1 deletion src/apis/letterDetail.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,17 @@ const deleteLetter = async (letterId: string) => {
}
};

export { getLetter, deleteLetter };
const postEvaluateLetter = async (letterId: number, evaluation: LetterEvaluation) => {
try {
const res = await client.post(`/api/letters/${letterId}/evaluate`, {
evaluation: evaluation,
});
if (!res) throw new Error('편지 삭제 요청 도중 에러가 발생했습니다.');
console.log(res);
return res;
} catch (error) {
console.error(error);
}
};

export { getLetter, deleteLetter, postEvaluateLetter };
2 changes: 1 addition & 1 deletion src/apis/mailBox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export const getMailbox = async () => {
export const getMailboxDetail = async (id: number, pageParam: number) => {
try {
const response = await client.get(`/api/mailbox/${id}/detail?page=${pageParam}&size=20`);

console.log(response.data);
if (!response) throw new Error('error while fetching mailbox detail data');
return response.data;
} catch (error) {
Expand Down
2 changes: 1 addition & 1 deletion src/apis/myPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const fetchMyPageInfo = async () => {

export const getMySharePostList = async () => {
try {
const response = await client.get('/api/share-proposals/inbox');
const response = await client.get('/api/share-posts/me');
if (!response) throw new Error('error while fetching my share post list');
return response.data;
} catch (error) {
Expand Down
Loading