Files
banu-front/src/services/query/auth.js
T
Server Migration b64f528c0d
Deploy banu-front / deploy (push) Successful in 1m40s
fix: complete registration frontend flow
2026-08-15 17:28:40 +03:30

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 })