51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import { AuthPayload } from "@/utils/features/location/authSlice"
|
|
import { useMutation } from "@tanstack/react-query"
|
|
|
|
type ErrorResponse = {
|
|
error: string
|
|
message: string
|
|
statusCode: number
|
|
}
|
|
|
|
type LoginForm = {
|
|
name: string
|
|
password: string
|
|
}
|
|
|
|
type onPostSuccessFunc = () => void
|
|
type ErrorFuncProps = { response?: ErrorResponse, error?: Error }
|
|
type onErrorFunc = (props: ErrorFuncProps) => void
|
|
|
|
type LoginProps = {
|
|
authLogin: (payload: AuthPayload) => { payload: AuthPayload, type: "auth/login" }
|
|
onPostSuccess?: onPostSuccessFunc
|
|
onError?: onErrorFunc
|
|
}
|
|
|
|
export const useLoginMutation = ({ authLogin, onPostSuccess, onError }: LoginProps) => {
|
|
return useMutation({
|
|
mutationFn: async ({ name, password }: LoginForm) => {
|
|
return fetch(`${process.env.EXPO_PUBLIC_TRAINTRAPE_MOI_SERVER}/auth/login/`, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ name: name, password: password })
|
|
}).then(resp => resp.json())
|
|
},
|
|
networkMode: 'always',
|
|
onSuccess: async (data, { name, password }: LoginForm) => {
|
|
if (data.error) {
|
|
if (onError)
|
|
onError({ response: data })
|
|
return
|
|
}
|
|
authLogin({ name: name, password: password, token: data.accessToken })
|
|
if (onPostSuccess)
|
|
onPostSuccess()
|
|
},
|
|
onError: async (error: Error) => {
|
|
if (onError)
|
|
onError({ error: error })
|
|
}
|
|
})
|
|
}
|