Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
fde2ba1
feat: searchBooks api
ho0010 Aug 12, 2025
bc69244
feat: searchBooks api
ho0010 Aug 12, 2025
4ca579f
feat: getBookDetail api
ho0010 Aug 13, 2025
3c120b4
refactor: api 이름 변경, isFinalized 파라미터 추가
ho0010 Aug 13, 2025
ccfd27e
feat: getRecruitingRooms API
ho0010 Aug 13, 2025
24c3bde
remove: 콘솔 로그
ho0010 Aug 13, 2025
4b2817e
feat: getMostSearchedBooks API
ho0010 Aug 13, 2025
8836709
feat: saveIcon
ho0010 Aug 13, 2025
860200c
design: cursor pointer 추가
ho0010 Aug 13, 2025
8dc269a
feat: postSaveBook API
ho0010 Aug 13, 2025
4617896
design: minHeight add
ho0010 Aug 13, 2025
fcfeb0b
Merge branch 'develop' into feat/api-books
ho0010 Aug 13, 2025
95f5a9e
Merge pull request #114 from THIP-TextHip/main
heeeeyong Aug 13, 2025
857ed60
fix: 헤더 임시 하드토큰 반영 로직 추가
heeeeyong Aug 13, 2025
8d3e6ab
fix: 빌드 에러 수정
heeeeyong Aug 13, 2025
f3ab7e1
Merge pull request #115 from THIP-TextHip/feat/api-auth
heeeeyong Aug 13, 2025
4edb17a
Merge pull request #105 from THIP-TextHip/feat/api-books
ho0010 Aug 14, 2025
41f85d9
feat: 새 글 작성을 위한 카테고리 및 태그 조회 API 연동
ljh130334 Aug 14, 2025
634b041
refactor: TagSelectionSection 컴포넌트를 API 연동으로 변경
ljh130334 Aug 14, 2025
041dfea
feat: getMyRooms API
ho0010 Aug 14, 2025
33fab28
design: 스타일링 방식 변경
ho0010 Aug 14, 2025
e5ca390
feat: getMyRooms CompletedGroupModal에 추가 적용
ho0010 Aug 14, 2025
b136ba4
feat: getRoomDetail
ho0010 Aug 14, 2025
9f2ace7
Merge pull request #116 from THIP-TextHip/feat/api-feeds-check
ljh130334 Aug 14, 2025
0168382
feat: getRoomsByCategory API
ho0010 Aug 14, 2025
10babe4
feat: RecruitingGroupBox EmpryState
ho0010 Aug 14, 2025
a79d94c
feat: getJoinedRooms API
ho0010 Aug 15, 2025
0c069c1
design: global 적용 형식 변경
ho0010 Aug 15, 2025
a3770c2
feat: groupCard click event 변경
ho0010 Aug 15, 2025
26edc6e
design: min size add
ho0010 Aug 15, 2025
c2bd7ba
design: BookDetails 수정
ho0010 Aug 15, 2025
4e5a555
feat: 기록 생성 API 연동 및 타입 정의 추가
ljh130334 Aug 15, 2025
1040673
refactor: 기록 작성 라우터 경로 수정 및 API 연동 완료
ljh130334 Aug 15, 2025
981d93e
feat: 투표 생성 API 연동 완료 - 기록 생성과 동일한 구조로 구현
ljh130334 Aug 15, 2025
854225f
refactor: console.log 삭제
ljh130334 Aug 15, 2025
b68cf6f
Merge pull request #117 from THIP-TextHip/feat/api-rooms
ho0010 Aug 15, 2025
058d0fc
fix: getRecentSearch 엔드포인트 수정
ho0010 Aug 15, 2025
2909bfa
feat: deleteRecentSearch API
ho0010 Aug 15, 2025
4aa1d5e
feat: GroupSearch 최근 검색어 로직
ho0010 Aug 15, 2025
791a44d
feat: Book Search 최근 검색어 로직
ho0010 Aug 15, 2025
210d305
feat: UserSearch 최근 검색어 로직
ho0010 Aug 15, 2025
310352e
feat: 기록장 조회 API 연동 완료 - 실시간 데이터 로드 및 필터링 지원
ljh130334 Aug 15, 2025
94b1f5d
fix: Memory 컴포넌트 TypeScript 오류 해결 및 Memory 페이지 라우터 오류 수정
ljh130334 Aug 15, 2025
2c245c5
Merge pull request #119 from THIP-TextHip/feat/api-record
ljh130334 Aug 15, 2025
c88b4a0
feat: 기록 및 투표 삭제 API 함수 구현
ljh130334 Aug 15, 2025
f8596cb
refactor: 내가 작성한 기록인지 여부 추가
ljh130334 Aug 15, 2025
2e13a7e
feat: RecordItem에 길게 누르기 더보기 메뉴 기능 추가
ljh130334 Aug 15, 2025
280d36b
fix: 스크롤 방해 해결 및 이벤트 분리
ljh130334 Aug 15, 2025
7bd99da
feat: 더보기 메뉴 빈 영역 클릭으로 닫기 기능 추가
ljh130334 Aug 15, 2025
373e5b0
Merge pull request #120 from THIP-TextHip/feat/api-record
ljh130334 Aug 15, 2025
9fc233c
feat: 저장한 책 및 참여 중 모임 책 조회 API 연동 완료
ljh130334 Aug 15, 2025
945328e
style: 북 리스트 갭 제거 및 구분선 추가
ljh130334 Aug 15, 2025
f493da8
feat: 빈 상태 UI 개선 및 책 신청하기 네비게이션 추가
ljh130334 Aug 15, 2025
d295af0
refactor: 임시방편 forceEmpty 코드 제거 및 정리
ljh130334 Aug 15, 2025
35f2288
refactor: 책 신청 경로 수정
ljh130334 Aug 15, 2025
05c58a0
refactor: BookSearchBottomSheet 컴포넌트 분리 및 구조 개선
ljh130334 Aug 15, 2025
efa5f1b
Merge pull request #121 from THIP-TextHip/feat/api-books-saved
ljh130334 Aug 15, 2025
b8df306
feat: 진행중인 방 상세보기 API 연동 완료
ljh130334 Aug 15, 2025
959bf05
feat: 독서메이트 조회 API 연동 완료
ljh130334 Aug 15, 2025
b22d2ab
fix: MemberList 컴포넌트 TypeScript 에러 수정
ljh130334 Aug 15, 2025
a7a2f90
fix: 독서메이트 경로 수정
ljh130334 Aug 15, 2025
d6eb173
fix: 독서메이트 API 필드명 매핑 수정
ljh130334 Aug 15, 2025
959cfa9
fix: getRoomMembers TypeScript any 타입 에러 해결
ljh130334 Aug 15, 2025
7829941
fix: 변수명 수정
ljh130334 Aug 15, 2025
842f143
refactor: 프로필 이미지 크기 수정
ljh130334 Aug 15, 2025
aaf07de
Merge pull request #122 from THIP-TextHip/feat/api-rooms-detail
ljh130334 Aug 15, 2025
d6447a0
refactor: carousel 로직 통일
ho0010 Aug 16, 2025
3d03c63
feat: 오늘의 한마디 작성 API 연동
ljh130334 Aug 16, 2025
3c4d65c
refactor: carousel 로직 통일
ho0010 Aug 16, 2025
d663e1c
Merge pull request #123 from THIP-TextHip/design/carousel-refactor
ho0010 Aug 16, 2025
baa27d0
feat: TodayWords 컴포넌트 API 연동 및 roomId 파라미터 지원 추가
ljh130334 Aug 16, 2025
8a0a9f8
수정
heeeeyong Aug 16, 2025
aaa7e6c
fix: bookinfocard 네비게이션 추가
heeeeyong Aug 16, 2025
534c0c0
Merge pull request #124 from THIP-TextHip/feat/api-rooms-today
ljh130334 Aug 16, 2025
ada1d89
feat: myGroupCard navigate 로직
ho0010 Aug 16, 2025
c291955
design: bannerSection margin-top 변경
ho0010 Aug 16, 2025
a60b5d4
feat: searchBook handleWritePostButton
ho0010 Aug 16, 2025
5798717
feat: SearchBook에서 CreateGroup 이동 시 책 불러오는 로직
ho0010 Aug 16, 2025
209919f
remove: SearchBook 더보기 버튼
ho0010 Aug 16, 2025
69eacbb
remove: GroupDetail 더보기 버튼
ho0010 Aug 16, 2025
8e2f385
feat: 책검색 무한스크롤 구현
heeeeyong Aug 16, 2025
7980570
feat: 모집중인 모임방에서 모임방 만들기에서 책 불러오기
ho0010 Aug 16, 2025
95755b0
feat: 띱하기,띱취소 snackbar추가
heeeeyong Aug 16, 2025
5b61563
feat: book에서 피드에 글쓰기 버튼 로직
ho0010 Aug 16, 2025
3d0f8c7
feat: GroupDetail에서 Book Click 로직
ho0010 Aug 16, 2025
3d7a999
feat: GroupDetail에서 추천 모임방 클릭 이벤트 로직
ho0010 Aug 16, 2025
8f9a1f9
Merge branch 'develop' into feat/userflow
ho0010 Aug 16, 2025
4817cf3
Merge pull request #126 from THIP-TextHip/feat/userflow
ho0010 Aug 16, 2025
ca1bfb4
feat: postJoinRoom
ho0010 Aug 16, 2025
7f7a4d4
feat: postCloseRoom API
ho0010 Aug 16, 2025
2208b34
refactor: error 처리 api 함수로 이동
ho0010 Aug 16, 2025
44c02b6
design: GroupDetail button cursor 추가
ho0010 Aug 16, 2025
d51715a
remove: 미사용 api 제거
ho0010 Aug 16, 2025
20421fb
Merge pull request #127 from THIP-TextHip/feat/api-rooms
ho0010 Aug 16, 2025
2b3e8d4
fix: carousel 로직 복구
ho0010 Aug 16, 2025
02e066a
fix: 안쓰는 로직 제거
ho0010 Aug 16, 2025
38bfac9
Merge pull request #128 from THIP-TextHip/feat/api-rooms
ho0010 Aug 16, 2025
35004c0
feat: 회원가입 튜토리얼 페이지 추가
heeeeyong Aug 16, 2025
523b74d
fix: cursor pointer 적용
heeeeyong Aug 16, 2025
c35ba06
Merge pull request #125 from THIP-TextHip/feat/api-auth
heeeeyong Aug 16, 2025
d93cfb3
fix: 내 프로필, 다른 사용자 프로필 클릭 시 분기 처리
heeeeyong Aug 17, 2025
4a5ab81
fix: 빌드에러 수정
heeeeyong Aug 17, 2025
3b00af3
Merge pull request #130 from THIP-TextHip/chore/minor-updates
heeeeyong Aug 17, 2025
c692d12
fix: 회원가입 request body에 isTokenRequired 추가
heeeeyong Aug 17, 2025
995f43d
Merge pull request #131 from THIP-TextHip/chore/minor-updates
heeeeyong Aug 17, 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
33 changes: 33 additions & 0 deletions src/api/books/getBookDetail.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { apiClient } from '../index';

