DysonNetwork.Pass service frontend

This commit is contained in:
2025-07-24 22:23:40 +08:00
parent 5a24c31d43
commit 460f321bd1
15 changed files with 623 additions and 98 deletions

View File

@@ -0,0 +1,65 @@
<template>
<div class="flex justify-center">
<div v-if="provider === 'cloudflare'">
<turnstile v-if="!!apiKey" :sitekey="apiKey" @callback="handleSuccess" />
<div v-else class="mx-auto">
<n-spin />
</div>
</div>
<div v-else-if="provider === 'recaptcha'">
<hcaptcha v-if="!!apiKey" :sitekey="apiKey" @verify="(tk: string) => handleSuccess(tk)" />
<div v-else class="mx-auto">
<n-spin />
</div>
</div>
<div v-else-if="provider === 'hcaptcha'" class="h-captcha" :data-sitekey="apiKey"></div>
<div v-else class="flex flex-col items-center justify-center gap-1">
<n-icon size="32">
<error-outline-round />
</n-icon>
<span>Captcha provider not configured correctly.</span>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, defineEmits, ref, onMounted } from 'vue'
import { NIcon, NSpin } from 'naive-ui'
import { ErrorOutlineRound } from '@vicons/material'
import Turnstile from 'cfturnstile-vue3'
import Hcaptcha from '@hcaptcha/vue3-hcaptcha'
const props = defineProps({
provider: {
type: String,
required: false,
},
apiKey: {
type: String,
required: false,
},
})
const provider = ref(props.provider)
const apiKey = ref(props.apiKey)
const emit = defineEmits(['verified'])
function handleSuccess(token: string) {
emit('verified', token)
}
// This function will be used to fetch configuration if needed,
// Like the backend didn't embed the configuration properly.
async function fetchConfiguration() {
const resp = await fetch('/api/captcha')
const data = await resp.json()
provider.value = data.provider
apiKey.value = data.api_key
}
onMounted(() => {
if (!provider.value || !apiKey.value) fetchConfiguration()
})
</script>