diff --git a/src/apis/services/httpMethod.ts b/src/apis/services/httpMethod.ts index 26de6888..06e737f6 100644 --- a/src/apis/services/httpMethod.ts +++ b/src/apis/services/httpMethod.ts @@ -1,40 +1,44 @@ import axiosInstance, { setAuthToken } from '@/lib/axiosInstance'; +import { handleHttpError } from '@/utils/handleHttpError'; -export async function GET(url: string, token?: string): Promise { +type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'; + +interface RequestOptionsProps { + method: HttpMethod; + url: string; + data?: unknown; + token?: string; +} + +async function request({ + method, + url, + data, + token, +}: RequestOptionsProps): Promise { try { if (token) { setAuthToken(token); } - const response = await axiosInstance.get(url); - return response.data; - } catch (error) { - throw new Error(error instanceof Error ? error.message : String(error)); - } -} -export async function POST(url: string, data?: U): Promise { - try { - const response = await axiosInstance.post(url, data); - return response.data; - } catch (error) { - throw new Error(error instanceof Error ? error.message : String(error)); - } -} + const response = await axiosInstance.request({ + method, + url, + data, + }); -export async function PUT(url: string, data: U): Promise { - try { - const response = await axiosInstance.put(url, data); return response.data; } catch (error) { - throw new Error(error instanceof Error ? error.message : String(error)); + handleHttpError(error); + throw error; } } -export async function DELETE(url: string): Promise { - try { - const response = await axiosInstance.delete(url); - return response.data; - } catch (error) { - throw new Error(error instanceof Error ? error.message : String(error)); - } -} +export const API = { + get: (url: string, token?: string) => + request({ method: 'GET', url, token }), + post: (url: string, data?: U) => + request({ method: 'POST', url, data }), + put: (url: string, data: U) => request({ method: 'PUT', url, data }), + delete: (url: string) => request({ method: 'DELETE', url }), +}; diff --git a/src/hooks/apis/Auth/useChangePassword.ts b/src/hooks/apis/Auth/useChangePassword.ts index bb200fdb..c4a647bf 100644 --- a/src/hooks/apis/Auth/useChangePassword.ts +++ b/src/hooks/apis/Auth/useChangePassword.ts @@ -1,9 +1,10 @@ import { useMutation, UseMutationResult } from '@tanstack/react-query'; import { AxiosError, AxiosResponse } from 'axios'; + +import { API } from '@/apis/services/httpMethod'; +import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { notify } from '@/store/useToastStore'; import { ChangePasswordRequest } from '@/types/Auth/ChangePasswordRequest'; -import { PUT } from '@/apis/services/httpMethod'; -import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; interface ErrorResponse { message: string; @@ -18,7 +19,7 @@ export const useChangePassword = ( > => { return useMutation({ mutationFn: (data: ChangePasswordRequest) => - PUT( + API.put( API_ENDPOINTS.AUTH.PASSWORD, data, ), diff --git a/src/hooks/apis/Auth/useFollowCountQuery.ts b/src/hooks/apis/Auth/useFollowCountQuery.ts index ea7e0b3d..8315fcb7 100644 --- a/src/hooks/apis/Auth/useFollowCountQuery.ts +++ b/src/hooks/apis/Auth/useFollowCountQuery.ts @@ -1,6 +1,7 @@ -import { AxiosError } from 'axios'; import { useQuery, UseQueryOptions } from '@tanstack/react-query'; -import { GET } from '@/apis/services/httpMethod'; +import { AxiosError } from 'axios'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; @@ -17,7 +18,7 @@ export interface FollowCountResponse { const followCountOptions: UseQueryOptions = { queryKey: [QUERY_KEYS.FOLLOW_COUNT], - queryFn: () => GET(API_ENDPOINTS.AUTH.FOLLOW_COUNT), + queryFn: () => API.get(API_ENDPOINTS.AUTH.FOLLOW_COUNT), }; export const useFollowCountQuery = () => { diff --git a/src/hooks/apis/Auth/useModifyProfilePic.ts b/src/hooks/apis/Auth/useModifyProfilePic.ts index 5900fa31..f42058fd 100644 --- a/src/hooks/apis/Auth/useModifyProfilePic.ts +++ b/src/hooks/apis/Auth/useModifyProfilePic.ts @@ -4,11 +4,12 @@ import { useQueryClient, } from '@tanstack/react-query'; import { AxiosError, AxiosResponse } from 'axios'; -import { ModifyProfilePicRequest } from '@/types/Auth/ModifyProfilePicRequest'; -import { notify } from '@/store/useToastStore'; -import { QUERY_KEYS } from '@/constants/QueryKeys'; -import { PUT } from '@/apis/services/httpMethod'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; +import { QUERY_KEYS } from '@/constants/QueryKeys'; +import { notify } from '@/store/useToastStore'; +import { ModifyProfilePicRequest } from '@/types/Auth/ModifyProfilePicRequest'; export const useModifyProfilePic = (): UseMutationResult< AxiosResponse, @@ -19,7 +20,7 @@ export const useModifyProfilePic = (): UseMutationResult< return useMutation({ mutationFn: (data: ModifyProfilePicRequest) => - PUT( + API.put( API_ENDPOINTS.AUTH.PROFILE_PIC, data, ), diff --git a/src/hooks/apis/Auth/useUserProfileQuery.ts b/src/hooks/apis/Auth/useUserProfileQuery.ts index bbd1ea39..fd9d6b2d 100644 --- a/src/hooks/apis/Auth/useUserProfileQuery.ts +++ b/src/hooks/apis/Auth/useUserProfileQuery.ts @@ -1,6 +1,7 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { UserProfileResponse } from '@/types/response'; @@ -10,7 +11,7 @@ const userProfileOptions = ( ): UseQueryOptions => ({ queryKey: [QUERY_KEYS.USER_PROFILE, userId], queryFn: () => - GET(API_ENDPOINTS.AUTH.USER_PROFILE(userId)), + API.get(API_ENDPOINTS.AUTH.USER_PROFILE(userId)), }); export const useUserProfileQuery = (userId: number) => { diff --git a/src/hooks/apis/Auth/useWithdrawal.ts b/src/hooks/apis/Auth/useWithdrawal.ts index 210dd77d..773978c8 100644 --- a/src/hooks/apis/Auth/useWithdrawal.ts +++ b/src/hooks/apis/Auth/useWithdrawal.ts @@ -1,16 +1,18 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useRouter } from 'next/navigation'; -import { DELETE } from '@/apis/services/httpMethod'; -import { WithdrawalResponse } from '@/types/response'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { notify } from '@/store/useToastStore'; +import { WithdrawalResponse } from '@/types/response'; export const useWithdrawal = () => { const queryClient = useQueryClient(); const router = useRouter(); return useMutation({ - mutationFn: () => DELETE(API_ENDPOINTS.AUTH.WITHDRAWAL), + mutationFn: () => + API.delete(API_ENDPOINTS.AUTH.WITHDRAWAL), onSuccess: () => { notify('success', '회원탈퇴에 성공하였습니다.', 3000); document.cookie = 'token=; max-age=0; path=/;'; diff --git a/src/hooks/apis/Comment/useCreateCommentQuery.ts b/src/hooks/apis/Comment/useCreateCommentQuery.ts index 99feb969..a66c664f 100644 --- a/src/hooks/apis/Comment/useCreateCommentQuery.ts +++ b/src/hooks/apis/Comment/useCreateCommentQuery.ts @@ -1,18 +1,18 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { POST } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; +import { TOAST_MESSAGES } from '@/constants/Messages'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { notify } from '@/store/useToastStore'; import { CommentResponse, GetCommentRequest } from '@/types/Comment'; -import { TOAST_MESSAGES } from '@/constants/Messages'; export const useCreateComment = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (postData: GetCommentRequest) => - POST( + API.post( API_ENDPOINTS.COMMENT.CREATE, postData, ), diff --git a/src/hooks/apis/Comment/useDeleteCommentQuery.ts b/src/hooks/apis/Comment/useDeleteCommentQuery.ts index e3267c8d..0c2aa413 100644 --- a/src/hooks/apis/Comment/useDeleteCommentQuery.ts +++ b/src/hooks/apis/Comment/useDeleteCommentQuery.ts @@ -1,9 +1,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { notify } from '@/store/useToastStore'; -import { DELETE } from '@/apis/services/httpMethod'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; -import { QUERY_KEYS } from '@/constants/QueryKeys'; import { TOAST_MESSAGES } from '@/constants/Messages'; +import { QUERY_KEYS } from '@/constants/QueryKeys'; +import { notify } from '@/store/useToastStore'; import { CommentResponse } from '@/types/Comment'; export const useDeleteComment = () => { @@ -11,7 +12,7 @@ export const useDeleteComment = () => { return useMutation({ mutationFn: (commentId: number) => - DELETE(API_ENDPOINTS.COMMENT.DELETE(commentId)), + API.delete(API_ENDPOINTS.COMMENT.DELETE(commentId)), onSuccess: () => { queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.COMPLETE_DETAIL] }); notify('success', TOAST_MESSAGES.COMMENT_DELETE_SUCCESS, 3000); diff --git a/src/hooks/apis/Comment/usePutCommentQuery.ts b/src/hooks/apis/Comment/usePutCommentQuery.ts index a947a8fa..e487e915 100644 --- a/src/hooks/apis/Comment/usePutCommentQuery.ts +++ b/src/hooks/apis/Comment/usePutCommentQuery.ts @@ -1,10 +1,11 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { notify } from '@/store/useToastStore'; -import { PUT } from '@/apis/services/httpMethod'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; -import { CommentResponse, PutCommentRequest } from '@/types/Comment'; import { TOAST_MESSAGES } from '@/constants/Messages'; import { QUERY_KEYS } from '@/constants/QueryKeys'; +import { notify } from '@/store/useToastStore'; +import { CommentResponse, PutCommentRequest } from '@/types/Comment'; interface PutCommentVariables { data: PutCommentRequest; @@ -16,7 +17,7 @@ export const usePutComment = () => { return useMutation({ mutationFn: ({ data, commentId }) => - PUT( + API.put( API_ENDPOINTS.COMMENT.PUT(commentId), data, ), diff --git a/src/hooks/apis/Complete/useGetCompleteDetailQuery.ts b/src/hooks/apis/Complete/useGetCompleteDetailQuery.ts index 3c037c64..ed888093 100644 --- a/src/hooks/apis/Complete/useGetCompleteDetailQuery.ts +++ b/src/hooks/apis/Complete/useGetCompleteDetailQuery.ts @@ -1,7 +1,7 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { GetCompleteDetailResponse } from '@/types/Completes'; @@ -11,7 +11,7 @@ const GetCompleteDetailOptions = ( ): UseQueryOptions => ({ queryKey: [QUERY_KEYS.COMPLETE_DETAIL, completeId], queryFn: () => - GET( + API.get( API_ENDPOINTS.TODOS.GET_CERTIFIED_TODO(completeId), ), }); diff --git a/src/hooks/apis/Dashboard/useRecentTodosQuery.ts b/src/hooks/apis/Dashboard/useRecentTodosQuery.ts index e294e639..8f222574 100644 --- a/src/hooks/apis/Dashboard/useRecentTodosQuery.ts +++ b/src/hooks/apis/Dashboard/useRecentTodosQuery.ts @@ -4,7 +4,7 @@ import { } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { RecentTodosResponse } from '@/types/Dashboard'; @@ -14,7 +14,7 @@ export const recentTodosOptions = ( ): UseSuspenseQueryOptions => ({ queryKey: [QUERY_KEYS.RECENT_TODOS], queryFn: () => - GET( + API.get( `${API_ENDPOINTS.TODOS.GET_ALL}?lastTodoId=0&size=3`, token, ), diff --git a/src/hooks/apis/Dashboard/useTodayProgressQuery.ts b/src/hooks/apis/Dashboard/useTodayProgressQuery.ts index a53d38b2..cce10b04 100644 --- a/src/hooks/apis/Dashboard/useTodayProgressQuery.ts +++ b/src/hooks/apis/Dashboard/useTodayProgressQuery.ts @@ -1,7 +1,7 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { TodayProgressResponse } from '@/types/Dashboard'; @@ -11,7 +11,10 @@ export const todayProgressOptions = ( ): UseQueryOptions => ({ queryKey: [QUERY_KEYS.TODAY_PROGRESS], queryFn: () => - GET(API_ENDPOINTS.TODOS.GET_TODAY_PROGRESS, token), + API.get( + API_ENDPOINTS.TODOS.GET_TODAY_PROGRESS, + token, + ), }); export const useTodayProgressQuery = () => { diff --git a/src/hooks/apis/Dashboard/useTodosOfGoalsQuery.ts b/src/hooks/apis/Dashboard/useTodosOfGoalsQuery.ts index 3f638b03..1b60cdf8 100644 --- a/src/hooks/apis/Dashboard/useTodosOfGoalsQuery.ts +++ b/src/hooks/apis/Dashboard/useTodosOfGoalsQuery.ts @@ -4,7 +4,7 @@ import { } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { TodosOfGoalsResponse } from '@/types/Dashboard'; @@ -17,7 +17,7 @@ export const todosOfGoalsOptions = (): UseInfiniteQueryOptions< > => ({ queryKey: [QUERY_KEYS.TODOS_OF_GOALS], queryFn: ({ pageParam = 0 }) => - GET( + API.get( `${API_ENDPOINTS.TODOS.GET_GOALS}?lastGoalId=${pageParam}&size=5`, ), getNextPageParam: (lastPage) => { diff --git a/src/hooks/apis/Follow/useAssignFollowMutation.ts b/src/hooks/apis/Follow/useAssignFollowMutation.ts index 65808de5..c190dff1 100644 --- a/src/hooks/apis/Follow/useAssignFollowMutation.ts +++ b/src/hooks/apis/Follow/useAssignFollowMutation.ts @@ -1,9 +1,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { POST } from '@/apis/services/httpMethod'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; -import { AssignFollowResponse, UserProfileResponse } from '@/types/response'; -import { notify } from '@/store/useToastStore'; import { QUERY_KEYS } from '@/constants/QueryKeys'; +import { notify } from '@/store/useToastStore'; +import { AssignFollowResponse, UserProfileResponse } from '@/types/response'; interface FollowId { userId: number; @@ -14,7 +15,7 @@ export const useAssignFollowMutation = () => { return useMutation({ mutationFn: (userId: number) => - POST( + API.post( API_ENDPOINTS.FOLLOW.ASSIGN_FOLLOW(userId), ), onMutate: async (userId) => { diff --git a/src/hooks/apis/Follow/useDeleteFollowMutation.ts b/src/hooks/apis/Follow/useDeleteFollowMutation.ts index fff35aa1..d22a39b5 100644 --- a/src/hooks/apis/Follow/useDeleteFollowMutation.ts +++ b/src/hooks/apis/Follow/useDeleteFollowMutation.ts @@ -1,16 +1,19 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { DELETE } from '@/apis/services/httpMethod'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; -import { DeleteFollowResponse, UserProfileResponse } from '@/types/response'; -import { notify } from '@/store/useToastStore'; import { QUERY_KEYS } from '@/constants/QueryKeys'; +import { notify } from '@/store/useToastStore'; +import { DeleteFollowResponse, UserProfileResponse } from '@/types/response'; export const useDeleteFollowMutation = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (userId: number) => - DELETE(API_ENDPOINTS.FOLLOW.DELETE_FOLLOW(userId)), + API.delete( + API_ENDPOINTS.FOLLOW.DELETE_FOLLOW(userId), + ), onMutate: async (userId) => { const previousData = queryClient.getQueriesData({ queryKey: [QUERY_KEYS.USER_PROFILE, userId], diff --git a/src/hooks/apis/Follows/useDeleteFollowsQuery.ts b/src/hooks/apis/Follows/useDeleteFollowsQuery.ts index 2c75472f..a5201838 100644 --- a/src/hooks/apis/Follows/useDeleteFollowsQuery.ts +++ b/src/hooks/apis/Follows/useDeleteFollowsQuery.ts @@ -1,17 +1,20 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { notify } from '@/store/useToastStore'; -import { DeleteFollowsResponse } from '@/types/Follows'; -import { DELETE } from '@/apis/services/httpMethod'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; -import { QUERY_KEYS } from '@/constants/QueryKeys'; import { TOAST_MESSAGES } from '@/constants/Messages'; +import { QUERY_KEYS } from '@/constants/QueryKeys'; +import { notify } from '@/store/useToastStore'; +import { DeleteFollowsResponse } from '@/types/Follows'; export const useDeleteFollow = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (followerId: number) => - DELETE(API_ENDPOINTS.FOLLOW.DELETE(followerId)), + API.delete( + API_ENDPOINTS.FOLLOW.DELETE(followerId), + ), onSuccess: () => { queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.FOLLOW_COUNT] }); notify('success', TOAST_MESSAGES.DELETE_FOLLOW_SUCCESS, 3000); diff --git a/src/hooks/apis/Follows/useGetFollowPostsQuery.ts b/src/hooks/apis/Follows/useGetFollowPostsQuery.ts index f1cdd028..270629c2 100644 --- a/src/hooks/apis/Follows/useGetFollowPostsQuery.ts +++ b/src/hooks/apis/Follows/useGetFollowPostsQuery.ts @@ -4,7 +4,7 @@ import { } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { GetFollowsResponse } from '@/types/Follows'; @@ -17,7 +17,7 @@ export const getFollowPostsOptions = (): UseInfiniteQueryOptions< > => ({ queryKey: [QUERY_KEYS.FOLLOWS], queryFn: ({ pageParam = 0 }) => - GET( + API.get( `${API_ENDPOINTS.FOLLOW.GET}?lastCompleteId=${pageParam}&size=6`, ), getNextPageParam: (lastPage) => { diff --git a/src/hooks/apis/Goals/useDeleteGoalMutation.ts b/src/hooks/apis/Goals/useDeleteGoalMutation.ts index d4072b92..6fa0392f 100644 --- a/src/hooks/apis/Goals/useDeleteGoalMutation.ts +++ b/src/hooks/apis/Goals/useDeleteGoalMutation.ts @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { DELETE } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { notify } from '@/store/useToastStore'; @@ -11,7 +11,7 @@ export const useDeleteGoalMutation = () => { return useMutation({ mutationFn: (goalId: number) => - DELETE(API_ENDPOINTS.GOAL.GOAL(goalId)), + API.delete(API_ENDPOINTS.GOAL.GOAL(goalId)), onSuccess: () => { queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.ALL_GOALS] }); queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.GOALS] }); diff --git a/src/hooks/apis/Goals/useEditGoalTitleMutation.ts b/src/hooks/apis/Goals/useEditGoalTitleMutation.ts index a75a2bd6..b3d1c3be 100644 --- a/src/hooks/apis/Goals/useEditGoalTitleMutation.ts +++ b/src/hooks/apis/Goals/useEditGoalTitleMutation.ts @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { PUT } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { notify } from '@/store/useToastStore'; @@ -16,7 +16,7 @@ export const useEditGoalTitleMutation = (editGoalId: number) => { return useMutation({ mutationFn: (postData: PostDataTypes) => - PUT( + API.put( API_ENDPOINTS.GOAL.GOAL(editGoalId), postData, ), diff --git a/src/hooks/apis/Goals/useGoalsDetailQuery.ts b/src/hooks/apis/Goals/useGoalsDetailQuery.ts index 96683f52..b12c39d1 100644 --- a/src/hooks/apis/Goals/useGoalsDetailQuery.ts +++ b/src/hooks/apis/Goals/useGoalsDetailQuery.ts @@ -4,7 +4,7 @@ import { } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { GoalsDetailResponse } from '@/types/Goals'; @@ -17,7 +17,7 @@ const GoalsDetailOptions = (): UseInfiniteQueryOptions< > => ({ queryKey: [QUERY_KEYS.ALL_GOALS], queryFn: ({ pageParam = 0 }) => - GET( + API.get( `${API_ENDPOINTS.GOAL.ALL_GOALS}?lastGoalId=${pageParam}&size=5`, ), getNextPageParam: (lastPage) => { diff --git a/src/hooks/apis/Likes/useDeleteLikeQuery.ts b/src/hooks/apis/Likes/useDeleteLikeQuery.ts index 0788713e..a55cb5da 100644 --- a/src/hooks/apis/Likes/useDeleteLikeQuery.ts +++ b/src/hooks/apis/Likes/useDeleteLikeQuery.ts @@ -1,17 +1,18 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { DELETE } from '@/apis/services/httpMethod'; -import { DeleteLikeResponse } from '@/types/Likes'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; -import { notify } from '@/store/useToastStore'; import { TOAST_MESSAGES } from '@/constants/Messages'; import { QUERY_KEYS } from '@/constants/QueryKeys'; +import { notify } from '@/store/useToastStore'; +import { DeleteLikeResponse } from '@/types/Likes'; export const useDeleteLike = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (completeId: number) => - DELETE(API_ENDPOINTS.LIKE.DELETE(completeId)), + API.delete(API_ENDPOINTS.LIKE.DELETE(completeId)), onSuccess: () => { queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.FOLLOWS] }); diff --git a/src/hooks/apis/Sidebar/useSidebarGoalsMutation.ts b/src/hooks/apis/Sidebar/useSidebarGoalsMutation.ts index c21d4200..d042afc1 100644 --- a/src/hooks/apis/Sidebar/useSidebarGoalsMutation.ts +++ b/src/hooks/apis/Sidebar/useSidebarGoalsMutation.ts @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { POST } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { notify } from '@/store/useToastStore'; @@ -15,7 +15,10 @@ export const useSidebarGoalsMutation = () => { return useMutation({ mutationFn: (postData: PostGoalTypes) => - POST(API_ENDPOINTS.GOAL.GOALS, postData), + API.post( + API_ENDPOINTS.GOAL.GOALS, + postData, + ), onMutate: async ({ title }) => { const prev = queryClient.getQueriesData({ queryKey: [QUERY_KEYS.GOALS] }); diff --git a/src/hooks/apis/Todo/useTodayTodo.ts b/src/hooks/apis/Todo/useTodayTodo.ts index 5dfb260e..fa52275e 100644 --- a/src/hooks/apis/Todo/useTodayTodo.ts +++ b/src/hooks/apis/Todo/useTodayTodo.ts @@ -1,7 +1,7 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { BaseResponse } from '@/types/response'; @@ -33,7 +33,8 @@ export const todayTodoOptions = (): UseQueryOptions< AxiosError > => ({ queryKey: [QUERY_KEYS.TODAY_TODO], - queryFn: () => GET(API_ENDPOINTS.TODOS.GET_TODAY_TODOS), + queryFn: () => + API.get(API_ENDPOINTS.TODOS.GET_TODAY_TODOS), }); export const useTodayTodoQuery = () => { diff --git a/src/hooks/apis/Todo/useTodoDetailQuery.ts b/src/hooks/apis/Todo/useTodoDetailQuery.ts index a5277778..e40948fd 100644 --- a/src/hooks/apis/Todo/useTodoDetailQuery.ts +++ b/src/hooks/apis/Todo/useTodoDetailQuery.ts @@ -1,6 +1,7 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; + +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { TodoDetailResponse } from '@/types/response'; @@ -10,7 +11,7 @@ const todoDetailOptions = ( ): UseQueryOptions => ({ queryKey: [QUERY_KEYS.TODOS_DETAIL, todoId], queryFn: () => - GET(API_ENDPOINTS.TODOS.GET_DETAIL(todoId)), + API.get(API_ENDPOINTS.TODOS.GET_DETAIL(todoId)), }); export const useTodoDetailQuery = (todoId: number) => { diff --git a/src/hooks/apis/useGoalsQuery.ts b/src/hooks/apis/useGoalsQuery.ts index b1490243..a8f55aea 100644 --- a/src/hooks/apis/useGoalsQuery.ts +++ b/src/hooks/apis/useGoalsQuery.ts @@ -4,7 +4,7 @@ import { } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { GoalsResponse } from '@/types/Goals'; @@ -13,7 +13,7 @@ export const goalsOptions = ( token?: string, ): UseSuspenseQueryOptions => ({ queryKey: [QUERY_KEYS.GOALS], - queryFn: () => GET(API_ENDPOINTS.GOAL.GOALS, token), + queryFn: () => API.get(API_ENDPOINTS.GOAL.GOALS, token), }); export const useGoalsQuery = () => { diff --git a/src/hooks/apis/useUserQuery.ts b/src/hooks/apis/useUserQuery.ts index cbc1e36f..45e04504 100644 --- a/src/hooks/apis/useUserQuery.ts +++ b/src/hooks/apis/useUserQuery.ts @@ -1,7 +1,7 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { GET } from '@/apis/services/httpMethod'; +import { API } from '@/apis/services/httpMethod'; import { API_ENDPOINTS } from '@/constants/ApiEndpoints'; import { QUERY_KEYS } from '@/constants/QueryKeys'; import { BaseResponse } from '@/types/response'; @@ -18,7 +18,7 @@ interface UserInfoResponse extends BaseResponse { const userInfoOptions: UseQueryOptions = { queryKey: [QUERY_KEYS.USER_INFO], - queryFn: () => GET(API_ENDPOINTS.AUTH.USER), + queryFn: () => API.get(API_ENDPOINTS.AUTH.USER), }; export const useUserQuery = () => { diff --git a/src/lib/query/getQueryClient.ts b/src/lib/query/getQueryClient.ts index cb10c41d..52da1760 100644 --- a/src/lib/query/getQueryClient.ts +++ b/src/lib/query/getQueryClient.ts @@ -1,9 +1,12 @@ import { defaultShouldDehydrateQuery, isServer, + QueryCache, QueryClient, } from '@tanstack/react-query'; +import { handleHttpError } from '@/utils/handleHttpError'; + const DEFAULT_STALE_TIME = 60 * 1000; function makeQueryClient() { @@ -21,6 +24,11 @@ function makeQueryClient() { query.state.status === 'pending', }, }, + queryCache: new QueryCache({ + onError: (error: unknown) => { + handleHttpError(error); + }, + }), }); } diff --git a/src/utils/handleHttpError.ts b/src/utils/handleHttpError.ts new file mode 100644 index 00000000..907f9397 --- /dev/null +++ b/src/utils/handleHttpError.ts @@ -0,0 +1,25 @@ +import { AxiosError } from 'axios'; + +import { notify } from '@/store/useToastStore'; + +export function handleHttpError(error: unknown) { + if (!(error instanceof AxiosError)) { + notify('error', '에러가 발생했습니다.', 3000); + return; + } + + const status = error.response?.status; + const message = error.response?.data?.message || ''; + + switch (status) { + case 401: + notify('info', '로그아웃 되었습니다.', 3000); + break; + case 500: + notify('error', '서버에서 오류가 발생하였습니다.', 3000); + break; + default: + notify('error', message, 3000); + break; + } +}