// 책 상세 정보 타입
export interface BookDetail {
title: string;
imageUrl: string;
authorName: string;
publisher: string;
isbn: string;
description: string;
recruitingRoomCount: number;
readCount: number;
isSaved: boolean;
}

// API 응답 타입
export interface BookDetailResponse {
isSuccess: boolean;
code: number;
message: string;
data: BookDetail;
}

export const getBookDetail = async (isbn: string): Promise<BookDetailResponse> => {
try {
const response = await apiClient.get<BookDetailResponse>(`/books/${isbn}`);

return response.data;
} catch (error) {
console.error('책 상세 정보 API 오류:', error);
throw error;
}
};
32 changes: 32 additions & 0 deletions src/api/books/getMostSearchedBooks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { apiClient } from '../index';

// 인기 검색 도서 타입
export interface MostSearchedBook {
rank: number;
title: string;
imageUrl: string;
isbn: string;
}

// API 응답 데이터 타입
export interface MostSearchedBooksData {
bookList: MostSearchedBook[];
}

// API 응답 타입
export interface MostSearchedBooksResponse {
isSuccess: boolean;
code: number;
message: string;
data: MostSearchedBooksData;
}

export const getMostSearchedBooks = async (): Promise<MostSearchedBooksResponse> => {
try {
const response = await apiClient.get<MostSearchedBooksResponse>('/books/most-searched');
return response.data;
} catch (error) {
console.error('인기 검색 도서 조회 API 오류:', error);
throw error;
}
};
40 changes: 40 additions & 0 deletions src/api/books/getRecruitingRooms.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { apiClient } from '../index';

