Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
84de53b
chore: 버스와 생협에서 사용하는 svg 추가
kang-s-h Nov 28, 2025
8dcf0f7
chore: assets 경로 규칙 설정
kang-s-h Nov 28, 2025
6a4a830
feat: 셔틀버스, 등하교버스, 생협 Route 추가
kang-s-h Nov 28, 2025
b455653
feat: 사이드바에 셔틀버스,등하교버스,생협 추가
kang-s-h Nov 28, 2025
d4b890d
feat: 공통 버스 드롭다운 컴포넌트 추가
kang-s-h Nov 28, 2025
389cb98
feat: 엑셀 다운로드 공통 컴포넌트 추가
kang-s-h Nov 28, 2025
3c18af5
feat: 엑셀 파일 선택 공통 컴포넌트 추가
kang-s-h Nov 28, 2025
4c3d20a
feat: 엑셀 업로드 공통 컴포넌트 추가
kang-s-h Nov 28, 2025
f2cab70
feat: bus model 추가
kang-s-h Nov 28, 2025
1eceb27
feat: coopshop model 추가
kang-s-h Nov 28, 2025
2732f8b
feat: 등하교버스 업데이트 컴포넌트 추가
kang-s-h Nov 28, 2025
25a81ac
feat: 등하교 버스 mutation 추가
kang-s-h Nov 28, 2025
3d76945
feat: 등하교 버스 preview 컴포넌트 추가
kang-s-h Nov 28, 2025
8101897
feat: 생협 업데이트 컴포넌트 추가
kang-s-h Nov 28, 2025
0b24c60
feat: 생협 mutation 추가
kang-s-h Nov 28, 2025
114f3d3
feat: 생협 업데이트 preview 컴포넌트 추가
kang-s-h Nov 28, 2025
cf76f8a
feat: 생협 업데이트 드롭다운 컴포넌트 추가
kang-s-h Nov 28, 2025
f88c52b
feat: 셔틀버스 업데이트 컴포넌트 추가
kang-s-h Nov 28, 2025
b3c78ec
feat: 셔틀버스 mutation 추가
kang-s-h Nov 28, 2025
a8e5675
feat: 셔틀버스 업데이트 preview 컴포넌트 추가
kang-s-h Nov 28, 2025
f037d28
feat: 업데이트 페이지 스타일 추가
kang-s-h Nov 28, 2025
4fa56d3
feat: 생협 Queries 추가
kang-s-h Nov 28, 2025
bef5886
feat: 등하교버스 api 추가
kang-s-h Nov 28, 2025
d98dff4
feat: 생협 api 추가
kang-s-h Nov 28, 2025
7b8f3c4
feat: 셔틀버스 api 추가
kang-s-h Nov 28, 2025
b800e79
refactor: coopShop으로 케이스 수정
kang-s-h Nov 29, 2025
2adbd7a
refactor: 버스 svg 이름 수정
kang-s-h Nov 29, 2025
814385e
fix: 오타 수정
kang-s-h Nov 29, 2025
0049407
refactor: dropdown 수정
kang-s-h Nov 29, 2025
864412c
refactor: 불필요한 파일 삭제
kang-s-h Nov 29, 2025
19e0d6c
feat: excel 파일 제한 추가
kang-s-h Nov 29, 2025
46615b1
refactor: 엑셀 관련 파일 위치 변경
kang-s-h Nov 29, 2025
fba49f2
fix: console 제거
kang-s-h Nov 29, 2025
9ffaee1
refactor: mutation error 수정
kang-s-h Nov 29, 2025
ba3da67
style: 타입 순서 수정
kang-s-h Nov 29, 2025
16bb9c9
style: 타입 순서 수정
kang-s-h Nov 29, 2025
ff13bd2
refactor: height 수정
kang-s-h Nov 29, 2025
7fb6eb4
style: css 파일 공백 정리
kang-s-h Nov 29, 2025
95f3e80
refactor: css 기본값 제거
kang-s-h Nov 29, 2025
9af13dc
refactor: 파일 이름 수정
kang-s-h Nov 30, 2025
edafb17
refactor: excel URL 상수화
kang-s-h Nov 30, 2025
9dc070c
refactor: css 파일 정리
kang-s-h Nov 30, 2025
34c9dc3
refactor: semester 타입 수정 및 Update css 파일 수정
kang-s-h Nov 30, 2025
5b589a7
refactor: useBooleanState으로 수정
kang-s-h Nov 30, 2025
0efe95c
fix: lint 에러 수정
kang-s-h Nov 30, 2025
68b49fc
fix: lint 에러 수정
kang-s-h Nov 30, 2025
dc094f1
fix: lint 에러 수정
kang-s-h Nov 30, 2025
8bc8614
fix: lint 에러 수정
kang-s-h Nov 30, 2025
310f670
refactor: Route 수정
kang-s-h Dec 1, 2025
3da6ac3
refactor: AxiosError 추가
kang-s-h Dec 1, 2025
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
11 changes: 10 additions & 1 deletion src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ import ClubDetail from 'pages/Services/Club/ClubDetail';
import ClubWrite from 'pages/Services/Club/ClubWrite';
import ClubManagerList from 'pages/UserManage/ClubManager/ClubManagerList';
import ClubManagerRequestList from 'pages/UserManage/ClubManagerRequest/ClubManagerRequestList';
import CoopShopUpdate from 'pages/Update/CoopShopUpdate/CoopShopUpdate';
import ShuttleBusUpdate from 'pages/Update/ShuttleBusUpdate/ShuttleBusUpdate';
import CommutingBusUpdate from 'pages/Update/CommutingBusUpdate/CommutingBusUpdate';

