|
<script setup lang='ts'> |
|
import { computed, ref } from 'vue' |
|
import { NButton, NInput, NModal, useMessage } from 'naive-ui' |
|
import { fetchVerify } from '@/api' |
|
import { useAuthStore } from '@/store' |
|
import Icon403 from '@/icons/403.vue' |
|
|
|
interface Props { |
|
visible: boolean |
|
} |
|
|
|
defineProps<Props>() |
|
|
|
const authStore = useAuthStore() |
|
|
|
const ms = useMessage() |
|
|
|
const loading = ref(false) |
|
const token = ref('') |
|
|
|
const disabled = computed(() => !token.value.trim() || loading.value) |
|
|
|
async function handleVerify() { |
|
const secretKey = token.value.trim() |
|
|
|
if (!secretKey) |
|
return |
|
|
|
try { |
|
loading.value = true |
|
await fetchVerify(secretKey) |
|
authStore.setToken(secretKey) |
|
ms.success('success') |
|
window.location.reload() |
|
} |
|
catch (error: any) { |
|
ms.error(error.message ?? 'error') |
|
authStore.removeToken() |
|
token.value = '' |
|
} |
|
finally { |
|
loading.value = false |
|
} |
|
} |
|
|
|
function handlePress(event: KeyboardEvent) { |
|
if (event.key === 'Enter' && !event.shiftKey) { |
|
event.preventDefault() |
|
handleVerify() |
|
} |
|
} |
|
</script> |
|
|
|
<template> |
|
<NModal :show="visible" style="width: 90%; max-width: 640px"> |
|
<div class="p-10 bg-white rounded dark:bg-slate-800"> |
|
<div class="space-y-4"> |
|
<header class="space-y-2"> |
|
<h2 class="text-2xl font-bold text-center text-slate-800 dark:text-neutral-200"> |
|
403 |
|
</h2> |
|
<p class="text-base text-center text-slate-500 dark:text-slate-500"> |
|
{{ $t('common.unauthorizedTips') }} |
|
</p> |
|
<Icon403 class="w-[200px] m-auto" /> |
|
</header> |
|
<NInput v-model:value="token" type="password" placeholder="" @keypress="handlePress" /> |
|
<NButton |
|
block |
|
type="primary" |
|
:disabled="disabled" |
|
:loading="loading" |
|
@click="handleVerify" |
|
> |
|
{{ $t('common.verify') }} |
|
</NButton> |
|
</div> |
|
</div> |
|
</NModal> |
|
</template> |
|
|