// 모집중인 모임방 타입
export interface RecruitingRoom {
roomId: number;
bookImageUrl: string;
roomName: string;
memberCount: number;
recruitCount: number;
deadlineEndDate: string;
}

// API 응답 데이터 타입
export interface RecruitingRoomsData {
recruitingRoomList: RecruitingRoom[];
totalRoomCount: number;
nextCursor: string;
isLast: boolean;
}

// API 응답 타입
export interface RecruitingRoomsResponse {
isSuccess: boolean;
code: number;
message: string;
data: RecruitingRoomsData;
}

export const getRecruitingRooms = async (isbn: string): Promise<RecruitingRoomsResponse> => {
try {
const response = await apiClient.get<RecruitingRoomsResponse>(
`/books/${isbn}/recruiting-rooms`,
);

return response.data;
} catch (error) {
console.error('모집중인 모임방 조회 API 오류:', error);
throw error;
}
};
39 changes: 39 additions & 0 deletions src/api/books/getSavedBooks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { apiClient } from '../index';

// 저장한 책 정보 타입
export interface SavedBook {
bookId: number;
bookTitle: string;
authorName: string;
publisher: string;
bookImageUrl: string;
isbn: string;
}

// API 응답 데이터 타입
export interface SavedBooksData {
bookList: SavedBook[];
}