function RequireAuth() {
return (
Expand Down Expand Up @@ -76,7 +79,13 @@ function App() {
<Route path="/notice/:id" element={<NoticeDetail />} />
<Route path="/notice/write" element={<NoticeWrite />} />
<Route path="/force-update" element={<ForceUpdate />} />
<Route path="/update-list" element={<UpdateList />} />
<Route path="/update">
<Route path="force" element={<ForceUpdate />} />
<Route path="update-list" element={<UpdateList />} />
<Route path="shuttle-bus" element={<ShuttleBusUpdate />} />
<Route path="commuting-bus" element={<CommutingBusUpdate />} />
<Route path="coop-shop" element={<CoopShopUpdate />} />
</Route>
<Route path="/history" element={<History />} />
<Route path="/banner" element={<BannerList />} />
<Route path="banner/:id" element={<BannerDetail />} />
Expand Down
23 changes: 23 additions & 0 deletions src/api/commutingBusUpdate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import accessClient from 'api';
import type { CommutingBusRouteInfoResponse, Semester } from 'model/bus.model';

export const postCommutingBusTimetable = async (body : FormData) => {
const response = await accessClient.post<CommutingBusRouteInfoResponse>(
'admin/bus/commuting/timetable/excel',
body,
{
headers: {
'Content-Type': 'multipart/form-data',
},
},
);
return response.data;
};

export const putCommutingBusTimetable = async (
body: CommutingBusRouteInfoResponse,
semesterType: Semester,
) => {
const response = await accessClient.put(`admin/bus/commuting/timetable?semester_type=${semesterType}`, body);
return response.data;
};
32 changes: 32 additions & 0 deletions src/api/coopShopUpdate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import accessClient from 'api';
import type {
CoopShopSemesterListResponse, CoopShopSemesterData, CoopShopResponse,
} from 'model/coopShop.model';

export const getCoopShopSemesterList = async () => {
const response = await accessClient.get<CoopShopSemesterListResponse[]>('admin/coopshop/semesters');
return response.data;
};

export const postCoopShopSemesterList = async (body:CoopShopSemesterData) => {
const response = await accessClient.post('admin/coopshop/semesters', body);
return response.data;
};

export const postCoopShopTimetable = async (body: FormData) => {
const response = await accessClient.post<CoopShopResponse>(
'admin/coopshop/timetable/excel',
body,
{
headers: {
'Content-Type': 'multipart/form-data',
},
},
);
return response.data;
};

export const putCoopShopTimetable = async (body : CoopShopResponse, id: number) => {
const response = await accessClient.put(`admin/coopshop/timetable/${id}`, body);
return response.data;
};
28 changes: 23 additions & 5 deletions src/api/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
/* eslint-disable no-underscore-dangle */
import axios from 'axios';
import axios, { AxiosError, AxiosRequestConfig } from 'axios';
import store from 'store';
import { login, logout } from 'store/slice/auth';
import { ApiErrorResponse } from 'interfaces/APIError';

interface RetryableAxiosRequestConfig extends AxiosRequestConfig {
_retry?: boolean;
}

const accessClient = axios.create({
baseURL: `${import.meta.env.VITE_API_PATH}`,
Expand All @@ -21,10 +26,10 @@ accessClient.interceptors.request.use((config) => {

accessClient.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
async (error: AxiosError<ApiErrorResponse>) => {
const originalRequest = error.config as RetryableAxiosRequestConfig | undefined;

if (error.response?.status === 401 && !originalRequest._retry) {
if (error.response?.status === 401 && originalRequest && !originalRequest._retry) {
originalRequest._retry = true;

try {
Expand All @@ -44,7 +49,10 @@ accessClient.interceptors.response.use(
refresh_token: data.refresh_token,
}));

originalRequest.headers.Authorization = `Bearer ${data.token}`;
if (originalRequest.headers) {
originalRequest.headers.Authorization = `Bearer ${data.token}`;
}

return await accessClient(originalRequest);
} catch (refreshError) {
store.dispatch(logout());
Expand All @@ -54,6 +62,16 @@ accessClient.interceptors.response.use(
}
}

if (error.response?.data) {
const apiError = error.response.data;

if (apiError.message) {
error.message = apiError.message;
}

(error as AxiosError<ApiErrorResponse> & { apiError?: ApiErrorResponse }).apiError = apiError;
}

return Promise.reject(error);
},
);
Expand Down
23 changes: 23 additions & 0 deletions src/api/shuttleBusUpdate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import accessClient from 'api';
import type { Semester, ShuttleBusRouteInfoResponse } from 'model/bus.model';

export const postShuttleBusTimetable = async (body : FormData) => {
const response = await accessClient.post<ShuttleBusRouteInfoResponse>(
'admin/bus/shuttle/timetable/excel',
body,
{
headers: {
'Content-Type': 'multipart/form-data',
},
},
);
return response.data;
};

export const putShuttleBusTimetable = async (
semesterType: Semester,
body: ShuttleBusRouteInfoResponse,
) => {
const response = await accessClient.put(`admin/bus/shuttle/timetable?semester_type=${semesterType}`, body);
return response.data;
};
10 changes: 10 additions & 0 deletions src/assets/Bus/bus.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/assets/Coopshop/book.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/assets/Coopshop/cafe.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/assets/Coopshop/cut.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/assets/Coopshop/flatware.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/assets/Coopshop/glasses.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/assets/Coopshop/laundry.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading