fix: captcha 開關
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
import type { CaptchaResponse } from '@/types/api'
|
||||
import { computed, ref, toValue, type MaybeRefOrGetter } from 'vue'
|
||||
import { normalizeError } from '@/services/error'
|
||||
import { authApi } from '@/services/modules/auth'
|
||||
|
||||
interface UseLoginCaptchaOptions {
|
||||
enabled: MaybeRefOrGetter<boolean>
|
||||
}
|
||||
|
||||
export function useLoginCaptcha(options: UseLoginCaptchaOptions) {
|
||||
const captcha = ref<CaptchaResponse | null>(null)
|
||||
const captchaValue = ref('')
|
||||
const captchaLoading = ref(false)
|
||||
const captchaErrorMessage = ref<string | null>(null)
|
||||
const enabled = computed(() => toValue(options.enabled))
|
||||
|
||||
const formCaptcha = computed(() => {
|
||||
if (!enabled.value || !captcha.value) return undefined
|
||||
|
||||
return {
|
||||
imgUrl: captcha.value.dntCaptchaImgUrl,
|
||||
id: captcha.value.dntCaptchaId,
|
||||
tokenValue: captcha.value.dntCaptchaTokenValue,
|
||||
}
|
||||
})
|
||||
|
||||
async function loadCaptcha() {
|
||||
if (!enabled.value) return null
|
||||
|
||||
captchaLoading.value = true
|
||||
captchaErrorMessage.value = null
|
||||
|
||||
try {
|
||||
const { data } = await authApi.getCaptcha()
|
||||
captcha.value = data
|
||||
return data
|
||||
} catch (error_) {
|
||||
const normalizedError = normalizeError(error_)
|
||||
captcha.value = null
|
||||
captchaErrorMessage.value = normalizedError.message
|
||||
throw normalizedError
|
||||
} finally {
|
||||
captchaLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
async function refreshCaptcha() {
|
||||
if (!enabled.value) return null
|
||||
|
||||
captchaValue.value = ''
|
||||
return await loadCaptcha()
|
||||
}
|
||||
|
||||
function setCaptchaValue(value: string) {
|
||||
if (!enabled.value) return
|
||||
|
||||
captchaValue.value = value
|
||||
}
|
||||
|
||||
function getLoginCaptchaPayload() {
|
||||
if (!enabled.value) return undefined
|
||||
|
||||
if (!captcha.value?.dntCaptchaTextValue || !captcha.value?.dntCaptchaTokenValue) {
|
||||
throw new Error('驗證碼資料缺失,請先刷新驗證碼')
|
||||
}
|
||||
|
||||
return {
|
||||
DNTCaptchaInputText: captchaValue.value,
|
||||
DNTCaptchaText: captcha.value.dntCaptchaTextValue,
|
||||
DNTCaptchaToken: captcha.value.dntCaptchaTokenValue,
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
captchaValue,
|
||||
captchaLoading,
|
||||
captchaErrorMessage,
|
||||
formCaptcha,
|
||||
loadCaptcha,
|
||||
refreshCaptcha,
|
||||
setCaptchaValue,
|
||||
getLoginCaptchaPayload,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user