// API 응답 타입
export interface SavedBooksResponse {
isSuccess: boolean;
code: number;
message: string;
data: SavedBooksData;
}

// 저장한 책 또는 참여 중 모임의 책 조회
export const getSavedBooks = async (type: 'saved' | 'joining'): Promise<SavedBooksResponse> => {
try {
const response = await apiClient.get<SavedBooksResponse>('/books/selectable-list', {
params: {
type: type.toUpperCase(),
},
});
return response.data;
} catch (error) {
console.error('저장한 책 조회 API 오류:', error);
throw error;
}
};
70 changes: 70 additions & 0 deletions src/api/books/getSearchBooks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { apiClient } from '../index';

// 검색된 책 타입 (API 응답에서 받는 형태)
export interface BookSearchItem {
title: string;
imageUrl: string;
authorName: string;
publisher: string;
isbn: string;
}

// 검색된 책 타입 (컴포넌트에서 사용하는 형태)
export interface SearchedBook {
id: number;
title: string;
author: string;
publisher: string;
coverUrl: string;
isbn: string;
}

// API 응답 데이터 타입
export interface SearchBooksData {
searchResult: BookSearchItem[];
page: number;
size: number;
totalElements: number;
totalPages: number;
last: boolean;
first: boolean;
}

// API 응답 타입
export interface SearchBooksResponse {
isSuccess: boolean;
code: number;
message: string;
data: SearchBooksData;
}

