107 lines
3.4 KiB
JavaScript
107 lines
3.4 KiB
JavaScript
import { useMutation, useQuery } from '@tanstack/vue-query'
|
|
|
|
import {
|
|
apiCompleteProfile,
|
|
apiForgotPassword,
|
|
apiGetMe,
|
|
apiGetRegisterData,
|
|
apiGetRegistrationQuestionVideo,
|
|
apiLogin,
|
|
apiRequestLoginOtp,
|
|
apiVerifyLoginOtp,
|
|
apiLogout,
|
|
apiRegister,
|
|
apiResendVerificationCode,
|
|
apiResetPassword,
|
|
apiSaveRegisterData,
|
|
apiUpdateProfile,
|
|
apiUploadMedia,
|
|
apiVerifyCode,
|
|
apiVerifyForgotPasswordCode,
|
|
} from '@/services/api/auth'
|
|
|
|
export const authKeys = {
|
|
me: () => ['auth', 'me'],
|
|
registrationVideo: () => ['auth', 'registration-video'],
|
|
registerData: () => ['auth', 'register-data'],
|
|
}
|
|
|
|
export const useLoginMutation = () => useMutation({ mutationFn: apiLogin })
|
|
|
|
export const useRequestLoginOtpMutation = () => useMutation({ mutationFn: apiRequestLoginOtp })
|
|
|
|
export const useVerifyLoginOtpMutation = () => useMutation({ mutationFn: apiVerifyLoginOtp })
|
|
|
|
export const useRegisterMutation = () => useMutation({ mutationFn: apiRegister })
|
|
|
|
export const useVerifyCodeMutation = () => useMutation({ mutationFn: apiVerifyCode })
|
|
|
|
export const useResendVerificationCodeMutation = () =>
|
|
useMutation({ mutationFn: apiResendVerificationCode })
|
|
|
|
export const useForgotPasswordMutation = () => useMutation({ mutationFn: apiForgotPassword })
|
|
|
|
export const useVerifyForgotPasswordCodeMutation = () =>
|
|
useMutation({ mutationFn: apiVerifyForgotPasswordCode })
|
|
|
|
export const useResetPasswordMutation = () => useMutation({ mutationFn: apiResetPassword })
|
|
|
|
export const useLogoutMutation = () => useMutation({ mutationFn: apiLogout })
|
|
|
|
export const useGetMeQuery = (options = {}) =>
|
|
useQuery({
|
|
queryKey: authKeys.me(),
|
|
queryFn: () => apiGetMe(),
|
|
select: (response) => response?.data ?? response,
|
|
...options,
|
|
})
|
|
|
|
export const useCompleteProfileMutation = () => useMutation({ mutationFn: apiCompleteProfile })
|
|
|
|
export const useUpdateProfileMutation = () => useMutation({ mutationFn: apiUpdateProfile })
|
|
|
|
const getRegistrationVideoIfAvailable = async () => {
|
|
try {
|
|
return await apiGetRegistrationQuestionVideo()
|
|
} catch (error) {
|
|
// The migrated backend does not expose this optional content endpoint yet.
|
|
// Treat a missing route as "no tutorial uploaded" so registration remains usable.
|
|
if (error?.response?.status === 404) return {}
|
|
throw error
|
|
}
|
|
}
|
|
|
|
export const useGetRegistrationVideoQuery = (options = {}) =>
|
|
useQuery({
|
|
queryKey: authKeys.registrationVideo(),
|
|
queryFn: getRegistrationVideoIfAvailable,
|
|
select: (response) => response?.data ?? response,
|
|
...options,
|
|
})
|
|
|
|
export const useUploadMediaMutation = () => useMutation({ mutationFn: apiUploadMedia })
|
|
|
|
// Register-data is a flat `{ field: value }` object; legacy responses were a
|
|
// `[{ key, value }]` list. Normalize both into the object shape.
|
|
const toRegisterDataObject = (response) => {
|
|
const body = response?.data ?? response
|
|
const raw = Array.isArray(body) ? body : body?.data ?? body
|
|
if (Array.isArray(raw)) {
|
|
return raw.reduce((acc, item) => {
|
|
if (item && typeof item === 'object' && 'key' in item) acc[item.key] = item.value
|
|
return acc
|
|
}, {})
|
|
}
|
|
return raw && typeof raw === 'object' ? raw : {}
|
|
}
|
|
|
|
export const useGetRegisterDataQuery = (options = {}) =>
|
|
useQuery({
|
|
queryKey: authKeys.registerData(),
|
|
queryFn: () => apiGetRegisterData(),
|
|
select: toRegisterDataObject,
|
|
...options,
|
|
})
|
|
|
|
export const useSaveRegisterDataMutation = () => useMutation({ mutationFn: apiSaveRegisterData })
|