Skip to content

Commit 1352fba

Browse files
authored
Merge pull request #145 from prgrms-web-devcourse-final-project/130-feature/walk-gangbuntta
[Feature] #130 강번따 및 산책 완료 기능 구현
2 parents 0d987d2 + 5efadbc commit 1352fba

File tree

14 files changed

+715
-144
lines changed

14 files changed

+715
-144
lines changed

src/WebSocketContext.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,12 @@ export const WebSocketProvider = ({ children }: { children: React.ReactNode }) =
7777
)
7878
}
7979

80-
export const useWebSocket = () => {
80+
export const useWebSocket = (): {
81+
client: Client | null
82+
isConnected: boolean
83+
subscribe: (destination: string, callback: (message: any) => void) => void
84+
publish: (destination: string, body: any) => void
85+
} => {
8186
const context = useContext(WebSocketContext)
8287
if (!context) {
8388
throw new Error('useWebSocket must be used within a WebSocketProvider')

src/apis/walk/fetchWalkComplete.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { AxiosError } from 'axios'
2+
import { APIResponse, ErrorResponse } from '~types/api'
3+
import { axiosInstance } from '~apis/axiosInstance'
4+
import { useQuery } from '@tanstack/react-query'
5+
6+
export const WALK_COMPLETE_QUERY_KEY = 'walkComplete' as const
7+
8+
export type FetchWalkCompleteRequest = {
9+
walkImgFile: File
10+
totalDistanceMeter: number
11+
totalWalkTimeSecond: number
12+
}
13+
14+
export type TimeDuration = {
15+
hours: number
16+
minutes: number
17+
seconds: number
18+
}
19+
20+
export type WalkWithDogInfo = {
21+
otherDogId: number
22+
otherDogProfileImg: string
23+
otherDogName: string
24+
otherDogBreed: string
25+
otherDogAge: number
26+
otherDogGender: 'MALE' | 'FEMALE'
27+
memberId: number
28+
}
29+
30+
export type FetchWalkCompleteResponse = {
31+
date: string
32+
memberName: string
33+
dogName: string
34+
totalDistanceMeter: number
35+
timeDuration: TimeDuration
36+
totalCalorie: number
37+
walkImg: string
38+
walkWithDogInfo: WalkWithDogInfo
39+
}
40+
41+
export const fetchWalkComplete = async (formData: FormData): Promise<APIResponse<FetchWalkCompleteResponse>> => {
42+
try {
43+
const { data } = await axiosInstance.post<APIResponse<FetchWalkCompleteResponse>>(`/walk/complete`, formData, {
44+
headers: {
45+
'Content-Type': 'multipart/form-data',
46+
},
47+
})
48+
return data
49+
} catch (error) {
50+
if (error instanceof AxiosError) {
51+
const { response } = error as AxiosError<ErrorResponse>
52+
53+
if (response) {
54+
const { code, message } = response.data
55+
switch (code) {
56+
case 400:
57+
throw new Error(message || '잘못된 요청입니다.')
58+
case 401:
59+
throw new Error(message || '인증에 실패했습니다.')
60+
case 500:
61+
throw new Error(message || '서버 오류가 발생했습니다.')
62+
default:
63+
throw new Error(message || '알 수 없는 오류가 발생했습니다.')
64+
}
65+
}
66+
throw new Error('네트워크 연결을 확인해주세요')
67+
}
68+
69+
console.error('예상치 못한 에러:', error)
70+
throw new Error('다시 시도해주세요')
71+
}
72+
}
73+
74+
export const useWalkComplete = (formData: FormData) => {
75+
return useQuery({
76+
queryKey: [WALK_COMPLETE_QUERY_KEY, formData],
77+
queryFn: () => fetchWalkComplete(formData),
78+
enabled: false,
79+
})
80+
}

src/assets/map_pin_1.svg

Lines changed: 37 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)