export const getSearchBooks = async (
query: string,
page: number = 1,
isFinalized: boolean = false,
): Promise<SearchBooksResponse> => {
try {
const response = await apiClient.get<SearchBooksResponse>('/books', {
params: {
keyword: query.trim(),
page: page,
isFinalized: isFinalized,
},
});
return response.data;
} catch (error) {
console.error('책 검색 API 오류:', error);
throw error;
}
};

export const convertToSearchedBooks = (apiBooks: BookSearchItem[]): SearchedBook[] => {
return apiBooks.map((book, index) => ({
id: index + 1,
title: book.title,
author: book.authorName,
publisher: book.publisher,
coverUrl: book.imageUrl,
isbn: book.isbn,
}));
};
32 changes: 32 additions & 0 deletions src/api/books/postSaveBook.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { apiClient } from '../index';

// 북마크 요청 타입
export interface SaveBookRequest {
type: boolean;
}

// 북마크 응답 데이터 타입
export interface SaveBookData {
isbn: string;
isSaved: boolean;
}

// 북마크 응답 타입
export interface SaveBookResponse {
isSuccess: boolean;
code: number;
message: string;
data: SaveBookData;
}

export const postSaveBook = async (isbn: string, type: boolean): Promise<SaveBookResponse> => {
try {
const response = await apiClient.post<SaveBookResponse>(`/books/${isbn}/saved`, {
type: type,
});
return response.data;
} catch (error) {
console.error('책 저장 API 오류:', error);
throw error;
}
};
38 changes: 38 additions & 0 deletions src/api/feeds/getWriteInfo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { apiClient } from '../index';

// 카테고리 및 태그 데이터 타입
export interface CategoryData {
category: string;
tagList: string[];
}

// API 응답 데이터 타입
export interface WriteInfoData {
categoryList: CategoryData[];
}

// API 응답 타입
export interface GetWriteInfoResponse {
isSuccess: boolean;
code: number;
message: string;
data: WriteInfoData;
}

// 새 글 작성을 위한 카테고리 및 태그 조회 API 함수
export const getWriteInfo = async () => {
const response = await apiClient.get<GetWriteInfoResponse>('/feeds/write-info');
return response.data;
};

/*
사용 예시:
const writeInfo = await getWriteInfo();
console.log(writeInfo.data.categoryList); // CategoryData[]

// 카테고리별 태그 접근
writeInfo.data.categoryList.forEach(category => {
console.log(`카테고리: ${category.category}`);
console.log(`태그: ${category.tagList.join(', ')}`);
});
*/
28 changes: 27 additions & 1 deletion src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,33 @@ export const apiClient = axios.create({
withCredentials: true, // 쿠키 자동 전송 설정
});

// 응답 인터셉터 (에러 처리)
// 임시 하드코딩된 토큰 (쿠키가 없을 때 사용)
const TEMP_ACCESS_TOKEN =
'eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjEsImlhdCI6MTc1NDM4MjY1MiwiZXhwIjoxNzU2OTc0NjUyfQ.BSGuoMWlrzc0oKgSJXHEycxdzzY9-e7gD4xh-wSDemc';

// Request 인터셉터: 쿠키가 없을 때 임시 토큰을 헤더에 추가
apiClient.interceptors.request.use(
config => {
// 쿠키에서 Authorization 확인
const cookies = document.cookie.split(';');
const hasAuthCookie = cookies.some(cookie => cookie.trim().startsWith('Authorization='));

// 쿠키가 없으면 임시 토큰을 헤더에 추가
if (!hasAuthCookie) {
console.log('🔑 쿠키가 없어서 임시 토큰을 헤더에 추가합니다.');
config.headers.Authorization = `Bearer ${TEMP_ACCESS_TOKEN}`;
} else {
console.log('✅ Authorization 쿠키가 있어서 자동으로 전송됩니다.');
}

return config;
},
error => {
return Promise.reject(error);
},
);

// Response 인터셉터: 401 에러 시 로그인 페이지로 리다이렉트
apiClient.interceptors.response.use(
(response: AxiosResponse) => response,
(error: AxiosError) => {
Expand Down
Loading