-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* FE-52 ✨에피그램 목록조회 API (#34) * FE-52 feat: api schema 작성 * FE-52 ✨feat: getEpigrams api 작성 * FE-522 ✨fix: default export로 변경 * FE-52 ✨test: 테스트 코드 작성 * FE-52 ✨feat: BaseUrl, TeamID 상수 추가 및 axios baseTRL 수정 * FE-52 ✨fix: schema 및 apis 파일 수정 * FE-52 ✨test: 테스트 코드 삭제 * FE-52 ✨fix: .env파일 생성 및 BaseURL 수정 * FE-52 ✨fix: limit 타입 수정(optional 삭제) * FE-52 ✨text: 테 테스트코드 삭제 * FE-52 ✨fix: api GET요청 주소 수정('epigrams' -> '/epigrams') * FE-53 ✨ 감정이모티콘 저장 스키마 정의 * FE-53 ✨ 오늘의 감정 저장 api 생성 * FE-53 ✨ getMe 함수를 사용해 로그인 상태 확인 기능 구현 * FE-53 ✨ 감정 한영 변환 함수 * FE-53 ✨ 감정 저장 후 토스트 알림 표시 * FE-53 ✨ 오늘의 감정 조회 api 생성 * FE-53 🔨 감정 한영 변환 함수 추가 +) post, get 함수 내부로 한영 변환 함수 이동 * FE-53 ✨ 오늘의 감정 스키마 추가 정의 * FE-53 ✨ 오늘의 감정 조회 함수 적용 * FE-53 🚚 오늘의 감정 type 이름 변경 * FE-53 ✨ useMutation 훅 사용 * FE-53 📝 EmotionSelector 주석 추가 * FE-53 🔥 api 함수 에러 처리 부분 제거 * FE-53 🔨 useQuery를 사용해 오늘의 감정 조회 데이터를 조회할 때는 useQuery를 사용하는거라 함 * FE-56 ✨ 댓글 수정 API (#84) * FE-29 🔀 로그인 페이지 머지 요청 (#39) * ➕ 이미지 파일 추가 * 💄 로그인 페이지 레이아웃 생성 * 💄 로그인 페이지 UI 생성 및 반응형 디자인 구현 * FE-60 ✨ react hook form, zod 추가 * FE-60 💄 로그인 폼 스타일 수정 - 텍스트 인풋 테두리 - 로그인 버튼 * FE-60 ♻️ 로그인 스키마 분리 * ✨ 로그인 응답 데이터 스키마 정의 * ✨ 로그인 api 생성 * ✨ 요청과 응답에 관한 인터셉터 추가 * ✨ useSignin mutation hook 생성 * ⚡ useSignin hook 로그인 폼에 적용 * 🔥 AuthLayout 삭제 * 🎨 onSubmit 함수 인라인으로 정의 * ♻️ 응답 인터셉터의 에러 처리 및 토큰 갱신 로직 개선 * ♻️ postSignin api 에러처리 로직 삭제 * 🔥 useSignin hook 삭제 * 🚚 useSigninMutation hook으로 이름 변경 및 파일 이동 * ✨ Toaster 컴포넌트 추가 * ✨ toast로 에러메시지 띄우기 * FE-71 🔀 에피그램 작성 페이지 (#71) * FE-64💄 글작성 페이지 UI추가 (#44) * FE-72 ✨ 에피그램 등록 api연동 (#52) * FE-72✨ 글작성페이지 스키마 추가 * FE-72✨ form태그 Form컴포넌트로 변경 * FE-72✨ 태그 저장기능 추가 * FE-72✨ 에피그램 등록 api연동 * FE-72✨ 에피그램 등록시 해당 에피그램 페이지로 이동 기능 추가 * FE-72✨ 등록 중일때의 로직추가 * FE-72✨ toast-> alert-dailog로 변경 * FE-72📝 TODO주석 추가 --------- Co-authored-by: 우지석 <[email protected]> * FE-73✨ 유효성검사 추가 (#66) * FE-73♻️ Tag관리 함수 훅으로 분리 * FE-73✨ RadioGroup 로직 수정 * FE-73✨ 유효성검사 추가 * FE-73♻️ 저자 본인 선택시의 로직 변경 * FE-73✨ 중복 태그 검사 로직 추가 * FE-73♻️ 출처 유효성(optional)검사 수정 * FE-73✨ 필수항목 입력했을때 버튼 활성화 * FE-73🐛 태그를 입력했다가 지웠을때 버튼 활성화되있는 버그 수정 * FE-73🐛 useEffect 의존성배열 lint problem 해결 * FE-73🐛 url유효성검사 에러 메세지 안뜨는 버그 수정 --------- Co-authored-by: 우지석 <[email protected]> * FE-71♻️ epic브랜치 코드리뷰 반영 (#76) * FE-71♻️ token,interceptor 로직 수정 * FE-71♻️ AddEpigram 코드리뷰 반영 * FE-71🔥 테스트용 상세페이지 삭제 * FE-71♻️ onKeyDown -> onKeyUp 수정 --------- Co-authored-by: 우지석 <[email protected]> * FE-56 ✨ 댓글 수정 API --------- Co-authored-by: MOON <[email protected]> Co-authored-by: Jiseok Woo <[email protected]> Co-authored-by: 우지석 <[email protected]> * FE-57 ✨ 댓글 삭제 API (#88) * FE-51 🔀 공용 API 최신화 (#93) * FE-29 🔀 로그인 페이지 머지 요청 (#39) * ➕ 이미지 파일 추가 * 💄 로그인 페이지 레이아웃 생성 * 💄 로그인 페이지 UI 생성 및 반응형 디자인 구현 * FE-60 ✨ react hook form, zod 추가 * FE-60 💄 로그인 폼 스타일 수정 - 텍스트 인풋 테두리 - 로그인 버튼 * FE-60 ♻️ 로그인 스키마 분리 * ✨ 로그인 응답 데이터 스키마 정의 * ✨ 로그인 api 생성 * ✨ 요청과 응답에 관한 인터셉터 추가 * ✨ useSignin mutation hook 생성 * ⚡ useSignin hook 로그인 폼에 적용 * 🔥 AuthLayout 삭제 * 🎨 onSubmit 함수 인라인으로 정의 * ♻️ 응답 인터셉터의 에러 처리 및 토큰 갱신 로직 개선 * ♻️ postSignin api 에러처리 로직 삭제 * 🔥 useSignin hook 삭제 * 🚚 useSigninMutation hook으로 이름 변경 및 파일 이동 * ✨ Toaster 컴포넌트 추가 * ✨ toast로 에러메시지 띄우기 * FE-71 🔀 에피그램 작성 페이지 (#71) * FE-64💄 글작성 페이지 UI추가 (#44) * FE-72 ✨ 에피그램 등록 api연동 (#52) * FE-72✨ 글작성페이지 스키마 추가 * FE-72✨ form태그 Form컴포넌트로 변경 * FE-72✨ 태그 저장기능 추가 * FE-72✨ 에피그램 등록 api연동 * FE-72✨ 에피그램 등록시 해당 에피그램 페이지로 이동 기능 추가 * FE-72✨ 등록 중일때의 로직추가 * FE-72✨ toast-> alert-dailog로 변경 * FE-72📝 TODO주석 추가 --------- Co-authored-by: 우지석 <[email protected]> * FE-73✨ 유효성검사 추가 (#66) * FE-73♻️ Tag관리 함수 훅으로 분리 * FE-73✨ RadioGroup 로직 수정 * FE-73✨ 유효성검사 추가 * FE-73♻️ 저자 본인 선택시의 로직 변경 * FE-73✨ 중복 태그 검사 로직 추가 * FE-73♻️ 출처 유효성(optional)검사 수정 * FE-73✨ 필수항목 입력했을때 버튼 활성화 * FE-73🐛 태그를 입력했다가 지웠을때 버튼 활성화되있는 버그 수정 * FE-73🐛 useEffect 의존성배열 lint problem 해결 * FE-73🐛 url유효성검사 에러 메세지 안뜨는 버그 수정 --------- Co-authored-by: 우지석 <[email protected]> * FE-71♻️ epic브랜치 코드리뷰 반영 (#76) * FE-71♻️ token,interceptor 로직 수정 * FE-71♻️ AddEpigram 코드리뷰 반영 * FE-71🔥 테스트용 상세페이지 삭제 * FE-71♻️ onKeyDown -> onKeyUp 수정 --------- Co-authored-by: 우지석 <[email protected]> --------- Co-authored-by: MOON <[email protected]> Co-authored-by: Jiseok Woo <[email protected]> Co-authored-by: 우지석 <[email protected]> * FE-51 🔀 공용 API 최신화 (충돌수정) (#98) --------- Co-authored-by: imsoohyeok <[email protected]> Co-authored-by: NEWJIN <[email protected]> Co-authored-by: NEWJIN <[email protected]> Co-authored-by: MOON <[email protected]> Co-authored-by: Jiseok Woo <[email protected]> Co-authored-by: 우지석 <[email protected]>
- Loading branch information
1 parent
197e37c
commit 547e7d3
Showing
23 changed files
with
475 additions
and
26 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
import httpClient from '@/apis/index'; | ||
import { CommentRequestSchema, CommentRequestType, CommentResponseSchema, CommentResponseType } from '@/schema/comment'; | ||
import { PostCommentRequest, PatchCommentRequest } from '@/types/epigram.types'; | ||
|
||
export const getEpigramComments = async (params: CommentRequestType): Promise<CommentResponseType> => { | ||
try { | ||
// 요청 파라미터 유효성 검사 | ||
const validatedParams = CommentRequestSchema.parse(params); | ||
|
||
const { id, limit, cursor } = validatedParams; | ||
|
||
// NOTE: URL의 쿼리 문자열을 사용 | ||
// NOTE : cursor값이 있다면 ?limit=3&cursor=100, 없다면 ?limit=3,(숫자는 임의로 지정한 것) | ||
const queryParams = new URLSearchParams({ | ||
limit: limit.toString(), | ||
...(cursor !== undefined && { cursor: cursor.toString() }), | ||
}); | ||
|
||
const response = await httpClient.get<CommentResponseType>(`/epigrams/${id}/comments?${queryParams.toString()}`); | ||
|
||
// 응답 데이터 유효성 검사 | ||
const validatedData = CommentResponseSchema.parse(response.data); | ||
|
||
return validatedData; | ||
} catch (error) { | ||
if (error instanceof Error) { | ||
throw new Error(`댓글을 불러오는데 실패했습니다: ${error.message}`); | ||
} | ||
throw error; | ||
} | ||
}; | ||
|
||
export const postComment = async (commentData: PostCommentRequest) => { | ||
const response = await httpClient.post('/comments', commentData); | ||
return response.data; | ||
}; | ||
|
||
export const patchComment = async (commentId: number, commentData: PatchCommentRequest) => { | ||
const response = await httpClient.patch(`/comments/${commentId}`, commentData); | ||
return response.data; | ||
}; | ||
|
||
export const deleteComment = async (commentId: number) => { | ||
const response = await httpClient.delete(`/comments/${commentId}`); | ||
return response.data; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
import { EmotionType } from '@/types/emotion'; | ||
import type { GetEmotionResponseType } from '@/schema/emotion'; | ||
import { translateEmotionToKorean } from '@/utils/emotionMap'; | ||
import httpClient from '.'; | ||
import { getMe } from './user'; | ||
|
||
const getEmotion = async (): Promise<EmotionType | null> => { | ||
const user = await getMe(); | ||
if (!user) { | ||
throw new Error('로그인이 필요합니다.'); | ||
} | ||
|
||
const response = await httpClient.get<GetEmotionResponseType>('/emotionLogs/today', { | ||
params: { userId: user.id }, | ||
}); | ||
|
||
if (response.status === 204) { | ||
return null; // No content | ||
} | ||
|
||
const koreanEmotion = translateEmotionToKorean(response.data.emotion); | ||
return koreanEmotion; | ||
}; | ||
|
||
export default getEmotion; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
import { GetEpigramsParamsType, GetEpigramsResponseType, GetEpigramsResponse } from '@/schema/epigrams'; | ||
import httpClient from '.'; | ||
|
||
const getEpigrams = async (params: GetEpigramsParamsType): Promise<GetEpigramsResponseType> => { | ||
const response = await httpClient.get(`/epigrams`, { params }); | ||
|
||
// 데이터 일치하는지 확인 | ||
const parsedResponse = GetEpigramsResponse.parse(response.data); | ||
return parsedResponse; | ||
}; | ||
|
||
export default getEpigrams; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
import { EmotionType } from '@/types/emotion'; | ||
import type { PostEmotionRequestType, PostEmotionResponseType } from '@/schema/emotion'; | ||
import { translateEmotionToEnglish } from '@/utils/emotionMap'; | ||
import httpClient from '.'; | ||
import { getMe } from './user'; | ||
|
||
const postEmotion = async (emotion: EmotionType): Promise<PostEmotionResponseType> => { | ||
const user = await getMe(); | ||
if (!user) { | ||
throw new Error('로그인이 필요합니다.'); | ||
} | ||
|
||
const englishEmotion = translateEmotionToEnglish(emotion); | ||
const request: PostEmotionRequestType = { emotion: englishEmotion }; | ||
|
||
const response = await httpClient.post<PostEmotionResponseType>('/emotionLogs/today', { | ||
...request, | ||
userId: user.id, | ||
}); | ||
|
||
return response.data; | ||
}; | ||
|
||
export default postEmotion; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,18 @@ | ||
import type { GetUserReponseType, GetUserRequestType, PatchMeRequestType } from '@/schema/user'; | ||
import type { GetUserResponseType, GetUserRequestType, PatchMeRequestType } from '@/schema/user'; | ||
import httpClient from '.'; | ||
|
||
export const getMe = async (): Promise<GetUserReponseType> => { | ||
export const getMe = async (): Promise<GetUserResponseType> => { | ||
const response = await httpClient.get('/users/me'); | ||
return response.data; | ||
}; | ||
|
||
export const getUser = async (request: GetUserRequestType): Promise<GetUserReponseType> => { | ||
export const getUser = async (request: GetUserRequestType): Promise<GetUserResponseType> => { | ||
const { id } = request; | ||
const response = await httpClient.get(`/users/${id}`); | ||
return response.data; | ||
}; | ||
|
||
export const updateMe = async (request: PatchMeRequestType): Promise<GetUserReponseType> => { | ||
export const updateMe = async (request: PatchMeRequestType): Promise<GetUserResponseType> => { | ||
const response = await httpClient.patch('/users/me', { ...request }); | ||
return response.data; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
/* | ||
* 오늘의 감정을 선택하면 표시되는 toast입니다. | ||
* 감정을 확인하기 위해 마이페이지로 연결됩니다. | ||
*/ | ||
|
||
import React, { useEffect } from 'react'; | ||
import { useToast } from '@/components/ui/use-toast'; | ||
import { ToastAction } from '@/components/ui/toast'; | ||
import { useRouter } from 'next/router'; | ||
|
||
interface EmotionSaveToastProps { | ||
iconType: string; | ||
} | ||
|
||
function EmotionSaveToast({ iconType }: EmotionSaveToastProps) { | ||
const { toast } = useToast(); | ||
const router = useRouter(); | ||
|
||
useEffect(() => { | ||
toast({ | ||
title: '오늘의 감정이 저장되었습니다.', | ||
description: `오늘의 감정: ${iconType}`, | ||
action: ( | ||
<ToastAction altText='확인하기' onClick={() => router.push('/mypage')}> | ||
확인하기 | ||
</ToastAction> | ||
), | ||
}); | ||
}, [iconType, toast, router]); | ||
|
||
return null; | ||
} | ||
|
||
export default EmotionSaveToast; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import { useMutation, useQueryClient } from '@tanstack/react-query'; | ||
import { deleteComment } from '@/apis/epigramComment'; | ||
import { toast } from '@/components/ui/use-toast'; | ||
|
||
const useDeleteCommentMutation = () => { | ||
const queryClient = useQueryClient(); | ||
|
||
return useMutation({ | ||
mutationFn: (commentId: number) => deleteComment(commentId), | ||
onSuccess: () => { | ||
// 댓글 목록 쿼리 무효화 | ||
queryClient.invalidateQueries({ queryKey: ['epigramComments'] }); | ||
|
||
// 성공 메시지 표시 | ||
toast({ | ||
title: '댓글 삭제 성공', | ||
description: '댓글이 성공적으로 삭제되었습니다.', | ||
}); | ||
}, | ||
onError: (error) => { | ||
// 에러 메시지 표시 | ||
toast({ | ||
title: '댓글 삭제 실패', | ||
description: `댓글 삭제 중 오류가 발생했습니다: ${error instanceof Error ? error.message : '알 수 없는 오류'}`, | ||
variant: 'destructive', | ||
}); | ||
}, | ||
}); | ||
}; | ||
|
||
export default useDeleteCommentMutation; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
import { useQuery } from '@tanstack/react-query'; | ||
import getEmotion from '@/apis/getEmotion'; | ||
import { EmotionType } from '@/types/emotion'; | ||
|
||
const useGetEmotion = () => | ||
useQuery<EmotionType | null, Error>({ | ||
queryKey: ['emotion'], | ||
queryFn: getEmotion, | ||
}); | ||
|
||
export default useGetEmotion; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
import { useMutation, useQueryClient } from '@tanstack/react-query'; | ||
import { patchComment } from '@/apis/epigramComment'; | ||
import { PatchCommentRequest } from '@/types/epigram.types'; | ||
import { toast } from '@/components/ui/use-toast'; | ||
|
||
const usePatchCommentMutation = () => { | ||
const queryClient = useQueryClient(); | ||
|
||
return useMutation({ | ||
mutationFn: ({ commentId, ...commentData }: { commentId: number } & PatchCommentRequest) => patchComment(commentId, commentData), | ||
onSuccess: () => { | ||
// 댓글 목록 쿼리 무효화 | ||
queryClient.invalidateQueries({ queryKey: ['epigramComments'] }); | ||
|
||
// 성공 메시지 표시 | ||
toast({ | ||
title: '댓글 수정 성공', | ||
description: '댓글이 성공적으로 수정되었습니다.', | ||
}); | ||
}, | ||
onError: (error) => { | ||
// 에러 메시지 표시 | ||
toast({ | ||
title: '댓글 수정 실패', | ||
description: `댓글 수정 중 오류가 발생했습니다: ${error instanceof Error ? error.message : '알 수 없는 오류'}`, | ||
variant: 'destructive', | ||
}); | ||
}, | ||
}); | ||
}; | ||
|
||
export default usePatchCommentMutation; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
import { useMutation } from '@tanstack/react-query'; | ||
import postEmotion from '@/apis/postEmotion'; | ||
import { EmotionType } from '@/types/emotion'; | ||
import { PostEmotionResponseType } from '@/schema/emotion'; | ||
|
||
const usePostEmotion = () => | ||
useMutation<PostEmotionResponseType, Error, EmotionType>({ | ||
mutationFn: postEmotion, | ||
}); | ||
|
||
export default usePostEmotion; |
Oops, something went wrong.